i18n/gettext : Web 应用程序中的 setlocale 配置
所以我开始摆弄 gettext
但我仍然对某些事情感到困惑,如果有人能帮助我并填补我的空白,那就太好了。
通常大多数实现只是根据语言参数调用
setlocale
。是否有任何情况需要使用putenv
,也许是 Windows 设置上的边缘情况?我的 php 框架的默认语言是英语,UTF-8 - 因此我将
LC_ALL
设置为en_US.utf-8
,因为en_US< /code> 是 ISO-8859-1/Latin1 ,显然这不像 UTF-8 那样支持?
调用
setlocale(LC_ALL, 'en_US.utf-8')
后是否有我应该了解的问题?由于它改变了所有这些:LC_COLLATE、LC_CTYPE、LC_MONETARY、LC_NUMERIC、LC_TIME 和 LC_MESSAGES
- 我是否必须更新任何脚本,例如生成时间或类似内容的脚本假设新配置的服务器没有配置
es_ES.utf-8
语言环境,我知道如何生成语言环境,但如果它不可用,那么我应该在大批?如果有人可以提供一个实际的例子,例如:setlocale( LC_ALL, array('es_ES.UTF-8', 'es_ES', 'es') )
是否有某种网站提供此类示例,或者人们通常会自己提出优先级排序?
我在某处读到,
locale
或i18n
文件夹的通常结构如下所示。结构真的很重要吗?似乎所有发生的事情都是当您执行
bindtextdomain('messages', 'locale')
时,它会递归地在该目录中搜索messages.mo
,我可能没有注意到,但是它可能会考虑目录。
我对结构应该有多严格?
locale
en_US
LC_MESSAGES
messages.po
es_ES
LC_MESSAGES
messages.po
6. 我是否应该尝试测试系统是否确实支持该语言环境?因为例如,如果服务器没有区域设置,并且我尝试使用 setlocale 设置它,它不会出错或出现任何问题,它只会默默地让它过去。
So I started messing around with gettext
but I'm still puzzled about certain things, would be great if anyone could help me out and fill in the gaps for me.
Usually most of the implementations just invoke
setlocale
based on a language parameter. Is there any case in which I need to useputenv
, perhaps for edge cases on Windows setups?The default language for my php framework is English, UTF-8 - so I'd set
LC_ALL
toen_US.utf-8
, sinceen_US
is ISO-8859-1/Latin1 and obviously that's not as supportive as UTF-8?Are there any gotchas I should know about after invoking
setlocale(LC_ALL, 'en_US.utf-8')
? Since it changes all of these:LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME, and LC_MESSAGES
- will I have to update any scripts for example, that generate time or something like that?Let's say for example a freshly configured server did not have
es_ES.utf-8
locale configured, I know how to generate the locale but if it wasn't available then should I provide backups in an array? Would be great if someone could provide a practical example, like:setlocale( LC_ALL, array('es_ES.UTF-8', 'es_ES', 'es') )
Is there some sort of website that offers examples such as this, or do people usually come up with the priority ordering themselves?
I read somewhere that the usual structure of the
locale
ori18n
folder is something like below.Does the structure really matter? It seems like all that's happening is when you do
bindtextdomain('messages', 'locale')
it recursively searches that directory formessages.mo
, I might not be noticing but it might be taking the directories into account.
How strict should I be with the structure?
locale
en_US
LC_MESSAGES
messages.po
es_ES
LC_MESSAGES
messages.po
6. Should I even bother with trying to test whether the system actually supports the locale or not? Because for example, if a server didn't have a locale and I attempted to set it with setlocale
it wouldn't error out or anything, it would just silently let it go by.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这不是对你的问题的合格答案,我并不是说使用 gettext 不好 - 我从来没有足够多地使用它来对它有一个真正深刻的看法 - 但我决定不理会 gettext因为它的复杂性和在不同地区不同平台上的巨大不可预测性。我发布了一个寻找替代方案的问题此处,虽然有周围并不多,Zend_translate 包似乎值得一看。我自己还没有抽出时间来做这件事。
如果您使用 gettext,请务必查看关于 Gettext 的 PHP 手册用户贡献注释。
This is not a qualified answer to your question, and I'm not saying using gettext is bad - I never worked enough with it to have a really deep opinion on it - but I decided to leave gettext alone because of its complexity and massive unpredictability on different platforms with different locales. I posted a question looking for alternatives here and while there is not really much around, the Zend_translate package seems to be worth a look. I haven't got around to it myself yet.
If you work with gettext, be sure to check out the PHP Manual User Contributed Notes on Gettext.