$this->translator->setLanguage($this->language);
$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) {
if ($domain !== self::DEFAULT_DOMAIN) {
$this->translator->loadDomain($domain, $translationPath, false);
$translations = new Translations();
// Core translations
try {
- /** @var Translations $translations */
$translations = $translations->addFromPoFile('inc/languages/'. $this->language .'/LC_MESSAGES/shaarli.po');
$translations->setDomain('shaarli');
$this->translator->loadTranslations($translations);
} 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.).
foreach ($this->conf->get('translation.extensions', []) as $domain => $translationPath) {
}
try {
- /** @var Translations $extension */
$extension = Translations::fromPoFile($translationPath . $this->language .'/LC_MESSAGES/'. $domain .'.po');
$extension->setDomain($domain);
$this->translator->loadTranslations($extension);
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
If you're writing a custom theme, or a non official plugin, you might want to use the translation system,
$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
*/
$this->assertEquals('voiture', t($txt, $txt, 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'));
+ }
}
--- /dev/null
+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"