4 # :title: Language module for rbot
6 # This module takes care of language handling for rbot:
7 # setting the core.language value, loading the appropriate
14 # Access needed for tests:
17 # This constant hash holds the mapping
18 # from long language names to the usual POSIX
19 # locale specifications
22 :british_english => 'en_GB',
23 :american_english => 'en_US',
31 :traditional_chinese => 'zh_TW',
32 :simplified_chinese => 'zh_CN'
34 # On WIN32 it appears necessary to have ".UTF-8" explicitly for gettext to use UTF-8
35 Lang2Locale.each_value {|v| v.replace(v + '.UTF-8')}
37 # Return the shortest language for the current
39 def Language.from_locale
40 return 'english' unless defined?(GetText)
41 lang = locale.language
43 str = lang + "_#{locale.country}"
44 if Lang2Locale.value?(str)
45 # Get the shortest key in Lang2Locale which maps to the given lang_country
46 lang_str = Lang2Locale.select { |k, v| v == str }.transpose.first.map { |v| v.to_s }.sort { |a, b| a.length <=> b.length }.first
47 if File.exist?(File.join(Config::datadir, "languages/#{lang_str}.lang"))
52 # lang_country didn't work, let's try lan
53 if Lang2Locale.value?(lang)
54 # Get the shortest key in Lang2Locale which maps to the given lang
55 lang_str = Lang2Locale.select { |k, v| v == lang }.transpose.first.map { |v| v.to_s }.sort { |a, b| a.length <=> b.length }.first
56 if File.exist?(File.join(Config::datadir, "/languages/#{lang_str}.lang"))
60 # all else fail, return 'english'
64 Config.register Config::EnumValue.new('core.language',
65 :default => Irc::Bot::Language.from_locale, :wizard => true,
66 :values => Proc.new{|bot|
67 Dir.new(Config::datadir + "/languages").collect {|f|
68 f =~ /\.lang$/ ? f.gsub(/\.lang$/, "") : nil
71 :on_change => Proc.new {|bot, v| bot.lang.set_language v},
72 :desc => "Which language file the bot should use")
74 def initialize(bot, language)
80 def set_language(language)
81 lang_str = language.to_s.downcase.gsub(/\s+/,'_')
82 lang_sym = lang_str.intern
83 if defined?(GetText) and Lang2Locale.key?(lang_sym)
84 GetText.set_locale(Lang2Locale[lang_sym])
85 debug "locale set to #{locale}"
88 warning "Unable to set locale, unknown language #{language} (#{lang_str})"
91 file = Config::datadir + "/languages/#{lang_str}.lang"
92 unless(FileTest.exist?(file))
93 raise "no such language: #{lang_str} (no such file #{file})"
98 return if @bot.plugins.nil?
99 @bot.plugins.core_modules.each { |p|
100 if p.respond_to?('set_language')
101 p.set_language(@language)
104 @bot.plugins.plugins.each { |p|
105 if p.respond_to?('set_language')
106 p.set_language(@language)
114 IO.foreach(@file) {|l|
118 @strings[$1] = Array.new
120 elsif(l =~ /^\s*(.*)$/)
121 @strings[current_key] << $1
131 if(@strings.has_key?(key))
132 return @strings[key][rand(@strings[key].length)]
134 raise "undefined language key"
139 File.open(@file, "w") {|file|
140 @strings.each {|key,val|