欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

drupal 语言切换 多语言网站 有大用 有大大用

1) https://ninghao.net/video/504 宁皓网视频 有大用
2) 界面的多语言化

Drupal版本: drupal7            

1.1 添加语言

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

我们来回顾一下一个简单的问题,如何添加一个语言?这个比较简单,我们在添加简单中文的时候,就已经做过了。首先是启用Locale模块,接着导航到语言的管理界面,在这里点击添加语言链接。                    

1.png                     

在我们添加语言的时候,除了预定义好的语言以外,我们还可以自定义语言,实际上,在实际项目中,从来没有用过这个自定义语言。                    

2.png                     

点击右上角的“检测与选择”,进入页面admin/config/regional/language/configure,我们在这里可以配置,按照那种方式选择界面语言。                    

3.png                     

这里的检测方法包括:网址、会话、用户、浏览器、默认。我们这里使用的是默认。对于网址,它是有配置选项的:                    

4.png                     

会话的配置选项:                    

5.png                     

如果同时支持多个语言的话,我们通常都采用网址(路径前缀)的探测方法。我们后面会用到这个。                    

 

Drupal版本: drupal7                

1.2 导入简体中文语言包

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

启用了简体中文以后,如何导入简体中文语言包?我们知道,Drupal的界面翻译,采用的是PO文件的格式,我们需要下载这些语言包,并将它们导入到Drupal中来。Drupal的翻译管理界面,位于admin/config/regional/translate                    

1.png                     

在这里可以查看每个语言的翻译状态,我们看到简体中文的翻译率不足60%                    

后台的翻译界面:                    

2.png                     

可以对界面语言进行翻译,在上面可以通过查找过滤功能,找到对应的字符串。找到以后,如果已经有了翻译,觉得翻译的不好的话,可以对它进行编辑,替换成我们自己想要的;如果尚未翻译的话,那么我们可以添加自己的翻译。                    

PO文件的导入界面:                    

3.png                     

可以导入PO文件,在导入的时候,需要选择语言,还需要选择导入的模式,这里有两种模式,一种是将原来的翻译覆盖掉,另一种是保持原有翻译不变,只添加新字符串,我们通常选择后者即可。                    

将本地的翻译,导出成PO文件,这个功能是有的,但是实际项目中很少用到。语言包可以在https://localize.drupal.org/translate下载到,简体中文的语言包位于https://localize.drupal.org/translate/languages/zh-hans。需要说明一下的是,简体中文小组的汉化工作比较混乱,我去年十月份汉化的Ubercart,到现在都没有人审批。                    

4.png                     

     这段话写的很好,期待简体中文小组的汉化工作,在将来会得到改善。                    

 

Drupal版本: drupal7                

1.3 Localization update模块

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

一个Drupal网站,通常会安装比较多的第3方模块,一个模块一个模块的导入汉化包,也是一件很麻烦的事情。很多时候,我都是这样的,只导入Drupal核心的汉化包,我很少导入第三方模块的。因为网站主要看的前台嘛。如果你对后台的界面的汉化,有更多的要求,而且还想自动化,此时有这样的一个模块,可以帮我们做这件事情。Localization update模块。                    

我们下载、安装、启用Localization update模块,我这里的版本是l10n_update-7.x-1.0-beta3。这个模块的作用,就是自动的帮我们下载这些语言包。模块启用后,直接导入该模块本身的语言包:                    

1.png                     

导入成功后:                    

2.png                     

在翻译的管理界面,多了一个“更新”标签:                    

3.png                     

点击这个标签,进入页面admin/config/regional/translate/update                    

4.png                     

这里的状态大部分都是“Uninstalled translation available”,这说明了很多Drupal的第三方模块都没有最新的汉化包可用。这里以CKEditor模块为例,展开后:                    

5.png                     

     右下角有一个下载链接,点击这个链接,就可以下载这个模块的PO文件。打开下载好的PO文件,发现里面的文本都已经翻译了。PO文件里面的内容大致如下:                    

6.png                     

     在这个页面的下面,是一个更新模式选项和两个按钮:                    

7.png                     

点击这个更新翻译按钮:                    

8.png                     

     我刚才还犯愁呢,没有想到点了这个按钮就自动导入了。这是我第一次使用这个模块。我能够手动做的,很少去装模块。这是更新成功后的样子:                    

9.png                     

10.png                     

汉化就这么简单。不过,美中不足:                    

11.png                     

12.png                     

不是100%的汉化了,只汉化了78%。不过很多都已经翻译了,翻译的还不错:                    

13.png                     

在语言的管理界面,多了一个“更新翻译”标签:                    

14.png                     

点击这个标签,进入页面admin/config/regional/language/update,这里是Localization update模块的配置选项:                    

15.png                     

16.png                     

     这里面的简体中文,是从繁体中文中复制过来的,都没有转换一下,人真懒。如果我们在“保存下载的文件到”里面输入“sites/all/translations”,那么我们从服务器上下载下来的PO文件就会保存在这个目录下,默认为空时,不会保存这些文件的。                    

 

Drupal版本: drupal7                

1.4 Localization client模块

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

与界面翻译相关的还有Localization client模块,使用它可以在当前页面就能够完成翻译,并且能够将本地的翻译,上传到localize.drupal.org                    

我们下载、安装、启用Localization client模块,我这里用的版本是l10n_client-7.x-1.2。启用后,在每个页面的下面,会有这个一个链接:                    

1.png                     

点击后,会展开更多内容:                    

2.png                     

左边是该页面上的所有界面文本,绿色的表示已经翻译好的,白色的表示尚未翻译的。双击一段白色的字符串,它就会在中间的“源”里面显示出来,比如这里的“Configure menu block.”,在右边的文本域中输入它的翻译,保存,就完成了翻译。这个比核心自带的翻译功能强大很多,方便很多。                    

如果我们在本地做了很多汉化工作,想将这些工作分享出来,学一下雷锋。在语言的管理界面,admin/config/regional/language,右边多了一个“分享”标签。                    

3.png                     

点击,进入页面,这是我的配置:                    

4.png                     

