Sort out storage and use of user preferred languages.
authorTom Hughes <tom@compton.nu>
Sun, 31 May 2009 14:55:45 +0000 (14:55 +0000)
committerTom Hughes <tom@compton.nu>
Sun, 31 May 2009 14:55:45 +0000 (14:55 +0000)
14 files changed:
app/controllers/application.rb
app/controllers/browse_controller.rb
app/controllers/changeset_controller.rb
app/controllers/changeset_tag_controller.rb
app/controllers/diary_entry_controller.rb
app/controllers/export_controller.rb
app/controllers/message_controller.rb
app/controllers/site_controller.rb
app/controllers/trace_controller.rb
app/controllers/user_controller.rb
app/models/language.rb
app/models/user.rb
db/migrate/035_change_user_locale.rb [new file with mode: 0644]
vendor/plugins/http_accept_language/lib/http_accept_language.rb

index 3d16ffa6954d22db95c3f2bad0d00c70cdceef33..c5624db146b4cdbfb86d03f84308c2d6f721f96e 100644 (file)
@@ -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
 
index 259ce0dc9377fa4b9e607fc8d866b945dba447f2..12ede13da333fd030a34b29559edcaa1f9f9dd88 100644 (file)
@@ -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 
index 72b966689c1b6fc65fa768c84c16fcbfce272dd2..704a2a0f634aaa90e3aee9816461c17d07bcd366 100644 (file)
@@ -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]
index 527149f77e66ce22872b2d2c5a4f1964ac9641b8..374e21ca1db174dbb2556814be5bf9e8a4c5f273 100644 (file)
@@ -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
index 96bf154a6121b211a2b6159ada68107c4606c1e3..018f4a48a452af233c5b71a8bfa0d8f630de902c 100644 (file)
@@ -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
index c84075d37ed7b822f3d2cdb2dd934f174557d953..b75fb1bca44d45ec9c00bb272f9ebd4590b49a8f 100644 (file)
@@ -1,5 +1,6 @@
 class ExportController < ApplicationController
 
+  before_filter :authorize_web
   before_filter :set_locale
 
   def start
index e01c34aca54bd169ef04b2fdaf28206c3ee887ff..183f8004a19ed1831c28e52ceab1a28dd9e99333 100644 (file)
@@ -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]
index 9bee03209f204ee08c24e4133c19bd5610d4e9a2..daf8fead74ae0a62c4a1207848566938b2576211 100644 (file)
@@ -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
index 33f6d0df72fcf1777e7f89f1fe966ac95c45e217..1787bb196a162e225631e67d0e22c1db5e648de4 100644 (file)
@@ -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]
index d83cac0da8790343dcaa11d8718f84da8739746c..2050ffdb4506056bbb39811ba34fd745ad6b8402 100644 (file)
@@ -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')
index 81441db5c4ff0665f845b7eb147d5d02446c1d34..a33c76081c786ae594fe86cffea721da6406e812 100644 (file)
@@ -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
index 85d9713169cdb5d148a07114d1947cd6f2c033c9..f38994e534596a71a9abf34bf3599698aab68502 100644 (file)
@@ -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 (file)
index 0000000..7dc8054
--- /dev/null
@@ -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
index bf34935d4050dc04996bd75e9aac1f50a1e3603c..f181c9f4309287d6aac017cdf9723ac7415aa0f6 100644 (file)
@@ -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: