0. 写本文时使用的环境:
OS: MacOS X 10.4.7
Ruby 1.8.5
Rails 1.1.6
gettext 1.8.0
1. 安装ruby gettext
使用gem安装:
gem install gettext
gem会列出可以安装的gettext的版本。注意,如果是在Windows下安装的话,一定要选择后面带“(mswin32)”的选项,否则会有编译错误。
2. 修改config/environment.rb文件:
在文件头上加入:
$KCODE='u'
require 'jcode'
require 'gettext/rails'
3. 修改app/controllers/application.rb文件
在文件头加入
require 'gettext/rails'
在ApplicationController的类声明后加入对init_gettext的调用。参数是一个字符串,一般取项目名称。这是后面要说到的po和mo文件的文件名。这里假设取'project'。
init_gettext 'project'
4. 修改Rakefile
加入以下内容:
desc "Update pot/po files to match new version."
task :updatepo do
MY_APP_TEXT_DOMAIN = "project"
MY_APP_VERSION = "project 0.0.1"
GetText.update_pofiles(MY_APP_TEXT_DOMAIN,
Dir.glob("{app,lib}/**/*.{rb,rhtml}"),
MY_APP_VERSION)
end
desc "Create mo-files for L10n"
task :makemo do
GetText.create_mofiles(true, "po", "locale")
end
5. 修改rb和rhtml文件,用“_()”调用代替裸字符串。
无论是在rb还是rhtml文件中,都通过“_()”函数得到多语言化的字符串。
比如controller:
class BlogController < ApplicationController
:
:
def create
@article = Article.new(params[:article])
if @article.save
flash[:notice] = _('Article was successfully created.') #Here!
redirect_to :action => 'list'
else
render :action => 'new'
end
end
:
:
end
_()函数的参数可以是任意的英文句子,而不需要象在Java应用中一样,遵循properties的命名规则。这样对英文版来说,基本没有额外的工作。
model中validation的错误信息:
validates_presence_of :title, :message => N_("can't be empty!")
注意,这里要用"N_()",而不是“_()”。
作为主语的属性名称不用写,gettext会自动将属性名加在开头。否则,可以用"%{fn}"代入属性名。gettext会查询数据库,自动产生属性名称的字符串,产生规则是:"类名|属性名"。如果属性名是由下划线分隔的多个单词,则将下划线替换为空格,第一个单词的首字母大写,其余单词全部小写。
例如User类的name属性,对应的是"User|Name","created_at"属性对应"User|Created at"。
在任意场合可以根据该规则使用多语言化的属性名,最常见的是在表头和表单中的标签。例如在rhtml文件中可以写:
<tr>
<td><%= _("User|Name") %></td>
<td><%= text_field "user", "name" %></td>
</tr>
在错误信息中还可以用“%d”代表validates_*中的某些参数,例如:
alidates_length_of :description, :minimum => 10, :message => N_("%{fn} is too short (min is %d characters)")
在view的rhtml文件中, 所有需要多语言化的文本都要用“_()”代替,比如:
<h1><%= _('Editing article') %></h1>
<%= start_form_tag :action => 'update', :id => @article %>
<%= render_partial 'form' %>
<p><%= submit_tag _('Edit') %></p>
<%= end_form_tag %>
<p>
<%= link_to _('Show'), :action => 'show', :id => @article %> |
<%= link_to _('Destroy'), {:action => 'destroy', :id => @article}, :confirm => _('Are you sure?') %> |
<%= link_to _('Back'), :action => 'list' %>
</p>
6. 准备po目录。
在项目的根目录下创建目录“po”。然后在“po”目录下为没一种语言创建一个目录,目录名是语言代码,语言代码参见:
[url] http://www.w3.org/International/resource-index.html#lang[/url]
中文一般用“zh”。其实,如果选择语言的过程完全由应用自己控制的话,目录名不遵循标准也没有关系。
7. 生成pot和po文件。
执行rake任务
rake updatepo
gettext会检查项目load路径中的所有的rb和rhtml文件,搜集调用“_()”或“N_()”的所有地方的参数,生成后缀为pot的文件,存放在po目录下,以及后缀为"po"的文件,在没一种语言的目录下各放一份。pot和po文件的文件名前缀就是前面调用“init_gettext”时的参数。所以如果在application.rb中写"init_gettext 'project'”的话,生成的文件就是“project.pot”和“project.po”。
8. 翻译po文件。
po文件是文本文件,可以使用文本编辑器编辑,但是必须使用Unicode编码。所以请使用支持Unicode的编辑器。另一种方式是使用poedit。([url]http://www.poedit.org[/url)
在po文件中,没一个文本串的格式如下面的样子:
#: app/views/member/index.rhtml:49
msgid "submit"
msgstr ""
第一行是该字符串出现的位置。如果出现过多次,则会有多行。不要删除或修改该行,否则会影响下面说的merge过程。
第二行msgid就是调用“_()”或“N_()”时的参数。
第三行的双引号中应该填入相应语言的文本。
9. 生成mo文件
执行rake任务
rake makemo
该任务会在项目的根目录下生成locale目录。下面的内容到时候自己看一下就可以了,不需要动的。mo文件是二进制文件,是gettext在运行时真正要用的。
10. 选择语言。
gettext按一下顺序决定使用哪一种语言。
a. 调用GetText.bindtextdomain方法的参数
b. request参数lang
c. Cookie lang的值。
d. Http消息头中HTTP_ACCEPT_LANGUAGE的值。
e. 缺省值“en”(English)
如果让用户自己选择语言,那么只要在controller中用“cookies['lang']=”设置用户使用的语言代码就可以了。
如果要在view中强制使用某种语言的话,可以使用set_locale方法。由此甚至可以做到一个view中使用不用的语言。比如:
<% set_locale "fr" %>
<%=_("Hello world") %>
<% set_locale "en" %>
<%=_("Hello world") %>
11. 递增开发
“rake updatepo”是支持递增开发的。也就是每次运行“rake updatepo”的时候,如果某种语言的目录下没有po文件,则生成新的po文件。如果已经有po文件了,则只是补充新发现的字符串,原来已经翻译过的内容会得到保留,是一个"merge"的过程。 这个过程中会发生两中情况,分别在po文件中用特殊的方式标记。
一种是在msgid前插入一行“#:fuzzy”,比如:
#: app/views/member/index.rhtml:49
#: fuzzy
msgid "submit"
msgstr ""
这表明gettext在merget的过程中遇到某种冲突,需要翻译po文件的人来解决。不过究竟什么样的冲突会导致fuzzy,我现在也不是很清楚。好在这种情况并不多见。发生的使用可能会出现msgid和msgstr之间张冠李戴的情况。
解决冲突以后,一定要把“#: fuzze”这行删除,否则makemo的时候会出现警告。
另一种情况是原来的某个字符串不再被用到,这种情况下gettext并不会删除这个字符串,而是在msgid前加入一行“#: deprecated”。如果这个字符串确实不再被用到了,则可以将这一行连同msgid和msgstr全部删除。否则只删除“#: deprecated”这行,而保留msgid, msgstr。
12. 多人开发时的协作。
gettext可以支持不同的模块使用不用的po文件,不过我还没试过。一般的应用,所有的文本放在一个po文件(一种语言一个)中也可以了。这时如果多个开发人员都去维护po文件的话,在版本管理上可能比较麻烦。所以最好是由一个人统一负责“updatepo, 翻译,makemo”这三个步骤。在某种语言的po文件中找不到某个字符串的时候,gettext会直接显示msgid,这在开发时也够用了。
13. 参考资料:
gettext home page:
http://www.yotabanana.com/hiki/ruby-gettext.html
Ruby-GetText-Package HOWTO for Ruby on Rails:
http://www.yotabanana.com/hiki/ruby-gettext-howto-rails.html
Using Gettext To Translate Your Rails Application:
http://manuals.rubyonrails.com/read/chapter/105
*: 本文中的部分例子代码来自上述参考资料。
分享到:
- 2006-12-02 16:18
- 浏览 7026
- 评论(7)
- 论坛回复 / 浏览 (7 / 8845)
- 查看更多
相关推荐
本篇将深入探讨gettext库及其在实现多语言国际化中的应用。 gettext库最初由GNU项目开发,它提供了一套工具和服务,使得软件开发者可以轻松地将程序翻译成多种语言,从而让软件具备全球化的能力。这个库的核心功能...
包含测试的php文件和gettext-0.14.4.exe,以及Poedit.exe 使用方法: 访问test.php?lan=zh_CN则显示简体 访问test.php?lan=en_US则显示英文 教程地址:https://www.cnblogs.com/-mrl/p/10949820.html
总的来说,FastGettext是一个高效且易于使用的Ruby国际化工具,它提供的功能和特性使得开发者能够轻松地处理多语言环境中的各种需求。无论是小型项目还是大型应用,FastGettext都能为国际化进程带来便利。在实际使用...
而`gettext`则是Linux/Unix环境中广泛使用的国际化(i18n)和本地化(l10n)工具,用于处理多语言支持。将Smarty与gettext结合,可以方便地在PHP应用中实现多语言功能。 Smarty_gettext是Smarty模板引擎的一个扩展...
总之,`gettext 0.17`是实现Django应用国际化的重要工具,它简化了多语言支持的实现过程,让开发者能专注于核心功能的开发,而不用过多关心语言差异的问题。了解和熟练使用这些工具,对于开发面向全球用户的Web应用...
在Python的Web开发框架Django中,实现应用的多语言支持是通过其强大的国际化(Internationalization,简称i18n)功能来完成的。这里主要介绍两种关键工具:gettext和Poedit,它们在Django国际化过程中起着至关重要的...
`gettext`是一个强大的国际化(i18n)和本地化(l10n)工具,它允许开发者将应用的文本字符串与特定的语言版本关联起来,从而实现多语言环境下的内容展示。 标题中提到的“PHP多语言翻译”是指使用PHP的`gettext`...
在Laravel框架中,`gettext`是一个非常有用的工具,它扩展了Laravel的本地化功能,使得开发者可以更方便地管理和维护多语言项目。`gettext`是一个广泛使用的跨平台的国际ization(i18n)工具,它允许开发者将应用...
GNU Gettext Delphi Demo 是一个基于GNU Gettext技术的演示项目,主要用于展示如何在Delphi开发环境中使用Gettext工具链进行多语言支持。这个小型应用的目的是为了验证Gettext是否能够在Delphi环境下正常工作,帮助...
GETTEXT是一个广泛用于C和C++等编程语言的国际化(i18n)和本地化(l10n)工具,但同样可以被引入到Delphi项目中,以实现更灵活的多语言功能。在Delphi开发环境中,GETTEXT的使用可以帮助程序员轻松地处理不同语言...
**MFC多语言实现——wxWidget移植法** MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,用于构建Windows应用程序。然而,MFC自身并不直接支持多语言功能,开发者通常需要自行实现这一特性。本文将...
在实际应用中,开发者可以利用`gettext0.21`的工具链,如`xgettext`提取程序中的可翻译字符串,`msgfmt`生成翻译文件,以及`msgmerge`更新翻译,以维护软件的多语言版本。同时,通过`iconv`库,他们可以确保这些字符...
总之,`laravel-gettext`为Laravel开发者提供了一种高效、灵活的多语言解决方案,通过结合Gettext的强大功能和Laravel的优雅设计,使得国际化的实现更加顺畅。在开发多语言应用时,它是值得考虑的一个优秀选择。
在C#编程中,实现多语言切换是许多应用程序不可或缺的功能,尤其对于面向国际市场的软件来说。这个主题主要涉及如何利用XML文件存储不同语言的文本资源,然后在C#程序中动态加载和切换这些资源,以实现用户界面的...
Java Web 应用程序的国际化通常通过使用Java的`ResourceBundle`类来实现,它允许开发者根据用户选择的语言提供不同的文本资源。然而,标题提到的“另类的国际化方式gettext”提供了一种不同的方法,特别是在处理多...
`gettext`是一个在开源软件开发中广泛使用的工具集,主要用于多语言环境下的文本翻译。它提供了从源代码中提取可翻译字符串,管理翻译文件,以及最终将这些翻译整合回二进制可执行文件的功能。在Linux系统中,`...
总的来说,laravel-gettext是Laravel开发者实现多语言支持的得力助手,通过它可以高效地管理项目中的翻译,提高应用的国际化水平。无论是小型项目还是大型企业级应用,laravel-gettext都能够提供强大的多语言解决...