这并不意味着我们本地的汉化工作,可以自动的上传到服务器上了,我们需要进一的配置。在用户的编辑页面,有这么一个配置选项:                    

5.png                     

我们需要输入API密钥,点击右下角的链接https://localize.drupal.org/translate/remote/userkey/c060c2fd8de97f4b620b808390d89f0a 如果你拥有drupal.org账号,并且已经登录的话,此时就会为你生成一个密钥:                    

6.png                     

将这个密钥复制过来,并保存。当我们在本地保存一个翻译时,系统就会尝试将这个翻译提交到服务器上:                    

7.png                     

遗憾的是,没有提交上,原因很可能是这个已经有人提交了,但是还没有被批准。又尝试了一下,提交成功:                    

8.png                     

     我把Menu position模块的部分界面文本翻译了一下,并上传到了服务器上。如果所有的中国Drupal开发者,每人贡献10条翻译的话,汉化工作就会比较出色了。                    

 

Drupal版本: drupal7                

2 内容的多语言化

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                

问题出在了哪里?这些工作对于我们来说,费力不讨好,所以没有人愿意去做,即便是有人去做多语言网站,开发者关注的重点,也不是界面的翻译。重点在哪里?当然是内容的翻译。                

 

Drupal版本: drupal7            

2.1 Content translation VS Entity translation

  •  

     作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

 

Drupal核心自带了一个Content translation的模块,能够翻译节点;再加上i18n模块,这是Drupal多语言网站建设里面的一个标准解决方案。在Drupal6里面,这是标准方案,在Drupal7里面,也可以说是一个标准方案。不过在Drupal7里面,出现了另一种选择,这就是Entity translation模块,后者进入了Drupal8的内核,并在Drupal8取代了前者。所以,我们在搭建Drupal7下的多语言网站的时候,有两种选择。我们这里将会选用Entity translation模块和i18n模块做我们我们的解决方案。                    

1.png                    

 

Content translation的基本架构图                    

2.png                    

Entity translation的基本架构图                    

                     

从上面的两个示意图中可以看出,Content translation是基于节点的,它为每种语言创建一个节点,并且维护不同语言节点之间的对应关系。Entity translation是基于字段的,在同一个节点内,同一字段在不同语言下,分别创建一个版本。                    

 

Drupal版本: drupal7                

3 使用Entity translation模块翻译节点

  •  

    作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                

我们下载、安装、启用Entity translation模块,我这里使用的版本是entity_translation-7.x-1.0-beta3。我们知道,Drupal7里面,标题不是一个字段,而是一个属性,为了实现标题的翻译,我们还需要安装Title模块。我这里使用的版本是title-7.x-1.0-alpha7                

启用后,我们可以导航到Entity translation模块的配置界面,admin/config/regional/entity_translation。这里有三个配置选项;                

1.png                 

一个是启用语言回退,一个是显示共享标签,最后一个是启用翻译工作流权限。我们这里采用默认的配置即可。                

再往下是配置哪些实体类型可被翻译:                

2.png                 

默认选择了节点,我们这里把分类术语也选中。我想知道Tittle模块是否支持分类术语的标签。选中分类保存后,下面多出来了一些与分类相关的配置选项。                

3.png                 

展开后:                

4.png                 

我们这里采用默认的即可。                

除了这里的配置以外,在admin/config/regional/language/configure,语言的检测与选择页面,此时多出来了“内容语言检测”的配置选项。                

5.png                 

在这里,我们启用网址、浏览器两种方法。对于网址的配置,我们采用路径前缀的方式即可。                

我们回到内容类型的管理界面,编辑“关于我们”内容类型,进入页面zh-hans/admin/structure/types/manage/about-us。这个时候路径前缀已经显示出来了。在“发布选项”里面,有这么一个配置选项:                

6.png                 

我们这里选中“Enabled, with field translation”,就是让这个内容类型支持多语言,通过字段翻译的方式。选中后,下面会显示出来进一步的配置选项:                

7.png                 

隐藏内容翻译链接,这个我们采用默认的不选中就可以了。保存这里的配置。现在访问Entity translation的配置界面,我们可以看到“关于我们”内容类型的配置选项了,和前面分类术语的一样,只是默认值不同。                

8.png                 

下面有四个配置选项,隐藏语言选择器,从可用语言中排除语言中立,一旦实体创建后就阻止修改语言属性,在翻译表单中隐藏共享元素。我们还是采用默认值。上面的默认语言,是这个节点类型的默认语言,可以与站点的默认语言不同。                

现在,我们去编辑节点1,访问页面node/1/edit,此时在节点的编辑表单中,我们可以看到语言的下拉选择框:                

9.png                 

这里有三个语言选项:                

10.png                 

在右上角的标签中,多了一个“翻译”:                

11.png                 

我们点击这个标签,进入页面node/1/translate                

12.png                 

这里显示的是“No translatable fields”,没有可翻译的字段,我想可能是这样的,原来我们保存节点的时候,字段的语言都是采用und的形式存储的,我们这里对原始内容编辑一下,保存,此时会有语言属性的。                

我们导航到“关于我们”内容类型的管理字段页面,admin/structure/types/manage/about-us/fields                

13.png                 

Title的右边,有一个replace链接,点击这个链接,进入页面:                

14.png                 

我们选中这个复选框,并点击保存设置按钮。这样标题就会被一个字段取代:                

15.png                 

我们编辑这个字段,在字段实例的配置页面,我们看到这个配置选项:                

16.png                 

这是这个字段的翻译设置,当前这个字段是可被翻译的,下面有一个“Disable translation”链接,可以用来禁用这个字段的翻译。                

此时我们终于有了眉目,编辑Body字段,我们可以看到:                

17.png                 

点击下面的“Enable translation”(启用翻译)链接。点击后,会看到这个配置选项:                

18.png                 

我们采用默认的选中即可。点击这个页面的确认按钮。这样我们就为正文字段启用了翻译功能。                

现在回到页面node/1/translate                

19.png                 

     英文右边的操作,现在变为了“添加”,我们点击这个链接,进入页面en/node/1/edit/add/zh-hans/en。现在这里面是有内容的:                

20.png                 

还是原来的,我们需要把它们替换为英文。                

再往下是:                

21.png                 

这个下拉选择框是被禁用了的,无法修改,原始语言为简体中文,我们这里实际情况下也不需要修改这个。                

再往下是节点的配置选项:                

22.png                 

很多配置选项后面都多了一个“(all languages)”,表明里面的配置是作用所有语言的。不过这里面有两个不是,其中一个是URL路径设置,这意味着我们可以为同一节点,在不同语言下设置不同的别名。                

对于“翻译”,展开后,里面包含四个配置选项:                

23.png                 

我们这里采用默认的即可。我们使用Google翻译,将标题和正文翻译一下,然后输入进来。                

24.png                 

这是保存后的样子:                

25.png                 

在正文的下面,有一个语言切换链接:                

26.png                 

点击后,可以方便的切换到简体中文。在简体中文的版本下,有同样一个链接,可以用来切换到英文。                

前面我们提到可以为单个语言分别设置路径别名,我们在保存英文翻译的时候,没有为node/1设置别名,此时英文的路径为en/node/1,并没有为它应用别名aboutus。我们还需要单独为它设置一下,不然出不来。                

为其余的内容类型,重复前面的操作,直到所有内容类型都可被正确的翻译。                

 

Drupal版本: drupal7            

6 首页的多语言化 你在这里

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                

    第一个问题是首页的产品区块的标题,在英文下没有正常显示:                

1.png                 

这个原因是,我们默认使用的是Title,现在变成字段title_field了,我们在Views里面,需要添加字段title_field,来代替原来的。修改后,显示正常。                

2.png                 

新闻标题显示不正常:                 

3.png                 

这个也是同样的问题。在Views里面,使用title_field替换原来的标题即可。需要注意的是,添加的时候,两个的名字相同。如果一次选不对的话,可以选两次,多试一下。                

4.png                 

Content: 标题 (title_field:language)”上面的这两个就是。                

                 

首页的“联系我们”区块的标题显示不正常:                

5.png                 

它和左边的新闻区块,使用的是Mini panel,我们导航到admin/structure/mini-panels,对它进行编辑,                

6.png                 

点击配置按钮,                 

7.png                 

在弹出的链接中点击设置链接:                

8.png                 

原来我们这里覆写了标题。取消对复选框“覆写标题”的选中。保存。不过这样还不行。我最终这样解决的,将这个区块添加了两次。                

9.png                 

    第一个:                

10.png                 

并将它限制在英文环境下显示:                

11.png                 

    第二个:                

12.png                 

并将它限制在中文环境下显示:                

13.png                 

                 

现在,首页只有幻灯和企业愿景没有翻译。对于幻灯,我们使用的是节点类型,只需要将对应节点翻译一下即可。不过都是图片,我们这里就不翻译了。企业愿景,是一个自定义窗格内容,它本身不是一个区块。我们的解决办法,是创建两个企业愿景,一个用于中文,一个用于英文。下面截了几张图,第一个是内容窗格的配置链接:                

14.png                 

    这是点击了添加可见性规则后的配置表单,这里我选择了“用户:语言”:                

15.png                 

    将窗格的显示,限制在英文环境下:                

16.png                 

保存后,显示正常了:                

                 

我将首页幻灯的第一张图片翻译了一下,上传了一张带有“English version”字样的,翻译后,英文版的图片没有显示出来,检查了一下幻灯视图,在设置中的“高级〉其它”部分:                

                 

上面的字段语言配置,默认是没有问题的。原因是这里我启用了缓存,去掉缓存,显示正常了。                

                 

这证明了幻灯也是可以翻译的。                

 

 

Drupal版本: drupal7            

6.1 Webform的翻译

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

前面,我们翻译联系我们的时候,这个节点上面的Webform表单还没有翻译。主要是表单元素的标签。不过只有几个,我们可以采用前面所使用的jQuery的方式,搞定这个问题。不过我觉得不是很好。搜索Webform + i18n,还真有现成的模块可用,这就是Webform Localization                    

Webform Localization有两个版本,一个1.x,一个4.x,我们使用1.x的开发版。下载、安装、并启用。启用后,我首先来到“联系我们”的编辑页面,然后访问node/4/webform/,这里检查一下,看有没有与翻译相关的配置,还真被我找到了,在node/4/webform/configure                    

1.png                     

Webform表单的多语言化,有两种方式,一种是使用一个表单,将表单元素的属性作为i18n字符串进行翻译;另一种是为每种语言创建一个表单,然后保持多个表单之间的同步。我们采用第一种方式:                    

2.png                     

其实,第二个复选框,是用于Content translation的。不过我们这里都选中了。现在,导航到admin/config/regional/translate/translate,这里我们将字符串限制在:                    

3.png                     

点击过滤按钮:                    

4.png                     

我们可以对这些字符串进行翻译了。翻译后,联系我们表单,在英文下正常:                    

5.png                     

 

Drupal版本: drupal7                

6.2 字段标签的翻译

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

当我们显示一个新闻节点的时候,新闻分类字段的标签,显示还是中文的形式,这个我们也可以在admin/config/regional/translate/translate对其进行翻译,首先将字符串限制在“字段”上,过滤:                    

1.png                     

此时会搜索到很多字段的标签:                    

2.png                     

     我们对它们分别翻译一下。就解决了这个问题。                    

如果,你想将语言切换器改成下拉选择框的形式,可以安装Language Switcher Dropdown模块;如果想加上语言图标的话,可以安装Language icons。与多语言相关的模块,还有很多。我们这里就不逐一介绍了。这是安装Language icons模块后的效果:                    

3.png                     

整个网站,基本功能已经搭建完毕,不过还有很多需要完善的,与多语言相关的部分,我们暂时讲解到这里,希望大家读完以后,对于多语言网站的搭建过程,有个比较好的了解。而我们的Think in Drupal第5集,到这里也就结束了,感谢大家的支持。                    

 

Drupal版本: drupal7                

7 面包屑的翻译

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                

