`
simohayha
  • 浏览: 1395714 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

ruby way之国际化之二

    博客分类:
  • ruby
阅读更多
5规范化unicode字符串

这张没什么意思,它讲的是将一些拉丁文的音调和表示分开来表示,比如"é"  可以表示为e 和'.对我们来说,没有多大的用处,就不说了。

不过这张介绍了一个unicode的库,大家想看的话可以去看看

http://www.yoshidam.net/Ruby.html

6字符串的排序

这张也是没多少意思,对我们来说,这张讲的是对拉丁文,西班牙文之类的字符的排序,作者所作的是把那些字母的发音用上一小节所用到的Unicode库,单独那出来,然后再 进行排序.

这边要注意的是,对于array.sort他的排序,是通过解码后字节大小来进行排序的:

eacute = [0x4E2D].pack('U')
acute = [0x56FD].pack('U')
puts array = ["人", "#{eacute}", "#{acute}"]
puts array.sort

puts array.map {|item| "#{item}: #{item.unpack('C*')[0,3].join(',')}" }


7编码之间的转换

ruby的标准库里面包含了一个iconv的库来将字符串在不同的编码之间转换

如果你想要转换UTF-8到 ISO-8859-15,你可以这么做:

require 'iconv'
sword="asd"
converter = Iconv.new('GB2312', 'UTF-8')
puts  sword_iso = converter.iconv(sword)


这里要注意的是,你所只支持的编码取决于你的操作系统,如果在linux你可以运行iconv -l来列出所有你支持的编码.

如果不能转换输入的字符串到输出的格式,这时iconv会抛出一个异常:

broken_utf8_string = "hello\xfe"
converter = Iconv.new('ISO-8859-15', 'UTF-8')
begin
converter.iconv(broken_utf8_string)    # raises
rescue Iconv::IllegalSequence
converter = Iconv.new('ISO-8859-15//IGNORE', 'UTF-8')    #这里的//IGNORE的意思是跳过那些错误
puts converter.iconv(broken_utf8_string)    # "hello"
end


这里还有一个标记,那就是//TRANSLIT,这个标记的意思是,尽可能近似的转码,以代替抛出异常

sword = "épée"

converter = Iconv.new('ASCII//IGNORE', 'UTF-8')
puts converter.iconv(sword)       # "pe"
converter = Iconv.new('ASCII//TRANSLIT', 'UTF-8')
puts converter.iconv(sword)       # "?p?e"



下面来看这段代码,这个代码是将一个web网页,转成utf-8的编码:
require 'open-uri'

require 'iconv'



def get_web_page_as_utf8(url)

  open(url) do |io|

    source = io.read

    type, *parameters = io.content_type_parse

    # Don't transcode anything that isn't (X)HTML

    unless type =~ %r!^(?:text/html|application/xhtml+xml)$!

      return source

    end

    # Check server headers first:

    if pair = parameters.assoc('charset')

      encoding = pair.last

    # Next, look in the HTML:

    elsif source =~ /\]*?charset=([^\s'"]+)/i

      encoding = $1

    # Finally, use the HTTP default

    else

      encoding = 'ISO-8859-1'

    end

    converter = Iconv.new('UTF-8//IGNORE', encoding)

    return converter.iconv(source)

  end

end


假设ruby正在运行的操作系统的默认编码没有被设置成UTF-8,或者ruby不能使用utf-8在这个操作系统下时(win32的包).

例如windows提供unicode的文件名并且使用内置的unicode字符集,但是ruby是通过 legacy code page和windows进行联系的.在英语和一些西欧语言的版本的windows里面这个code page是1252.

你仍然能在你的程序里面使用utf-8.可是你必须转换 legacy code page到指定的文件名,这时就必须使用iconv.可是你要记住的是 legacy code page只能表示unicode字符集里面的一小部分子集.

这就说明ruby不能在windows系统下,打开文件名不能描述为 legacy code page的文件,而这种限制在 Mac OS X, Linux, or other systems using UTF-8 locales的操作系统是不存在的.

8使用消息目录

引用
Lojban is culturally fully neutral. Its vocabulary was built algorithmically using today's six most widely spoken languages: Chinese, Hindi, English, Russian, Spanish, and Arabic.What is Lojban?, Nick Nicholas and John Cowan


一个 message catalog是使用指定语言的消息集合.它是L10N的一部分.简而言之,它也就是能使我们得到不同语言的message的版本.比如出错提示之类的..

在ruby中最好的方法是使用库Ruby-GetText-Package.我们简单的用gettext这个名字来使用他.可是这边还有一个更高效的,那就是gettet/utils,稍后我们会介绍它.

gettext库所包含的库有好几个,基本的使用这个库就require 'gettex'就可以了,可是当我们要使用一些很有用的工具的时候,我们就要用 require 'gettext/utils'来使用它.

message catalogs也就是把message在不同语言之间翻译.

每一个库或者程序都有他们自己的 message catalog.这意味着catalogs是作为发行包的一部分而存在的.

环境变量比如LANG和GETTEXT_PATH都是很重要的,我们稍后会介绍他们.

这边有两个很基础的操作在你使用消息目录的时候可能会遇到.
1 提取消息,从你的ruby源代码到你所创建的最初目录
2 更新(合并)新的消息从ruby源码到一个存在的目录

9前置工作

如果你没有安装这个库的话,你需要gem install gettext来安装一下这个库.

对于开发者来说,你可能还需要一个GNU  utilities,如果你是linux或者unix系统的话,你可能已经拥有这个工具包了.顺便说一下,这个工具包只是开发是用,而不是在运行时用.

如果你没有装rake,你现在可以gem install rake..

如果你已经安装好所有的东西了,你就可以开始消息目录了,在这之前,我们先理解几个概念:

#po-file 也就是 portable object file.他是消息目录的文本形式(也就是人可以直接看的格式).每个po-file对应于不同的local,都提供一个版本的文件.它也就是模板文件。

#mo-file也就是portable binary message catalog file,他是二进制的.他是从po-file里面创建而来的.我们的ruby库就是读这个文件.

#一个文本域,也就是一个mo-file的名字,一个文本域,是和一个应用程序帮定在一起的.

10 本地化一个简单的程序

require 'rubygems'
require 'gettext'
class Person
  include GetText

  def initialize(name, age, children_num)
    @name, @age, @children_num = name, age, children_num
    bindtextdomain("myapp")
  end

  def show
    puts _("Information")
    puts _("Name: %{name}, Age: %{age}") % {:name => @name, :age => @age}
    puts n_("%{name} has a child.", "%{name} has %{num} children.",
             @children_num) % {:name => @name, :num => @children_num}
  end
end

john = Person.new("John", 25, 1)
puts john.show
linda = Person.new("Linda", 30, 3)
puts linda.show


要注意这个文件的路径是myapp/person.rb. 在initialize方法里面使用bindtextdomain绑定了文本域myapp到person对象在运行时.

在show方法里面这里有3个gettext调用,我们稍后解释一个n_这个方法。

现在我们现建立一个Rakefile的文件,目录是myapp/Rakefile .

引用
require 'rubygems'
require 'gettext/utils'

desc "Update pot/po files."
task :updatepo do
  GetText.update_pofiles("myapp", ["person.rb"], "myapp 1.0.0")
end
desc "Create mo-files"
task :makemo do
  GetText.create_mofiles
end


update_pofiles方法帮助我们从person.rb源文件来创建myapp.pot文件,如果这个函数被调用两次(或者更多)的话,这个函数他将会自己对pot文件和po文件进行update或者合成.GetText.create_mofiles 创建一个 在data/locale/ 这个目录下的mo文件(从po文件).

现在我们运行rake updatepo,myapp/po下面将会生成myapp.pot文件.

现在我们复制myapp.pot到myapp/po/zh/myapp.po.然后我们编辑myapp.po(也就是翻译他).

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: myapp 1.0.0\n"
"POT-Creation-Date: 2007-12-16 01:44+0800\n"
"PO-Revision-Date: 2007-12-16 01:44+0800\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms:  nplurals=2; plural=(n != 1);\n"

#: person.rb:13
msgid "Information"
msgstr "信息"

#: person.rb:14
msgid "Name: %{name}, Age: %{age}"
msgstr "名字: %{name}, 年龄: %{age}"

#: person.rb:15
msgid "%{name} has a child."
msgid_plural "%{name} has %{num} children."
msgstr[0] "%{name} 有一个小孩"
msgstr[1] "%{name} 有%{num}个小孩"


我们现在来看这个文件:
msgid标记后面的字符串是原始的字符串,也就是是没有本地化的字符串.msgstr后面的字符串是我们所要翻译的字符串,也就是到时候本地浏览,所要看到的.

这边还有一个特殊的符号那就是msgid_plural,当看到这个的时候,我们就要通过上面所给的Plural-Forms来选择他所匹配的msgstr,这边的规则是n!=1,n也就是最上面n_函数里面最后一个参数,也就是孩子的个数不等于1时就选择匹配nsgstr[1].

在这里我们看到,这边的参数最重要的两个是Content-Type和Plural-Forms。

最终,修改完毕后,我们再次回到myapp/目录下,运行rake makemo,然后将会生成myapp.mo路径将会是:myapp/data/locale/zh/LC_MESSAGES/myapp.mo.所以整个工程的路径是下面的样子:

引用
myapp/

    Rakefile

    person.rb

    po/

        myapp.pot

        de/myapp.po

        fr/myapp.po

        ja/myapp.po

        :

    data/

        locale/

            de/LC_MESSAGES/myapp.mo

            fr/LC_MESSAGES/myapp.mo

            ja/LC_MESSAGES/myapp.mo



现在我们可以测试我们的本地化了,首先在命令行下执行export GETTEXT_PATH="data/locale"
,这边是指定mo文件的位置。而由于本身自己的操作系统就是zh_cn.utf-8的,因此export Lang就不用执行了.然后再执行ruby person.rb,可以看到,本地化成功..

分享到:
评论

相关推荐

    The Ruby Way(第2版)

    The Ruby Way(第2版) &lt;br&gt;The Ruby Way assumes that the reader is already familiar with the subject matter. Using many code samples it focuses on "how-to use Ruby" for specific applications, either ...

    The Ruby Way--3rd Edition--2015-英文版

    The Ruby Way 第三版(英文版),全书22章,书中包含600多个按主题分类的示例。每个示例都回答了“如何使用Ruby来完成”的问题。 ——Ruby on Rails之父David Heinemeier Hansson倾力推荐!

    Ruby-FastGettextRuby国际化工具

    Ruby作为一门动态、灵活的编程语言,广泛应用于Web开发领域,其在国际化的支持上也有多种解决方案。FastGettext就是其中一款高效的Ruby国际化工具,它以其内存占用小、命名空间简洁以及线程安全性等特性,深受开发者...

    the ruby way 2ed

    《The Ruby Way 2nd Edition》是一本深入探讨Ruby编程语言的经典著作,旨在帮助读者全面理解和掌握Ruby的精髓。这本书的第二版在2006年出版,由Addison-Wesley出版,作者通过深入浅出的方式,揭示了Ruby语言的强大...

    THE RUBY WAY(中文版)(第二版)pdf

    《The Ruby Way 第二版》...“《The Ruby Way (第2版)中文版》在阐述元编程(metaprogramming)等方面尤其出类拔萃,而元编程是Ruby最引人注目的方面之一。” ——Ruby on Rails之父David Heinemeier Hansson倾力推荐!

    ruby学习资源(Programming Ruby, Learning Ruby, The Ruby Way)

    内含以下4个文档: 1、Addison.Wesley.The.Ruby.Way.2nd.Edition.Oct.2006.chm 2、O'Reilly.Learning.Ruby.May.2007.chm 3、Programming Ruby 2e.pdf 4、ruby中文文档.chm

    the-ruby-way

    the ruby way the ruby way

    Addison Wesley The Ruby Way 2Nd Edition Oct 2006.pdf(英文版)

    4. **国际化(I18N)与消息目录**:探讨了如何使用Ruby进行国际化支持,包括消息目录的创建和管理。 5. **高级数据结构操作**:除了基本的数据类型外,还涉及到了哈希表、数组以及其他数据结构如栈、树和图的操作。...

    Ruby-i18nRuby的国际化和本地化的解决方案

    Ruby-i18n是Ruby语言中的一个核心库,专门用于实现国际化(Internationalization,简称i18n)和本地化(Localization,简称l10n)功能。在软件开发过程中,尤其是在面向全球用户的应用中,i18n和l10n是至关重要的,...

    the ruby way

    《The Ruby Way》第二版是Addison-Wesley出版社在2006年10月出版的一本关于Ruby编程语言的权威指南。这本书深入浅出地介绍了Ruby语言的核心特性和高级用法,旨在帮助读者全面理解和掌握Ruby的精髓。通过阅读这本书,...

    11.5 时间日期the ruby way.rar

    "11.5 时间日期the ruby way"这个主题深入探讨了Ruby中处理时间日期的最佳实践和常见用法。让我们逐一了解这些知识点。 首先,`Time.now`是Ruby中获取当前时间的标准方法。它返回一个`Time`对象,表示自1970年1月1...

    Ruby-Way.rar_About Language

    《Ruby Way》是由Hal Fulton编写的关于Ruby编程语言的一本著作。这本书深入浅出地探讨了Ruby语言的各种特性,旨在帮助读者理解并掌握这门强大的动态脚本语言。Ruby以其简洁、优雅的语法和强大的元编程能力而备受赞誉...

    Ruby自动化脚本实现网络拓扑映射

    从给定的文件信息来看,标题、描述及标签均指向了“Ruby自动化脚本实现网络拓扑映射”这一主题,然而,实际的部分内容却似乎与自动化脚本或网络拓扑映射没有直接关联,而更像是一个自动化操作的脚本示例,可能用于...

    开放Ruby+watir 自动化测试工具介绍+安装说明

    Ruby和Watir(Web Application Testing in Ruby)是一个强大的自动化测试框架,主要用于Web应用程序的测试。Ruby是一种面向对象的、动态的编程语言,以其简洁、优雅的语法和强大的元编程能力而受到开发者的喜爱。...

Global site tag (gtag.js) - Google Analytics