Использовать вспомогательные методы внутри файла локалей? - PullRequest
4 голосов
/ 02 февраля 2012

Я пытаюсь запустить Gitorious с помощью Rails 3, но я столкнулся с проблемой.

У меня есть эта линия в представлении.

<p><%= t("views.commits.message").call(self, tree_path(@commit.id)) %></p>

Соответствующая строка локалей выглядит следующим образом [config/locales/en.rb]

 :message => lambda { |this, path| "This is the initial commit in this repository, " +
      this.link_to( "browse the initial tree state", path ) + "." }

Проблема здесь в том, что лямбда-метод не вызывается с использованием #call в представлении, он вызывается кем-то другим, что означает, что this не является self, который передается ему.

this содержит views.commits.message, а path содержит {:rescue_format=>:html}. Команда Gitorious использовала этот подход во всем приложении, что означает, что я не могу просто перевести логику в вспомогательный метод, не занимая день формальной работы.

Я провел некоторое исследование и обнаружил эту ветку о точной линии.

Это был ответ на проблему.

Похоже, это указывает на то, что в вашей системе установлен гем i18n; этот драгоценный камень несовместим с Gitorious. Удаление с помощью Rubygems должно решить проблему.

Я пытался удалить i18n, но при запуске bundle install просто устанавливает его снова.

Как мне решить эту проблему без рефакторинга файла с 700 строчными локалями?

1 Ответ

1 голос
/ 28 января 2013

Это распространенная проблема, как разбить сложные вложенные фрагменты текста.

Использование уценки для упрощения

This is the initial commit in this repository
[browse the initial tree state](http://example.com/some/path)
.

Возможно, на китайском вы бы вместо этого сказали

这是第一个提交在这个知识库
[看初始状态](http://example.com/some/path)
。

Мы должны рассмотреть 3 вещи;

  1. Внешний текст
  2. Текст ссылки
  3. Порядок и положение этих двух

Если положение ссылки относительно текста менять не нужно, то @WattsInABox корректно.

views.commits.message: "This is the initial commit in this repository"
views.commits.browse:  "browse the initial tree state"

Затем мы просто сочиняем

<p>
  <%= t "views.commits.message" %>
  <%= link_to t("views.commits.browse"), tree_path(@commit.id) %>
  .
</p>

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

views.commits.message: "This is the initial commit in this repository %{link}"
views.commits.browse:  "browse the initial tree state"

Тогда мы можем интерполировать ссылку в нужном месте

<p>
  <%= t "views.commits.message", link: link_to(t("views.commits.browse"), tree_path(@commit.id)) %>
</p>
...