jobeet第十九天:国际化和本地化

*这一系列文章来源于Fabien Potencier,基于Symfony1.4编写的Jobeet Tutirual

昨天我们为搜索引擎添加了AJAX功能,这下搜索引擎变得有趣多了。而在今天的内容中,我们来了解一下Jobeet的国际化(i18n)和本地化(l10n)。

来自维基百科国际化是指在设计软件,将软件与特定语言及地区脱钩的过程。当软件被移植到不同的语言及地区时,软件本身不用做内部工程上的改变或修正。 本地化是指当移植软件时,加上与特定区域设置有关的信息和翻译文件的过程。

用户

软件或者网站没有国际化就意味着有可能会造成用户的流失。如果你的网站能够支持多种语言或者是能够为世界不同地区的人们服务的话,那么就有必要为用户提供语言选择功能以最大程度地满足用户的需求。

Symfony的i18n和l10n功能是以用户文化(user culture)为基础的。文化是由语言和其所在国家的用户所构成的。比如,那些会说法语的人被称为’fr’,而那些来自法国的人(同时也会法语)则被成为’fr_FR’。

Symfony中的翻译工作是由Translator来处理的,它会根据用户的本地信息来查找并返回文本的翻译。在使用它之前,我们需要在配置中启用Translator:

 

Culture in the URL

Jobeet网站需要能够支持英语和法语。因为一个URL就是代表了一个单一的资源,所以我们必须在URL中加入语言参数供用户切换不同语言的资源。为了达到这个目的,我们打开routing.yml文件,除了api路由外,我们需要为所有的路由添加一个特殊的locale变量。为了使路由简单,我们在url的前面加上/{_locale}

我们的首页应该要尽可能多地支持不同语言(/en/,/fr/,…)。系统根据用户在url中指定的_locale值转向到特定语言版本的首页(/)。但如果用户还没有指定_locale的值(用户可能是第一次访问Jobeet),那么Jobeet会先为用户选择一种默认语言(我们上面定义的是en)。现在我们来添加一个新路由,然后再修改首页的路由:

然后我们来添加和修改这两个路由对应的控制器的行为:

如果用户访问Jobeet时没有指定优先选择使用哪种语言的话(http://jobeet.local/app\_dev.php),那么用户将会被重定向到首页(/),并且系统会为用户选择默认的语言(http://jobeet.local/app\_dev.php/en/)。

Culture测试

现在是时候测试我们实现的功能了。但在编写测试之前,我们需要先来修改之前编写的测试。因为我们在上面修改过了路由,所有的URL被都改变了,所以我们需要修改之前的功能测试,在测试中的所有URL前面加上/en。

 

 

 

语言切换

为了让用户能够切换语言,我们需要在layout中添加一个表单。现在我们来修改它:

现在来添加路由:

然后添加Action:

添加完成之后不要忘了清除cache。

 

模板

一个国际化的网站就意味着它支持多种不同国家语言版本的用户界面和用户接口。对于Jobeet来说,默认支持的是英语,然后是法语。为了翻译模板,我们会使用Twig的{% trans %}标签。Symfony在渲染模板时,每当遇到一个{% trans %}标签,Symfony就会去查找用户当前的本地信息来得到对应的翻译。如果找到了对应的翻译字符串,那么就返回它。如果没有找到,那么需要被翻译的字符串就会被当做备用(fallback)值返回。

所有的翻译文件都保存在src/Ibw/JobeetBundle/Resources/translations/目录下,我们将会使用XLIFF格式来保存翻译文本,它是一个标准,而且灵活性好。

现在我们在模板中添加{% trans %}标签:

 

 

 

 

 

 

 

 

每个翻译都是通过trans-unit标签来管理的,trans-unit有一个唯一的id属性。现在我们可以在文件中添加或者修改法语翻译了:

每次当你添加了新的翻译时,你都需要清除cache。

 

原文链接:http://www.intelligentbee.com/blog/2013/09/09/symfony2-jobeet-day-19-internationalization-and-localization/

发表评论