You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

gloc-internal.rb 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. # Copyright (c) 2005-2006 David Barri
  2. require 'iconv'
  3. require 'gloc-version'
  4. module GLoc
  5. class GLocError < StandardError #:nodoc:
  6. end
  7. class InvalidArgumentsError < GLocError #:nodoc:
  8. end
  9. class InvalidKeyError < GLocError #:nodoc:
  10. end
  11. class RuleNotFoundError < GLocError #:nodoc:
  12. end
  13. class StringNotFoundError < GLocError #:nodoc:
  14. end
  15. class << self
  16. private
  17. def _add_localized_data(lang, symbol_hash, override, target) #:nodoc:
  18. lang= lang.to_sym
  19. if override
  20. target[lang] ||= {}
  21. target[lang].merge!(symbol_hash)
  22. else
  23. symbol_hash.merge!(target[lang]) if target[lang]
  24. target[lang]= symbol_hash
  25. end
  26. end
  27. def _add_localized_strings(lang, symbol_hash, override=true, strings_charset=nil) #:nodoc:
  28. _charset_required
  29. # Convert all incoming strings to the gloc charset
  30. if strings_charset
  31. Iconv.open(get_charset(lang), strings_charset) do |i|
  32. symbol_hash.each_pair {|k,v| symbol_hash[k]= i.iconv(v)}
  33. end
  34. end
  35. # Convert rules
  36. rules= {}
  37. old_kcode= $KCODE
  38. begin
  39. $KCODE= 'u'
  40. Iconv.open(UTF_8, get_charset(lang)) do |i|
  41. symbol_hash.each {|k,v|
  42. if /^_gloc_rule_(.+)$/ =~ k.to_s
  43. v= i.iconv(v) if v
  44. v= '""' if v.nil?
  45. rules[$1.to_sym]= eval "Proc.new do #{v} end"
  46. end
  47. }
  48. end
  49. ensure
  50. $KCODE= old_kcode
  51. end
  52. rules.keys.each {|k| symbol_hash.delete "_gloc_rule_#{k}".to_sym}
  53. # Add new localized data
  54. LOWERCASE_LANGUAGES[lang.to_s.downcase]= lang
  55. _add_localized_data(lang, symbol_hash, override, LOCALIZED_STRINGS)
  56. _add_localized_data(lang, rules, override, RULES)
  57. end
  58. def _charset_required #:nodoc:
  59. set_charset UTF_8 unless CONFIG[:internal_charset]
  60. end
  61. def _get_internal_state_vars
  62. [ CONFIG, LOCALIZED_STRINGS, RULES, LOWERCASE_LANGUAGES ]
  63. end
  64. def _get_lang_file_list(dir) #:nodoc:
  65. dir= File.join(RAILS_ROOT,'{.,vendor/plugins/*}','lang') if dir.nil?
  66. Dir[File.join(dir,'*.{yaml,yml}')]
  67. end
  68. def _l(symbol, language, *arguments) #:nodoc:
  69. symbol= symbol.to_sym if symbol.is_a?(String)
  70. raise InvalidKeyError.new("Symbol or String expected as key.") unless symbol.kind_of?(Symbol)
  71. translation= LOCALIZED_STRINGS[language][symbol] rescue nil
  72. if translation.nil?
  73. raise StringNotFoundError.new("There is no key called '#{symbol}' in the #{language} strings.") if CONFIG[:raise_string_not_found_errors]
  74. translation= symbol.to_s
  75. end
  76. begin
  77. return translation % arguments
  78. rescue => e
  79. raise InvalidArgumentsError.new("Translation value #{translation.inspect} with arguments #{arguments.inspect} caused error '#{e.message}'")
  80. end
  81. end
  82. def _l_has_string?(symbol,lang) #:nodoc:
  83. symbol= symbol.to_sym if symbol.is_a?(String)
  84. LOCALIZED_STRINGS[lang].has_key?(symbol.to_sym) rescue false
  85. end
  86. def _l_rule(symbol,lang) #:nodoc:
  87. symbol= symbol.to_sym if symbol.is_a?(String)
  88. raise InvalidKeyError.new("Symbol or String expected as key.") unless symbol.kind_of?(Symbol)
  89. r= RULES[lang][symbol] rescue nil
  90. raise RuleNotFoundError.new("There is no rule called '#{symbol}' in the #{lang} rules.") if r.nil?
  91. r
  92. end
  93. def _verbose_msg(type=nil)
  94. return unless CONFIG[:verbose]
  95. x= case type
  96. when :stats
  97. x= valid_languages.map{|l| ":#{l}(#{LOCALIZED_STRINGS[l].size}/#{RULES[l].size})"}.sort.join(', ')
  98. "Current stats -- #{x}"
  99. else
  100. yield
  101. end
  102. puts "[GLoc] #{x}"
  103. end
  104. public :_l, :_l_has_string?, :_l_rule
  105. end
  106. private
  107. unless const_defined?(:LOCALIZED_STRINGS)
  108. LOCALIZED_STRINGS= {}
  109. RULES= {}
  110. LOWERCASE_LANGUAGES= {}
  111. end
  112. end