|
|
|
---
|
|
|
|
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())
|
|
|
|
```
|
|
|
|
|
|
|
|
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
|
|
|
|
```
|