3cfc2ec7bd
misc/translator/translate was doing three different things: - extract translatable strings - create or update PO files - install translated templates This patch separates responsibilities by moving the string extraction code into several 'xgettext-like' scripts and adds gulp tasks to automate string extraction and PO files update This has several benefits: - gulp runs tasks in parallel, so it's a lot faster (updating all PO files is at least 10 times faster with my 4-cores CPU) - there is no need for $KOHA_CONF to be defined LangInstaller.pm relied on $KOHA_CONF to get the different paths needed. I'm not sure why, since string extraction and PO update should work on source files, not installed files - string extraction code can be more easily tested This patch also brings a couple of fixes and improvements: - TT string extraction (strings wrapped in [% t(...) %]) was done with Template::Parser and PPI, which was extremely slow, and had some problems (see bug 24797). This is now done with Locale::XGettext::TT2 (new dependency) which is a lot faster, and fixes bug 24797 - Fix header in 4 PO files For backward compatibility, 'create' and 'update' commands of misc/translator/translate can still be used and will execute the corresponding gulp task Test plan: 1. Run `yarn install` and install Locale::XGettext::TT2 2. Run `gulp po:update` 3. Verify the contents of updated PO files 4. Run `cd misc/translator && ./translate install <lang>` 5. Verify that all (templates, sysprefs, xslt, installer files) is correctly translated 6. Run `gulp po:create --lang <lang>` and verify that it created all PO files for that language 7. Run `prove t/misc/translator` Signed-off-by: Bernardo Gonzalez Kriegel <bgkriegel@gmail.com> Need to install yarn & gulp, no errors Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
121 lines
3.6 KiB
Markdown
121 lines
3.6 KiB
Markdown
# Internationalization
|
|
|
|
This page documents how internationalization works in Koha.
|
|
|
|
## Making strings translatable
|
|
|
|
There are several ways of making a string translatable, depending on where it
|
|
is located
|
|
|
|
### In Template::Toolkit files (`*.tt`)
|
|
|
|
The simplest way to make a string translatable in a template is to do nothing.
|
|
Templates are parsed as HTML files and almost all text nodes are considered as
|
|
translatable strings. This also includes some attributes like `title` and
|
|
`placeholder`.
|
|
|
|
This method has some downsides: you don't have full control over what would
|
|
appear in PO files and you cannot use plural forms or context. In order to do
|
|
that you have to use `i18n.inc`
|
|
|
|
`i18n.inc` contains several macros that, when used, make a string translatable.
|
|
The first thing to do is to make these macros available by adding
|
|
|
|
[% PROCESS 'i18n.inc' %]
|
|
|
|
at the top of the template file. Then you can use those macros.
|
|
|
|
The simplest one is `t(msgid)`
|
|
|
|
[% t('This is a translatable string') %]
|
|
|
|
You can also use variable substitution with `tx(msgid, vars)`
|
|
|
|
[% tx('Hello, {name}', { name = 'World' }) %]
|
|
|
|
You can use plural forms with `tn(msgid, msgid_plural, count)`
|
|
|
|
[% tn('a child', 'several children', number_of_children) %]
|
|
|
|
You can add context, to help translators when a term is ambiguous, with
|
|
`tp(msgctxt, msgid)`
|
|
|
|
[% tp('verb', 'order') %]
|
|
[% tp('noun', 'order') %]
|
|
|
|
Or any combinations of the above
|
|
|
|
[% tnpx('bibliographic record', '{count} item', '{count} items', items_count, { count = items_count }) %]
|
|
|
|
### In JavaScript files (`*.js`)
|
|
|
|
Like in templates, you have several functions available. Just replace `t` by `__`.
|
|
|
|
__('This is a translatable string');
|
|
__npx('bibliographic record, '{count} item', '{count} items', items_count, { count: items_count });
|
|
|
|
### In Perl files (`*.pl`, `*.pm`)
|
|
|
|
You will have to add
|
|
|
|
use Koha::I18N;
|
|
|
|
at the top of the file, and then the same functions as above will be available.
|
|
|
|
__('This is a translatable string');
|
|
__npx('bibliographic record, '{count} item', '{count} items', $items_count, count => $items_count);
|
|
|
|
### In installer and preferences YAML files (`*.yml`)
|
|
|
|
Nothing special to do here. All strings will be automatically translatable.
|
|
|
|
## Manipulating PO files
|
|
|
|
Once strings have been made translatable in source files, they have to be
|
|
extracted into PO files and uploaded on https://translate.koha-community.org/
|
|
so they can be translated.
|
|
|
|
### Install gulp first
|
|
|
|
The next sections rely on gulp. If it's not installed, run the following
|
|
commands:
|
|
|
|
# as root
|
|
npm install gulp-cli -g
|
|
|
|
# as normal user, from the root of Koha repository
|
|
yarn
|
|
|
|
### Create PO files for a new language
|
|
|
|
If you want to add translations for a new language, you have to create the
|
|
missing PO files. You can do that by executing the following command:
|
|
|
|
# Replace xx-XX by your language tag
|
|
gulp po:create --lang xx-XX
|
|
|
|
New PO files will be available in `misc/translator/po`.
|
|
|
|
### Update PO files with new strings
|
|
|
|
When new features or bugfixes are added to Koha, new translatable strings can
|
|
be added, other can be removed or modified, and the PO file become out of sync.
|
|
|
|
To be able to translate the new or modified strings, you have to update PO
|
|
files. This can be done by executing the following command:
|
|
|
|
# Update PO files for all languages
|
|
gulp po:update
|
|
|
|
# or only one language
|
|
gulp po:update --lang xx-XX
|
|
|
|
### Only extract strings
|
|
|
|
Creating or updating PO files automatically extract strings, but if for some
|
|
reasons you want to only extract strings without touching PO files, you can run
|
|
the following command:
|
|
|
|
gulp po:extract
|
|
|
|
POT files will be available in `misc/translator`.
|