最后加一句,我想说的是,前面通过jQuery解决的那个问题,后来我回去又想了想,终于想到新闻列表页面和产品列表页面的不同了。原来我为products页面添加了一个菜单位置规则(menu position rule,只不过这个规则后来被禁用了。我们为新闻添加一个同样的规则,并禁用,然后注释掉前面的JS代码。面包屑显示仍然正常。                

1.png                 

 

Drupal版本: drupal7            

8 Translation Management Tool

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                

发现页数不够272页,想了一下,这个模块还没有介绍,我们这里简单介绍一下。这是用来做翻译管理工具的模块,我这里使用的版本是tmgmt-7.x-1.0-beta1。这个模块依赖于entity模块,我们这里使用entity-7.x-1.1。这个模块的目的,是用来实现翻译自动化的,我们去翻译一个节点的时候,里面的内容能够预先的翻译好,比如使用Google翻译,这样我们就不用去Google翻译的页面复制粘贴了。不过令人遗憾的是,TMGMT Translator Google所依赖的Google翻译服务是收费的,没有免费版。还好,微软的提供免费的,我们拿微软的作为例子。我们使用TMGMT Translator Microsoft模块,这里使用的版本是tmgmt_microsoft-7.x-1.0-alpha2。为了启用子模块Translation Management UI,我们还需要安装VBORules模块。我启用了这些模块:Entity SourceEntity Source User InterfaceMicrosoft TranslatorTranslation Management CoreTranslation Management FieldTranslation Management UI,以及它们所依赖的模块。                

它的配置界面位于admin/config/regional/tmgmt_settings,包含两个配置选项:                

1.png                 

流程设定,和性能设置。我们这里采用默认的即可。                

另外一个配置页面位于/admin/config/regional/tmgmt_translator,这是翻译器设置:                

2.png                 

这里只有一个翻译器,就是微软的这个。还是微软大方,提供免费的给我们用。我们对它进行编辑,在编辑页面,有微软翻译器的特有配置:                

3.png                 

这里有一篇文档,http://blogs.msdn.com/b/translation/p/gettingstarted1.aspx,介绍了如何获取这些信息。                

1, 我们需要在https://datamarket.azure.com上面注册一个账号。                

2, 然后订阅微软的翻译器API,我这里定的是免费版的,定购的地址为:https://datamarket.azure.com/dataset/bing/microsofttranslator                

4.png                 

3, 获取开发者密钥信息,访问https://datamarket.azure.com/,在我的账号里面,可以获取到密钥信息:                

5.png                 

我们将这里获取的客户ID和密钥,填到Drupal里面对应的配置中来。                

6.png                 

我们现在来创建一个静态页面节点:                

7.png                 

我们对它进行翻译:                

8.png                 

刚才在这里,我点击了添加链接,发现里面显示的还是中文。仔细看了一下这个页面,左边比以前多了一个复选框,下面好像多了一个“Request translation”按钮,我们选中“英文”,点击这个“请求翻译”按钮。                

9.png                 

自动翻译好了,需要我们的审核。点击这里的“Needs review”链接,进入页面admin/tmgmt/items/1?destination=node/22/translate。我们在这里看到了:                

10.png                 

11.png                 

12.png                 

13.png                 

对于这里的翻译,我们可以进一步的编辑。如果满意了,那么可以点击“Save as completed(保存为已完成)。我们这里点击这个按钮。                

14.png                 

    这个节点的英文版已经翻译好了。省事吧。我们不用再把节点标题、正文,复制过去,翻译好了以后再复制回来,然后再保存了。只需要轻轻的点击几下按钮,就能自动完成翻译。                

 

Drupal版本: drupal7            

4使用Entity translation模块翻译分类术语

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                

 

我们现在来看分类术语的翻译,导航到分类的管理界面,找到“新闻分类”词汇表,admin/structure/taxonomy/news_category,编辑它下面的第一个分类术语“公司新闻”:                

1.png                 

我们看到,左上角有一个“翻译”标签,点击这个标签,进入页面taxonomy/term/4/translate                

2.png                 

这里英文版本的操作,仍然是“无可翻译的字段”。和前面遇到的情况一样。我们现在进入“新闻分类”词汇表的管理字段页面:                

3.png                 

我们发现,“名称”和“描述”的右边都有一个“替换”链接,也就是我们可以把它替换成字段的形式。我们替换一下,这是替换后的样子:                

4.png                 

注意,这里字段的机读名字分别为name_fielddescription_field,前面的节点标题替换后的为title_field。看来Title模块的功能,不仅仅支持节点标题,还支持分类术语的名称和描述。这真是一个不小的惊喜。                

现在,对于“公司新闻”这个分类术语,我们可以为它添加英文翻译了:                

5.png                 

点击这里的添加链接,在对应的名称、描述里面输入英文版本。我们这里只输入名称的英文版本即可:                

6.png                 

我们重复这一操作,将新闻分类下面其余两个分类术语也翻译一下。将产品分类下面的分类术语也翻译一下。                

不过令人遗憾的是,当我们创建新闻的英文版本时,新闻分类里面的分类术语,显示的还是简体中文:                

7.png                 

保存后,才会显示英文的形式:                

8.png                 

不过这里,字段的标签,没有被翻译过来。尽管有这么一个小问题,但是在显示的时候,没有问题,所以我觉得,分类术语的这种翻译方式,还是比较不错的。I18N模块里面,也有分类术语的子模块,如果你觉得这里的这种方式,对你来说有点问题的话,可以尝试一下I18N模块下面的分类术语翻译。                

我们安装Title模块的时候,忘记说了,这个模块是有一个配置页面的,                

9.png                 

就是创建一个bundle的时候,能够将实体的标题(名称)自动替换成字段的形式。对我们的影响不大。我们可以手动的完成。至于Label替换,这个到底怎么起作用的,我也没有弄清楚。我把它们选中以后,在英文版本下面,新闻分类显示的还是中文。                

 

Drupal版本: drupal7            

5语言切换器区块

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                

我们导航到区块的管理界面,找到“语言切换器(内容)”区块,将它放在主题的“标题”区域中,同时禁用区块标题。默认是这样显示的:                

1.png                 

我们调整一下CSS                

.region-header{                

  float:right;                

  clear:none;                

}                

.region-header #block-locale-language-content .language-switcher-locale-url li{                

  display:block;                

  float:left;                

  margin-right:20px;                

}                

