mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 18:30:26 -06:00
FEATURE: English locale with international date formats
Makes en_US the new default locale
This commit is contained in:
parent
a58aa9b4bf
commit
b788948985
@ -13,8 +13,8 @@ This PR doesn't match our required code formatting standards, as enforced by pre
|
||||
})
|
||||
end
|
||||
|
||||
locales_changes = git.modified_files.grep(/config\/locales/)
|
||||
has_non_en_locales_changes = locales_changes.grep_v(/config\/locales\/(client|server)\.en\.yml/).any?
|
||||
locales_changes = git.modified_files.grep(%r{config/locales})
|
||||
has_non_en_locales_changes = locales_changes.grep_v(%r{config/locales/(?:client|server)\.(?:en|en_US)\.yml}).any?
|
||||
|
||||
if locales_changes.any? && has_non_en_locales_changes
|
||||
fail("Please submit your non-English translation updates via [Transifex](https://www.transifex.com/discourse/discourse-org/). You can read more on how to contribute translations [here](https://meta.discourse.org/t/contribute-a-translation-to-discourse/14882).")
|
||||
|
5
app/assets/javascripts/locales/en_US.js.erb
Normal file
5
app/assets/javascripts/locales/en_US.js.erb
Normal file
@ -0,0 +1,5 @@
|
||||
//= depend_on 'client.en_US.yml'
|
||||
//= require locales/i18n
|
||||
|
||||
<% JsLocaleHelper.reloadable_plugins(:en_US, self) %>
|
||||
<%= JsLocaleHelper.output_locale(:en_US) %>
|
@ -17,7 +17,7 @@
|
||||
//= require_tree ./acceptance
|
||||
//= require_tree ./models
|
||||
//= require_tree ./components
|
||||
//= require locales/en
|
||||
//= require locales/en_US
|
||||
//= require fake_xml_http_request
|
||||
//= require route-recognizer/dist/route-recognizer
|
||||
//= require pretender/pretender
|
||||
|
@ -324,7 +324,7 @@ class ApplicationController < ActionController::Base
|
||||
locale = current_user.effective_locale
|
||||
end
|
||||
|
||||
I18n.locale = I18n.locale_available?(locale) ? locale : :en
|
||||
I18n.locale = I18n.locale_available?(locale) ? locale : SiteSettings::DefaultsProvider::DEFAULT_LOCALE
|
||||
I18n.ensure_all_loaded!
|
||||
end
|
||||
|
||||
|
@ -221,7 +221,7 @@ module Jobs
|
||||
RailsMultisite::ConnectionManagement.with_connection(db) do
|
||||
job_instrumenter = JobInstrumenter.new(job_class: self.class, opts: opts, db: db, jid: jid)
|
||||
begin
|
||||
I18n.locale = SiteSetting.default_locale || "en"
|
||||
I18n.locale = SiteSetting.default_locale || SiteSettings::DefaultsProvider::DEFAULT_LOCALE
|
||||
I18n.ensure_all_loaded!
|
||||
begin
|
||||
logster_env = {}
|
||||
|
@ -57,7 +57,14 @@ class LocaleSiteSetting < EnumSiteSetting
|
||||
end
|
||||
end
|
||||
|
||||
FALLBACKS ||= {
|
||||
en_US: :en
|
||||
}
|
||||
|
||||
def self.fallback_locale(locale)
|
||||
fallback_locale = FALLBACKS[locale.to_sym]
|
||||
return fallback_locale if fallback_locale
|
||||
|
||||
plugin_locale = DiscoursePluginRegistry.locales[locale.to_s]
|
||||
plugin_locale ? plugin_locale[:fallbackLocale]&.to_sym : nil
|
||||
end
|
||||
|
@ -66,8 +66,7 @@ class TranslationOverride < ActiveRecord::Base
|
||||
|
||||
def check_interpolation_keys
|
||||
original_text = I18n.overrides_disabled do
|
||||
# lookup is protected
|
||||
I18n.backend.send(:lookup, self.locale, self.translation_key)
|
||||
I18n.t(translation_key, locale: :en)
|
||||
end
|
||||
|
||||
if original_text
|
||||
|
@ -38,31 +38,31 @@ en:
|
||||
millions: "{{number}}M"
|
||||
dates:
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
time: "h:mm a"
|
||||
time: "HH:mm"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
timeline_date: "MMM YYYY"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_no_year: "MMM D h:mm a"
|
||||
long_no_year: "D MMM HH:mm"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_no_year_no_time: "MMM D"
|
||||
long_no_year_no_time: "D MMM"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
full_no_year_no_time: "MMMM Do"
|
||||
full_no_year_no_time: "Do MMMM"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_with_year: "MMM D, YYYY h:mm a"
|
||||
long_with_year: "D MMM YYYY HH:mm"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_with_year_no_time: "MMM D, YYYY"
|
||||
long_with_year_no_time: "D MMM YYYY"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
full_with_year_no_time: "MMMM Do, YYYY"
|
||||
full_with_year_no_time: "D MMMM YYYY"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date_with_year: "MMM D, 'YY LT"
|
||||
long_date_with_year: "D MMM 'YY LT"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date_without_year: "MMM D, LT"
|
||||
long_date_without_year: "D MMM LT"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date_with_year_without_time: "MMM D, 'YY"
|
||||
long_date_with_year_without_time: "D MMM 'YY"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date_without_year_with_linebreak: "MMM D <br/>LT"
|
||||
long_date_without_year_with_linebreak: "D MMM <br/>LT"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date_with_year_with_linebreak: "MMM D, 'YY <br/>LT"
|
||||
long_date_with_year_with_linebreak: "D MMM 'YY <br/>LT"
|
||||
|
||||
wrap_ago: "%{date} ago"
|
||||
|
||||
@ -98,7 +98,9 @@ en:
|
||||
almost_x_years:
|
||||
one: "1y"
|
||||
other: "%{count}y"
|
||||
date_month: "MMM D"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
date_month: "D MMM"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
date_year: "MMM 'YY"
|
||||
medium:
|
||||
x_minutes:
|
||||
@ -110,7 +112,8 @@ en:
|
||||
x_days:
|
||||
one: "1 day"
|
||||
other: "%{count} days"
|
||||
date_year: "MMM D, 'YY"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
date_year: "D MMM 'YY"
|
||||
medium_with_ago:
|
||||
x_minutes:
|
||||
one: "1 min ago"
|
||||
|
38
config/locales/client.en_US.yml
Normal file
38
config/locales/client.en_US.yml
Normal file
@ -0,0 +1,38 @@
|
||||
en_US:
|
||||
js:
|
||||
dates:
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
time: "h:mm a"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
timeline_date: "MMM YYYY"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_no_year: "MMM D h:mm a"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_no_year_no_time: "MMM D"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
full_no_year_no_time: "MMMM Do"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_with_year: "MMM D, YYYY h:mm a"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_with_year_no_time: "MMM D, YYYY"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
full_with_year_no_time: "MMMM Do, YYYY"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date_with_year: "MMM D, 'YY LT"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date_without_year: "MMM D, LT"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date_with_year_without_time: "MMM D, 'YY"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date_without_year_with_linebreak: "MMM D <br/>LT"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date_with_year_with_linebreak: "MMM D, 'YY <br/>LT"
|
||||
|
||||
tiny:
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
date_month: "MMM D"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
date_year: "MMM 'YY"
|
||||
medium:
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
date_year: "MMM D, 'YY"
|
@ -113,6 +113,9 @@ el:
|
||||
en:
|
||||
name: English
|
||||
nativeName: English
|
||||
en_US:
|
||||
name: English (United States)
|
||||
nativeName: English (United States)
|
||||
eo:
|
||||
name: Esperanto
|
||||
nativeName: Esperanto
|
||||
|
@ -19,21 +19,21 @@ en:
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
short_date_no_year: "D MMM"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
short_date: "D MMM, YYYY"
|
||||
short_date: "D MMM YYYY"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date: "MMMM D, YYYY h:mma"
|
||||
long_date: "D MMMM YYYY LT"
|
||||
|
||||
datetime_formats: &datetime_formats
|
||||
formats:
|
||||
# Format directives: https://ruby-doc.org/core-2.6.1/Time.html#method-i-strftime
|
||||
short: "%m-%d-%Y"
|
||||
# Format directives: https://ruby-doc.org/core-2.6.1/Time.html#method-i-strftime
|
||||
short_no_year: "%B %-d"
|
||||
# Format directives: https://ruby-doc.org/core-2.6.1/Time.html#method-i-strftime
|
||||
date_only: "%B %-d, %Y"
|
||||
# Format directives: https://ruby-doc.org/core-2.6.1/Time.html#method-i-strftime
|
||||
long: "%B %-d, %Y, %l:%M%P"
|
||||
# Format directives: https://ruby-doc.org/core-2.6.1/Time.html#method-i-strftime
|
||||
# Format directives: https://ruby-doc.org/core/Time.html#method-i-strftime
|
||||
short: "%d-%m-%Y"
|
||||
# Format directives: https://ruby-doc.org/core/Time.html#method-i-strftime
|
||||
short_no_year: "%-d %B"
|
||||
# Format directives: https://ruby-doc.org/core/Time.html#method-i-strftime
|
||||
date_only: "%-d %B %Y"
|
||||
# Format directives: https://ruby-doc.org/core/Time.html#method-i-strftime
|
||||
long: "%-d %B %Y %H:%M"
|
||||
# Format directives: https://ruby-doc.org/core/Time.html#method-i-strftime
|
||||
no_day: "%B %Y"
|
||||
date:
|
||||
# Do not remove the brackets and commas and do not translate the first month name. It should be "null".
|
||||
@ -1710,6 +1710,7 @@ en:
|
||||
max_image_megapixels: "Maximum number of megapixels allowed for an image."
|
||||
|
||||
title_prettify: "Prevent common title typos and errors, including all caps, lowercase first character, multiple ! and ?, extra . at end, etc."
|
||||
title_remove_extraneous_space: "Remove leading whitespaces in front of the end punctiation."
|
||||
|
||||
topic_views_heat_low: "After this many views, the views field is slightly highlighted."
|
||||
topic_views_heat_medium: "After this many views, the views field is moderately highlighted."
|
||||
|
25
config/locales/server.en_US.yml
Normal file
25
config/locales/server.en_US.yml
Normal file
@ -0,0 +1,25 @@
|
||||
en_US:
|
||||
dates:
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
short_date_no_year: "D MMM"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
short_date: "D MMM, YYYY"
|
||||
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
|
||||
long_date: "MMMM D, YYYY h:mma"
|
||||
|
||||
datetime_formats: &datetime_formats
|
||||
formats:
|
||||
# Format directives: https://ruby-doc.org/core/Time.html#method-i-strftime
|
||||
short: "%m-%d-%Y"
|
||||
# Format directives: https://ruby-doc.org/core/Time.html#method-i-strftime
|
||||
short_no_year: "%B %-d"
|
||||
# Format directives: https://ruby-doc.org/core/Time.html#method-i-strftime
|
||||
date_only: "%B %-d, %Y"
|
||||
# Format directives: https://ruby-doc.org/core/Time.html#method-i-strftime
|
||||
long: "%B %-d, %Y, %l:%M%P"
|
||||
# Format directives: https://ruby-doc.org/core/Time.html#method-i-strftime
|
||||
no_day: "%B %Y"
|
||||
date:
|
||||
<<: *datetime_formats
|
||||
time:
|
||||
<<: *datetime_formats
|
@ -639,6 +639,11 @@ posting:
|
||||
ja: false
|
||||
zh_CN: false
|
||||
zh_TW: false
|
||||
title_remove_extraneous_space:
|
||||
default: false
|
||||
locale_default:
|
||||
en: true
|
||||
en_US: true
|
||||
title_fancy_entities: true
|
||||
min_personal_message_title_length:
|
||||
client: true
|
||||
|
55
db/migrate/20190430135846_migrate_english_locale.rb
Normal file
55
db/migrate/20190430135846_migrate_english_locale.rb
Normal file
@ -0,0 +1,55 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class MigrateEnglishLocale < ActiveRecord::Migration[5.2]
|
||||
def up
|
||||
execute <<~SQL
|
||||
UPDATE users
|
||||
SET locale = 'en_US'
|
||||
WHERE locale = 'en'
|
||||
SQL
|
||||
|
||||
execute <<~SQL
|
||||
UPDATE site_settings
|
||||
SET value = 'en_US'
|
||||
WHERE name = 'default_locale' AND value = 'en'
|
||||
SQL
|
||||
|
||||
execute <<~SQL
|
||||
UPDATE translation_overrides
|
||||
SET locale = 'en_US'
|
||||
WHERE locale = 'en'
|
||||
SQL
|
||||
|
||||
execute <<~SQL
|
||||
UPDATE theme_translation_overrides
|
||||
SET locale = 'en_US'
|
||||
WHERE locale = 'en'
|
||||
SQL
|
||||
end
|
||||
|
||||
def down
|
||||
execute <<~SQL
|
||||
UPDATE users
|
||||
SET locale = 'en'
|
||||
WHERE locale = 'en_US'
|
||||
SQL
|
||||
|
||||
execute <<~SQL
|
||||
UPDATE site_settings
|
||||
SET value = 'en'
|
||||
WHERE name = 'default_locale' AND value = 'en_US'
|
||||
SQL
|
||||
|
||||
execute <<~SQL
|
||||
UPDATE translation_overrides
|
||||
SET locale = 'en'
|
||||
WHERE locale = 'en_US'
|
||||
SQL
|
||||
|
||||
execute <<~SQL
|
||||
UPDATE theme_translation_overrides
|
||||
SET locale = 'en'
|
||||
WHERE locale = 'en_US'
|
||||
SQL
|
||||
end
|
||||
end
|
@ -127,8 +127,7 @@ module JsLocaleHelper
|
||||
fallback_locale_str = LocaleSiteSetting.fallback_locale(locale_str)&.to_s
|
||||
translations = Marshal.load(Marshal.dump(translations_for(locale_str)))
|
||||
|
||||
message_formats = strip_out_message_formats!(translations[locale_str]['js'])
|
||||
message_formats.merge!(strip_out_message_formats!(translations[locale_str]['admin_js']))
|
||||
message_formats = remove_message_formats!(translations, locale)
|
||||
mf_locale, mf_filename = find_message_format_locale([locale_str], fallback_to_english: true)
|
||||
result = generate_message_format(message_formats, mf_locale, mf_filename)
|
||||
|
||||
@ -155,7 +154,8 @@ module JsLocaleHelper
|
||||
end
|
||||
|
||||
MOMENT_LOCALE_MAPPING ||= {
|
||||
"hy" => "hy-am"
|
||||
"hy" => "hy-am",
|
||||
"en" => "en-gb"
|
||||
}
|
||||
|
||||
def self.find_moment_locale(locale_chain, timezone_names: false)
|
||||
@ -259,18 +259,33 @@ module JsLocaleHelper
|
||||
"function(){ return #{message.inspect};}"
|
||||
end
|
||||
|
||||
def self.strip_out_message_formats!(hash, prefix = "", rval = {})
|
||||
def self.remove_message_formats!(translations, locale)
|
||||
message_formats = {}
|
||||
I18n.fallbacks[locale].map(&:to_s).each do |l|
|
||||
next unless translations.key?(l)
|
||||
|
||||
%w{js admin_js}.each do |k|
|
||||
message_formats.merge!(strip_out_message_formats!(translations[l][k]))
|
||||
end
|
||||
end
|
||||
message_formats
|
||||
end
|
||||
|
||||
def self.strip_out_message_formats!(hash, prefix = "", message_formats = {})
|
||||
if hash.is_a?(Hash)
|
||||
hash.each do |key, value|
|
||||
if value.is_a?(Hash)
|
||||
rval.merge!(strip_out_message_formats!(value, prefix + (prefix.length > 0 ? "." : "") << key, rval))
|
||||
message_formats.merge!(strip_out_message_formats!(value, join_key(prefix, key), message_formats))
|
||||
elsif key.to_s.end_with?("_MF")
|
||||
rval[prefix + (prefix.length > 0 ? "." : "") << key] = value
|
||||
message_formats[join_key(prefix, key)] = value
|
||||
hash.delete(key)
|
||||
end
|
||||
end
|
||||
end
|
||||
rval
|
||||
message_formats
|
||||
end
|
||||
|
||||
def self.join_key(prefix, key)
|
||||
prefix.blank? ? key : "#{prefix}.#{key}"
|
||||
end
|
||||
end
|
||||
|
@ -4,7 +4,7 @@ module SiteSettings; end
|
||||
|
||||
# A cache for providing default value based on site locale
|
||||
class SiteSettings::DefaultsProvider
|
||||
DEFAULT_LOCALE = 'en'
|
||||
DEFAULT_LOCALE = 'en_US'
|
||||
|
||||
def initialize(site_setting)
|
||||
@site_setting = site_setting
|
||||
|
@ -17,7 +17,7 @@ class TextCleaner
|
||||
replace_all_upper_case: SiteSetting.title_prettify && !SiteSetting.allow_uppercase_posts,
|
||||
capitalize_first_letter: SiteSetting.title_prettify,
|
||||
remove_all_periods_from_the_end: SiteSetting.title_prettify,
|
||||
remove_extraneous_space: SiteSetting.title_prettify && SiteSetting.default_locale == "en",
|
||||
remove_extraneous_space: SiteSetting.title_prettify && SiteSetting.title_remove_extraneous_space,
|
||||
fixes_interior_spaces: true,
|
||||
strip_whitespaces: true,
|
||||
strip_zero_width_spaces: true
|
||||
|
@ -8,7 +8,7 @@ module DiscourseNarrativeBot
|
||||
|
||||
def self.generate(user)
|
||||
quote, author =
|
||||
if user.effective_locale != 'en'
|
||||
if !user.effective_locale.start_with?('en')
|
||||
translation_key = "discourse_narrative_bot.quote.#{rand(1..10)}"
|
||||
|
||||
[
|
||||
|
@ -105,7 +105,7 @@ class BulkImport::Base
|
||||
|
||||
def preload_i18n
|
||||
puts "Preloading I18n..."
|
||||
I18n.locale = ENV.fetch("LOCALE") { "en" }.to_sym
|
||||
I18n.locale = ENV.fetch("LOCALE") { SiteSettings::DefaultsProvider::DEFAULT_LOCALE }.to_sym
|
||||
I18n.t("test")
|
||||
ActiveSupport::Inflector.transliterate("test")
|
||||
end
|
||||
|
@ -16,7 +16,7 @@ end
|
||||
def supported_locales
|
||||
Dir.glob(expand_path('config/locales/client.*.yml'))
|
||||
.map { |x| x.split('.')[-2] }
|
||||
.select { |x| x != 'en' }
|
||||
.reject { |x| x.start_with?('en') }
|
||||
.sort - TranslationsManager::BROKEN_LOCALES
|
||||
end
|
||||
|
||||
|
@ -89,6 +89,8 @@ describe "translate accelerator" do
|
||||
end
|
||||
|
||||
describe "with overrides" do
|
||||
before { I18n.locale = :en }
|
||||
|
||||
it "returns the overridden key" do
|
||||
override_translation('en', 'foo', 'Overwritten foo')
|
||||
expect(I18n.t('foo')).to eq('Overwritten foo')
|
||||
|
@ -20,7 +20,6 @@ describe JsLocaleHelper do
|
||||
JsLocaleHelper.extend StubLoadTranslations
|
||||
|
||||
after do
|
||||
I18n.locale = :en
|
||||
JsLocaleHelper.clear_cache!
|
||||
end
|
||||
|
||||
@ -119,6 +118,16 @@ describe JsLocaleHelper do
|
||||
message = JsLocaleHelper.compile_message_format(message_format_filename('ru'), 'ru', 'format')
|
||||
expect(message).not_to match 'Plural Function not found'
|
||||
end
|
||||
|
||||
it "includes uses message formats from fallback locale" do
|
||||
translations = JsLocaleHelper.translations_for(:en_US)
|
||||
en_us_message_formats = JsLocaleHelper.remove_message_formats!(translations, :en_US)
|
||||
expect(en_us_message_formats).to_not be_empty
|
||||
|
||||
translations = JsLocaleHelper.translations_for(:en)
|
||||
en_message_formats = JsLocaleHelper.remove_message_formats!(translations, :en)
|
||||
expect(en_us_message_formats).to eq(en_message_formats)
|
||||
end
|
||||
end
|
||||
|
||||
it 'performs fallbacks to english if a translation is not available' do
|
||||
@ -190,7 +199,7 @@ describe JsLocaleHelper do
|
||||
it "finds moment.js locale file for #{locale[:value]}" do
|
||||
content = JsLocaleHelper.moment_locale(locale[:value])
|
||||
|
||||
if (locale[:value] == 'en')
|
||||
if (locale[:value] == SiteSettings::DefaultsProvider::DEFAULT_LOCALE)
|
||||
expect(content).to eq('')
|
||||
else
|
||||
expect(content).to_not eq('')
|
||||
|
@ -766,7 +766,7 @@ describe SiteSettingExtension do
|
||||
|
||||
describe '.default_locale' do
|
||||
it 'is always loaded' do
|
||||
expect(settings.default_locale).to eq 'en'
|
||||
expect(settings.default_locale).to eq('en_US')
|
||||
end
|
||||
end
|
||||
|
||||
@ -833,7 +833,7 @@ describe SiteSettingExtension do
|
||||
settings.refresh!
|
||||
|
||||
expect(settings.client_settings_json_uncached).to eq(
|
||||
%Q|{"default_locale":"en","upload_type":"#{upload.url}","string_type":"haha"}|
|
||||
%Q|{"default_locale":"#{SiteSetting.default_locale}","upload_type":"#{upload.url}","string_type":"haha"}|
|
||||
)
|
||||
end
|
||||
end
|
||||
|
@ -196,7 +196,11 @@ describe TextCleaner do
|
||||
end
|
||||
|
||||
it "removes extraneous space before the end punctuation" do
|
||||
SiteSetting.title_remove_extraneous_space = true
|
||||
expect(TextCleaner.clean_title("Hello there ?")).to eq("Hello there?")
|
||||
|
||||
SiteSetting.title_remove_extraneous_space = false
|
||||
expect(TextCleaner.clean_title("Hello there ?")).to eq("Hello there ?")
|
||||
end
|
||||
|
||||
it "replaces all upper case unicode text with regular unicode case letters" do
|
||||
|
@ -109,7 +109,7 @@ describe ThemeStore::TgzExporter do
|
||||
# Theme field names should be sanitized before writing to the database,
|
||||
# but protection is in place 'just in case'
|
||||
expect do
|
||||
theme.set_field(target: :translations, name: "en", value: "hacked")
|
||||
theme.set_field(target: :translations, name: SiteSetting.default_locale, value: "hacked")
|
||||
ThemeField.any_instance.stubs(:file_path).returns("../../malicious")
|
||||
theme.save!
|
||||
package
|
||||
|
@ -15,7 +15,8 @@ describe Wizard::StepUpdater do
|
||||
|
||||
context "locale" do
|
||||
it "does not require refresh when the language stays the same" do
|
||||
updater = wizard.create_updater('locale', default_locale: 'en')
|
||||
locale = SiteSettings::DefaultsProvider::DEFAULT_LOCALE
|
||||
updater = wizard.create_updater('locale', default_locale: locale)
|
||||
updater.update
|
||||
expect(updater.refresh_required?).to eq(false)
|
||||
expect(wizard.completed_steps?('locale')).to eq(true)
|
||||
|
@ -90,8 +90,11 @@ describe "i18n integrity checks" do
|
||||
expect(yaml.keys).to eq([locale])
|
||||
|
||||
expect(yaml[locale]["js"]).to be
|
||||
expect(yaml[locale]["admin_js"]).to be
|
||||
# expect(yaml[locale]["wizard_js"]).to be
|
||||
|
||||
if !LocaleSiteSetting.fallback_locale(locale)
|
||||
expect(yaml[locale]["admin_js"]).to be
|
||||
expect(yaml[locale]["wizard_js"]).to be
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -13,6 +13,14 @@ describe I18n::Backend::FallbackLocaleList do
|
||||
expect(list[:en]).to eq([:en])
|
||||
end
|
||||
|
||||
it "works when default_locale is English (United States)" do
|
||||
SiteSetting.default_locale = :en_US
|
||||
|
||||
expect(list[:ru]).to eq([:ru, :en_US, :en])
|
||||
expect(list[:en_US]).to eq([:en_US, :en])
|
||||
expect(list[:en]).to eq([:en])
|
||||
end
|
||||
|
||||
it "works when default_locale is not English" do
|
||||
SiteSetting.default_locale = :de
|
||||
|
@ -787,7 +787,7 @@ describe UserNotifications do
|
||||
|
||||
before do
|
||||
TranslationOverride.upsert!(
|
||||
"en",
|
||||
SiteSetting.default_locale,
|
||||
"#{mail_template}.text_body_template",
|
||||
custom_body
|
||||
)
|
||||
@ -901,7 +901,6 @@ describe UserNotifications do
|
||||
|
||||
context "user locale is allowed" do
|
||||
before do
|
||||
SiteSetting.default_locale = "en"
|
||||
SiteSetting.allow_user_locale = true
|
||||
end
|
||||
|
||||
@ -919,7 +918,6 @@ describe UserNotifications do
|
||||
|
||||
context "user locale is not allowed" do
|
||||
before do
|
||||
SiteSetting.default_locale = "en"
|
||||
SiteSetting.allow_user_locale = false
|
||||
end
|
||||
|
||||
@ -929,7 +927,7 @@ describe UserNotifications do
|
||||
let(:locale) { "fr" }
|
||||
let(:mail_type) { mail_type }
|
||||
it "sets the locale" do
|
||||
expects_build_with(has_entry(:locale, "en"))
|
||||
expects_build_with(has_entry(:locale, "en_US"))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -20,12 +20,8 @@ describe Badge do
|
||||
badge = Badge.find_by_name("Basic User")
|
||||
name_english = badge.name
|
||||
|
||||
begin
|
||||
I18n.locale = 'fr'
|
||||
|
||||
I18n.with_locale(:fr) do
|
||||
expect(badge.display_name).not_to eq(name_english)
|
||||
ensure
|
||||
I18n.locale = :en
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -13,7 +13,7 @@ describe LocaleSiteSetting do
|
||||
value[:name]
|
||||
end
|
||||
|
||||
describe 'valid_value?' do
|
||||
describe '.valid_value?' do
|
||||
it 'returns true for a locale that we have translations for' do
|
||||
expect(LocaleSiteSetting.valid_value?('en')).to eq(true)
|
||||
end
|
||||
@ -23,7 +23,7 @@ describe LocaleSiteSetting do
|
||||
end
|
||||
end
|
||||
|
||||
describe 'values' do
|
||||
describe '.values' do
|
||||
it 'returns all the locales that we have translations for' do
|
||||
expect(LocaleSiteSetting.values.map { |x| x[:value] }).to include(*core_locales)
|
||||
end
|
||||
@ -52,7 +52,7 @@ describe LocaleSiteSetting do
|
||||
DiscoursePluginRegistry.reset!
|
||||
end
|
||||
|
||||
describe 'valid_value?' do
|
||||
describe '.valid_value?' do
|
||||
it 'returns true for locales from core' do
|
||||
expect(LocaleSiteSetting.valid_value?('en')).to eq(true)
|
||||
expect(LocaleSiteSetting.valid_value?('de')).to eq(true)
|
||||
@ -64,7 +64,7 @@ describe LocaleSiteSetting do
|
||||
end
|
||||
end
|
||||
|
||||
describe 'values' do
|
||||
describe '.values' do
|
||||
it 'returns native names added by plugin' do
|
||||
expect(native_locale_name('foo')).to eq('Native Foo')
|
||||
expect(native_locale_name('bar')).to eq('Native Bar')
|
||||
@ -79,7 +79,7 @@ describe LocaleSiteSetting do
|
||||
end
|
||||
end
|
||||
|
||||
describe 'fallback_locale' do
|
||||
describe '.fallback_locale' do
|
||||
it 'returns the fallback locale registered by plugin' do
|
||||
expect(LocaleSiteSetting.fallback_locale('de_AT')).to eq(:de)
|
||||
expect(LocaleSiteSetting.fallback_locale(:de_AT)).to eq(:de)
|
||||
@ -88,6 +88,16 @@ describe LocaleSiteSetting do
|
||||
it 'returns nothing when no fallback locale was registered' do
|
||||
expect(LocaleSiteSetting.fallback_locale('foo')).to be_nil
|
||||
end
|
||||
|
||||
it 'returns English for English (United States)' do
|
||||
expect(LocaleSiteSetting.fallback_locale('en_US')).to eq(:en)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '.fallback_locale' do
|
||||
it 'returns English for English (United States)' do
|
||||
expect(LocaleSiteSetting.fallback_locale('en_US')).to eq(:en)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -239,8 +239,8 @@ HTML
|
||||
let!(:theme3) { Fabricate(:theme) }
|
||||
|
||||
let!(:en1) {
|
||||
ThemeField.create!(theme: theme, target_id: Theme.targets[:translations], name: "en",
|
||||
value: { en: { somestring1: "helloworld", group: { key1: "enval1" } } }
|
||||
ThemeField.create!(theme: theme, target_id: Theme.targets[:translations], name: "en_US",
|
||||
value: { en_US: { somestring1: "helloworld", group: { key1: "enval1" } } }
|
||||
.deep_stringify_keys.to_yaml
|
||||
)
|
||||
}
|
||||
@ -251,21 +251,21 @@ HTML
|
||||
)
|
||||
}
|
||||
let!(:fr2) { ThemeField.create!(theme: theme2, target_id: Theme.targets[:translations], name: "fr", value: "") }
|
||||
let!(:en2) { ThemeField.create!(theme: theme2, target_id: Theme.targets[:translations], name: "en", value: "") }
|
||||
let!(:en2) { ThemeField.create!(theme: theme2, target_id: Theme.targets[:translations], name: "en_US", value: "") }
|
||||
let!(:ca3) { ThemeField.create!(theme: theme3, target_id: Theme.targets[:translations], name: "ca", value: "") }
|
||||
let!(:en3) { ThemeField.create!(theme: theme3, target_id: Theme.targets[:translations], name: "en", value: "") }
|
||||
let!(:en3) { ThemeField.create!(theme: theme3, target_id: Theme.targets[:translations], name: "en_US", value: "") }
|
||||
|
||||
describe "scopes" do
|
||||
it "filter_locale_fields returns results in the correct order" do
|
||||
expect(ThemeField.find_by_theme_ids([theme3.id, theme.id, theme2.id])
|
||||
.filter_locale_fields(
|
||||
["en", "fr"]
|
||||
["en_US", "fr"]
|
||||
)).to eq([en3, en1, fr1, en2, fr2])
|
||||
end
|
||||
|
||||
it "find_first_locale_fields returns only the first locale for each theme" do
|
||||
expect(ThemeField.find_first_locale_fields(
|
||||
[theme3.id, theme.id, theme2.id], ["ca", "en", "fr"]
|
||||
[theme3.id, theme.id, theme2.id], ["ca", "en_US", "fr"]
|
||||
)).to eq([ca3, en1, en2])
|
||||
end
|
||||
end
|
||||
@ -296,7 +296,7 @@ HTML
|
||||
it "loads correctly" do
|
||||
expect(fr1.translation_data).to eq(
|
||||
fr: { somestring1: "bonjourworld", group: { key2: "frval2" } },
|
||||
en: { somestring1: "helloworld", group: { key1: "enval1" } }
|
||||
en_US: { somestring1: "helloworld", group: { key1: "enval1" } }
|
||||
)
|
||||
end
|
||||
|
||||
@ -318,7 +318,7 @@ HTML
|
||||
theme.reload
|
||||
expect(fr1.translation_data).to eq(
|
||||
fr: { somestring1: "bonjourworld", group: { key2: "frval2" } },
|
||||
en: { somestring1: "helloworld", group: { key1: "overriddentest1" } }
|
||||
en_US: { somestring1: "helloworld", group: { key1: "overriddentest1" } }
|
||||
)
|
||||
end
|
||||
end
|
||||
|
@ -599,8 +599,8 @@ HTML
|
||||
end
|
||||
|
||||
it "can create a hash of overridden values" do
|
||||
en_translation = ThemeField.create!(theme_id: theme.id, name: "en", type_id: ThemeField.types[:yaml], target_id: Theme.targets[:translations], value: <<~YAML)
|
||||
en:
|
||||
en_translation = ThemeField.create!(theme_id: theme.id, name: "en_US", type_id: ThemeField.types[:yaml], target_id: Theme.targets[:translations], value: <<~YAML)
|
||||
en_US:
|
||||
group_of_translations:
|
||||
translation1: en test1
|
||||
YAML
|
||||
@ -610,7 +610,7 @@ HTML
|
||||
theme.update_translation("group_of_translations.translation1", "overriddentest2")
|
||||
theme.reload
|
||||
expect(theme.translation_override_hash).to eq(
|
||||
"en" => {
|
||||
"en_US" => {
|
||||
"group_of_translations" => {
|
||||
"translation1" => "overriddentest1"
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ describe TranslationOverride do
|
||||
context 'validations' do
|
||||
describe '#value' do
|
||||
before do
|
||||
I18n.backend.store_translations(:en, some_key: '%{first} %{second}')
|
||||
I18n.backend.store_translations(I18n.locale, some_key: '%{first} %{second}')
|
||||
end
|
||||
|
||||
describe 'when interpolation keys are missing' do
|
||||
|
@ -15,7 +15,7 @@ RSpec.describe 'Multisite SiteSettings', type: :multisite do
|
||||
describe '#default_locale' do
|
||||
it 'should return the right locale' do
|
||||
test_multisite_connection('default') do
|
||||
expect(SiteSetting.default_locale).to eq('en')
|
||||
expect(SiteSetting.default_locale).to eq('en_US')
|
||||
end
|
||||
|
||||
test_multisite_connection('second') do
|
||||
@ -25,7 +25,7 @@ RSpec.describe 'Multisite SiteSettings', type: :multisite do
|
||||
end
|
||||
|
||||
test_multisite_connection('default') do
|
||||
expect(SiteSetting.default_locale).to eq('en')
|
||||
expect(SiteSetting.default_locale).to eq('en_US')
|
||||
|
||||
SiteSetting.default_locale = 'ja'
|
||||
|
||||
|
@ -108,7 +108,7 @@ module TestSetup
|
||||
Discourse.clear_readonly!
|
||||
Sidekiq::Worker.clear_all
|
||||
|
||||
I18n.locale = :en
|
||||
I18n.locale = SiteSettings::DefaultsProvider::DEFAULT_LOCALE
|
||||
|
||||
RspecErrorTracker.last_exception = nil
|
||||
|
||||
|
@ -271,7 +271,7 @@ RSpec.describe Admin::SiteTextsController do
|
||||
end
|
||||
|
||||
it "returns the right error message" do
|
||||
I18n.backend.store_translations(:en, some_key: '%{first} %{second}')
|
||||
I18n.backend.store_translations(SiteSetting.default_locale, some_key: '%{first} %{second}')
|
||||
|
||||
put "/admin/customize/site_texts/some_key.json", params: {
|
||||
site_text: { value: 'hello %{key} %{omg}' }
|
||||
|
@ -27,11 +27,8 @@ describe ExtraLocalesController do
|
||||
end
|
||||
|
||||
it "includes plugin translations" do
|
||||
I18n.locale = :en
|
||||
I18n.reload!
|
||||
|
||||
JsLocaleHelper.expects(:plugin_translations)
|
||||
.with(I18n.locale.to_s)
|
||||
.with(any_of("en", "en_US"))
|
||||
.returns("admin_js" => {
|
||||
"admin" => {
|
||||
"site_settings" => {
|
||||
|
@ -102,7 +102,7 @@ describe SearchIndexer do
|
||||
|
||||
raw_data, locale, version = PostSearchData.where(post_id: post_id).pluck(:raw_data, :locale, :version)[0]
|
||||
expect(raw_data).to eq("This is a test")
|
||||
expect(locale).to eq("en")
|
||||
expect(locale).to eq(SiteSetting.default_locale)
|
||||
expect(version).to eq(SearchIndexer::INDEX_VERSION)
|
||||
|
||||
SearchIndexer.update_posts_index(post_id, "tester", "", nil, nil)
|
||||
|
@ -646,7 +646,7 @@ componentTest("clicking the toggle-direction button toggles the direction", {
|
||||
template: "{{d-editor value=value}}",
|
||||
beforeEach() {
|
||||
this.siteSettings.support_mixed_text_direction = true;
|
||||
this.siteSettings.default_locale = "en";
|
||||
this.siteSettings.default_locale = "en_US";
|
||||
},
|
||||
|
||||
async test(assert) {
|
||||
|
@ -20,7 +20,7 @@ export default {
|
||||
description:
|
||||
"Discussion about the next-generation open source Discourse forum software",
|
||||
title: "Discourse Meta",
|
||||
locale: "en",
|
||||
locale: "en_US",
|
||||
version: "2.2.0.beta8",
|
||||
https: true,
|
||||
admins: [
|
||||
|
@ -16,7 +16,7 @@
|
||||
//= require preload-store
|
||||
|
||||
//= require locales/i18n
|
||||
//= require locales/en
|
||||
//= require locales/en_US
|
||||
|
||||
// Stuff we need to load first
|
||||
//= require vendor
|
||||
|
Loading…
Reference in New Issue
Block a user