2

在最近遇到了一些问题之后gettext,我对它的工作原理以及将来如何避免这些问题提出了几个问题。
我的问题是我试图将语言环境设置为de,而不是de_DE,这在服务器上不可用。我的本地副本正在使用php-gettext包(包是正确的术语吗?),因此很高兴使用系统上没有的语言环境。这产生了2个问题:

  1. 当目录de_DE结构为locales/de/LC_MESSAGES/file.po
  2. 如何检查是否安装了语言环境?例如,如果我想使用de_DE.utf8,但它不可用,所以我必须回退到de_DE,或者zh_HK不可用所以我想回退到zh_CN。我知道这些是边缘情况,但我想让代码尽可能健壮。澄清一下,这是系统上是否有区域设置(如使用locale -a命令所示),而不是系统中是否有文件。

另外,在多个平台上进行这项工作的最佳实践是什么?我目前的代码是:

$localeCode = 'de_DE'; // Example, would be generated
putenv('LANG=' . $localeCode);
putenv('LANGUAGE=' . $localeCode);
setlocale(LC_ALL, $localeCode);

$domain = 'mydomain'; // Again, example
// Don't load the locale from the cache
bindtextdomain($domain, '../locales/nocache');
bindtextdomain($domain, '../locales');
bind_textdomain_codeset($domain, 'UTF-8');

textdomain($domain);
4

1 回答 1

0
  1. 当目录结构为 locales/de/LC_MESSAGES/file.po 时,为什么语言环境代码 de_DE 起作用

我认为这是一个后备。我正在通过以下方式初始化我的gettext:

$localeCode = 'en_US.utf8';       //<----
putenv('LANG=' . $localeCode);
putenv('LANGUAGE=' . $localeCode);

但我只有 en_US 目录,它工作得很好。

  1. 如何检查是否安装了语言环境?例如,如果我想使用 de_DE.utf8,但它不可用,所以我必须回退到 de_DE,或者 zh_HK 不可用,所以我想回退到 zh_CN。我知道这些是边缘情况,但我想让代码尽可能健壮。澄清一下,这是系统上的区域设置是否可用(如使用 locale -a 命令所示),而不是系统中文件是否可用。

我认为它们不是边缘情况。在 linux 系统上,您可以通过执行列出所有语言环境locale -a我认为 php 中没有此功能,但我为您找到了这个解决方案:

$locale_data = array();

//Get locales from Linux terminal command locale
$locales = shell_exec('locale -a');

$locales = explode("n" , $locales);

foreach($locales as $c => $l)
{
    if(strlen($l))
    {
        $parts = explode('.' , $l);
        $lc = $parts[0];

        list($lcode , $ccode) = explode('_' , $lc);

        $lcode = strtolower($lcode);

        $language = $language_codes[$lcode];
        $country = $country_codes[$ccode];

        if(strlen($language) and strlen($country))
        {
            $locale_data[$l] = "$language - $country - {$parts[1]}";
        }
    }
}

print_r($locale_data);

有关更多信息,您应该访问此页面: http: //www.binarytides.com/php-get-list-of-locales-installed-on-system/

于 2013-08-27T13:49:05.687 回答