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
13 # This constant has holds the mapping
14 # from long language names to usual POSIX
15 # locale specifications
18 :british_english => 'en_GB',
19 :american_english => 'en_US',
26 :traditional_chinese => 'zh_TW',
27 :simplified_chinese => 'zh_CN'
31 BotConfig.register BotConfigEnumValue.new('core.language',
32 :default => "english", :wizard => true,
33 :values => Proc.new{|bot|
34 Dir.new(Config::datadir + "/languages").collect {|f|
35 f =~ /\.lang$/ ? f.gsub(/\.lang$/, "") : nil
38 :on_change => Proc.new {|bot, v| bot.lang.set_language v},
39 :desc => "Which language file the bot should use")
41 def initialize(bot, language)
45 attr_reader :language, :locale
47 def set_language(language)
48 l = language.to_s.gsub(/\s+/,'_').intern
49 if Lang2Locale.key?(l)
50 @locale = Lang2Locale[l]
51 debug "locale set to #{@locale}"
54 warn "Unable to set locale, unknown language #{l}"
57 file = Config::datadir + "/languages/#{language}.lang"
58 unless(FileTest.exist?(file))
59 raise "no such language: #{language} (no such file #{file})"
64 return if @bot.plugins.nil?
65 @bot.plugins.core_modules.each { |p|
66 if p.respond_to?('set_language')
67 p.set_language(@language)
70 @bot.plugins.plugins.each { |p|
71 if p.respond_to?('set_language')
72 p.set_language(@language)
80 IO.foreach(@file) {|l|
84 @strings[$1] = Array.new
86 elsif(l =~ /^\s*(.*)$/)
87 @strings[current_key] << $1
97 if(@strings.has_key?(key))
98 return @strings[key][rand(@strings[key].length)]
100 raise "undefined language key"
105 File.open(@file, "w") {|file|
106 @strings.each {|key,val|