namespace Shaarli;
use Gettext\GettextTranslator;
-use Gettext\Merge;
use Gettext\Translations;
use Gettext\Translator;
use Gettext\TranslatorInterface;
/**
* Core translations domain
*/
- const DEFAULT_DOMAIN = 'shaarli';
+ public const DEFAULT_DOMAIN = 'shaarli';
/**
* @var TranslatorInterface
/**
* Languages constructor.
*
- * @param string $language lang determined by autoLocale(), can be override.
+ * @param string $language lang determined by autoLocale(), can be overridden.
* @param ConfigManager $conf instance.
*/
public function __construct($language, $conf)
{
$this->conf = $conf;
$confLanguage = $this->conf->get('translation.language', 'auto');
+ // Auto mode or invalid parameter, use the detected language.
+ // If the detected language is invalid, it doesn't matter, it will use English.
if ($confLanguage === 'auto' || ! $this->isValidLanguage($confLanguage)) {
$this->language = substr($language, 0, 5);
} else {
$this->language = $confLanguage;
}
- if (! extension_loaded('gettext')
+ if (
+ ! extension_loaded('gettext')
|| in_array($this->conf->get('translation.mode', 'auto'), ['auto', 'php'])
) {
$this->initPhpTranslator();
/**
* Initialize the translator using php gettext extension (gettext dependency act as a wrapper).
*/
- protected function initGettextTranslator ()
+ protected function initGettextTranslator()
{
$this->translator = new GettextTranslator();
$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 = $translations->addFromPoFile(
+ 'inc/languages/' . $this->language . '/LC_MESSAGES/shaarli.po'
+ );
$translations->setDomain('shaarli');
$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.).
foreach ($this->conf->get('translation.extensions', []) as $domain => $translationPath) {
}
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);
$this->translator->loadTranslations($extension);
- } catch (\InvalidArgumentException $e) {}
+ } catch (\InvalidArgumentException $e) {
+ }
}
}
{
return preg_match('/^[a-z]{2}(_[A-Z]{2})?/', $language) === 1;
}
+
+ /**
+ * Get the list of available languages for Shaarli.
+ *
+ * @return array List of available languages, with their label.
+ */
+ public static function getAvailableLanguages()
+ {
+ return [
+ 'auto' => t('Automatic'),
+ 'de' => t('German'),
+ 'en' => t('English'),
+ 'fr' => t('French'),
+ 'jp' => t('Japanese'),
+ 'ru' => t('Russian'),
+ ];
+ }
}