Skip to content

Commit

Permalink
Merge pull request #1093 from ArthurHoaro/feature/theme-translation
Browse files Browse the repository at this point in the history
Load theme translations files automatically
  • Loading branch information
ArthurHoaro authored Mar 26, 2018
2 parents 838ef8a + 68c6afc commit 9b2bd66
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 2 deletions.
20 changes: 18 additions & 2 deletions application/Languages.php
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,12 @@ protected function initGettextTranslator ()
$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);
Expand All @@ -116,12 +122,23 @@ protected function initPhpTranslator()
$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) {
Expand All @@ -130,7 +147,6 @@ protected function initPhpTranslator()
}

try {
/** @var Translations $extension */
$extension = Translations::fromPoFile($translationPath . $this->language .'/LC_MESSAGES/'. $domain .'.po');
$extension->setDomain($domain);
$this->translator->loadTranslations($extension);
Expand Down
12 changes: 12 additions & 0 deletions doc/md/Translations.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.

### 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,
Expand Down
26 changes: 26 additions & 0 deletions tests/LanguagesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,32 @@ public function testTranslateWithInvalidAutoLanguagePhp()
$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
*/
Expand Down
26 changes: 26 additions & 0 deletions tests/languages/fr/LanguagesFrTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -172,4 +172,30 @@ public function testTranslationExtensionPhp()
$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'));
}
}
Binary file not shown.
16 changes: 16 additions & 0 deletions tests/utils/customtpl/dummy/language/fr/LC_MESSAGES/dummy.po
Original file line number Diff line number Diff line change
@@ -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"

0 comments on commit 9b2bd66

Please sign in to comment.