PHP gettext()没有依赖setlocale

时间:2014-06-13 08:01:20

标签: php localization internationalization gettext

目前我需要在翻译功能上设置和恢复区域设置,因为全局使用setlocale会影响我们系统的其他部分(即遗留代码)

所以我们需要使用..

function translate($text, $locale) {

    $original = getenv('LC_ALL');

    putenv('LC_ALL=' . $locale);
    setlocale(LC_ALL, $locale);

    $translated = _("text);

    putenv('LC_ALL=' . $original);
    setlocale(LC_ALL, $original);

    return $translated;
}

还有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

不要使用LC_ALL,只需使用LC_MESSAGES即可。虽然设置LC_ALL当然会有效,但因为它会全局设置语言,所以只设置LC_MESSAGES就足够了 - 只有这个变量用于翻译:

setlocale(LC_ALL, "en_US");
setlocale(LC_MESSAGES, "cs_CZ");
_("something") # you will get czech translation now, even if globally you use EN

因此,如果您的旧代码可以正确设置LC_MESSAGES,那么您就可以了。

有关每个LC_*变量的详细信息,请参阅http://us2.php.net//manual/en/function.setlocale.php

答案 1 :(得分:1)

我认为这是正确的方法。 几年前我遇到了同样的问题。

这是我的代码,类似于你的代码:

// Translate
$_SESSION['locale'] = $locale;
\Application::GetInstance()->getLocaleManager()->refresh();
$output["data"][] = array(
    "text" => utf8_encode($menuItem->getLibelle()),
    "lang" => utf8_encode(ucfirst($localeName)),
    "translation" => utf8_encode(_($menuItem->getLibelle()))
);
// Restore lang
$_SESSION['locale'] = "fr";
\Application::GetInstance()->getLocaleManager()->refresh();

refresh()正在执行:

  • \地点:: setDefault($区域)
  • 的setlocale(...)
  • 运行putenv( “LANG =” $区域设置。); //在Windows环境中必需
  • 运行putenv( “LANGUAGE =” $区域设置。); //在Windows环境中必需

答案 2 :(得分:1)

您应该从LANG环境变量中提取语言环境,因为可能未设置LC_ALL。这可能不是Windows兼容的,如果您需要它让我知道,我会更新它。


//default locale to use when all else fails
define('DEFAULT_LANG',    'en_US.UTF-8');

/**
 * returns the current locale based on the LANG environment variable. 
 * Only calls getenv() once, after that uses a cached value.  remove the static 
 * keyword to disable this functionality.
 * 
 * @return string returns the current locale, or DEFAULT_LANG on error.
 */
function get_lang() {
  static $lang; //static variable, so the resulting call to getenv() only fire once
  if (!isset($lang) || $lang=="") { 
    $lang = getenv('LANG');
    if (trim($lang)=='')
      $lang = DEFAULT_LANG;    
  }
  return $lang;
}

/**
 * @param string $text string to translate
 * @param string $locale locale to translate to, i.e. de_DE
 * @param boolean $provideFallback - provide the original local as a fallback if locale is not     recognized
 * @return boolean|string returns $text translated to $locale, or FALSE on error. 
 */
function translate($text, $locale, $provideFallback = FALSE, $resetLocale = TRUE) {
  if ((empty($locale) || trim($locale)=='') && !$provideFallback) 
    return FALSE;
  if (empty($text))
    return $text;

  $original = get_lang();

  //provide a fallback locale in case $locale is not recognized.
  if ($provideFallback) {
    $l = strval($locale);
    if (empty($locale) || trim($locale)=='')
      $l = $original; //set locale to the original locale, since none was provided.
    $locale = array($l, $original, DEFAULT_LANG);
  }

  setlocale(LC_ALL, $locale);
  $translated = _($text);
  if ($resetLocale) {
    setlocale(LC_ALL, $original);
  }
  return $translated;
}


echo get_lang().PHP_EOL;
echo translate("test1", "de_DE.UTF-8") . PHP_EOL;
echo translate("test2", "de_DE.UTF-8") . PHP_EOL;

答案 3 :(得分:0)

也许php-gettext是一个选项?它是gettext功能的纯PHP实现。它的gettext_reader类可以读取gettext .mo文件,而不依赖于语言环境功能或任何其他全局状态。 (php-gettext也可以提供标准PHP gettext API的替代品,但这看起来相当丑陋/危险。)

免责声明:从未在生产中实际使用过它。