Thank you for helping make someone’s app feel native!
.ini files — a .lang file IS a type of .ini file.MyScript-[en].lang would be saved asMyScript-[fr].lang👉 It’s easiest to use OneLocale_FindLangID to find tags by partial language name. As shown below for example, entering “spa…” or “esp…” lists all Spanish dialects:

=’.%percent signs%[section heading]Parts of a .lang file:

\n’ forces a new line\z’ is a comment and will never appear to the user:
%’, write ‘\%’.👉 Watch out for translated strings becoming too long to display properly. Experiment. Run the app and see how it looks. Try to re-word your translation to make it fit in the space available.
As a rule of thumb, messages should be no more than ~120% longer than the base language - although this depends on how much room the developer gave you.
If your shortened translation sacrifices important meaning, you can explain further in the element’s Tooltip, if it has one.
&’) sets the Access Key (e.g. ‘&Cancel’)
&’ without the underline, use ‘&&’ (e.g. ‘Cats && Dogs’)\t) separates menu text and menu Accelerator (hotkey) (e.g. ‘&Save \t Ctrl+S’)
See Microsoft’s Keyboard Shortcuts and Localization for details of both Access Keys and Accelerators.
&) sets the Access Key (e.g. ‘Save &As...’)
&’ without the underline, use ‘&&’Multi-line sections look different in a .lang file, because they don’t have ‘=’ on every line like normal sections.
%variables%)\t’.\n’ if you need an empty line on output.\w at the start or end of line.Questions? Open an issue on the GitHub repo — we’re friendly.
👉 Just give the entire .lang file to Grok, Claude or ChatGPT and say: Translate this AutoHotkey OneLocale language file to German. Never touch keys or %variables% and attach a copy of these Notes.
A good AI chatbot will give you a near-perfect file in seconds. You only need to skim for tone.
(Yes, this is how most translations will happen from now on.) 😀
– the OneLocale team (and Grok says hi)
Back to README