Как изменить регистр интерполированных переменных в файле локали Rails? - PullRequest
11 голосов
/ 10 марта 2012

Использование Rails 3.1.3 с Ruby 1.9.3p0.

Я обнаружил, что по умолчанию Rails не использует регистр предложений для кнопок формы.Например, вместо кнопки «Обновить пользователя» создается кнопка «Обновить пользователя».

Имена кнопок взяты из файла локали ActionView .Есть ли способ создать значение по умолчанию, которое преуменьшает название модели?Это не рассматривается в разделе Руководства по Ruby on Rails i18n в разделе Интерполяция , поэтому, возможно, это невозможно.Следующее не работает:

en:
  helpers:
    submit:
      update: 'Update %{model}.downcase'

В общем, я был бы рад найти ссылку на синтаксис файлов YAML локали.Руководство по i18n охватывает некоторые синтаксисы, но было бы полезно найти документацию по всем восклицательным знакам, различным форматам даты / времени и т. Д. Или, возможно, для этой цели мне следует использовать Ruby Hash вместо файла YAML?1012 *

Ответы [ 2 ]

9 голосов
/ 20 марта 2012

После дальнейших исследований я пришел к выводу, что такого рода операции с интерполированными значениями невозможны, по крайней мере с использованием файла локали YAML.

YAML описан здесь и не поддерживает строковые операции:
http://www.yaml.org/spec/1.2/spec.html

Главная страница по локализации в Ruby находится здесь:
http://ruby -i18n.org / вики

Оттуда мы находим код для драгоценного камня I18n по умолчанию и углубляемся до кода интерполяции. Он использует sprintf для интерполяции:
https://github.com/svenfuchs/i18n/blob/master/lib/i18n/interpolate/ruby.rb

Этот код "в значительной степени основан на расширении интерполяции строки gettext Масао Муто":
http://github.com/mutoh/gettext/blob/f6566738b981fe0952548c421042ad1e0cdfb31e/lib/gettext/core_ext/string.rb

Это расширение имеет пример форматирования чисел :

For strings.
"%{firstname}, %{familyname}" % {:firstname => "Masao", :familyname => "Mutoh"}

With field type to specify format such as d(decimal), f(float),...
"%<age>d, %<weight>.1f" % {:age => 10, :weight => 43.4}

Расширение относится к [Ruby] "Kernel::sprintf для получения подробной информации о строке формата":
http://www.ruby -doc.org / ядро-1.9.2 / Kernel.html # метод-я-Sprintf

В этом документе по sprintf существует множество способов форматирования чисел, но нет операций по изменению регистра строк.

1 голос
/ 19 ноября 2014

Я решил эту проблему, изменив интерполяцию I18n.Поместите следующий код в каталог инициализаторов:

module I18n
  # Implemented to support method call on translation keys
  INTERPOLATION_WITH_METHOD_PATTERN = Regexp.union(
    /%%/,
    /%\{(\w+)\}/,                               # matches placeholders like "%{foo}"
    /%<(\w+)>(.*?\d*\.?\d*[bBdiouxXeEfgGcps])/, # matches placeholders like "%<foo>.d"
    /%\{(\w+)\.(\w+)\}/,                          # matches placeholders like "%{foo.upcase}"
  )

  class << self
    def interpolate_hash(string, values)
      string.gsub(INTERPOLATION_WITH_METHOD_PATTERN) do |match|
        if match == '%%'
          '%'
        else
          key = ($1 || $2 || $4).to_sym
          value = values.key?(key) ? values[key] : raise(MissingInterpolationArgument.new(values, string))
          value = value.call(values) if value.respond_to?(:call)
          $3 ? sprintf("%#{$3}", value) : ( $5 ? value.send($5) : value) 
        end
      end
    end
  end
end

Теперь вот что вы можете сделать в файле локали:

create: 'Opprett %{model.downcase}'

и протестируйте его:

require 'test_helper'

class I18nTest < ActiveSupport::TestCase

  should 'interpolate as usual' do
    assert_equal 'Show Customer', I18n.interpolate("Show %{model}", model: 'Customer')
  end

  should 'interpolate with number formatting' do
    assert_equal 'Show many 100', I18n.interpolate("Show many %<kr>2d", kr: 100)
    assert_equal 'Show many abc', I18n.interpolate("Show many %<str>3.3s", str: 'abcde')
  end

  should 'support method execution' do
    assert_equal 'Show customer', I18n.interpolate("Show %{model.downcase}", model: 'Customer')
  end

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...