]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/language.rb
plugin(points): +/- must come after, closes #34
[user/henk/code/ruby/rbot.git] / lib / rbot / language.rb
index 7c47230367aabe713197e746b870a01c03d5cb48..8055ea0e8e986ae588ff624408617daef803d0f0 100644 (file)
@@ -8,77 +8,91 @@
 # .lang file etc.
 
 module Irc
-module Language
+class Bot
+  class Language
+
+    # Access needed for tests:
+    attr_reader :strings
 
-  # This constant hash holds the mapping
-  # from long language names to the usual POSIX
-  # locale specifications
-  Lang2Locale = {
-    :english  => 'en',
-    :british_english  => 'en_GB',
-    :american_english  => 'en_US',
-    :italian  => 'it',
-    :french   => 'fr',
-    :german   => 'de',
-    :dutch    => 'nl',
-    :japanese => 'ja',
-    :russian  => 'ru',
-    :traditional_chinese => 'zh_TW',
-    :simplified_chinese => 'zh_CN'
-  }
+    # This constant hash holds the mapping
+    # from long language names to the usual POSIX
+    # locale specifications
+    Lang2Locale = {
+      :english  => 'en',
+      :british_english  => 'en_GB',
+      :american_english  => 'en_US',
+      :italian  => 'it',
+      :french   => 'fr',
+      :german   => 'de',
+      :dutch    => 'nl',
+      :japanese => 'ja',
+      :russian  => 'ru',
+      :finnish  => 'fi',
+      :traditional_chinese => 'zh_TW',
+      :simplified_chinese => 'zh_CN'
+    }
+    # On WIN32 it appears necessary to have ".UTF-8" explicitly for gettext to use UTF-8
+    Lang2Locale.each_value {|v| v.replace(v + '.UTF-8')}
 
-  # Return the shortest language for the current
-  # GetText locale
-  def Language.from_locale
-    lang = locale.language
-    if locale.country
-      str = lang + "_#{locale.country}"
-      if Lang2Locale.value?(str)
-        # Get the shortest key in Lang2Locale which maps to the given lang_country
-        return Lang2Locale.select { |k, v| v == str }.transpose.first.map { |v| v.to_s }.sort { |a, b| a.length <=> b.length }.first
+    # Return the shortest language for the current
+    # GetText locale
+    def Language.from_locale
+      return 'english' unless defined?(GetText)
+      lang = locale.language
+      if locale.country
+        str = lang + "_#{locale.country}"
+        if Lang2Locale.value?(str)
+          # Get the shortest key in Lang2Locale which maps to the given lang_country
+          lang_str = Lang2Locale.select { |k, v| v == str }.transpose.first.map { |v| v.to_s }.sort { |a, b| a.length <=> b.length }.first
+          if File.exist?(File.join(Config::datadir, "languages/#{lang_str}.lang"))
+            return lang_str
+          end
+        end
       end
+      # lang_country didn't work, let's try lan
+      if Lang2Locale.value?(lang)
+        # Get the shortest key in Lang2Locale which maps to the given lang
+        lang_str = Lang2Locale.select { |k, v| v == lang }.transpose.first.map { |v| v.to_s }.sort { |a, b| a.length <=> b.length }.first
+        if File.exist?(File.join(Config::datadir, "/languages/#{lang_str}.lang"))
+          return lang_str
+        end
+      end
+      # all else fail, return 'english'
+      return 'english'
     end
-    # lang_country didn't work, let's try lan
-    if Lang2Locale.value?(lang)
-      # Get the shortest key in Lang2Locale which maps to the given lang
-      return Lang2Locale.select { |k, v| v == lang }.transpose.first.map { |v| v.to_s }.sort { |a, b| a.length <=> b.length }.first
-    end
-    # all else fail, return 'english'
-    return 'english'
-  end
 
-  class Language
-    BotConfig.register BotConfigEnumValue.new('core.language', 
-      :default => Irc::Language.from_locale, :wizard => true,
+    Config.register Config::EnumValue.new('core.language',
+      :default => Irc::Bot::Language.from_locale, :wizard => true,
       :values => Proc.new{|bot|
             Dir.new(Config::datadir + "/languages").collect {|f|
               f =~ /\.lang$/ ? f.gsub(/\.lang$/, "") : nil
             }.compact
-          },   
+          },
       :on_change => Proc.new {|bot, v| bot.lang.set_language v},
       :desc => "Which language file the bot should use")
-    
+
     def initialize(bot, language)
       @bot = bot
       set_language language
     end
-    attr_reader :language, :locale
+    attr_reader :language
 
     def set_language(language)
-      l = language.to_s.gsub(/\s+/,'_').intern
-      if Lang2Locale.key?(l)
-        @locale = Lang2Locale[l]
-        setlocale(@locale)
+      lang_str = language.to_s.downcase.gsub(/\s+/,'_')
+      lang_sym = lang_str.intern
+      if defined?(GetText) and Lang2Locale.key?(lang_sym)
+        GetText.set_locale(Lang2Locale[lang_sym])
         debug "locale set to #{locale}"
+        rbot_gettext_debug
       else
-        warn "Unable to set locale, unknown language #{l}"
+        warning "Unable to set locale, unknown language #{language} (#{lang_str})"
       end
 
-      file = Config::datadir + "/languages/#{language}.lang"
+      file = Config::datadir + "/languages/#{lang_str}.lang"
       unless(FileTest.exist?(file))
-        raise "no such language: #{language} (no such file #{file})"
+        raise "no such language: #{lang_str} (no such file #{file})"
       end
-      @language = language
+      @language = lang_str
       @file = file
       scan
       return if @bot.plugins.nil?