如何将浏览器区域设置映射到我的一个php gettext i18n区域设置?
我已经开始使用gettext来翻译我的站点。到目前为止,我已经将主要菜单和标题翻译成法语、西班牙语和葡萄牙语 我的文件夹结构如下所示:如何将浏览器区域设置映射到我的一个php gettext i18n区域设置?,php,internationalization,locale,Php,Internationalization,Locale,我已经开始使用gettext来翻译我的站点。到目前为止,我已经将主要菜单和标题翻译成法语、西班牙语和葡萄牙语 我的文件夹结构如下所示: .../locale /en_GB.utf8 /LC_MESSAGES messages.po messages.mo /fr_FR.utf8 /LC_MESSAGES messages.po messages.mo
.../locale
/en_GB.utf8
/LC_MESSAGES
messages.po
messages.mo
/fr_FR.utf8
/LC_MESSAGES
messages.po
messages.mo
/es_ES.utf8
/LC_MESSAGES
messages.po
messages.mo
/pt_PT.utf8
/LC_MESSAGES
messages.po
messages.mo
我可以获得用户的默认浏览器区域设置,如下所示:
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
如果他们的语言环境是en\u GB
,fr\u fr
,es\u es
或pt\u pt
这非常有效,我只需在语言环境中附加.utf8
,我就可以开始了
但可能根本不设置区域设置。嗯,好的,我们将添加以下内容:
if (!$locale) {
$locale = 'en_GB';
}
但我知道,区域设置可能只是fr
(也可能是fr
?)。没问题,这会抓住大多数人:
if (strlen($locale)==2) {
$locale = strtolower($locale).'_'.strtoupper($locale);
}
好的。但是代码开始增加,现在我看到显然french
是一个有效的语言环境。可能还有无数我不知道的奇怪的边缘案例
正确的方法是什么
在查看文档时,人们可能会认为Locale::lookup
可以得到答案,但遗憾的是,答案不是:
var_dump(Locale::lookup(['en_GB','fr_FR','es_ES','pt_PT'], 'fr')); // ''
var_dump(Locale::lookup(['en_GB','fr_FR','es_ES','pt_PT'], 'fr_FR')); // 'fr_FR'
var_dump(Locale::lookup(['en_GB','fr_FR','es_ES','pt_PT'], 'fr_CA')); // ''
var_dump(Locale::lookup(['en_GB','fr_FR','es_ES','pt_PT'], 'french')); // ''
var_dump(Locale::lookup(['en','fr','es','pt'], 'fr')); // 'fr'
var_dump(Locale::lookup(['en','fr','es','pt'], 'fr_FR')); // 'fr'
var_dump(Locale::lookup(['en','fr','es','pt'], 'fr_CA')); // 'fr'
var_dump(Locale::lookup(['en','fr','es','pt'], 'french')); // ''