目前我需要在翻译功能上设置和恢复区域设置,因为全局使用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;
}
还有更好的方法吗?
答案 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()正在执行:
答案 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的替代品,但这看起来相当丑陋/危险。)
免责声明:从未在生产中实际使用过它。