Sort out storage and use of user preferred languages.

This commit is contained in:
Tom Hughes 2009-05-31 14:55:45 +00:00
parent 37749e07e1
commit 0e96027a20
14 changed files with 52 additions and 16 deletions

View file

@ -102,6 +102,15 @@ class ApplicationController < ActionController::Base
end end
def set_locale 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) I18n.locale = request.compatible_language_from(I18n.available_locales)
end end

View file

@ -1,8 +1,8 @@
class BrowseController < ApplicationController class BrowseController < ApplicationController
layout 'site' layout 'site'
before_filter :set_locale
before_filter :authorize_web before_filter :authorize_web
before_filter :set_locale
before_filter { |c| c.check_database_readable(true) } before_filter { |c| c.check_database_readable(true) }
def start def start

View file

@ -5,8 +5,8 @@ class ChangesetController < ApplicationController
require 'xml/libxml' require 'xml/libxml'
session :off, :except => [:list, :list_user, :list_bbox] 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 :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 :authorize, :only => [:create, :update, :delete, :upload, :include, :close]
before_filter :require_public_data, :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] before_filter :check_api_writable, :only => [:create, :update, :delete, :upload, :include]

View file

@ -1,11 +1,8 @@
class ChangesetTagController < ApplicationController class ChangesetTagController < ApplicationController
layout 'site' layout 'site'
before_filter :set_locale
def search def search
@tags = ChangesetTag.find(:all, :limit => 11, :conditions => ["match(v) against (?)", params[:query][:query].to_s] ) @tags = ChangesetTag.find(:all, :limit => 11, :conditions => ["match(v) against (?)", params[:query][:query].to_s] )
end end
end end

View file

@ -1,8 +1,8 @@
class DiaryEntryController < ApplicationController class DiaryEntryController < ApplicationController
layout 'site', :except => :rss layout 'site', :except => :rss
before_filter :set_locale
before_filter :authorize_web before_filter :authorize_web
before_filter :set_locale
before_filter :require_user, :only => [:new, :edit] before_filter :require_user, :only => [:new, :edit]
before_filter :check_database_readable before_filter :check_database_readable
before_filter :check_database_writable, :only => [:new, :edit] before_filter :check_database_writable, :only => [:new, :edit]
@ -20,7 +20,7 @@ class DiaryEntryController < ApplicationController
render :action => 'edit' render :action => 'edit'
end end
else else
@diary_entry = DiaryEntry.new(:language => @user.language) @diary_entry = DiaryEntry.new(:language_code => @user.preferred_language)
render :action => 'edit' render :action => 'edit'
end end
end end

View file

@ -1,5 +1,6 @@
class ExportController < ApplicationController class ExportController < ApplicationController
before_filter :authorize_web
before_filter :set_locale before_filter :set_locale
def start def start

View file

@ -1,8 +1,8 @@
class MessageController < ApplicationController class MessageController < ApplicationController
layout 'site' layout 'site'
before_filter :set_locale
before_filter :authorize_web before_filter :authorize_web
before_filter :set_locale
before_filter :require_user before_filter :require_user
before_filter :check_database_readable before_filter :check_database_readable
before_filter :check_database_writable, :only => [:new, :reply, :mark] before_filter :check_database_writable, :only => [:new, :reply, :mark]

View file

@ -1,6 +1,6 @@
class SiteController < ApplicationController class SiteController < ApplicationController
before_filter :set_locale
before_filter :authorize_web before_filter :authorize_web
before_filter :set_locale
before_filter :require_user, :only => [:edit] before_filter :require_user, :only => [:edit]
def export def export

View file

@ -1,8 +1,8 @@
class TraceController < ApplicationController class TraceController < ApplicationController
layout 'site' layout 'site'
before_filter :set_locale
before_filter :authorize_web before_filter :authorize_web
before_filter :set_locale
before_filter :require_user, :only => [:mine, :create, :edit, :delete, :make_public] before_filter :require_user, :only => [:mine, :create, :edit, :delete, :make_public]
before_filter :authorize, :only => [:api_details, :api_data, :api_create] before_filter :authorize, :only => [:api_details, :api_data, :api_create]
before_filter :check_database_readable, :except => [:api_details, :api_data, :api_create] before_filter :check_database_readable, :except => [:api_details, :api_data, :api_create]

View file

@ -2,8 +2,8 @@ class UserController < ApplicationController
layout 'site' layout 'site'
before_filter :authorize, :only => [:api_details, :api_gpx_files] 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 :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 :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_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] 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.data_public = true
@user.description = "" if @user.description.nil? @user.description = "" if @user.description.nil?
@user.creation_ip = request.remote_ip @user.creation_ip = request.remote_ip
@user.locale = Language.find_by_code(I18n.locale.to_s) @user.languages = request.user_preferred_languages
@user.locale = Language.find_by_code("en") if @user.locale.nil?
if @user.save if @user.save
flash[:notice] = I18n.t('user.new.flash create success message') flash[:notice] = I18n.t('user.new.flash create success message')

View file

@ -1,7 +1,6 @@
class Language < ActiveRecord::Base class Language < ActiveRecord::Base
set_primary_key :code set_primary_key :code
has_many :users, :foreign_key => 'locale'
has_many :diary_entries, :foreign_key => 'language' has_many :diary_entries, :foreign_key => 'language'
def name def name

View file

@ -1,8 +1,6 @@
class User < ActiveRecord::Base class User < ActiveRecord::Base
require 'xml/libxml' require 'xml/libxml'
belongs_to :language, :foreign_key => 'locale'
has_many :traces has_many :traces
has_many :diary_entries, :order => 'created_at DESC' has_many :diary_entries, :order => 'created_at DESC'
has_many :messages, :foreign_key => :to_user_id, :order => 'sent_on DESC' has_many :messages, :foreign_key => :to_user_id, :order => 'sent_on DESC'
@ -80,6 +78,18 @@ class User < ActiveRecord::Base
return el1 return el1
end 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) def nearby(radius = 50, num = 10)
if self.home_lon and self.home_lat if self.home_lon and self.home_lat
gc = OSM::GreatCircle.new(self.home_lat, self.home_lon) gc = OSM::GreatCircle.new(self.home_lat, self.home_lon)

View file

@ -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

View file

@ -22,6 +22,12 @@ module HttpAcceptLanguage
[] []
end 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. # Finds the locale specifically requested by the browser.
# #
# Example: # Example: