| --- |
| short-description: Localization with GNU Gettext |
| ... |
| |
| # Localisation |
| |
| Localising your application with GNU gettext takes a little effort but |
| is quite straightforward. We'll create a `po` subdirectory at your |
| project root directory for all the localisation info. |
| |
| ## Generating .pot and .po files |
| |
| In your main meson.build file include the `po` subdirectory in the build process. |
| |
| subdir('po') |
| |
| In this `po` subdirectory we need: |
| - `LINGUAS`: Space separated list of languages |
| - `POTFILES`: List of source files to scan for translatable strings. |
| - `meson.build`: Localization specific Meson file |
| |
| ### LINGUAS |
| |
| File with space separated list of languages. A sample LINGUAS might look like this. |
| |
| aa ab ae af |
| |
| ### POTFILES |
| |
| File that lists all the source files that gettext should scan in order |
| to find strings to translate. The syntax of the file is one line per |
| source file and the line must contain the relative path from source |
| root. A sample POTFILES might look like this. |
| |
| src/file1.c |
| src/file2.c |
| src/subdir/file3.c |
| include/mything/somefile.h |
| |
| ### meson.build |
| |
| Localization specific Meson file. It imports and uses the `i18n` |
| module. If not defined before it needs to define the `GETTEXT_PACKAGE` |
| global. |
| |
| ```meson |
| i18n = import('i18n') |
| # define GETTEXT_PACKAGE |
| add_project_arguments('-DGETTEXT_PACKAGE="intltest"', language:'c') |
| i18n.gettext(meson.project_name(), |
| args: '--directory=' + meson.source_root() |
| ) |
| ``` |
| |
| The first command imports the `i18n` module that provides gettext |
| features. The fourth line does the actual invocation. The first |
| argument is the gettext package name. This causes two things to |
| happen. The first is that Meson will generate binary mo files and put |
| them to their proper locations when doing an install. The second is |
| that it creates a build rule to regenerate the main pot file. If you |
| are using the Ninja backend, this is how you would invoke the rebuild. |
| |
| ### generate .pot file |
| |
| Then we need to generate the main pot file. The potfile can have any |
| name but is usually the name of the gettext package. Let's say the |
| project is called *intltest*. In this case the corresponding pot file |
| would be called `intltest.pot`. |
| |
| Run the following command from your build folder to generate the pot |
| file. It is recommended to inspect it manually afterwards and fill in |
| e.g. proper copyright and contact information. |
| |
| ```console |
| $ meson compile intltest-pot |
| ``` |
| |
| ### generate .po files |
| |
| For each language listed in the array above we need a corresponding |
| `.po` file. Those can be generated by running the following command |
| from your build folder. |
| |
| ```console |
| $ meson compile intltest-update-po |
| ``` |