
	Localization/Translation FAQ
                (2007-2025)

    by Ran Rutenberg, Pavel Sanda, Michael Gerz


PART I - Interface translation
------------------------------

This file is mainly intended for those who have no or little experience using
.po files, but want to contribute by translating the LyX interface (i.e. menu
and dialog items, console messages) into their native language.


1) WHERE DO I START?

The file you need to edit is an xx.po file where xx stands for your language's
two letter code. For a list of language codes look at:

  https://www.gnu.org/software/gettext/manual/html_mono/gettext.html#Language-Codes

If you want to start from scratch then you should obtain a copy of the lyx.pot
and name it after your language. German would be for example de.po and Polish
pl.po. This file is generated in the "po" directory of the source tree during
the compilation.

There are basically two source trees you can start to work with - master
(development version) and branch (stable version). Unless the development
version is shortly before release it is better to start your translating
work on the stable version. If you have no idea how to get those trees you
can follow https://www.lyx.org/HowToUseGIT page.


2) HOW DO I EDIT PO FILES?

PO files can be edited with any text editor available for your system (e.g.
Vim, jEdit etc.). Yet another option is to use a specialized editor for .po
files. You can e.g. use the editor "Poedit", Linux users can
additionally use e.g. "Lokalize". Using these editors usually makes things 
easier as they have many tools to assist the translator.
If you use Poedit, please uncheck in its settings the option to break lines 
after 80 characters.


3) WHAT DO I NEED TO TRANSLATE?

If you are using a simple text editor you should translate the strings that
appear in the msgid line and write the translation into the msgstr line. Note
that a "#, fuzzy" line is just a hint for translation from compiler - in order
to get the translation of the current item working you have to delete this
line. It is recommended that you take a look at another .po file - that way you
can get an idea of what to do. If you are using a specialized po editor
then you will see in it the untranslated strings and a place to write your
translation for them.

There are large chunks of strings which actually do not need to be translated,
typically coming from layouts of specific journals, e.g. specific strings from 
lib/layouts/AEA.layout presenting the style of American Economic Association
are unlikely to be ever written in localized form. Or vast set of very
specific colors probaly does not need translations either...
In such case you can just "translate" the string by repeating the english
original as translated string so stats of your language show real number of
reviewed strings.


4) WHAT SHOULD I DO WITH THE '&', '|', '$, '%' {} AND [[]] CHARACTERS?

'&' stands for underlined characters (shortcut) in dialog boxes.
'|' stands for underlined characters in menus.

These chars should be somehow used in your translations, however you'll have to
invent your own working shortcuts for dialog and menu entries and resolve
possible conflicts of the same shortcut chars in one menu...

You will be informed about conflicts in the terminal if you try to access the
menu.

Note that, in the case of '|', if more than one character follows, this means
that LyX will try each of them in turn and use the first one that is not yet
used by another entry in the menu. That way, you can define alternative
shortcuts in the case one works in one context only, and another one only in
another. You can use this possibility also in translations, but please use it
only if no single shortcut that fits could be found.

Note also that there are already used global shortcuts (such as p k x c m s a)
and you should avoid using these characters for first-level menu shortcuts.

'$' and '%' are usually used as handlers for formatting or variables to be
inserted into the strings. Character sequences like %1$s or %1$d MUST also
appear in your translations! Please take them exactly as they are or you may
experience crashes when running LyX.

[[Context]] is used to distinguish otherwise identical strings, which could
have different translations depending on the Context. It can also be used to
indicate what is substituted for a placeholder. [[Context]] appears only in
msgid string and should not be repeated in the translated version.

{} refer to counters and must not be translated. An example would be:
msgid "Algorithm \\arabic{theorem}"
msgstr "Algoritmus \\arabic{theorem}"


5) WHAT IS pocheck.pl AND HOW DO I USE IT?

This is a small script located in the "po" directory of the source that helps
you find common errors in your translation. In order to use this script you
need the script language Perl installed.
Run ./pocheck.pl -h to see all possible switches.


6) HOW CAN I TEST MY TRANSLATION?

In order to test your translation you need to obtain the LyX sources
(from the git repository) and replace the existing .po with yours.
Afterwards, you should compile and optionally install LyX (check the
INSTALL file for your OS). Note that, as of LyX 2.1, it is not
necessary anymore to install anything.

In order to run LyX with your translation, change the current language
in Preferences dialog or use the appropriate LANG variable:

  On Linux: LANG=xx_CC lyx
  On Windows, you need to change the lyx.bat file and write: set LANG=xx_CC

xx stands for your language code. CC stands for your country code. So to get,
e.g., Czech, the code is "cs_CZ".

