X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Flanguage.rb;h=7193c39e3577240e8219d089ea6f91585ab22ced;hb=6cf365c49ce5fbe24c0a4ff0663550390b501fea;hp=ee6746d6709c139965bd3b047570e0fff8233dfe;hpb=992ef2edbf3eed7cb1d7c4c22f72cd203aff2aa5;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/language.rb b/lib/rbot/language.rb index ee6746d6..7193c39e 100644 --- a/lib/rbot/language.rb +++ b/lib/rbot/language.rb @@ -1,23 +1,108 @@ -module Irc +#-- vim:sw=2:et +#++ +# +# :title: Language module for rbot +# +# This module takes care of language handling for rbot: +# setting the core.language value, loading the appropriate +# .lang file etc. +module Irc +class Bot class Language - BotConfig.register('core.language', - :default => "english", :type => :enum, - :values => Dir.new(Config::DATADIR + "/languages").collect {|f| - f =~ /\.lang$/ ? f.gsub(/\.lang$/, "") : nil - }.compact, + + # 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 + 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 + + 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(language, file="") - @language = language - if file.empty? - file = Config::DATADIR + "/languages/#{@language}.lang" + + def initialize(bot, language) + @bot = bot + set_language language + end + attr_reader :language + + def set_language(language) + 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 + warning "Unable to set locale, unknown language #{language} (#{lang_str})" end + + 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 = lang_str @file = file scan + return if @bot.plugins.nil? + @bot.plugins.core_modules.each { |p| + if p.respond_to?('set_language') + p.set_language(@language) + end + } + @bot.plugins.plugins.each { |p| + if p.respond_to?('set_language') + p.set_language(@language) + end + } end def scan @@ -60,3 +145,4 @@ module Irc end end +end