diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 44686a477a7..30c7ce51024 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -109,7 +109,11 @@ class ApplicationController < ActionController::Base
end
def set_locale
- I18n.locale = SiteSetting.default_locale
+ I18n.locale = if SiteSetting.allow_user_locale && current_user && current_user.locale.present?
+ current_user.locale
+ else
+ SiteSetting.default_locale
+ end
end
def store_preloaded(key, json)
diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb
index 25b92d0edf7..8365c3bf6e5 100644
--- a/app/models/site_setting.rb
+++ b/app/models/site_setting.rb
@@ -23,6 +23,11 @@ class SiteSetting < ActiveRecord::Base
load_settings(file)
end
+ SiteSettingExtension.class_variable_get(:@@client_settings) << :available_locales
+
+ def self.available_locales
+ LocaleSiteSetting.values.map{ |e| e[:value] }.join('|')
+ end
def self.call_discourse_hub?
self.enforce_global_nicknames? && self.discourse_org_access_key.present?
diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb
index 7d93ffee7cd..4b55a2fd9e4 100644
--- a/app/serializers/user_serializer.rb
+++ b/app/serializers/user_serializer.rb
@@ -47,6 +47,7 @@ class UserSerializer < BasicUserSerializer
end
private_attributes :email,
+ :locale,
:email_digests,
:email_private_messages,
:email_direct,
diff --git a/app/services/user_updater.rb b/app/services/user_updater.rb
index ade9dd64c72..025f0b3762f 100644
--- a/app/services/user_updater.rb
+++ b/app/services/user_updater.rb
@@ -27,6 +27,7 @@ class UserUpdater
user.bio_raw = attributes.fetch(:bio_raw) { user.bio_raw }
user.name = attributes.fetch(:name) { user.name }
+ user.locale = attributes.fetch(:locale) { user.locale }
user.digest_after_days = attributes.fetch(:digest_after_days) { user.digest_after_days }
if attributes[:auto_track_topics_after_msecs]
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index b5edcdb6003..922d98fefce 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -325,6 +325,11 @@ en:
enter_email: 'Username found. Enter matching email.'
prefilled: "Email matches this registered username."
+ locale:
+ title: "Interface language"
+ instructions: "The language used by the forum interface. It will change when you refresh the page."
+ default: "(default)"
+
password_confirmation:
title: "Password Again"
diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml
index 3e277d1460d..af5196b5ac9 100644
--- a/config/locales/client.fr.yml
+++ b/config/locales/client.fr.yml
@@ -299,6 +299,11 @@ fr:
enter_email: 'Pseudo trouvé. Entrez l''adresse email correspondante.'
prefilled: "L'adresse email correspond à ce pseudo enregistré."
+ locale:
+ title: "Langue de l'interface"
+ instructions: "La langue utilisée dans l'interface du forum. Le changement se fait lorsque vous rechargez la page."
+ default: "(par défaut)"
+
password_confirmation:
title: "Confirmation"
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index c4a2c9d78d6..09296929651 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -550,6 +550,7 @@ en:
site_settings:
default_locale: "The default language of this Discourse instance (ISO 639-1 Code)"
+ allow_user_locale: "Allow users to choose their own language interface preference"
min_post_length: "Minimum post length in characters"
min_private_message_post_length: "Minimum post length in characters for private messages"
max_post_length: "Maximum post length in characters"
diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml
index 71be63bd0ae..0826f145698 100644
--- a/config/locales/server.fr.yml
+++ b/config/locales/server.fr.yml
@@ -484,6 +484,7 @@ fr:
description: "HTML qui sera ajouté au pied de toutes les pages"
site_settings:
default_locale: "Le langage par défaut de cette instance de Discourse (code ISO 639-1)"
+ allow_user_locale: "Permettre aux utilisateurs de choisir leur propre préférence de langue pour l'interface"
min_post_length: "Longueur minimale des messages en nombre de caractères"
min_private_message_post_length: "Longueur minimale des messages privés en nombre de caractères"
max_post_length: "Longueur maximale des messages en nombres de caractères"
diff --git a/config/site_settings.yml b/config/site_settings.yml
index 63ec26a78e6..31c275b54ff 100644
--- a/config/site_settings.yml
+++ b/config/site_settings.yml
@@ -24,6 +24,9 @@ basic:
default_locale:
default: 'en'
enum: 'LocaleSiteSetting'
+ allow_user_locale:
+ client: true
+ default: false
ga_tracking_code:
client: true
default: ''
diff --git a/db/migrate/20140206044818_add_locale_to_user.rb b/db/migrate/20140206044818_add_locale_to_user.rb
new file mode 100644
index 00000000000..c0f2431b3ef
--- /dev/null
+++ b/db/migrate/20140206044818_add_locale_to_user.rb
@@ -0,0 +1,5 @@
+class AddLocaleToUser < ActiveRecord::Migration
+ def change
+ add_column :users, :locale, :string, limit: 10
+ end
+end
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index 00ba7824b27..0827176469b 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -44,6 +44,28 @@ describe TopicsController do
end
+ describe 'set_locale' do
+ it 'sets the one the user prefers' do
+ SiteSetting.stubs(:allow_user_locale).returns(true)
+
+ user = Fabricate(:user, locale: :fr)
+ log_in_user(user)
+
+ get :show, {topic_id: topic.id}
+
+ I18n.locale.should == :fr
+ end
+
+ it 'is sets the default locale when the setting not enabled' do
+ user = Fabricate(:user, locale: :fr)
+ log_in_user(user)
+
+ get :show, {topic_id: topic.id}
+
+ I18n.locale.should == :en
+ end
+ end
+
end
describe 'api' do