2012-08-22 63 views
1

我似乎无法得到这个权利,也没有理解它。gettext和locale

我有这样的代码:

putenv('LC_ALL=eng_US.UTF-8'); 
var_dump(setlocale(LC_ALL, 'eng_US.UTF-8', 'eng_US')); 

输出在Windows

string 'English_United States.1252' (length=26) 

输出在Linux上

bool(false) 

Linux下正常工作与EN_US,而不是Windows。 Windows查看文件夹eng_US和Linux en_US。

有没有人找到解决方案?或者有没有办法将一个自定义的字符串,不管操作系统,将被考虑到?

(我必须补充,我使用WAMP在Windows-7和Linux机器是nginx的+ PHP-FPM一个CentOS)

回答

2

语言环境的名称依赖于平台。

在大多数unix系统上,你想要<two letter language code>_<two letter country code>[.<optional encoding>]。您可以使用命令行locale -a列出有效的区域设置名称。

正确的Windows语言环境使用相同的X_X [.X]方案,只是它们使用语言和国家的全名,并且使用代码页码而不是编码名称:English_United States.1252。对于找出其他字符串,Windows似乎也有一些启发式,尽管它似乎没有像Unix风格的区域名称一样工作。此外,Windows不支持UTF-8作为区域设置编码,无论您是使用名称'UTF-8'还是使用代码页编号'65001'来指定它。

正如您已经发现Windows和其他平台的语言环境名称不同。您不能在所有平台上使用相同的字符串。相反,您必须编写使用当前平台的正确字符串的代码。

if Linux 
    return "en_US.UTF-8" 
if Windows 
    return "English_United States.1252" 
+0

什么是检测平台的最佳方法?我能否使用相同的文件夹语言名称? – Manhim

+0

我并不熟悉PHP,所以我不知道。我只知道地区和东西。 – bames53

+0

好吧,我发现了PHP_OS常量,并将使用此方法。 – Manhim