From: Tom Hughes Date: Sun, 31 May 2009 14:55:45 +0000 (+0000) Subject: Sort out storage and use of user preferred languages. X-Git-Tag: live~7384^2~16 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/0e96027a209d59ff5e7f5c2b1405febc59664a16 Sort out storage and use of user preferred languages. --- diff --git a/app/controllers/application.rb b/app/controllers/application.rb index 3d16ffa69..c5624db14 100644 --- a/app/controllers/application.rb +++ b/app/controllers/application.rb @@ -102,6 +102,15 @@ class ApplicationController < ActionController::Base end def set_locale + if @user + if !@user.languages.empty? + request.user_preferred_languages = @user.languages + elsif !request.user_preferred_languages.empty? + @user.languages = request.user_preferred_languages + @user.save + end + end + I18n.locale = request.compatible_language_from(I18n.available_locales) end diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index 259ce0dc9..12ede13da 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -1,8 +1,8 @@ class BrowseController < ApplicationController layout 'site' - before_filter :set_locale before_filter :authorize_web + before_filter :set_locale before_filter { |c| c.check_database_readable(true) } def start diff --git a/app/controllers/changeset_controller.rb b/app/controllers/changeset_controller.rb index 72b966689..704a2a0f6 100644 --- a/app/controllers/changeset_controller.rb +++ b/app/controllers/changeset_controller.rb @@ -5,8 +5,8 @@ class ChangesetController < ApplicationController require 'xml/libxml' session :off, :except => [:list, :list_user, :list_bbox] - before_filter :set_locale, :only => [:list, :list_user, :list_bbox] before_filter :authorize_web, :only => [:list, :list_user, :list_bbox] + before_filter :set_locale, :only => [:list, :list_user, :list_bbox] before_filter :authorize, :only => [:create, :update, :delete, :upload, :include, :close] before_filter :require_public_data, :only => [:create, :update, :delete, :upload, :include, :close] before_filter :check_api_writable, :only => [:create, :update, :delete, :upload, :include] diff --git a/app/controllers/changeset_tag_controller.rb b/app/controllers/changeset_tag_controller.rb index 527149f77..374e21ca1 100644 --- a/app/controllers/changeset_tag_controller.rb +++ b/app/controllers/changeset_tag_controller.rb @@ -1,11 +1,8 @@ class ChangesetTagController < ApplicationController layout 'site' - before_filter :set_locale - def search @tags = ChangesetTag.find(:all, :limit => 11, :conditions => ["match(v) against (?)", params[:query][:query].to_s] ) end - end diff --git a/app/controllers/diary_entry_controller.rb b/app/controllers/diary_entry_controller.rb index 96bf154a6..018f4a48a 100644 --- a/app/controllers/diary_entry_controller.rb +++ b/app/controllers/diary_entry_controller.rb @@ -1,8 +1,8 @@ class DiaryEntryController < ApplicationController layout 'site', :except => :rss - before_filter :set_locale before_filter :authorize_web + before_filter :set_locale before_filter :require_user, :only => [:new, :edit] before_filter :check_database_readable before_filter :check_database_writable, :only => [:new, :edit] @@ -20,7 +20,7 @@ class DiaryEntryController < ApplicationController render :action => 'edit' end else - @diary_entry = DiaryEntry.new(:language => @user.language) + @diary_entry = DiaryEntry.new(:language_code => @user.preferred_language) render :action => 'edit' end end diff --git a/app/controllers/export_controller.rb b/app/controllers/export_controller.rb index c84075d37..b75fb1bca 100644 --- a/app/controllers/export_controller.rb +++ b/app/controllers/export_controller.rb @@ -1,5 +1,6 @@ class ExportController < ApplicationController + before_filter :authorize_web before_filter :set_locale def start diff --git a/app/controllers/message_controller.rb b/app/controllers/message_controller.rb index e01c34aca..183f8004a 100644 --- a/app/controllers/message_controller.rb +++ b/app/controllers/message_controller.rb @@ -1,8 +1,8 @@ class MessageController < ApplicationController layout 'site' - before_filter :set_locale before_filter :authorize_web + before_filter :set_locale before_filter :require_user before_filter :check_database_readable before_filter :check_database_writable, :only => [:new, :reply, :mark] diff --git a/app/controllers/site_controller.rb b/app/controllers/site_controller.rb index 9bee03209..daf8fead7 100644 --- a/app/controllers/site_controller.rb +++ b/app/controllers/site_controller.rb @@ -1,6 +1,6 @@ class SiteController < ApplicationController - before_filter :set_locale before_filter :authorize_web + before_filter :set_locale before_filter :require_user, :only => [:edit] def export diff --git a/app/controllers/trace_controller.rb b/app/controllers/trace_controller.rb index 33f6d0df7..1787bb196 100644 --- a/app/controllers/trace_controller.rb +++ b/app/controllers/trace_controller.rb @@ -1,8 +1,8 @@ class TraceController < ApplicationController layout 'site' - before_filter :set_locale before_filter :authorize_web + before_filter :set_locale before_filter :require_user, :only => [:mine, :create, :edit, :delete, :make_public] before_filter :authorize, :only => [:api_details, :api_data, :api_create] before_filter :check_database_readable, :except => [:api_details, :api_data, :api_create] diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index d83cac0da..2050ffdb4 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -2,8 +2,8 @@ class UserController < ApplicationController layout 'site' before_filter :authorize, :only => [:api_details, :api_gpx_files] - before_filter :set_locale, :except => [:api_details, :api_gpx_files] before_filter :authorize_web, :except => [:api_details, :api_gpx_files] + before_filter :set_locale, :except => [:api_details, :api_gpx_files] before_filter :require_user, :only => [:set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image, :delete_image] before_filter :check_database_readable, :except => [:api_details, :api_gpx_files] before_filter :check_database_writable, :only => [:login, :new, :set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image, :delete_image] @@ -23,8 +23,7 @@ class UserController < ApplicationController @user.data_public = true @user.description = "" if @user.description.nil? @user.creation_ip = request.remote_ip - @user.locale = Language.find_by_code(I18n.locale.to_s) - @user.locale = Language.find_by_code("en") if @user.locale.nil? + @user.languages = request.user_preferred_languages if @user.save flash[:notice] = I18n.t('user.new.flash create success message') diff --git a/app/models/language.rb b/app/models/language.rb index 81441db5c..a33c76081 100644 --- a/app/models/language.rb +++ b/app/models/language.rb @@ -1,7 +1,6 @@ class Language < ActiveRecord::Base set_primary_key :code - has_many :users, :foreign_key => 'locale' has_many :diary_entries, :foreign_key => 'language' def name diff --git a/app/models/user.rb b/app/models/user.rb index 85d971316..f38994e53 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,8 +1,6 @@ class User < ActiveRecord::Base require 'xml/libxml' - belongs_to :language, :foreign_key => 'locale' - has_many :traces has_many :diary_entries, :order => 'created_at DESC' has_many :messages, :foreign_key => :to_user_id, :order => 'sent_on DESC' @@ -80,6 +78,18 @@ class User < ActiveRecord::Base return el1 end + def languages + attribute_present?(:languages) ? read_attribute(:languages).split(",") : [] + end + + def languages=(languages) + write_attribute(:languages, languages.join(",")) + end + + def preferred_language + languages.find { |l| Language.find(:first, :conditions => { :code => l }) } + end + def nearby(radius = 50, num = 10) if self.home_lon and self.home_lat gc = OSM::GreatCircle.new(self.home_lat, self.home_lon) diff --git a/db/migrate/035_change_user_locale.rb b/db/migrate/035_change_user_locale.rb new file mode 100644 index 000000000..7dc80549e --- /dev/null +++ b/db/migrate/035_change_user_locale.rb @@ -0,0 +1,15 @@ +require 'lib/migrate' + +class ChangeUserLocale < ActiveRecord::Migration + def self.up + remove_foreign_key :users, [:locale], :languages, [:code] + + rename_column :users, :locale, :languages + end + + def self.down + rename_column :users, :languages, :locale + + add_foreign_key :users, [:locale], :languages, [:code] + end +end diff --git a/vendor/plugins/http_accept_language/lib/http_accept_language.rb b/vendor/plugins/http_accept_language/lib/http_accept_language.rb index bf34935d4..f181c9f43 100644 --- a/vendor/plugins/http_accept_language/lib/http_accept_language.rb +++ b/vendor/plugins/http_accept_language/lib/http_accept_language.rb @@ -22,6 +22,12 @@ module HttpAcceptLanguage [] end + # Sets the user languages preference, overiding the browser + # + def user_preferred_languages=(languages) + @user_preferred_languages = languages.join(",") + end + # Finds the locale specifically requested by the browser. # # Example: