23天:国际化
以前在symfonyob娱乐下载
现在,您了解了如何symfony应用程序转移到生产主机,使用应用程序可以运行在ob娱乐下载任何地方。但如果有人决定使用它在一个非英语国家,说,法国?
使用一个开源项目,我们希望人们来自世界各地将很快使用它。这不仅意味着项目的所有文件必须编码utf - 8,应用程序还必须提出一个多语言界面和内容定位。
考虑跨国公司会在内网安装使用知识管理基础。他们肯定会要求用户可以切换界面语言或内容而不是安装使用/语言……幸运的是,在选择十八天实现宇宙会缓解我们的任务很多,和symfony原生支持国际化接口。ob娱乐下载
本地化
如果调用一个地址:
http://fr.askeet.com/
…只显示法国的问题吗?嗯,这是很简单的,因为自十八天,这样的URI是理解为宇宙。
内容
在宇宙的语言创建一个问题会自动标记语言标记(在这里:“fr”)。如果你浏览“fr”的宇宙中,只有“fr”标签的问题就会出现。
所以宇宙过滤器已经负责内容本地化。这是一个简单的移动。
外观和感觉
宇宙可以有自己的样式表。这意味着局部使用的外观和感觉可以很容易地改编,用相同的机制。接下来,请。
语言相关的功能
在构建的数据库索引系统21天依赖于一个阻止language-dependant算法。在本地化版本,它必须适应。
现在,没有可以阻止图书馆除英语之外的其他语言在PHP中,但是如果有一个,或者如果有人决定港口之一Perl所图书馆PHP吗?
然后,在myTools: stemPhrase ()
方法,我们应该叫一个工厂方法而不是一个简单的PorterStemmer(作为练习留给现在)。
数据库内容
想象一个国际网站提出一个世界各地的酒店列表。显示的文本描述每个酒店房间,服务和开放时间。有成千上万的酒店,所以这个内容是存储在数据库中。问题是,必须有尽可能多的版本的描述有翻译的网站。
ob娱乐下载Symfony提供了一种结构数据为处理此类案件。在上面的示例中,会有一个酒店
类的票价,地址和not-to-be-translated内容,和一个HotelI18n
类的本地化内容。作为推动访问器抽象这种分离,即使描述
是位于HotelI18n
表,你仍用一个简单的访问它:
美元的描述=美元的酒店- >getDescription();
要理解这是如何工作的,请参考i18n章symfonyob娱乐下载的书。
幸运的是,使用宇宙的过滤系统替换内容适应的需要,所以我们不会使用它。
国际化
长的一个单词,开发人员常常引用国际化为“国际化”。对于那些不知道为什么,只是计算字母‘国际化’这个词的时候,你也会明白为什么“本地化”被称为“l10n”。在web应用程序开发中,i18n主要关注翻译的文本内容和使用本地接口格式。
集文化
很多内置在symfony i18n特性都是基于用户会话的一个参数ob娱乐下载文化。文化的结合国家和用户的语言,它决定了文本和culture-dependant信息将显示出来。
当使用本地化应用程序识别一个宇宙,它必须设置相应的文化。当永久标记应该公认的本地化吗?我们选择只允许的接口的转换(见下文),所以事实上,宇宙是一个本地化的存在是由XML翻译文件的项目i18n /
目录中。
宇宙中发现的使用/应用程序/前端/ lib / myTagFilter.class.php
过滤器,所以我们只需要修改一下:
公共函数执行(filterChain美元){…/ /主机名的标签吗?美元的请求=这个美元- >getContext()- >getRequest();美元的主机名=美元的请求- >getHost();如果(!preg_match(这个美元- >getParameter(“host_exclude_regex”),美元的主机名)& &pos美元=大小写敏感(美元的主机名,“。”)){美元的标记=标签::正常化(字符串的子串(美元的主机名,0,pos美元));/ /添加一个永久的标签常数sfConfig::集(“app_permanent_tag”,美元的标记);/ /添加一个定制的样式表美元的请求- >setAttribute(“app / tag_filter”,美元的标记,“辅助/资产/汽车/样式表”);/ /标签是一个文化吗?如果(is_readable(sfConfig::得到(“sf_app_i18n_dir”)。“全球/消息。”。函数(美元的标记)。“xml”)){这个美元- >getContext()- >getUser()- >setCulture(函数(美元的标记));}其他的{这个美元- >getContext()- >getUser()- >setCulture(“en”);}}…}
请注意
语言标签将被编码在两个小写字符,如所描述的ISO 639 - 1标准(例如fr
法国)。在处理国际化时,总是喜欢ISO代码为国家和语言,这样代码就可以符合国际标准和被理解外国开发商。
你会发现更多的信息关于国际化和文化i18n章symfonyob娱乐下载的书。
日期、时间、数字、货币,测量
显示一个日期在法国的方式是不一样的。一个美国人会写:
2005年12月16日9:26点
…是由一个法国人写的吗
16 decembre 2005 21:26
如果你还记得,我们每一次在一个使用模板来显示一个日期,我们使用了format_date ()
帮手。这个助手格式的日期作为参数根据用户的文化。作为文化中设置myTagFilter.class.php
过滤器,日期格式将自动完成。
国际项目:这是另一个很好的练习时总是使用i18n助手必须输出一个约会,一次,一个数字,货币或测量。ob娱乐下载Symfony提供了他们中的大多数(参见帮手i18助手章symfonyob娱乐下载的书的更多信息)。
界面翻译
使用的接口项目包含文本。在本地化版本,界面应该显示的文本的语言使用者的文化。
使界面翻译,所有使用的文本模板必须封装在一个特殊的i18n助手,__ ()
。此外,顶部的助手必须声明的模板。例如,使界面翻译主页,打开使用/应用程序/前端/模块/问题/模板/ listSuccess.php
模板并将其更改为:
< ? phpuse_helper(“国际化”)? ><标题> < ? php回声__(“流行的问题”)? > < / h1 >< ? phpinclude_partial(“列表”,数组(“question_pager”= >question_pager美元))? >
请注意
不用添加i18n
辅助的模板,你可以一次添加到应用程序settings.yml
在使用/应用程序/ frontend.config /
:
所有:.settings:
standard_helpers:部分,缓存,形式,I18N
对于每一个语言界面的翻译,messages.xx.xml
必须创建的文件使用/应用程序/前端/ i18n /
目录,xx
是翻译的语言。这是一个XML文件XLIFF字典,显示文本的翻译版本从源语言(使用英语)。
例如,让一个法语翻译,您必须创建一个messages.fr.xml
用下面的内容:
< ? xml版本=“1.0”? >< xliff版本=“1.0”><文件原始=“全球”通过读=“en_US”数据类型=“明文”><身体>< trans-unitid=“1”><源>受欢迎的问题< /来源><目标>问题已经展开< /目标>< / trans-unit>< /身体>< /文件>< / xliff>
的语法XLIFF文件中详细解释i18N章symfonyob娱乐下载的书。
现在,大部分的工作是浏览所有模板(模板片段)找到翻译的文本。每次找到一个句子,你必须将它< ? php回声__('
和”)?
,创建一个新的< trans-unit >
标签的messages.fr.xml
文件。幸运的是,所有的模板在symfony项目本地化ob娱乐下载模板/
目录,所以你不需要浏览您的项目的所有文件。
请注意
翻译只有当翻译文件包含完整的句子。然而,有时你在文本格式或变量,您可以添加的第二个参数__ ()
辅助做替换。例如,标记以下模板文本:
有< ? php回声count_logged()? >人记录。
…只使用一个__ ())
电话,以避免把句子分成两部分,自己不能被理解:
< ? php回声__(“有1% %的人记录”,数组(“% 1%”= > count_logged()))? >
最后,允许自动翻译,你必须设置i18n
参数在
在应用程序中settings.yml
:
:.settings: i18n
现在浏览fr.askeet.com
看翻译后的界面:
自动的翻译
一些工具存在自动化封闭源文本和创建的任务messages.xx.xml
文件。不幸的是,没有一个能够封闭,你要做的事情。只有你可以决定从哪里开始和结束的地方__ ()
调用。尽管我们不使用它们,我们提供一个链接到网站,你会发现资源自动的翻译工具:
- 的
xgettext
命令从GNU getText工具提供了一种从PHP代码中提取文本。它产生一个.pot
文件(的条件),可以拒绝为一系列.po
文件(术语翻译成一种语言)的列表。 - 的
po2xliff
命令从XLIFF工具转.po
文件到messages.xx.xml
XLIFF文件。 - 对于Windows用户,霍加皮框架可以是一个不错的选择。
- 编辑翻译文件,poedit提出了一个直观的界面(这是特别有用,因为大多数的翻译人员不理解XML或
.po
文件)。
不要忘记
一旦被标记为翻译的文本模板,仍有密切的代码检查。事实上,短信可以藏在意想不到的应用程序部分。确保你做一个库存找到以下“隐藏”的文本:
图像文件夹(图像可以包含文本)
如果你需要本地化的图片,把它们放在子目录对应于他们的文化,并将文化添加到
image_tag ()
助手电话:(php)getCulture ()。/ myimage.png) ? >
图像的替代文本,按钮标签和所有的文本消息参数
< ? php
和? >
指令。JavaScript可以位于助手(如消息
link_to(“点击”,“@rule”、“确认=你确定吗?”)
),在JavaScript标记在你的模板,或包括在内. js
文件
总而言之,如果你不设计一个应用程序与i18n记住从一开始,风险高,你会忘记一些翻译文本的某个地方。我们的最佳建议是考虑i18n在开始开发之前,如果您知道您的应用程序可能会翻译,请记住使用__ (")
每次你写的文本将显示给最终用户。
请注意
有一些隐藏的短信验证/
出现的目录你的模块,当一种形式不正确验证。最酷的是,你不需要做特殊处理这些文本,如果他们出现在XLIFF翻译。ob娱乐下载Symfony会自动找到的翻译< trans-unit >
节点,并使用它代替YAML文件的原始文本。
明天见
使用正在成为一个真正有用的开源应用程序。作为i18n-compatible应用程序,它可用非英语(大约90%的世界人口)。
修改后的应用程序的源代码,包括i18n,是可用的SVN储存库,可以直接浏览askeet trac。你的评论论坛是受欢迎的。
明天已经是最后一天的symfony出现日历系列。ob娱乐下载不要错过它。
这个工作许可适用创作共用署名下衍生著作3.0 Unported许可执照。