如何让i18n知道性别敏感语言中的“性别”,例如:法国

时间:2014-01-29 17:16:17

标签: ruby-on-rails internationalization rails-i18n

我必须用法语翻译一个网站。现在,法语和许多其他语言一样,具有性别和变形。问题是:

  • 如何创建包含可变部分为男性或女性的消息的yaml文件......
  • 如何修改i18n发生器以支持此功能?
  • 有没有支持这个的宝石或插件?

2 个答案:

答案 0 :(得分:9)

这也是意大利人的常见问题。

一个不需要插件的解决方案是使用性别特定的密钥。

it: 
  presentation_f: "Sig.ra %{customer_name}" 
  presentation_m: "Sig. %{customer_name}" 

您可以在模型中创建一个方法,该方法在输入中输入一个键并返回性别修改键:

module Genderize
  def genderize(key)
    "#{key}_#{self.gender}" 
  end
end 

class Customer 
  include Genderize

  def gender
    gender_field_from_database_or_wherever || 'm' 
  end
end

在您的控制器或视图中,您可以执行以下操作:

t(@person.genderize('presentation'), customer_name: @person.name)

这个例子有点做作,但你得到了图片。

你可以做的另一件事是写一个tg函数(意思是t-genderized)作为第二个参数 获取性别方法的模型:

def tg(key, model, options={})
  gender_key = "#{key}_#{model.gender}" 
  I18n.t(gender_key, options)
end

这与上面的基本相同而不会污染模型,而是使用全局函数。

i18n-inflector-rails看起来像一个有趣的项目,但根据我的经验,将yaml文件传递给非技术翻译人员并没有那么罕见,并且需要额外的复杂性来解释:

en:
  welcome:  "Dear @{f:Lady|m:Sir|n:You|All}"

对他们来说可能太过分了。虽然这一个:

en:
  welcome_f: "Dear Lady"
  welcome_m: "Dear Sir"
  welcome_n: "Dear You" 

阅读解释要容易得多。

我还建议(这是一个与问题无关的免费建议)保持yaml文件尽可能扁平,但更喜欢将命名空间字符串作为键,而不是嵌套结构。例如,这样做:

it: 
  home_page_welcome: "Welcome to the home page!" 

而不是:

it: 
  home_page: 
    welcome: "Welcome to the home page!" 

你在控制器和视图中付出了更多的冗长,但是你最终得到的代码可以更容易地移动,而不必重新排列yaml fies中的树结构。当翻译文件回复给你时,找到混乱的缩进也会更容易。

答案 1 :(得分:2)

您是否尝试过i18n-inflector-rails

对于具有可变部分的文件,具体取决于性别(在您的en.yml中):

welcome:  "Dear @{f:Lady|m:Sir|n:You|All}"

然后你可以像这样定义f,m和n:

en:
  i18n:
    inflections:
      gender:
        f:        "female"
        m:        "male"
        n:        "neuter"
        female:   @f
        male:     @m
        neuter:   @n
        man:      @male
        woman:    @female
        default:  n

只需确保在控制器中定义inflection_method,以便它可以检测给定案例的正确宝石。

此示例适用于英语,但我相信法语翻译很简单。

编辑:

我认为你需要在翻译中指定性别作为参数,如果你有一个集合,这是特别有用的,这是你如何做到这一点:

t('.welcome', :gender => model.gender)

请记住,控制器中定义的inflection_method只是一个帮助器,因此您不需要多次将gender指定为参数,但是如果您需要在同一视图中更改它,您可以将其作为参数发送给我说过。

如果您打算使用这种结构,我建议您创建一个这样的帮助器:

module TranslationHelper
  def translate_model(key, model)
    gender = model.try(:gender) || 'male'
    I18n.t(key, :gender => gender)
  end
end

相关问题