第八章——国际化和本地化
很多流行的Web应用程序都可以在几种语言,有时,他们甚至是定制的基于用户的文化。ob娱乐下载Symfony提供了一个内置的框架,简化了管理这些功能(参见章”I18n, L10n”(/ book / 1 _2/13-i18n-and-l10n
symfony的书ob娱乐下载)。
的形式框架还提供了内置的支持用户界面的翻译和国际化提供了一个简单的方法来管理对象。
形成国际化
在默ob娱乐下载认情况下是internationalizable symfony形式。的翻译标签,帮助文本,错误消息可以通过编辑翻译文件,是他们的吗XLIFF
,gettext
,或任何其他symfony支持ob娱乐下载的格式。
清单8 - 1显示了接触形式我们在前面的章节。
清单8 - 1 -接触形式
类ContactForm扩展标识{公共函数配置(){这个美元- >setWidgets(数组(“名字”= >新sfWidgetFormInputText(),/ /默认的标签是“名称”“电子邮件”= >新sfWidgetFormInputText(),/ /默认的标签是“电子邮件”“身体”= >新sfWidgetFormTextarea(),/ /默认的标签是“身体”));/ /更改邮件部件标签这个美元- >widgetSchema- >setLabel(“电子邮件”,“电子邮件地址”);}}
我们现在可以定义的标签翻译XLIFF
法语文件,如清单8所示。
清单8 - 2 - XLIFF文件翻译
/ /应用程序/前端/ i18n / messages.fr.xml< ? xml版本=“1.0”? >< xliff版本=“1.0”><文件原始=“全球”通过读=“en”数据类型=“明文”><身体>< trans-unit><源>的名字< /来源><目标>笔名< /目标>< / trans-unit>< trans-unit><源>电子邮件地址< /来源><目标>地址的邮件< /目标>< / trans-unit>< trans-unit><源>身体< /来源><目标>消息< /目标>< / trans-unit>< /身体>< /文件>< / xliff>
指定目录用于翻译
如果你使用symfony的目录功能i18n框架(ob娱乐下载/书/ 1 _2/13-i18n-and-l10n # chapter_13_sub_managing_dictionaries
),您可以将表单绑定到给定目录。在清单8 - 3,我们把ContactForm
形式与contact_form
目录。所以,表单元素将寻找翻译contact_form.fr.xml
文件。
清单8 - 3 -翻译目录定制
类ContactForm扩展标识{公共函数配置(){/ /……这个美元- >widgetSchema- >getFormFormatter()- >setTranslationCatalogue(“contact_form”);}}
请注意
使用目录允许更好地组织你的翻译通过使用一个文件每个表单为例。
错误消息国际化
有时候,错误消息嵌入用户提交的值(例如,“user@domain无效的邮件地址。”)。在第二章我们已经看到,很容易实现这类的形式定义定制的错误消息和使用对用户提交的值的引用。这些引用遵循% parameter_name %
模式。
清单8 - 4展示了如何将这一原则应用到的名字
领域的接触形式。
清单8 - 4 -错误信息国际化
类ContactForm扩展标识{公共函数配置(){/ /……这个美元- >validatorSchema(“名字”]=新sfValidatorEmail(数组(“min_length”= >2,“max_length”= >45),数组(“min_length”= >的名字“% %”价值必须至少% min_length %字符。”,“max_length”= >的名字“% %”价值不得超过% max_length %字符。”,),);}}
我们现在可以翻译这些错误消息通过编辑XLIFF文件如清单8 - 5所示。
清单8 - 5 - XLIFF文件翻译错误消息
< trans-unit><源>名字“% %”价值必须至少% min_length %字符< /来源><目标>Le笔名“%值%”doit相称联合国最低de % min_length %的特征< /目标>< / trans-unit>< trans-unit><源>名称“%值%”不得超过% max_length %字符< /来源><目标>Le笔名“% %”价值不能相称+ % max_length %的特征< /目标>< / trans-unit>
定制翻译对象的
如果你想使用symfony的形式框架没有symob娱乐下载fony i18n框架,您需要提供您自己的翻译的对象。
只是一个翻译对象可调用的PHP。它可以下列三件事之一:
一个字符串代表一个函数的名字,像
my_function
一个数组类实例的引用和它的一个方法的名称,等等
阵列(anObject美元,“oneOfItsMethodsName”)
一个
sfCallable
实例。这个类封装了一个PHP调用以一致的方式。
请注意
一个PHP调用指的是一个函数或方法实例。它也是一个PHP变量返回真正的
当传递给is_callable ()
函数。
让我们看一个例子。你必须迁移项目,已经有了自己的国际化机制所提供的类显示在清单之后。
清单之后——自定义I18N类
类myI18n{静态受保护的default_culture美元=“en”;静态受保护的美元的消息=数组(“fr”= >数组(“名字”= >“笔名”,“电子邮件”= >“运输electronique”,“主题”= >“我”,“身体”= >“消息”,));静态公共函数translateText(美元的文本){美元的文化=收取(_SESSION美元(“文化”])吗?_SESSION美元(“文化”]:自我::default_culture美元;如果(array_key_exists(美元的文化,自我::美元的消息)& &array_key_exists(美元的文本,自我::美元的消息(美元的文化])){返回自我::美元的消息(_SESSION美元(“文化”]](美元的文本];}返回美元的文本;}}/ /类的使用myI18n美元=新myI18n();_SESSION美元(“文化”]=“en”;回声myI18n美元- >translateText(“主题”);/ / = >显示“主题”_SESSION美元(“文化”]=“fr”;回声myI18n美元- >translateText(“主题”);/ / = >显示“我”
每个表单可以定义自己的调用将管理国际化的表单元素清单以8:7所示。
清单以8:7——国际化方法的覆盖形式
类ContactForm扩展标识{公共函数配置(){/ /……这个美元- >widgetSchema- >getFormFormatter()- >setTranslationCallable(数组(新myI18n(),“translateText”));}}
翻译可调用接受参数
翻译可调用需要三个参数:
的文本翻译;
一个关联数组内的参数替换原始文本,通常以取代动态参数作为我们看到以前在本章;
一个目录名称翻译文本时使用。
这是使用的电话sfFormWidgetSchemaFormatter:翻译()
方法调用翻译可调用:
返回call_user_func(自我::translationCallable美元,美元的主题,美元的参数,美元的目录);
的自我:translationCallable美元
参考翻译可调用的。所以,前面的代码等价于:
myI18n美元- >translateText(美元的主题,美元的参数,美元的目录);
这是更新后的版本的MyI18n
类,支持那些额外的参数:
类myI18n{静态受保护的default_culture美元=“en”;静态受保护的美元的消息=数组(“fr”= >数组(“消息”= >数组(“名字”= >“笔名”,“电子邮件”= >“运输electronique”,“主题”= >“我”,“身体”= >“消息”,),));静态公共函数translateText(美元的文本,美元的参数=数组(),美元的目录=“消息”){美元的文化=收取(_SESSION美元(“文化”])吗?_SESSION美元(“文化”]:自我::default_culture美元;如果(array_key_exists(美元的文化,自我::美元的消息)& &array_key_exists(美元的消息,自我::美元的消息(美元的文化]& &array_key_exists(美元的文本,自我::美元的消息(美元的文化](美元的消息])){美元的文本= self::美元的消息(_SESSION美元(“文化”]](美元的消息](美元的文本];美元的文本=strtr(美元的文本,美元的参数);}返回美元的文本;}}
侧边栏
我们为什么使用sfWidgetFormSchemaFormatter
自定义翻译过程?
正如我们所看到的在第二章,表单是基于MVC体系结构和框架sfWidgetFormSchemaFormatter
类属于视图层。该类负责所有的文本渲染,所以它可以拦截所有的文本字符串并将其。
推动国际化的对象
表单框架内置的支持推动国际化的对象。让我们来一个国际化模式的例子来说明它的工作方式:
推动:文章:id:作者:varchar (255) created_at: article_i18n:标题:varchar(255)内容:用longvarchar
你可以生成推动类和相关表单类以下命令:
美元php ob娱乐下载symfony构建:模型php symfony构建:美元形式
在symfony项目:这些命令生成一些文件ob娱乐下载
lib / / ArticleForm.class形式。php ArticleI18nForm.class。php BaseFormPropel.class。php模型/条。php ArticlePeer。php ArticleI18n。php ArticleI18nPeer.php
清单8显示了如何配置ArticleForm
能够编辑法语和英语版本的文章相同的形式。
清单8 - I18n形式为一个国际化推动对象
类ArticleForm扩展BaseArticleForm{公共函数配置(){这个美元- >embedI18n(数组(“en”,“fr”));}}
您还可以自定义语言标签的形式,将下面的代码添加到配置()
方法,如清单8所示。
清单8 - 9 -语言标签定制
这个美元- >widgetSchema- >setLabel(“en”,“英语”);这个美元- >widgetSchema- >setLabel(“fr”,“法国”);
图8 - 1 -国际化推动形式
这就是所有。当你打电话给save ()
表单对象的方法,推动相关对象和所有i18n对象自动保存。
侧边栏
如何通过用户文化的一种形式吗?
如果你想绑定到当前用户的文化形式,您可以传递一个可选的文化
选择当您创建表单:
类articleActions扩展sfActions{公共函数executeCreate(美元的请求){这个美元- >形式=新ArticleForm(零,数组(“文化”= >这个美元- >getUser()- >getCulture()));如果(美元的请求- >isMethod(“职位”)& &这个美元- >形式- >bindAndSave(美元的请求- >getParameter(“文章”))){这个美元- >重定向(“文章/创建”);}}}
在ArticleForm
类,你现在可以得到的价值选项
数组:
类ArticleForm扩展BaseArticleForm{公共函数配置(){这个美元- >embedI18n(数组(这个美元- >getCurrentCulture()));}公共函数getCurrentCulture(){返回收取(这个美元- >选项(“文化”])吗?这个美元- >选项(“文化”]:“en”;}}
本地化部件
symfob娱乐下载ony框架形式是与一些部件绑定i18n“意识到”。他们可以用来定位一些部件根据用户的文化。
日期选择器
这里有可用的小部件本地化日期:
的
sfWidgetFormI18nDate
小部件显示输入的日期(日、月、年):这个美元- >widgetSchema(“published_on”]=新sfWidgetFormI18nDate(数组(“文化”= >“fr”));
您还可以定义的显示格式,谢谢
month_format
选项可以采取三种不同的值:的名字
显示的名称月(默认)short_name
显示的缩写名称数量
显示一个月的数量(从1到12)
的
sfWidgetFormI18nTime
小部件显示输入一段时间(小时、分钟、秒):这个美元- >widgetSchema(“published_on”]=新sfWidgetFormI18nTime(数组(“文化”= >“fr”));
的
sfWidgetFormI18nDateTime
小部件显示输入的日期和时间:这个美元- >widgetSchema(“published_on”]=新sfWidgetFormI18nDateTime(数组(“文化”= >“fr”));
国家选择器
的sfWidgetFormI18nChoiceCountry
小部件显示一个选择框装满一个国家列表。这个国家名称翻译在给定的语言:
这个美元- >widgetSchema(“国家”]=新sfWidgetFormI18nChoiceCountry(数组(“文化”= >“fr”));
你也可以选择框限制的国家,由于国家
选择:
美元的国家=数组(“FR”,“EN”,“西文”,“德”,“问”);这个美元- >widgetSchema(“国家”]=新sfWidgetFormI18nChoiceCountry(数组(“文化”= >“fr”,“国家”= >美元的国家));
文化选择器
的sfWidgetFormI18nChoiceLanguage
小部件显示一个选择框装满一个语言列表。语言名称翻译在给定的语言:
这个美元- >widgetSchema(“语言”]=新sfWidgetFormI18nChoiceLanguage(数组(“文化”= >“fr”));
你也可以限制的语言选择框,多亏了语言
选择:
美元的语言=数组(“fr”,“en”,“西文”,“德”,“问”);这个美元- >widgetSchema(“语言”]=新sfWidgetFormI18nChoiceLanguage(数组(“文化”= >“fr”,“语言”= >美元的语言));
时区选择器
的sfWidgetFormI18nChoiceTimezone
小部件显示一个选择框装满一个时区列表。
这个美元- >widgetSchema(“时区”]=新sfWidgetFormI18nChoiceTimezone();
这项工作在Creative Commons许可Attribution-Share都3.0 Unported许可执照。