mirror of
https://github.com/discourse/discourse.git
synced 2024-11-22 11:15:05 +08:00
FEATURE: Add localized timezone names (#7004)
Uses github.com/discourse/moment-timezone-names-translations to translate timezone names. Plugins can also provide their own timezone name translations.
This commit is contained in:
parent
42df20e4f0
commit
9bf11a7c02
|
@ -156,18 +156,26 @@ module JsLocaleHelper
|
|||
result << File.read("#{Rails.root}/vendor/assets/javascripts/moment.js")
|
||||
result << File.read("#{Rails.root}/vendor/assets/javascripts/moment-timezone-with-data.js")
|
||||
result << moment_locale(locale_str)
|
||||
result << moment_locale(locale_str, timezone_names: true)
|
||||
result << moment_formats
|
||||
|
||||
result
|
||||
end
|
||||
|
||||
def self.find_moment_locale(locale_chain)
|
||||
path = "#{Rails.root}/vendor/assets/javascripts/moment-locale"
|
||||
def self.find_moment_locale(locale_chain, timezone_names: false)
|
||||
if timezone_names
|
||||
path = "#{Rails.root}/vendor/assets/javascripts/moment-timezone-names-locale"
|
||||
type = :moment_js_timezones
|
||||
else
|
||||
path = "#{Rails.root}/vendor/assets/javascripts/moment-locale"
|
||||
type = :moment_js
|
||||
end
|
||||
|
||||
find_locale(locale_chain, path, :moment_js, fallback_to_english: false) do |locale|
|
||||
find_locale(locale_chain, path, type, fallback_to_english: false) do |locale|
|
||||
# moment.js uses a different naming scheme for locale files
|
||||
locale.tr('_', '-').downcase
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def self.find_message_format_locale(locale_chain, fallback_to_english:)
|
||||
|
@ -213,8 +221,8 @@ module JsLocaleHelper
|
|||
"moment.fn.#{name.camelize(:lower)} = function(){ return this.format('#{format}'); };\n"
|
||||
end
|
||||
|
||||
def self.moment_locale(locale)
|
||||
_, filename = find_moment_locale([locale])
|
||||
def self.moment_locale(locale, timezone_names: false)
|
||||
_, filename = find_moment_locale([locale], timezone_names: timezone_names)
|
||||
filename && File.exist?(filename) ? File.read(filename) << "\n" : ""
|
||||
end
|
||||
|
||||
|
|
|
@ -638,6 +638,10 @@ class Plugin::Instance
|
|||
opts[:moment_js] = find_locale_file(locale_chain, path)
|
||||
opts[:moment_js] = JsLocaleHelper.find_moment_locale(locale_chain) unless opts[:moment_js]
|
||||
|
||||
path = File.join(lib_locale_path, "moment_js_timezones")
|
||||
opts[:moment_js_timezones] = find_locale_file(locale_chain, path)
|
||||
opts[:moment_js_timezones] = JsLocaleHelper.find_moment_locale(locale_chain, timezone_names: true) unless opts[:moment_js_timezones]
|
||||
|
||||
if valid_locale?(opts)
|
||||
DiscoursePluginRegistry.register_locale(locale, opts)
|
||||
Rails.configuration.assets.precompile << "locales/#{locale}.js"
|
||||
|
|
|
@ -73,6 +73,9 @@ task 'javascript:update' do
|
|||
destination: 'moment-locale',
|
||||
}, {
|
||||
source: 'moment-timezone/builds/moment-timezone-with-data.js'
|
||||
}, {
|
||||
source: 'moment-timezone-names-translations/locales/.',
|
||||
destination: 'moment-timezone-names-locale'
|
||||
}, {
|
||||
source: 'mousetrap/plugins/global-bind/mousetrap-global-bind.js'
|
||||
}, {
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
"markdown-it": "8.4.1",
|
||||
"moment": "2.22.1",
|
||||
"moment-timezone": "0.5.14",
|
||||
"moment-timezone-names-translations": "https://github.com/discourse/moment-timezone-names-translations",
|
||||
"mousetrap": "https://github.com/discourse/mousetrap#firefox-alt-key",
|
||||
"pikaday": "1.7.0",
|
||||
"resumablejs": "1.1.0",
|
||||
|
|
|
@ -65,6 +65,12 @@ export default Ember.Component.extend({
|
|||
|
||||
@computed()
|
||||
allTimezones() {
|
||||
if (
|
||||
moment.locale() !== "en" &&
|
||||
typeof moment.tz.localizedNames === "function"
|
||||
) {
|
||||
return moment.tz.localizedNames();
|
||||
}
|
||||
return moment.tz.names();
|
||||
},
|
||||
|
||||
|
|
|
@ -358,6 +358,7 @@ describe Plugin::Instance do
|
|||
expect(DiscoursePluginRegistry.locales.count).to eq(0)
|
||||
|
||||
plugin.activate!
|
||||
|
||||
expect(DiscoursePluginRegistry.locales.count).to eq(2)
|
||||
end
|
||||
|
||||
|
@ -377,12 +378,14 @@ describe Plugin::Instance do
|
|||
expect(locale[:fallbackLocale]).to be_nil
|
||||
expect(locale[:message_format]).to eq(["foo_BAR", "#{plugin_path}/lib/javascripts/locale/message_format/foo_BAR.js"])
|
||||
expect(locale[:moment_js]).to eq(["foo_BAR", "#{plugin_path}/lib/javascripts/locale/moment_js/foo_BAR.js"])
|
||||
expect(locale[:moment_js_timezones]).to eq(["foo_BAR", "#{plugin_path}/lib/javascripts/locale/moment_js_timezones/foo_BAR.js"])
|
||||
expect(locale[:plural]).to eq(plural.with_indifferent_access)
|
||||
|
||||
expect(Rails.configuration.assets.precompile).to include("locales/foo_BAR.js")
|
||||
|
||||
expect(JsLocaleHelper.find_message_format_locale(["foo_BAR"], fallback_to_english: true)).to eq(locale[:message_format])
|
||||
expect(JsLocaleHelper.find_moment_locale(["foo_BAR"])).to eq (locale[:moment_js])
|
||||
expect(JsLocaleHelper.find_moment_locale(["foo_BAR"], timezone_names: true)).to eq (locale[:moment_js_timezones])
|
||||
end
|
||||
|
||||
it "correctly registers a new locale using a fallback locale" do
|
||||
|
@ -394,6 +397,7 @@ describe Plugin::Instance do
|
|||
expect(locale[:fallbackLocale]).to eq("es")
|
||||
expect(locale[:message_format]).to eq(["es", "#{Rails.root}/lib/javascripts/locale/es.js"])
|
||||
expect(locale[:moment_js]).to eq(["es", "#{Rails.root}/vendor/assets/javascripts/moment-locale/es.js"])
|
||||
expect(locale[:moment_js_timezones]).to eq(["es", "#{Rails.root}/vendor/assets/javascripts/moment-timezone-names-locale/es.js"])
|
||||
expect(locale[:plural]).to be_nil
|
||||
|
||||
expect(Rails.configuration.assets.precompile).to include("locales/es_MX.js")
|
||||
|
|
1
spec/fixtures/plugins/custom_locales/lib/javascripts/locale/moment_js_timezones/foo_BAR.js
vendored
Normal file
1
spec/fixtures/plugins/custom_locales/lib/javascripts/locale/moment_js_timezones/foo_BAR.js
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
// this file should contain the locale configuration for moment.js timezone names
|
16
vendor/assets/javascripts/moment-timezone-names-locale/ar.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/ar.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/bg.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/bg.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/bs.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/bs.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/ca.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/ca.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/cs.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/cs.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/da.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/da.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/de.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/de.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/el.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/el.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/es.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/es.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/et.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/et.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/fa.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/fa.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/fi.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/fi.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/fr.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/fr.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/gl.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/gl.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/he.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/he.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/hu.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/hu.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/id.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/id.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/it.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/it.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/lv.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/lv.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/nb.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/nb.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/nl.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/nl.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/pl.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/pl.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/pt.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/pt.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/ro.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/ro.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/ru.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/ru.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/sq.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/sq.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/sr.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/sr.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/sv.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/sv.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/sw.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/sw.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/te.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/te.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/th.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/th.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/tr.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/tr.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/uk.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/uk.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/ur.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/ur.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/vi.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/vi.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/zh-cn.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/zh-cn.js
vendored
Normal file
File diff suppressed because one or more lines are too long
16
vendor/assets/javascripts/moment-timezone-names-locale/zh-tw.js
vendored
Normal file
16
vendor/assets/javascripts/moment-timezone-names-locale/zh-tw.js
vendored
Normal file
File diff suppressed because one or more lines are too long
|
@ -1611,6 +1611,10 @@ mkdirp@0.5.1, mkdirp@^0.5.1:
|
|||
dependencies:
|
||||
minimist "0.0.8"
|
||||
|
||||
"moment-timezone-names-translations@https://github.com/discourse/moment-timezone-names-translations":
|
||||
version "0.0.0"
|
||||
resolved "https://github.com/discourse/moment-timezone-names-translations#5f576fc6355d8e636783bfb7b0214a5d74a5399d"
|
||||
|
||||
moment-timezone@0.5.14:
|
||||
version "0.5.14"
|
||||
resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.14.tgz#4eb38ff9538b80108ba467a458f3ed4268ccfcb1"
|
||||
|
|
Loading…
Reference in New Issue
Block a user