Load theme translations files automatically

Fixes #1077

Take a look at the docs update to see how it works
This commit is contained in:
ArthurHoaro 2018-02-26 22:53:00 +01:00
parent ddd3c19f43
commit 68c6afc56f
6 changed files with 98 additions and 2 deletions

View file

@ -98,6 +98,12 @@ protected function initGettextTranslator ()
$this->translator->setLanguage($this->language); $this->translator->setLanguage($this->language);
$this->translator->loadDomain(self::DEFAULT_DOMAIN, 'inc/languages'); $this->translator->loadDomain(self::DEFAULT_DOMAIN, 'inc/languages');
// Default extension translation from the current theme
$themeTransFolder = rtrim($this->conf->get('raintpl_tpl'), '/') .'/'. $this->conf->get('theme') .'/language';
if (is_dir($themeTransFolder)) {
$this->translator->loadDomain($this->conf->get('theme'), $themeTransFolder, false);
}
foreach ($this->conf->get('translation.extensions', []) as $domain => $translationPath) { foreach ($this->conf->get('translation.extensions', []) as $domain => $translationPath) {
if ($domain !== self::DEFAULT_DOMAIN) { if ($domain !== self::DEFAULT_DOMAIN) {
$this->translator->loadDomain($domain, $translationPath, false); $this->translator->loadDomain($domain, $translationPath, false);
@ -116,12 +122,23 @@ protected function initPhpTranslator()
$translations = new Translations(); $translations = new Translations();
// Core translations // Core translations
try { try {
/** @var Translations $translations */
$translations = $translations->addFromPoFile('inc/languages/'. $this->language .'/LC_MESSAGES/shaarli.po'); $translations = $translations->addFromPoFile('inc/languages/'. $this->language .'/LC_MESSAGES/shaarli.po');
$translations->setDomain('shaarli'); $translations->setDomain('shaarli');
$this->translator->loadTranslations($translations); $this->translator->loadTranslations($translations);
} catch (\InvalidArgumentException $e) {} } catch (\InvalidArgumentException $e) {}
// Default extension translation from the current theme
$theme = $this->conf->get('theme');
$themeTransFolder = rtrim($this->conf->get('raintpl_tpl'), '/') .'/'. $theme .'/language';
if (is_dir($themeTransFolder)) {
try {
$translations = Translations::fromPoFile(
$themeTransFolder .'/'. $this->language .'/LC_MESSAGES/'. $theme .'.po'
);
$translations->setDomain($theme);
$this->translator->loadTranslations($translations);
} catch (\InvalidArgumentException $e) {}
}
// Extension translations (plugins, themes, etc.). // Extension translations (plugins, themes, etc.).
foreach ($this->conf->get('translation.extensions', []) as $domain => $translationPath) { foreach ($this->conf->get('translation.extensions', []) as $domain => $translationPath) {
@ -130,7 +147,6 @@ protected function initPhpTranslator()
} }
try { try {
/** @var Translations $extension */
$extension = Translations::fromPoFile($translationPath . $this->language .'/LC_MESSAGES/'. $domain .'.po'); $extension = Translations::fromPoFile($translationPath . $this->language .'/LC_MESSAGES/'. $domain .'.po');
$extension->setDomain($domain); $extension->setDomain($domain);
$this->translator->loadTranslations($extension); $this->translator->loadTranslations($extension);

View file

@ -76,6 +76,18 @@ Then click on the "Update" button, and you can start to translate every availabl
Save when you're done, then you can submit a pull request containing the new `shaarli.po`. Save when you're done, then you can submit a pull request containing the new `shaarli.po`.
### Theme translations
Theme translation extensions are loaded automatically if they're present.
As a theme developer, all you have to do is to add the `.po` and `.mo` compiled file like this:
tpl/<theme name>/language/<lang>/LC_MESSAGES/<theme name>.po
tpl/<theme name>/language/<lang>/LC_MESSAGES/<theme name>.mo
Where `<lang>` is the ISO 3166-1 alpha-2 language code.
Read the following section "Extend Shaarli's translation" to learn how to generate those files.
### Extend Shaarli's translation ### Extend Shaarli's translation
If you're writing a custom theme, or a non official plugin, you might want to use the translation system, If you're writing a custom theme, or a non official plugin, you might want to use the translation system,

View file

@ -175,6 +175,32 @@ public function testTranslateWithInvalidAutoLanguagePhp()
$this->assertEquals($text, t($text)); $this->assertEquals($text, t($text));
} }
/**
* Test t() with an extension language file coming from the theme in gettext mode
*/
public function testTranslationThemeExtensionGettext()
{
$this->conf->set('translation.mode', 'gettext');
$this->conf->set('raintpl_tpl', 'tests/utils/customtpl/');
$this->conf->set('theme', 'dummy');
new Languages('en', $this->conf);
$txt = 'rooster'; // ignore me poedit
$this->assertEquals('rooster', t($txt, $txt, 1, 'dummy'));
}
/**
* Test t() with an extension language file coming from the theme in PHP mode
*/
public function testTranslationThemeExtensionPhp()
{
$this->conf->set('translation.mode', 'php');
$this->conf->set('raintpl_tpl', 'tests/utils/customtpl/');
$this->conf->set('theme', 'dummy');
new Languages('en', $this->conf);
$txt = 'rooster'; // ignore me poedit
$this->assertEquals('rooster', t($txt, $txt, 1, 'dummy'));
}
/** /**
* Test t() with an extension language file in gettext mode * Test t() with an extension language file in gettext mode
*/ */

View file

@ -172,4 +172,30 @@ public function testTranslationExtensionPhp()
$this->assertEquals('voiture', t($txt, $txt, 1, 'test')); $this->assertEquals('voiture', t($txt, $txt, 1, 'test'));
$this->assertEquals('Fouille', t('Search', 'Search', 1, 'test')); $this->assertEquals('Fouille', t('Search', 'Search', 1, 'test'));
} }
/**
* Test t() with an extension language file coming from the theme in gettext mode
*/
public function testTranslationThemeExtensionGettext()
{
$this->conf->set('translation.mode', 'gettext');
$this->conf->set('raintpl_tpl', 'tests/utils/customtpl/');
$this->conf->set('theme', 'dummy');
new Languages('en', $this->conf);
$txt = 'rooster'; // ignore me poedit
$this->assertEquals('coq', t($txt, $txt, 1, 'dummy'));
}
/**
* Test t() with an extension language file coming from the theme in PHP mode
*/
public function testTranslationThemeExtensionPhp()
{
$this->conf->set('translation.mode', 'php');
$this->conf->set('raintpl_tpl', 'tests/utils/customtpl/');
$this->conf->set('theme', 'dummy');
new Languages('en', $this->conf);
$txt = 'rooster'; // ignore me poedit
$this->assertEquals('coq', t($txt, $txt, 1, 'dummy'));
}
} }

View file

@ -0,0 +1,16 @@
msgid ""
msgstr ""
"Project-Id-Version: Theme extension test\n"
"POT-Creation-Date: 2017-05-20 13:54+0200\n"
"PO-Revision-Date: 2018-03-26 19:09+0200\n"
"Last-Translator: \n"
"Language-Team: Shaarli\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 2.0.6\n"
msgid "rooster"
msgstr "coq"