我必须用法语翻译一个网站。现在,法语和许多其他语言一样,具有性别和变形。问题是:
答案 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