Как сделать i18n осведомленным о "полах" в гендерно-чувствительных языках, таких как, например, Французский

Мне нужно перевести веб-сайт на французский. Теперь на французском языке, как и на многих других языках, есть полы и перегибы. Вопросы:

  • Как создать файлы yaml, содержащие сообщения с переменными частями, являющимися либо мужскими, либо женскими...
  • Как изменить генератор i18n для поддержки этого?
  • Есть ли какие-либо драгоценные камни или плагины, поддерживающие это?

Ответ 1

Это обычная проблема и на итальянском языке.

Одним из решений, которое не требует плагинов, было бы использование специальных ключей для пола.

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 выглядит как интересный проект, но, по моему опыту, не так редко передавать файлы ямля нетехническим переводчикам и иметь дополнительную сложность для объяснения:

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. Будет также намного легче узнать испорченный отступ, когда переведенные файлы вернутся к вам.

Ответ 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 в своем контроллере, чтобы он мог обнаружить правильный камень для данного случая.

Этот пример для английского, но я считаю, что перевод на французский язык является простым.

EDIT:

Я считаю, что вам нужно указать пол в качестве параметра в переводе, это особенно полезно, если у вас есть коллекция, вот как вы это делаете:

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

Помните, что метод inflection_method, определенный в контроллере, является просто помощником, поэтому вам не нужно указывать пол как параметр несколько раз, но в случае, если вам нужно изменить его в том же представлении, вы можете отправить его как параметр я сказал.

Если вы собираетесь использовать эту структуру, я рекомендую создать такой помощник:


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