Another possibility is to use the Preferences dialog to set LyX UI to
use your language. Note that, as of LyX 2.2, a newly introduced
language will not appear in the languages combox unless it corresponds
to an entry of the lib/languages file that has a "HasGuiSupport true"
property. See this file for more details.

The most comfortable way to see your updated translation while
editing, is running (in linux) "make xx.gmo" in the po directory to
compile updated xx.po translation and then run LyX.

For advanced users - if you want to remerge your files against current source:

- on Linux: execute the command: make update-po
- on Windows: if you compile LyX in install mode, the po files are automatically
	updated and output to the folder <compilation output folder>\po
	Another option is to build the target "update-po" in MSVC.


7) HOW TO CONTRIBUTE MY WORK?

Send your edited xx.po file to po-updates@lyx.org.

Also you can check https://www.lyx.org/trac/browser/lyxgit/?rev=master to track
changes or watch updates.


8) SHALL ALL THE UNUSED STRINGS AT THE BOTTOM OF .PO FILE BE REMOVED,
   OR SHALL THEY STAY?

As you wish. They can be reused for generating fuzzy hints when completely
new strings appear, no other function.


9) CAN YOU EXPLAIN THE "FUZZY" HINT MORE EXPLICITELY?

In po files, strings are marked "fuzzy" if the po file generator (the program
gettext in our case) thinks there is a somewhat sensible translation, but a
Human translator needs to check and confirm that (by removing the "fuzzy"
mark). Fuzzy translations are treated as if they were not there, so the
translation is not used.

Fuzzy strings can be auto-generated if a new string is added where gettext
finds a similar enough translation to suggest a translation.

But also if an existing string is changed, its translation is set to "fuzzy"
(if the original string is similar enough to the previous version).

This is often so in the case of accelerators. Accelerators mark the keyboard
shortcut to access GUI elements. In LyX this is either marked by and ampersand
(S&earch: shows Search: and has the accelerator Alt+e) or, in menus, by a
suffix delimited by | (as in Search|e).

Since accelerators must be unique in a context, and of course the letter should
be part of a string, it is the task of translators to decide for an appropriate
accelerator in their localization. For instance, in German we might have Ma&rke
for English &Label.

As LyX develops, we need to change the accelerators in the English strings in
many cases to prevent shortcut clashes or adapt strings for coherence. So some
label "&Foo" is treated as a different (but similar enough) string that was
previously "F&oo" and hence you need to revisit this string. This makes sense
as well, as the accelerator in the translation might very welll be adapted to
the interface changes in your language, too.


10) REFERENCES

For a basic idea of how the translation works, you can look at

  https://en.wikipedia.org/wiki/Gettext

For detailed reference (including a full list of country and language codes),
have a look at

  https://www.gnu.org/software/gettext/manual/gettext.html


Consider subscribing to the documentation list, lyx-docs@lists.lyx.org (rather
silent), or the developer's mailing list, lyx-devel@lists.lyx.org (high
volume).



PART II - Translation of Math environments and Floats in the final output
-------------------------------------------------------------------------

As of 2.0 LyX allows automatic translation in tex/dvi/ps/pdf output for math
environment strings (and some floats) which are not automatically translated via
babel package to the localized form.  For example the environment "Exercise"
becomes "Aufgabe" in the output of the documents with language set to German.

These translations are taken from the previously translated .po file before the
final major LyX release (e.g. 2.0.0) and are fixed for all next minor releases
(e.g. 2.0.x) in order to have fixed output of LyX documents.

The current translation for your language can be found in the file
lib/layouttranslations. An easy way to check many of the translations is to
simply load lib/examples/localization_test.lyx in LyX and read its
instructions.

The problematic strings can be then fixed in the .po file. For inspiration the
typical places in .po files, where to fix the translation, can be seen on the
following commit: https://www.lyx.org/trac/changeset/bd8663130/lyxgit .

If you need to manually regenerate the layouttranslations file from .po files
- Under Linux: If using autotools, execute the command
 `make ../lib/layouttranslations'
 in the po directory. If using CMake, execute the command
 `make layouttranslations1'
 in the build directory.
 The Python polib library is needed for building the output file.
- Under Windows:
 1. install the Python extensions "polib". To do this,
 1.1 open a commen line prompt in the folder where you find the file "pip.exe"
     withing the python installation folder.
 1.2 execute the command
     pip install polib
 2. close the command prompt and open the file "lyx.sln" with MSVC. You find
    file in the compilation result folder you set for LyX
 3. right click in MSVC on the target "layouttranslations1" and choose "Rebuild"

Optionally - to quickly check whether some new translatable strings appeared
for your language you can always check ../lib/layouttranslations.review.

Q: Running make ../lib/layouttranslations returns with just saying
   ../lib/layouttranslations is up to date.
A: To force regerenation, use something like (XX is your language)
   make -W XX.po ../lib/layouttranslations
