Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a process to look at the timestamp and reload the term if it is not latest #56

Merged
merged 10 commits into from Oct 7, 2022
7 changes: 1 addition & 6 deletions app/controllers/custom_message_settings_controller.rb
Expand Up @@ -12,8 +12,6 @@ def default_messages
end

def update
languages = @setting.using_languages

if setting_params.key?(:custom_messages) || params[:tab] == 'normal'
@setting.update_with_custom_messages(setting_params[:custom_messages].try(:to_unsafe_h).try(:to_hash) || {}, @lang)
elsif setting_params.key?(:custom_messages_yaml)
Expand All @@ -22,9 +20,6 @@ def update

if @setting.errors.blank?
flash[:notice] = l(:notice_successful_update)
languages += @setting.using_languages
MessageCustomize::Locale.reload!(languages)

redirect_to edit_custom_message_settings_path(tab: params[:tab], lang: @lang)
else
render :edit
Expand Down Expand Up @@ -58,7 +53,7 @@ def setting_params
def set_lang
@lang =
MessageCustomize::Locale.find_language(
params[:lang].presence || @setting.custom_messages.keys.first || User.current.language.presence || Setting.default_language
params[:lang].presence || @setting.custom_messages.keys.first || current_user_language
)
end
end
27 changes: 13 additions & 14 deletions app/models/custom_message_setting.rb
Expand Up @@ -18,6 +18,18 @@ def custom_messages(lang=nil, check_enabled=false)
messages || {}
end

def custom_messages_with_timestamp(lang=nil, check_enabled=false)
messages = self.custom_messages(lang, check_enabled)
yui-har marked this conversation as resolved.
Show resolved Hide resolved
messages.merge({'redmine_message_customize_timestamp' => self.try(:updated_on).to_i.to_s})
end

def latest_messages_applied?(lang)
return true if self.new_record?
yui-har marked this conversation as resolved.
Show resolved Hide resolved

redmine_message_customize_timestamp = I18n.backend.send(:translations)[:"#{lang}"][:redmine_message_customize_timestamp]
redmine_message_customize_timestamp == self.updated_on.to_i.to_s
yui-har marked this conversation as resolved.
Show resolved Hide resolved
end

def custom_messages_to_flatten_hash(lang=nil)
self.class.flatten_hash(custom_messages(lang))
end
Expand Down Expand Up @@ -53,20 +65,7 @@ def update_with_custom_messages_yaml(yaml)

def toggle_enabled!
self.value = self.value.merge({enabled: (!self.enabled?).to_s})

if result = self.save
MessageCustomize::Locale.reload!(self.using_languages)
end
result
end

def using_languages
messages = self.custom_messages
if messages.is_a?(Hash)
messages.keys.map(&:to_s)
else
[User.current.language]
end
self.save
end

