123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- # Copyright (c) 2005-2006 David Barri
-
- require 'iconv'
- require 'gloc-version'
-
- module GLoc
- class GLocError < StandardError #:nodoc:
- end
- class InvalidArgumentsError < GLocError #:nodoc:
- end
- class InvalidKeyError < GLocError #:nodoc:
- end
- class RuleNotFoundError < GLocError #:nodoc:
- end
- class StringNotFoundError < GLocError #:nodoc:
- end
-
- class << self
- private
-
- def _add_localized_data(lang, symbol_hash, override, target) #:nodoc:
- lang= lang.to_sym
- if override
- target[lang] ||= {}
- target[lang].merge!(symbol_hash)
- else
- symbol_hash.merge!(target[lang]) if target[lang]
- target[lang]= symbol_hash
- end
- end
-
- def _add_localized_strings(lang, symbol_hash, override=true, strings_charset=nil) #:nodoc:
- _charset_required
-
- # Convert all incoming strings to the gloc charset
- if strings_charset
- Iconv.open(get_charset(lang), strings_charset) do |i|
- symbol_hash.each_pair {|k,v| symbol_hash[k]= i.iconv(v)}
- end
- end
-
- # Convert rules
- rules= {}
- old_kcode= $KCODE
- begin
- $KCODE= 'u'
- Iconv.open(UTF_8, get_charset(lang)) do |i|
- symbol_hash.each {|k,v|
- if /^_gloc_rule_(.+)$/ =~ k.to_s
- v= i.iconv(v) if v
- v= '""' if v.nil?
- rules[$1.to_sym]= eval "Proc.new do #{v} end"
- end
- }
- end
- ensure
- $KCODE= old_kcode
- end
- rules.keys.each {|k| symbol_hash.delete "_gloc_rule_#{k}".to_sym}
-
- # Add new localized data
- LOWERCASE_LANGUAGES[lang.to_s.downcase]= lang
- _add_localized_data(lang, symbol_hash, override, LOCALIZED_STRINGS)
- _add_localized_data(lang, rules, override, RULES)
- end
-
- def _charset_required #:nodoc:
- set_charset UTF_8 unless CONFIG[:internal_charset]
- end
-
- def _get_internal_state_vars
- [ CONFIG, LOCALIZED_STRINGS, RULES, LOWERCASE_LANGUAGES ]
- end
-
- def _get_lang_file_list(dir) #:nodoc:
- dir= File.join(RAILS_ROOT,'{.,vendor/plugins/*}','lang') if dir.nil?
- Dir[File.join(dir,'*.{yaml,yml}')]
- end
-
- def _l(symbol, language, *arguments) #:nodoc:
- symbol= symbol.to_sym if symbol.is_a?(String)
- raise InvalidKeyError.new("Symbol or String expected as key.") unless symbol.kind_of?(Symbol)
-
- translation= LOCALIZED_STRINGS[language][symbol] rescue nil
- if translation.nil?
- raise StringNotFoundError.new("There is no key called '#{symbol}' in the #{language} strings.") if CONFIG[:raise_string_not_found_errors]
- translation= symbol.to_s
- end
-
- begin
- return translation % arguments
- rescue => e
- raise InvalidArgumentsError.new("Translation value #{translation.inspect} with arguments #{arguments.inspect} caused error '#{e.message}'")
- end
- end
-
- def _l_has_string?(symbol,lang) #:nodoc:
- symbol= symbol.to_sym if symbol.is_a?(String)
- LOCALIZED_STRINGS[lang].has_key?(symbol.to_sym) rescue false
- end
-
- def _l_rule(symbol,lang) #:nodoc:
- symbol= symbol.to_sym if symbol.is_a?(String)
- raise InvalidKeyError.new("Symbol or String expected as key.") unless symbol.kind_of?(Symbol)
-
- r= RULES[lang][symbol] rescue nil
- raise RuleNotFoundError.new("There is no rule called '#{symbol}' in the #{lang} rules.") if r.nil?
- r
- end
-
- def _verbose_msg(type=nil)
- return unless CONFIG[:verbose]
- x= case type
- when :stats
- x= valid_languages.map{|l| ":#{l}(#{LOCALIZED_STRINGS[l].size}/#{RULES[l].size})"}.sort.join(', ')
- "Current stats -- #{x}"
- else
- yield
- end
- puts "[GLoc] #{x}"
- end
-
- public :_l, :_l_has_string?, :_l_rule
- end
-
- private
-
- unless const_defined?(:LOCALIZED_STRINGS)
- LOCALIZED_STRINGS= {}
- RULES= {}
- LOWERCASE_LANGUAGES= {}
- end
-
- end
|