gloc-internal.rb
134 lines
| 4.0 KiB
| text/x-ruby
|
RubyLexer
|
r10 | # 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: | ||||
|
r741 | dir= File.join(RAILS_ROOT,'{.,vendor/plugins/*}','lang') if dir.nil? | ||
|
r10 | 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 | ||||