.region-header  a {                

    text-decoration: none;                

}                

这是调整后的样子:                

2.png                 

值得一提的是,如果把新闻翻译好了以后,在新闻列表页面的英文版本下,显示也是基本正常的,这是en/news/4路经下的样子:                

3.png                 

除了节点和分类术语以外,我们还有很多工作要做,比如菜单、区块、系统变量,字段的标签,等等,需要翻译。                

 

Drupal版本: drupal7            

5.1 i18n模块

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

我们下载、安装、启用i18n模块,我这里使用的版本是i18n-7.x-1.9。这个模块还依赖于Variable模块,我们还需要先安装Variable模块,我这里使用的版本是variable-7.x-2.2。 i18n模块下面包含很多个子模块,从上到下:                    

1.png                     

我这里启用了Block languagesField translationInternationalization,这里的Contact translation是负责Contact这个核心模块的翻译的,不过我们这个站点没有用到这个模块。                    

2.png                     

这里,我启用了Menu translation模块;Multilingual content这个是基于content translation的,我们这里没有采用这种方案;Multilingual forum解决的是论坛模块的翻译,我们这里没有使用论坛模块;Multilingual select,这个可能有用,后面我们不妨启用测试一下,看是否能够解决我们前面所说的分类术语选择时的问题。                    

3.png                     

这里,启用了String translationSynchronize translations是基于content translation的,我们这里没有采用这种方案;Taxonomy translation,我们已经解决了分类术语的翻译,如果你觉得我们前面的方式不够好的话,可以尝试一下这个模块;Path translation,用于翻译路经,有时候有用。                    

4.png                     

我们这里启用了Translation setsVariable translation,前者为多个子模块所依赖,后者用于变量的翻译,很有用;Translation redirect主要用于SEO,我们这里对SEO的要求不高;User mail translation用于用户电子邮件的翻译,我们这个站点用处不大。                    

 

Drupal版本: drupal7                

5.2 变量的翻译

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

首先,我们来看站点名称的翻译,我们站点的名称为“亚艾元”,在英文环境下,我们想显示拼音的形式。怎么翻译呢?导航到admin/config/system/site-information,这是站点名称所在的配置界面:                    

1.png                     

在这个页面的上面有提示,这个表单中包含多语言的变量,我们将它切换到英文的环境下,admin/config/system/site-information?variable_realm_key_language=en,在这种情况下,输入拼音,保存:                    

2.png                     

此时,我又遇到了一个问题,那就是虽然我这里输入了变量的英文版本,但是在首页的中英文切换的过程中,站点名称始终是中文。我尝试了比较多的办法,比如分别使用路经:zh-hans/admin/config/system/site-information,和en/admin/config/system/site-information访问,然后输入对应的中文、英文版本,还是不行。                    

Google 了一下,找到一篇文档,https://drupal.org/node/1113374,这里讲的就是变量翻译,我的配置没有任何问题。通过这篇文章,我了解到admin/config/regional/i18n的存在,这是i18n的配置界面,变量的多语言设置可以在admin/config/regional/i18n/variable完成。                    

然后我想到了在预处理函数中,搞定这个问题,在当前主题的template.php文件中添加这么一个函数:                    

function yaiyuan_preprocess_page(&$variables, $hook) {                    

  global $language;                    

  $lang_name = $language->language ;                    

  $variables['site_name'] = (theme_get_setting('toggle_name') ? filter_xss_admin(i18n_variable_get('site_name', 'en')) : '');                    

  drupal_set_message($lang_name);                    

}                    

注意,这里的$lang_name始终都是zh-hans,即便是我切换到了英文下面。我这里使用i18n_variable_get来替代默认的variable_get,以便支持多语言。                    

昨天晚上一直在想解决方案,如果我能够获取到当前语言,那么通过预处理函数的方式,就能够解决问题,Drupal核心自带的语言切换器区块对应的代码里面,应该有如何获取当前语言的代码。这样一想,感觉问题是可以通过预处理函数的方式解决的。                    

不过,我突然想到了一件事情,即便是使用en/admin/config/system/site-information访问后台页面的时候,后台显示的也是简体中文。我突然想到,Drupal7中,界面语言和内容语言的检测方法是分开配置的,界面语言的检测方法我们还是用的默认的,很可能是这里出了问题。                    

我们先沿着第一种方案继续前进,我们去配置“语言切换器(内容)”的时候,可以看出这个区块是由locale模块提供的,这样我们就可以顺藤摸瓜,找到对应的代码。                    