# { date: { formats: { defaults: '%m/%d/%Y'}}} to {'date.formats.defaults' => '%m/%d/%Y'}
Expand Down
2 changes: 1 addition & 1 deletion config/locales/custom_messages/ar.rb
@@ -1 +1 @@
{ ar: CustomMessageSetting.find_or_default.custom_messages('ar', true) }
{ ar: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('ar', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/az.rb
@@ -1 +1 @@
{ az: CustomMessageSetting.find_or_default.custom_messages('az', true) }
{ az: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('az', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/bg.rb
@@ -1 +1 @@
{ bg: CustomMessageSetting.find_or_default.custom_messages('bg', true) }
{ bg: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('bg', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/bs.rb
@@ -1 +1 @@
{ bs: CustomMessageSetting.find_or_default.custom_messages('bs', true) }
{ bs: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('bs', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/ca.rb
@@ -1 +1 @@
{ ca: CustomMessageSetting.find_or_default.custom_messages('ca', true) }
{ ca: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('ca', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/cs.rb
@@ -1 +1 @@
{ cs: CustomMessageSetting.find_or_default.custom_messages('cs', true) }
{ cs: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('cs', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/da.rb
@@ -1 +1 @@
{ da: CustomMessageSetting.find_or_default.custom_messages('da', true) }
{ da: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('da', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/de.rb
@@ -1 +1 @@
{ de: CustomMessageSetting.find_or_default.custom_messages('de', true) }
{ de: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('de', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/el.rb
@@ -1 +1 @@
{ el: CustomMessageSetting.find_or_default.custom_messages('el', true) }
{ el: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('el', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/en-GB.rb
@@ -1 +1 @@
{ "en-GB": CustomMessageSetting.find_or_default.custom_messages('en-GB', true) }
{ "en-GB": CustomMessageSetting.find_or_default.custom_messages_with_timestamp('en-GB', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/en.rb
@@ -1 +1 @@
{ en: CustomMessageSetting.find_or_default.custom_messages('en', true) }
{ en: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('en', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/es-PA.rb
@@ -1 +1 @@
{ "es-PA": CustomMessageSetting.find_or_default.custom_messages('es-PA', true) }
{ "es-PA": CustomMessageSetting.find_or_default.custom_messages_with_timestamp('es-PA', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/es.rb
@@ -1 +1 @@
{ es: CustomMessageSetting.find_or_default.custom_messages('es', true) }
{ es: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('es', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/et.rb
@@ -1 +1 @@
{ et: CustomMessageSetting.find_or_default.custom_messages('et', true) }
{ et: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('et', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/eu.rb
@@ -1 +1 @@
{ eu: CustomMessageSetting.find_or_default.custom_messages('eu', true) }
{ eu: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('eu', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/fa.rb
@@ -1 +1 @@
{ fa: CustomMessageSetting.find_or_default.custom_messages('fa', true) }
{ fa: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('fa', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/fi.rb
@@ -1 +1 @@
{ fi: CustomMessageSetting.find_or_default.custom_messages('fi', true) }
{ fi: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('fi', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/fr.rb
@@ -1 +1 @@
{ fr: CustomMessageSetting.find_or_default.custom_messages('fr', true) }
{ fr: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('fr', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/gl.rb
@@ -1 +1 @@
{ gl: CustomMessageSetting.find_or_default.custom_messages('gl', true) }
{ gl: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('gl', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/he.rb
@@ -1 +1 @@
{ he: CustomMessageSetting.find_or_default.custom_messages('he', true) }
{ he: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('he', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/hr.rb
@@ -1 +1 @@
{ hr: CustomMessageSetting.find_or_default.custom_messages('hr', true) }
{ hr: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('hr', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/hu.rb
@@ -1 +1 @@
{ hu: CustomMessageSetting.find_or_default.custom_messages('hu', true) }
{ hu: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('hu', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/id.rb
@@ -1 +1 @@
{ id: CustomMessageSetting.find_or_default.custom_messages('id', true) }
{ id: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('id', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/it.rb
@@ -1 +1 @@
{ it: CustomMessageSetting.find_or_default.custom_messages('it', true) }
{ it: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('it', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/ja.rb
@@ -1 +1 @@
{ ja: CustomMessageSetting.find_or_default.custom_messages('ja', true) }
{ ja: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('ja', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/ko.rb
@@ -1 +1 @@
{ ko: CustomMessageSetting.find_or_default.custom_messages('ko', true) }
{ ko: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('ko', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/lt.rb
@@ -1 +1 @@
{ lt: CustomMessageSetting.find_or_default.custom_messages('lt', true) }
{ lt: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('lt', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/lv.rb
@@ -1 +1 @@
{ lv: CustomMessageSetting.find_or_default.custom_messages('lv', true) }
{ lv: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('lv', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/mk.rb
@@ -1 +1 @@
{ mk: CustomMessageSetting.find_or_default.custom_messages('mk', true) }
{ mk: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('mk', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/mn.rb
@@ -1 +1 @@
{ mn: CustomMessageSetting.find_or_default.custom_messages('mn', true) }
{ mn: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('mn', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/nl.rb
@@ -1 +1 @@
{ nl: CustomMessageSetting.find_or_default.custom_messages('nl', true) }
{ nl: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('nl', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/no.rb
@@ -1 +1 @@
{ no: CustomMessageSetting.find_or_default.custom_messages('no', true) }
{ no: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('no', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/pl.rb
@@ -1 +1 @@
{ pl: CustomMessageSetting.find_or_default.custom_messages('pl', true) }
{ pl: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('pl', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/pt-BR.rb
@@ -1 +1 @@
{ "pt-BR": CustomMessageSetting.find_or_default.custom_messages('pt-BR', true) }
{ "pt-BR": CustomMessageSetting.find_or_default.custom_messages_with_timestamp('pt-BR', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/pt.rb
@@ -1 +1 @@
{ pt: CustomMessageSetting.find_or_default.custom_messages('pt', true) }
{ pt: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('pt', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/ro.rb
@@ -1 +1 @@
{ ro: CustomMessageSetting.find_or_default.custom_messages('ro', true) }
{ ro: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('ro', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/ru.rb
@@ -1 +1 @@
{ ru: CustomMessageSetting.find_or_default.custom_messages('ru', true) }
{ ru: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('ru', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/sk.rb
@@ -1 +1 @@
{ sk: CustomMessageSetting.find_or_default.custom_messages('sk', true) }
{ sk: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('sk', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/sl.rb
@@ -1 +1 @@
{ sl: CustomMessageSetting.find_or_default.custom_messages('sl', true) }
{ sl: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('sl', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/sq.rb
@@ -1 +1 @@
{ sq: CustomMessageSetting.find_or_default.custom_messages('sq', true) }
{ sq: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('sq', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/sr-YU.rb
@@ -1 +1 @@
{ "sr-YU": CustomMessageSetting.find_or_default.custom_messages('sr-YU', true) }
{ "sr-YU": CustomMessageSetting.find_or_default.custom_messages_with_timestamp('sr-YU', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/sr.rb
@@ -1 +1 @@
{ sr: CustomMessageSetting.find_or_default.custom_messages('sr', true) }
{ sr: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('sr', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/sv.rb
@@ -1 +1 @@
{ sv: CustomMessageSetting.find_or_default.custom_messages('sv', true) }
{ sv: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('sv', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/th.rb
@@ -1 +1 @@
{ th: CustomMessageSetting.find_or_default.custom_messages('th', true) }
{ th: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('th', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/tr.rb
@@ -1 +1 @@
{ tr: CustomMessageSetting.find_or_default.custom_messages('tr', true) }
{ tr: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('tr', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/uk.rb
@@ -1 +1 @@
{ uk: CustomMessageSetting.find_or_default.custom_messages('uk', true) }
{ uk: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('uk', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/vi.rb
@@ -1 +1 @@
{ vi: CustomMessageSetting.find_or_default.custom_messages('vi', true) }
{ vi: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('vi', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/zh-TW.rb
@@ -1 +1 @@
{ "zh-TW": CustomMessageSetting.find_or_default.custom_messages('zh-TW', true) }
{ "zh-TW": CustomMessageSetting.find_or_default.custom_messages_with_timestamp('zh-TW', true) }
2 changes: 1 addition & 1 deletion config/locales/custom_messages/zh.rb
@@ -1 +1 @@
{ zh: CustomMessageSetting.find_or_default.custom_messages('zh', true) }
{ zh: CustomMessageSetting.find_or_default.custom_messages_with_timestamp('zh', true) }
1 change: 1 addition & 0 deletions init.rb
Expand Up @@ -2,6 +2,7 @@

require File.expand_path('../lib/message_customize/locale', __FILE__)
require File.expand_path('../lib/message_customize/hooks', __FILE__)
require File.expand_path('../lib/message_customize/application_controller_patch', __FILE__)

p = Redmine::Plugin.register :redmine_message_customize do
name 'Redmine message customize plugin'
Expand Down
31 changes: 31 additions & 0 deletions lib/message_customize/application_controller_patch.rb
@@ -0,0 +1,31 @@
# frozen_string_literal: true

require 'application_controller'

module MessageCustomize
module ApplicationControllerPatch
def self.included(base)
base.send(:include, InstanceMethod)
base.class_eval do
before_action :reload_customize_messages
end
end

module InstanceMethod
def reload_customize_messages
custom_message_setting = CustomMessageSetting.find_or_default
return if custom_message_setting.latest_messages_applied?(current_user_language)

MessageCustomize::Locale.reload!([current_user_language])
end

private

def current_user_language
User.current.language.presence || Setting.default_language
end
end
end
end

ApplicationController.include(MessageCustomize::ApplicationControllerPatch)
3 changes: 2 additions & 1 deletion test/fixtures/custom_message_settings.yml
Expand Up @@ -4,4 +4,5 @@ one:
value: {
custom_messages: { en: { label_home: 'Home1' }, ja: { label_home: 'Home2' }},
enabled: 'true'
}
}
updated_on: '2022-01-01 00:00'
6 changes: 4 additions & 2 deletions test/functional/custom_message_settings_controller_test.rb
@@ -1,13 +1,13 @@
require File.dirname(__FILE__) + '/../test_helper'

class CustomMessageSettingsControllerTest < defined?(Redmine::ControllerTest) ? Redmine::ControllerTest : ActionController::TestCase
fixtures :custom_message_settings, :users
fixtures :users, :email_addresses, :roles, :custom_message_settings
include Redmine::I18n
prepend ::RailsKwargsTesting::ControllerMethods if defined?(RailsKwargsTesting)

def setup
@request.session[:user_id] = 1 # admin
MessageCustomize::Locale.reload!('en')
MessageCustomize::Locale.reload!(['en', 'ja'])
Rails.application.config.i18n.load_path = (Rails.application.config.i18n.load_path + Dir.glob(Rails.root.join('plugins', 'redmine_message_customize', 'config', 'locales', 'custom_messages', '*.rb'))).uniq
end

Expand Down Expand Up @@ -50,6 +50,7 @@ def test_update_with_custom_messages

get :update, params: { settings: {'custom_messages'=>{'label_home' => 'Home3'}}, lang: 'en', tab: 'normal' }

MessageCustomize::Locale.reload!('en')
assert_equal 'Home3', l(:label_home)
assert_redirected_to edit_custom_message_settings_path(lang: 'en', tab: 'normal')
assert_equal l(:notice_successful_update), flash[:notice]
Expand All @@ -59,6 +60,7 @@ def test_update_with_custom_messages_yaml

get :update, params: { settings: {'custom_messages_yaml'=>"---\nen:\n label_home: Home3"}, tab: 'yaml' }

MessageCustomize::Locale.reload!('en')
assert_equal 'Home3', l(:label_home)
assert_redirected_to edit_custom_message_settings_path(lang: 'en', tab: 'yaml')
assert_equal l(:notice_successful_update), flash[:notice]
Expand Down
72 changes: 72 additions & 0 deletions test/integration/application_controller_patch_test.rb
@@ -0,0 +1,72 @@
# frozen_string_literal: true

require File.expand_path('../../test_helper', __FILE__)

class ApplicationControllerPatchTest < Redmine::IntegrationTest
fixtures :users, :email_addresses, :roles, :custom_message_settings

def setup
MessageCustomize::Locale.reload!(['ja', 'en'])
Rails.application.config.i18n.load_path = (Rails.application.config.i18n.load_path + Dir.glob(Rails.root.join('plugins', 'redmine_message_customize', 'config', 'locales', 'custom_messages', '*.rb'))).uniq
end

def test_reload_if_messages_are_not_latest
yui-har marked this conversation as resolved.
Show resolved Hide resolved
log_user('admin', 'admin')
custom_message_setting = CustomMessageSetting.find_or_default

# 値が書き換わっただけでは用語は置き換わらない(MessageCustomize::Locale.reload!の実行が必要)
custom_message_setting.update_with_custom_messages({'label_home' => 'Changed home'}, 'en')
assert_equal 'Home1', I18n.backend.send(:translations)[:en][:label_home]
assert_equal '1640995200', I18n.backend.send(:translations)[:en][:redmine_message_customize_timestamp]

# ApplicationControllerのbefore_actionによって、redmine_message_customize_timestampの値を見て最新かが判断される
# get '/issues'は最新じゃない状態でのリクエストのためMessageCustomize::Locale.reload!が実行されること
get '/issues'
assert_equal 'Changed home', I18n.backend.send(:translations)[:en][:label_home]
assert_equal custom_message_setting.updated_on.to_i.to_s, I18n.backend.send(:translations)[:en][:redmine_message_customize_timestamp]
end

def test_reload_if_user_language_is_auto_and_default_language_messages_are_not_latest
# User.currentのlanguageが''(auto)でもSetting.default_languageを元に用語の最新化を行うこと
User.find_by_login('admin').update(language: '')
log_user('admin', 'admin')
custom_message_setting = CustomMessageSetting.find_or_default

custom_message_setting.update_with_custom_messages({'label_home' => 'Changed home'}, 'ja')
assert_equal 'Home2', I18n.backend.send(:translations)[:ja][:label_home]
assert_equal '1640995200', I18n.backend.send(:translations)[:ja][:redmine_message_customize_timestamp]

with_settings :default_language => 'ja' do
get '/issues'
end
assert_equal 'Changed home', I18n.backend.send(:translations)[:ja][:label_home]
assert_equal custom_message_setting.updated_on.to_i.to_s, I18n.backend.send(:translations)[:ja][:redmine_message_customize_timestamp]
end

def test_reload_if_messages_are_in_different_language_than_the_language_in_which_you_customized_the_message
# メッセージをカスタマイズした言語とは別の言語を利用している場合もreloadすること
User.find_by_login('admin').update(language: 'en')
log_user('admin', 'admin')
custom_message_setting = CustomMessageSetting.find_or_default

custom_message_setting.update_with_custom_messages({'label_home' => 'Changed home'}, 'ja')
assert_equal 'Home1', I18n.backend.send(:translations)[:en][:label_home]
assert_equal '1640995200', I18n.backend.send(:translations)[:en][:redmine_message_customize_timestamp]

get '/issues'
assert_equal 'Home1', I18n.backend.send(:translations)[:en][:label_home] # 変わらない
assert_equal custom_message_setting.updated_on.to_i.to_s, I18n.backend.send(:translations)[:en][:redmine_message_customize_timestamp]
end

def test_dont_reload_if_messages_are_latest
MessageCustomize::Locale.expects(:reload!).never
get '/issues'
end

def test_dont_reload_if_customize_message_setting_is_not_saved
CustomMessageSetting.find_or_default.destroy

MessageCustomize::Locale.expects(:reload!).never
get '/issues'
end
end