]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - lib/rbot/language.rb
gettext support: initial works for language -> locale mappings
[user/henk/code/ruby/rbot.git] / lib / rbot / language.rb
1 #-- vim:sw=2:et
2 #++
3 #
4 # :title: Language module for rbot
5 #
6 # This module takes care of language handling for rbot:
7 # setting the core.language value, loading the appropriate
8 # .lang file etc.
9 #
10 module Irc
11 module Language
12
13   # This constant has holds the mapping
14   # from long language names to usual POSIX
15   # locale specifications
16   Lang2Locale = {
17     :english  => 'en_GB',
18     :british_english  => 'en_GB',
19     :american_english  => 'en_US',
20     :italian  => 'it',
21     :french   => 'fr',
22     :german   => 'de',
23     :dutch    => 'nl',
24     :japanese => 'ja',
25     :russian  => 'ru',
26     :traditional_chinese => 'zh_TW',
27     :simplified_chinese => 'zh_CN'
28   }
29
30   class Language
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
36             }.compact
37           },   
38       :on_change => Proc.new {|bot, v| bot.lang.set_language v},
39       :desc => "Which language file the bot should use")
40     
41     def initialize(bot, language)
42       @bot = bot
43       set_language language
44     end
45     attr_reader :language, :locale
46
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}"
52         setlocale(@locale)
53       else
54         warn "Unable to set locale, unknown language #{l}"
55       end
56
57       file = Config::datadir + "/languages/#{language}.lang"
58       unless(FileTest.exist?(file))
59         raise "no such language: #{language} (no such file #{file})"
60       end
61       @language = language
62       @file = file
63       scan
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)
68         end
69       }
70       @bot.plugins.plugins.each { |p|
71         if p.respond_to?('set_language')
72           p.set_language(@language)
73         end
74       }
75     end
76
77     def scan
78       @strings = Hash.new
79       current_key = nil
80       IO.foreach(@file) {|l|
81         next if l =~ /^$/
82         next if l =~ /^\s*#/
83         if(l =~ /^(\S+):$/)
84           @strings[$1] = Array.new
85           current_key = $1
86         elsif(l =~ /^\s*(.*)$/)
87           @strings[current_key] << $1
88         end
89       }
90     end
91
92     def rescan
93       scan
94     end
95
96     def get(key)
97       if(@strings.has_key?(key))
98         return @strings[key][rand(@strings[key].length)]
99       else
100         raise "undefined language key"
101       end
102     end
103
104     def save
105       File.open(@file, "w") {|file|
106         @strings.each {|key,val|
107           file.puts "#{key}:"
108           val.each_value {|v|
109             file.puts "   #{v}"
110           }
111         }
112       }
113     end
114   end
115
116 end
117 end