function locale_block_view($type) {                    

  if (drupal_multilingual()) {                    

    $path = drupal_is_front_page() ? '<front>' : $_GET['q'];                    

    $links = language_negotiation_get_switch_links($type, $path);                    

这里面,我觉得比较关键是language_negotiation_get_switch_links,通过搜索,找到这个函数的源代码。在这个函数里面,有这么一段代码:                    

  if (count(language_list()) >= 2) {                    

    $language = language_initialize($type);                    

  }                    

给了我很大的提示,这里的$type有多种情况,我们在前面分析核心源代码的时候,曾经提到过,打开bootstrap.inc文件,找到:                    

define('LANGUAGE_TYPE_CONTENT', 'language_content');                    

                     

/**                    

 * The type of language used to select the user interface.                    

 */                    

define('LANGUAGE_TYPE_INTERFACE', 'language');                    

                     

/**                    

 * The type of language used for URLs.                    

 */                    

define('LANGUAGE_TYPE_URL', 'language_url');                    

我们这里使用LANGUAGE_TYPE_CONTENT。根据这些信息,我最终使用下面的代码,解决了这个多语言问题:                    

function yaiyuan_preprocess_page(&$variables, $hook) {                    

  //global $language;                    

 //$lang_name = $language->language ;                    

  $language = language_initialize(LANGUAGE_TYPE_CONTENT);                    

  $variables['site_name'] = (theme_get_setting('toggle_name') ? filter_xss_admin(i18n_variable_get('site_name', $language->language)) : '');                    

  //drupal_set_message($lang_name);                    

  //print debug($language);                    

}                    

这里面,如何获取当前语言,我首先尝试了一下$language,总是不对。使用language_initialize(LANGUAGE_TYPE_CONTENT),则可以成功获取。注意我们这里获取的是当前内容的语言。不是当前的界面语言。此外,我对这个语言变量还debug了一下,查看了它的结构。它的结构是这个样子的:                    

stdClass::__set_state(array(                    

   'language' => 'en',                    

   'name' => 'English',                    

   'native' => 'English',                    

   'direction' => '0',                    

   'enabled' => '1',                    

   'plurals' => '0',                    

   'formula' => '',                    

   'domain' => '',                    

   'prefix' => 'en',                    

   'weight' => '0',                    

   'javascript' => '',                    

   'provider' => 'locale-url',                    

))                    

我们使用预处理函数的方式解决了问题。不过,总不能每次都这样解决吧。或许真的是界面语言的检测与选择的配置问题。导航到admin/config/regional/language/configure,对于界面语言的检测方法,我们与内容的保持一致。                    

3.png                     

保存这里的配置。注释掉,我们前面所写的预处理函数。站点名称的中英文切换,正常。当然,前面的工作,也不是没有白做,如果你跟着阅读了源代码,会对Drupal7多语言的背后机制有更深的理解。比如这个语言,它分为:内容、界面、路径。我们这里对这个概念有了更深的理解。我们前面的获取当前语言,其实是获取当前内容语言,而不是获取当前界面语言。                    

4.png                     

5.png                     

如果,我们这里是一个Logo,中文Logo和英文Logo不一样,怎么解决呢?导航到zh-hans/admin/config/regional/i18n/variable                    

6.png                     

选中这里的主题设置复选框即可,这样主题的Logo就支持多语言了,分别为每个语言上传一个Logo,解决了Logo的多语言问题。                    

                     

 

Drupal版本: drupal7                

5.3 菜单的翻译

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

我们来看一下如何翻译主菜单,导航到主菜单的编辑页面,admin/structure/menu/manage/main-menu/edit。这里面有一个多语言的配置选项:                    

                     

1.png                     

第一个选项,菜单项没有多语言选项,只有菜单本身可被翻译。菜单本身可被翻译?如何理解,看这个菜单右上角的标签,里面有一个“翻译”标签:                    

2.png                     

点击这个“翻译”标签,就可以对菜单进行翻译。只是我们这里没有必要。                    

第二个选项,翻译和本地化。注意,这里的翻译(translate)和本地化(Localize)之间是有区别的。如果一个菜单项,它具有语言属性,此时会允许翻译;如果它没有设置语言,则可被本地化。                    

第三个选项,固定语言,每个菜单项都有一个语言属性,它们只会显示在自己的语言下。                    

我们这里选择第二个选项,保存。我们现在对主菜单的菜单项,进行编辑:                    

3.png                     

点击“首页”菜单项右边的编辑链接。进入菜单项的编辑页面。                    

4.png                     

此时,右上角有了一个“翻译”标签,我们点击这个标签,就可以对这个菜单项进行翻译了。                    

5.png                     

点击操作里面的“翻译”链接,我们将菜单项的标题翻译一下:                    

6.png                     

翻译好了保存结果。这是翻译后的样子:                    

7.png                     

菜单项的编辑页面,还有一个语言选项:                    

8.png                     

我们可以设置,这个菜单项是属于哪个语言下的。这样的话,我们可以为每种语言都创建一个对应的菜单项,也能解决问题。                    

因为,我们这里面,中文、英文的节点ID是相同的,所以我们没有必要创建多个菜单项。直接对菜单项的标题进行翻译即可。                    

重复前面的操作,直到把主菜单里面剩余的菜单项都翻译完毕为止。需要说明一下的是,当我们翻译到“关于我们”下面的第一个子菜单项“公司历程”的时候,菜单项编辑页面的右上角没有“翻译”标签。如果我们直接输入对应的路径的话,此时会提示没有权限。这是因为,我们还没有翻译菜单项“公司历程”所对应的节点,我们将对应的节点翻译成英文后,这里的菜单项,也可以翻译了。                    

到最后,只剩下“联系我们”这个webform页面了,这也是一个普通的节点。我们首先让内容类型Webform支持字段翻译,将它的Title替换成字段的形式。这个时候,我们就可以将“联系我们”这个节点的标题和正文翻译成英文了。之后,就可以翻译对应的菜单项了。只不过这个页面的表单还无法翻译,主要是表单元素的标签,在英文环境下还是显示的中文。                    

9.png                     

我们现在先不管这个,到此,整个主菜单里面的所有菜单项,都被翻译成为了英文。注意,                    

10.png                     

     注意,这里不仅仅是主菜单,左边的Menu block,以及面包屑都变成英文的。这说明了Menu blockMenu Position模块对多语言的支持是比较友好的。                    

                     

 

Drupal版本: drupal7                

5.4区块的翻译

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

不过,左下角的“联系我们”区块,仍然是中文的,我们来看一下,如何将它翻译成英文。点击它的配置链接,进入它的编辑页面en/admin/structure/block/manage/block/2/configure。在这里,可见性设置里面,多了一个语言选项。                    

1.png                     

     这里有两种方式,第一种方式,是将这个区块标记为可翻译的,也就是选中“Make this block translatable”。选中后,下面的按钮多出来了一个:                    

2.png                     

我们可以点击“保存并翻译”按钮。                    

3.png                     

我们点击英文右边的翻译链接,来翻译这个区块:                    

4.png                     

遗憾的是,我们这里面只能翻译区块标题,不能翻译区块的正文,这是因为区块正文所使用的文本格式不支持多语言。如何让它支持多语言呢?导航到i18n的管理界面,点击右上角的“字符串”标签:                    

5.png                     

这里有两个配置选项:                    

6.png                     

                    

7.png                     

对于源语言,我们使用默认的简体中文即可。对于可翻译的文本格式,我们这里选中所有的,保存。回到,刚才的区块的翻译页面,现在就可以翻译区块正文了:                    

8.png                     

在这里,输入对应的英文。注意,对于区块正文,应该保留原来的HTML标签。                    

我们可以创建两个区块,一个显示在中文下,一个显示在英文下,两个区块显示在同一个区域的同一位置。这也是一种常见的解决方案,我以前就非常喜欢这种方式。                    

我发现一个问题,面包屑没有正确显示:                    

9.png                     

具体原因不明。我把新闻、产品所有节点也都翻译了一遍,使用的Google翻译,没有人工校对。                    

现在,我们重复前面的操作,将“页脚菜单”、“版权信息”也翻译成英文。                    

10.png                     

     令人遗憾的是,我们将所有的菜单项翻译后,在英文环境下,显示的还是中文。这是我的翻译:                    

11.png                     

原因未明。我们暂时先不管它。来看“版权所有”区块,我们对它进行配置,将它只显示在中文下:                    

12.png                     

接着,创建一个新的静态区块,是版权所有区块的英文版:                    

13.png                     

也放在页脚区域,这里只显示在英文环境下;                     

14.png                     

     保存。这个区块的多语言,我们也解决了。来看页脚菜单区块,这个区块我们用的是核心自带的,我们前面讲到左边的菜单区块(menu block)的中英文显示是正常的,我们将这个页脚菜单导航替换成Menu block模块提供的方式显示。                    

 

Drupal版本: drupal7                

5.5 使用Menu block输出菜单

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

导航到区块的管理界面,创建一个新的menu block(菜单区块),做以下配置:                    

1.png                     

我们将这个区块放在页脚区域,测试一下。中英文显示正常了。把原来的核心自带的区块禁用。现在页脚也正常了。                    

2.png                     

我们没有必要去深究,为什么核心自带的对多语言支持不友好,只要解决问题就好。有时候换种方式,绕过去,可能会更好。                    

 

Drupal版本: drupal7                

5.6 Views的翻译

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

我们现在回到新闻列表页面,或者一个新闻节点页面,此时的面包屑是不正常的。我们前面已经提到过了。我想这里之所以显示“新闻”两个字,是因为Views里面的配置问题。我们编辑对应的Views,将标题设置为英文的形式:                    

1.png                     

现在,在英文环境下,面包屑显示正常了,但是在中文环境下,又不正常了。                    

2.png                     

可是,这个面包屑是基于菜单的,而我们的菜单项中,已经完成了“新闻”到“News”的翻译。经过测试,发现,新闻节点页面的面包屑,是基于菜单的;新闻列表页面,是基于Views的。                    

为了解决这个问题,我们下载、安装、启用Internationalization Views模块,我这里使用的版本是i18nviews-7.x-3.x-dev。这个模块只有开发版,不过Drupal7下的开发版的安装量也超过了1万。安装后,报了一个错:                    

3.png                     

这样的错误消息很多,我们这里不去管它。我最终成功解决这个问题,解决办法如下:                    

导航到admin/config/regional/translate/translate,在过滤条件中:                    

4.png                     

将搜索限制在视图上,也就是Views上。这个时候,会列出Views中的很多需要翻译的字符串:                    

5.png                     

这里的“新闻”,也就是news视图的标题,我们把它翻译一下:                    

6.png                     

翻译后,测试了一下,发现不行。我又导航到admin/config/regional/translate/i18n_string,在这里刷新了一下字符串:                    

7.png                     

这样新闻列表的面包屑,就显示正常了。                    

8.png                     

用同样的版本,解决产品列表的面包屑显示。需要说明的是,上面的刷新字符串在这里没有起作用,真正起作用的是清除缓存。                    

9.png                     

不过令人遗憾的是,新闻节点页面,在英文环境下的面包屑显示不正常:                    

10.png                     

但是产品节点的显示就正常。两者之间的配置,我记得没有任何不同。我对这个问题研究了很久,始终找不到解决办法。                    

 

Drupal版本: drupal7                

5.7 使用jQuery解决无法翻译的字符串

  •  

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com                    

我是这样解决的,解决的办法不是很地道。首先是编辑当前主题的info文件yaiyuan.info,取消注释这句代码:                    

scripts[] = js/script.js                    

接着向script.js这个文件中添加以下代码:                    

jQuery.noConflict();                    

(function($) {                     

$(function() {                    

                        

  $('.i18n-en .breadcrumb li a').each(function(index){                     

    if($(this).attr('href') == '/yaiyuan1/en/news'){                    

   //$(this).addClass('abc');                    

   $(this).html('News');                    

}                    

  });                    

                     

});                    

})(jQuery);                    

这段JS的作用,就是将面包屑中“新闻”这个链接的文本替换为“News”。                    

有时候,问题实在解决不了的话,可以借助于jQuery, Hack一下,也没有关系。

来自 
http://www.thinkindrupal.com/book/export/html/5712


如何用drupal建立多语言网站

 

  
                   

29 5月, 2014BY ADMIN                           

博客                                   多语言                                   DRUPAL                                   

原文链接:How to Build Multilingual Drupal Sites                                    

译者:晴空 校对:龙马

tutuploadsmedia_1326929592271.png 安装Drupal的时候有很多不同的语言可供选择,但是如果你想实现一个多语言的网站,该怎么办呢?Drupal可以实现这样的功能,但是过程并不简单。有两个方面需要进行翻译。

首先,首先你需要翻译网站界面,这包括按钮、下拉菜单、消息和其他在网站上用于交互的文字。定制界面是比较简单的,而且你可以下载语言包来减少你的工作量。Drupal开发者经常称这个过程为“网站本地化”。

其次,你还需要翻译页面内容。有一些模块可以实现这个功能,但是工作量比翻译界面大很多。

让我们看一看如何翻译界面和内容。

第一步:下载并安装所有需要的模块                                    

以下模块是你在翻译的时候必须用到的。在你继续下一步之前,请确认你已经下载,安装并启用了他们。

第二步:启用并配置local模块                                    

tutuploadsStep_2__Enable_and_configure_Locale.png                                    

这是一个核心模块,你可以在模块页面的核心部分找到它。

tutuploadsmedia_1326858686932.png                                    

先确认安装并启用了Local和Localization Update模块。Localization Update模块是在安装 Entity Translation模块的时候被添加的。

第三步:设置语言                                    

tutuploadsStep_3_Configure_Languages.png                                    

导航到“配置”并找到“地区及语言”。你会看到两个新的选项:“语言”及“翻译”。点击“语言”

tutuploadsmedia_1326857306494.png                                    

在语言页面,点击“添加语言”

tutuploadsmedia_1326857397128.png                                    

在预定义语言下面的下拉菜单中选择一个语言。如果你找不到你想要的语言,你可以自己定义一个语言。但是这并不是这个教程要讲的内容。你可以在https://localize.drupal.org找到可供下载的语言包。

添加所有需要的语言后将页面滚动至底部并点击保存设置按钮。

第四步:选择语言检测方式并激活它                                    

tutuploadsStep_4__Choose_a_detection_method_and_enable_it_with_a_ch.png                                    

给你想使用的方法打钩,并保存。

警告:不要关闭或者改变你的默认语言,这会导致严重的错误及不可预料的结果。你的默认语言不一定必须是英语。如果你用的是某个国际化的Drupal版本,不要改变它的默认语言。

第五步:配置翻译升级                                    

tutuploadsStep_5_Configure_Translation_Updates..png                                    

在“更新翻译”选项卡,你可以配置为你的语言文件自动升级的功能。

tutuploadsmedia_1326860356104.png                                    

导航到“配置”并找到“地区及语言”。点击“翻译”。这里你可以看到一排选项卡,可以让你执行导入、升级和管理界面的字符串。

tutuploadsmedia_1326860773347.png                                    

你下载的语言包会翻译大部分的东西。使用这个页面上的工具,你可以搜索并找到你想翻译的字符串或者一段话。

在上图中我搜索了字符串 "An AJAX HTTP error occurred." 字符串必须完全按照它在页面中所显示的那样来输入。点击编辑来翻译这个字符串。

tutuploadsmedia_1326860938401.png                                    

现在你可以为不同的语言添加字符串,并为他们添加翻译。如果你不为字符串添加翻译,那么用户只能在默认语言下看到他们。

第六步:为页面添加翻译                                    

tutuploadsStep_6_Add_the_translation_to_the_website.png                                    

启用下面的模块,如果你还没有启用的话

  • Entity Translation

  • Title

  • Internationalization

  • Entity API

  • Variable

启用之后,导航至结构,然后进入内容类型

tutuploadsmedia_1326922982363.png                                    

点击你想要添加翻译的内容类型的编辑按钮

tutuploadsmedia_1326923055299.png                                    

点击发布选项并启用多语言支持

-如果选择启用,编辑表单中会被添加一个语言选择字段,它可以让你选择已经启用的语言。

-你也可以为这个内容类型开启翻译,这样你可以对内容进行翻译。

-如果不启用。新添加的内容将用默认语言保存。已经存在的内容不会因为这个选项的改变而受到影响。

-如果entity translation被启用了,它可以针对每个启用的语言为同一个内容提供不同的翻译版本。

tutuploadsmedia_1326923446012.png                                    

点击“Multilingual settings”。选择扩展语言支持选项。点击保存内容类型。为每一个内容类型重复这个步骤。

第七步:让每一个字段都可以被翻译                                    

tutuploadsStep_7_Make_each_field_translatable.png                                    

退回到你正在编辑的内容类型,并点击“管理字段”选项卡。你会看到标题字段有一个“replace”选项。

tutuploadsmedia_1326924079411.png                                    

如果你勾选“Replace title with a field instance”,标题就会被一个字段所取代。(译者注:这样你就可以翻译标题了)

tutuploadsmedia_1326924160600.png                                    

现在你会得到一条确认信息。

第八步:为每个字段激活语言选项                                    

tutuploadsStep_8_Activate_the_language_option_for_each_field.png                                    

点击“字段”栏中的字段名称。你需要为该内容类型里的每一个字段重复这个步骤。

tutuploadsmedia_1326925225904.png                                    

勾选并保存,以确保字段可以被翻译。

第九步:创建一些内容并为他们添加翻译                                    

tutuploadsStep_9_Create_some_content_and_activate_the_translation_f.png                                    

点击“添加内容”并为一个你已经激活了多语言属性的内容类型添加一个内容。

tutuploadsmedia_1326927322414.png                                    

当你保存之后,在编辑页上会有一个多出来的选项卡。点击“翻译”。

tutuploadsmedia_1326927391598.png                                    

在新的对话框中点击“add translation”

tutuploadsmedia_1326927572410.png                                    

进行翻译并保存。在上面的例子中,我将标题和body字段翻译成了法语。

第十步:为每个语种重复同样的步骤                                    

tutuploadsStep_10_Repeat_for_each_language.png                                    

为每个页面上会使用到的语种重复同样的步骤。

第十一步:添加一个用于语言切换的区块                                    

tutuploadsStep_11_Add_a_block_for_the_language_switcher.png                                    

导航至结构,然后到区块,找到“语言切换器(内容)”和“语言切换器(用户界面文本)”这2个区块。

tutuploadsStep_12_Add_the_block_to_your_site.png                                        

将他们之一或者一起加入到你的页面的指定位置。

tutuploadsmedia_1326928781631.png                                        

在区块页面上点击“配置”,点击“语言”。对可见性进行配置。这里如果不配置的话,默认是不区分语言的。

tutuploadsmedia_1326928955792.png                                        

如上图所示,语言选择区块被放置在了页脚部分。点击国旗图标或者语言链接就可以切换页面的语言。

tutuploadsmedia_1326929117337.png                                        

上图显示的是我点击了南非国旗之后的样子。你会发现某些标签并没有被翻译。你需要像在第五步里描述的那样,一对一的找到他们并对他们进行翻译。也许在将来这些词汇的翻译会被加入这个语言的语言包中,也有可能在这个语言中并不存在相对应的词汇。

现在你学会了如何为一个drupal网站添加界面和内容的翻译。你需要执行很多个步骤而且你很容易被搞昏了头。如果你是个新手,不要急,慢慢来,并且在你做下一步之前,一定要确定前一个步骤没有搞错。

来自 http://www.vi-sure.com/blog/71


普通分类: