この情報は Redmine 2.5 で不要になりました。→ tail -f pinzo.log: Redmine 2.5.0 からプラグインでの文言上書きが復活しています
Redmine のプラグインで本体の文言を上書きすることが出来ません。
昔はできたようなのですが 、バージョンが違うのか I18n の仕様が変わったのか現在は出来ません。
ja:
project_module_documents: ドキュメント
project_module_calendar: 日程表
プラグインの ja.yml
にこんな記述をしても画面はかわりません。
通常、プラグインをロードすると、I18n.load_path
はこんな状態になります。
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.15/lib/active_support/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activemodel-3.2.15/lib/active_model/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.15/lib/active_record/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.15/lib/action_view/locale/en.yml
$REDMINE_HOME/plugins/<plugin_name>/config/locales/en.yml
$REDMINE_HOME/plugins/<plugin_name>/config/locales/ja.yml
$REDMINE_HOME/config/locales/ar.yml
$REDMINE_HOME/config/locales/az.yml
$REDMINE_HOME/config/locales/bg.yml
--- 延々と Redmine 本体の言語ファイルが列挙
$REDMINE_HOME/config/locales/vi.yml
$REDMINE_HOME/config/locales/zh-TW.yml
$REDMINE_HOME/config/locales/zh.yml
rails/railties/lib/rails/engine.rb at 3-2-stable · rails/rails にあるように、I18n.load_path
の後ろのほうが優先度が高いので、本体の言語ファイルのほうが優先されてしまいプラグイン側で上書きすることができません。
プラグインの登録は config/initializers/30-redmine.rb
で行われていて、その際にプラグインの辞書ファイルが I18n.load_path
に登録されるのですが、この時点ではアプリケーション本来の辞書ファイルが登録されていないからでしょう。
じゃあどうすればいいのかというと、どこかで I18n.load_path
を調整して、プラグインの辞書ファイルを後ろの方にもっていくのがいいのかなと。
確実に行うなら、初期化完了時がよさげですね。
Rails::Engine
には after_initialize
という目的そのままの機能があるのでこれが使えそうです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8
module RedmineApp
class Application < Rails::Application
config.after_initialize do
plugin_root_path = File.expand_path(File.join(File.dirname(__FILE__), '../'))
Dir.glob(File.join(plugin_root_path, 'config', 'locales', '*.yml')) do |path|
if I18n.load_path.include?(path)
I18n.load_path.delete(path)
I18n.load_path << path
end
end
end
end
end
こんなコードを lib
あたりに突っ込んでおいて、init.rb
で require
すればOK。
I18n.load_path
はこんな感じになります。
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.15/lib/active_support/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activemodel-3.2.15/lib/active_model/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.15/lib/active_record/locale/en.yml
$REDMINE_HOME/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.15/lib/action_view/locale/en.yml
$REDMINE_HOME/config/locales/ar.yml
$REDMINE_HOME/config/locales/az.yml
$REDMINE_HOME/config/locales/bg.yml
--- 延々と Redmine 本体の言語ファイルが列挙
$REDMINE_HOME/config/locales/vi.yml
$REDMINE_HOME/config/locales/zh-TW.yml
$REDMINE_HOME/config/locales/zh.yml
$REDMINE_HOME/plugins/<plugin_name>/config/locales/en.yml
$REDMINE_HOME/plugins/<plugin_name>/config/locales/ja.yml
これで、本体の辞書ファイルをプラグインの辞書ファイルで上書きすることができました。