app/controllers/translate_controller.rb in translate-rails3-plus-0.0.11 vs app/controllers/translate_controller.rb in translate-rails3-plus-0.0.12
- old
+ new
@@ -1,218 +1,218 @@
-class TranslateController < ActionController::Base
- # It seems users with active_record_store may get a "no :secret given" error if we don't disable csrf protection,
- skip_before_action :verify_authenticity_token, raise: false
-
- layout 'translate'
-
- before_action :init_translations
- before_action :set_locale
-
- # GET /translate
- def index
- initialize_keys
- filter_by_key_pattern
- filter_by_text_pattern
- filter_by_translated_text_pattern
- filter_by_translated_or_changed
- sort_keys
- paginate_keys
- @total_entries = @keys.size
- @page_title = page_title
- end
-
- # POST /translate
- def translate
- processed_parameters = process_array_parameters(params[:key])
- I18n.backend.store_translations(@to_locale, Translate::Keys.to_deep_hash(processed_parameters))
- Translate::Storage.new(@to_locale).write_to_file
- Translate::Log.new(@from_locale, @to_locale, params[:key].keys).write_to_file
- force_init_translations # Force reload from YAML file
- flash[:notice] = "Translations stored"
- old_params = params.slice(:filter, :sort_by, :key_type, :key_pattern, :text_type, :text_pattern, :translated_text_type, :translated_text_pattern)
- redirect_to( {:action => :index}.merge(old_params) )
- end
-
- # GET /translate/reload
- def reload
- Translate::Keys.files = nil
- redirect_to :action => 'index'
- end
-
- private
- def initialize_keys
- @files = Translate::Keys.files
- @keys = (@files.keys.map(&:to_s) + Translate::Keys.new.i18n_keys(@from_locale)).uniq
- @keys.reject! do |key|
- from_text = lookup(@from_locale, key)
- # When translating from one language to another, make sure there is a text to translate from.
- # The only supported formats are String and Array. We don't support other formats
- (@from_locale != @to_locale && !from_text.present?) || (from_text.present? && !from_text.is_a?(String) && !from_text.is_a?(Array))
- end
- end
-
- def page_title
- "Translate"
- end
-
- def lookup(locale, key)
- I18n.backend.send(:lookup, locale, key)
- end
- helper_method :lookup
-
- def from_locales
- # Attempt to get the list of locale from configuration
- from_loc = Rails.application.config.from_locales if Rails.application.config.respond_to?(:from_locales)
- return I18n.available_locales if from_loc.blank?
- raise StandardError, "from_locale expected to be an array" if from_loc.class != Array
- from_loc
- end
- helper_method :from_locales
-
- def to_locales
- to_loc = Rails.application.config.to_locales if Rails.application.config.respond_to?(:to_locales)
- return I18n.available_locales if to_loc.blank?
- raise StandardError, "to_locales expected to be an array" if to_loc.class != Array
- to_loc
- end
- helper_method :to_locales
-
- def filter_by_translated_or_changed
- params[:filter] ||= 'all'
- return if params[:filter] == 'all'
- @keys.reject! do |key|
- case params[:filter]
- when 'untranslated'
- lookup(@to_locale, key).present?
- when 'translated'
- lookup(@to_locale, key).blank?
- when 'changed'
- lookup(@from_locale, key).to_s == lookup(@to_locale, key).to_s
- when 'list_changed'
- fr = lookup(@from_locale, key).to_s.squish
- to = lookup(@to_locale, key).to_s.squish
- if fr.downcase != to.downcase
- p '--'
- p 'c:' + fr
- p 'g:' + to
- end
- fr.downcase == to.downcase
- else
- raise "Unknown filter '#{params[:filter]}'"
- end
- end
- end
-
- def filter_by_key_pattern
- return if params[:key_pattern].blank?
- @keys.reject! do |key|
- case params[:key_type]
- when "starts_with"
- !key.starts_with?(params[:key_pattern])
- when "contains"
- key.index(params[:key_pattern]).nil?
- else
- raise "Unknown key_type '#{params[:key_type]}'"
- end
- end
- end
-
- def filter_by_text_pattern
- return if params[:text_pattern].blank?
- @keys.reject! do |key|
- case params[:text_type]
- when 'contains'
- !lookup(@from_locale, key).present? || !lookup(@from_locale, key).to_s.downcase.index(params[:text_pattern].downcase)
- when 'equals'
- !lookup(@from_locale, key).present? || lookup(@from_locale, key).to_s.downcase != params[:text_pattern].downcase
- else
- raise "Unknown text_type '#{params[:text_type]}'"
- end
- end
- end
-
- def filter_by_translated_text_pattern
- return if params[:translated_text_pattern].blank?
- @keys.reject! do |key|
- case params[:translated_text_type]
- when 'contains' then
- !lookup(@to_locale, key).present? || !lookup(@to_locale, key).to_s.downcase.index(params[:translated_text_pattern].downcase)
- when 'equals' then
- !lookup(@to_locale, key).present? || lookup(@to_locale, key).to_s.downcase != params[:translated_text_pattern].downcase
- else
- raise "Unknown translated_text_type '#{params[:translated_text_type]}'"
- end
- end
- end
-
- def sort_keys
- params[:sort_by] ||= "key"
- case params[:sort_by]
- when "key"
- @keys.sort!
- when "text"
- @keys.sort! do |key1, key2|
- if lookup(@from_locale, key1).present? && lookup(@from_locale, key2).present?
- lookup(@from_locale, key1).to_s.downcase <=> lookup(@from_locale, key2).to_s.downcase
- elsif lookup(@from_locale, key1).present?
- -1
- else
- 1
- end
- end
- else
- raise "Unknown sort_by '#{params[:sort_by]}'"
- end
- end
-
- def paginate_keys
- params[:page] ||= 1
- @paginated_keys = @keys[offset, per_page]
- end
-
- def offset
- (params[:page].to_i - 1) * per_page
- end
-
- def per_page
- 50
- end
- helper_method :per_page
-
- def init_translations
- I18n.backend.send(:init_translations) unless I18n.backend.initialized?
- end
-
- def force_init_translations
- I18n.backend.send(:init_translations)
- end
-
- def default_locale
- I18n.default_locale
- end
-
- def default_to_locale
- :en
- end
-
- def set_locale
- session[:from_locale] ||= default_locale
- session[:to_locale] ||= default_to_locale
- session[:from_locale] = params[:from_locale] if params[:from_locale].present?
- session[:to_locale] = params[:to_locale] if params[:to_locale].present?
- @from_locale = session[:from_locale].to_sym
- @to_locale = session[:to_locale].to_sym
- end
-
- def process_array_parameters(parameter)
- reconstructed_hash = Hash.new
-
- parameter.each do |key, value|
- if value.is_a?(String)
- reconstructed_hash[key] = value
- elsif value.is_a?(Hash)
- reconstructed_hash[key] = Translate::Keys.arraylize(value)
- end
- end
- reconstructed_hash
- end
-end
+class TranslateController < ActionController::Base
+ # It seems users with active_record_store may get a "no :secret given" error if we don't disable csrf protection,
+ skip_before_action :verify_authenticity_token, raise: false
+
+ layout 'translate'
+
+ before_action :init_translations
+ before_action :set_locale
+
+ # GET /translate
+ def index
+ initialize_keys
+ filter_by_key_pattern
+ filter_by_text_pattern
+ filter_by_translated_text_pattern
+ filter_by_translated_or_changed
+ sort_keys
+ paginate_keys
+ @total_entries = @keys.size
+ @page_title = page_title
+ end
+
+ # POST /translate
+ def translate
+ processed_parameters = process_array_parameters(params[:key])
+ I18n.backend.store_translations(@to_locale, Translate::Keys.to_deep_hash(processed_parameters))
+ Translate::Storage.new(@to_locale).write_to_file
+ Translate::Log.new(@from_locale, @to_locale, params[:key].keys).write_to_file
+ force_init_translations # Force reload from YAML file
+ flash[:notice] = "Translations stored"
+ old_params = params.slice(:filter, :sort_by, :key_type, :key_pattern, :text_type, :text_pattern, :translated_text_type, :translated_text_pattern)
+ redirect_to( {:action => :index}.merge(old_params) )
+ end
+
+ # GET /translate/reload
+ def reload
+ Translate::Keys.files = nil
+ redirect_to :action => 'index'
+ end
+
+ private
+ def initialize_keys
+ @files = Translate::Keys.files
+ @keys = (@files.keys.map(&:to_s) + Translate::Keys.new.i18n_keys(@from_locale)).uniq
+ @keys.reject! do |key|
+ from_text = lookup(@from_locale, key)
+ # When translating from one language to another, make sure there is a text to translate from.
+ # The only supported formats are String and Array. We don't support other formats
+ (@from_locale != @to_locale && !from_text.present?) || (from_text.present? && !from_text.is_a?(String) && !from_text.is_a?(Array))
+ end
+ end
+
+ def page_title
+ "Translate"
+ end
+
+ def lookup(locale, key)
+ I18n.backend.send(:lookup, locale, key)
+ end
+ helper_method :lookup
+
+ def from_locales
+ # Attempt to get the list of locale from configuration
+ from_loc = Rails.application.config.from_locales if Rails.application.config.respond_to?(:from_locales)
+ return I18n.available_locales if from_loc.blank?
+ raise StandardError, "from_locale expected to be an array" if from_loc.class != Array
+ from_loc
+ end
+ helper_method :from_locales
+
+ def to_locales
+ to_loc = Rails.application.config.to_locales if Rails.application.config.respond_to?(:to_locales)
+ return I18n.available_locales if to_loc.blank?
+ raise StandardError, "to_locales expected to be an array" if to_loc.class != Array
+ to_loc
+ end
+ helper_method :to_locales
+
+ def filter_by_translated_or_changed
+ params[:filter] ||= 'all'
+ return if params[:filter] == 'all'
+ @keys.reject! do |key|
+ case params[:filter]
+ when 'untranslated'
+ lookup(@to_locale, key).present?
+ when 'translated'
+ lookup(@to_locale, key).blank?
+ when 'changed'
+ lookup(@from_locale, key).to_s == lookup(@to_locale, key).to_s
+ when 'list_changed'
+ fr = lookup(@from_locale, key).to_s.squish
+ to = lookup(@to_locale, key).to_s.squish
+ if fr.downcase != to.downcase
+ p '--'
+ p 'c:' + fr
+ p 'g:' + to
+ end
+ fr.downcase == to.downcase
+ else
+ raise "Unknown filter '#{params[:filter]}'"
+ end
+ end
+ end
+
+ def filter_by_key_pattern
+ return if params[:key_pattern].blank?
+ @keys.reject! do |key|
+ case params[:key_type]
+ when "starts_with"
+ !key.starts_with?(params[:key_pattern])
+ when "contains"
+ key.index(params[:key_pattern]).nil?
+ else
+ raise "Unknown key_type '#{params[:key_type]}'"
+ end
+ end
+ end
+
+ def filter_by_text_pattern
+ return if params[:text_pattern].blank?
+ @keys.reject! do |key|
+ case params[:text_type]
+ when 'contains'
+ !lookup(@from_locale, key).present? || !lookup(@from_locale, key).to_s.downcase.index(params[:text_pattern].downcase)
+ when 'equals'
+ !lookup(@from_locale, key).present? || lookup(@from_locale, key).to_s.downcase != params[:text_pattern].downcase
+ else
+ raise "Unknown text_type '#{params[:text_type]}'"
+ end
+ end
+ end
+
+ def filter_by_translated_text_pattern
+ return if params[:translated_text_pattern].blank?
+ @keys.reject! do |key|
+ case params[:translated_text_type]
+ when 'contains' then
+ !lookup(@to_locale, key).present? || !lookup(@to_locale, key).to_s.downcase.index(params[:translated_text_pattern].downcase)
+ when 'equals' then
+ !lookup(@to_locale, key).present? || lookup(@to_locale, key).to_s.downcase != params[:translated_text_pattern].downcase
+ else
+ raise "Unknown translated_text_type '#{params[:translated_text_type]}'"
+ end
+ end
+ end
+
+ def sort_keys
+ params[:sort_by] ||= "key"
+ case params[:sort_by]
+ when "key"
+ @keys.sort!
+ when "text"
+ @keys.sort! do |key1, key2|
+ if lookup(@from_locale, key1).present? && lookup(@from_locale, key2).present?
+ lookup(@from_locale, key1).to_s.downcase <=> lookup(@from_locale, key2).to_s.downcase
+ elsif lookup(@from_locale, key1).present?
+ -1
+ else
+ 1
+ end
+ end
+ else
+ raise "Unknown sort_by '#{params[:sort_by]}'"
+ end
+ end
+
+ def paginate_keys
+ params[:page] ||= 1
+ @paginated_keys = @keys[offset, per_page]
+ end
+
+ def offset
+ (params[:page].to_i - 1) * per_page
+ end
+
+ def per_page
+ 50
+ end
+ helper_method :per_page
+
+ def init_translations
+ I18n.backend.send(:init_translations) unless I18n.backend.initialized?
+ end
+
+ def force_init_translations
+ I18n.backend.send(:init_translations)
+ end
+
+ def default_locale
+ I18n.default_locale
+ end
+
+ def default_to_locale
+ :en
+ end
+
+ def set_locale
+ session[:from_locale] ||= default_locale
+ session[:to_locale] ||= default_to_locale
+ session[:from_locale] = params[:from_locale] if params[:from_locale].present?
+ session[:to_locale] = params[:to_locale] if params[:to_locale].present?
+ @from_locale = session[:from_locale].to_sym
+ @to_locale = session[:to_locale].to_sym
+ end
+
+ def process_array_parameters(parameter)
+ reconstructed_hash = Hash.new
+
+ parameter.each do |key, value|
+ if value.is_a?(String)
+ reconstructed_hash[key] = value
+ elsif value.is_a?(Hash)
+ reconstructed_hash[key] = Translate::Keys.arraylize(value)
+ end
+ end
+ reconstructed_hash
+ end
+end