检查gettext语言是否可用

时间:2013-08-21 19:48:34

标签: php localization gettext

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

  1. 当目录结构为de_DE
  2. 时,为什么语言环境代码locales/de/LC_MESSAGES/file.po有效?
  3. 如何检查是否安装了区域设置?例如如果我想使用de_DE.utf8,但这不可用,那么我必须回退到de_DE,或zh_HK不可用,所以我想回退到zh_CN。我知道这些是边缘情况,但我想使代码尽可能健壮。为了澄清,这是因为系统上的语言环境是可用的(如使用locale -a命令所示),而不是文件在系统中可用。
  4. 此外,在多个平台上进行此项工作的最佳做​​法是什么?我目前的代码是:

    $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);
    

1 个答案:

答案 0 :(得分:0)

  
      
  1. 当目录结构为时,为什么语言环境代码de_DE有效   区域设置/ DE / LC_MESSAGES / file.po
  2.   

我认为这是一个后备。我正在初始化我的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命令),如果文件在   系统。
  2.   

我认为他们不是边缘案件。在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/