Load theme translations files automatically
Fixes #1077 Take a look at the docs update to see how it works
This commit is contained in:
parent
ddd3c19f43
commit
68c6afc56f
6 changed files with 98 additions and 2 deletions
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
BIN
tests/utils/customtpl/dummy/language/fr/LC_MESSAGES/dummy.mo
Normal file
BIN
tests/utils/customtpl/dummy/language/fr/LC_MESSAGES/dummy.mo
Normal file
Binary file not shown.
16
tests/utils/customtpl/dummy/language/fr/LC_MESSAGES/dummy.po
Normal file
16
tests/utils/customtpl/dummy/language/fr/LC_MESSAGES/dummy.po
Normal 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"
|
Loading…
Reference in a new issue