class Irc::Bot::Language

Constants

Lang2Locale

This constant hash holds the mapping from long language names to the usual POSIX locale specifications

Attributes

language[R]
strings[R]

Access needed for tests:

Public Class Methods

from_locale() click to toggle source

Return the shortest language for the current GetText locale

# File lib/rbot/language.rb, line 39
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
new(bot, language) click to toggle source
# File lib/rbot/language.rb, line 74
def initialize(bot, language)
  @bot = bot
  set_language language
end

Public Instance Methods

get(key) click to toggle source
# File lib/rbot/language.rb, line 130
def get(key)
  if(@strings.has_key?(key))
    return @strings[key][rand(@strings[key].length)]
  else
    raise "undefined language key"
  end
end
rescan() click to toggle source
# File lib/rbot/language.rb, line 126
def rescan
  scan
end
save() click to toggle source
# File lib/rbot/language.rb, line 138
def save
  File.open(@file, "w") {|file|
    @strings.each {|key,val|
      file.puts "#{key}:"
      val.each_value {|v|
        file.puts "   #{v}"
      }
    }
  }
end
scan() click to toggle source
# File lib/rbot/language.rb, line 111
def scan
  @strings = Hash.new
  current_key = nil
  IO.foreach(@file) {|l|
    next if l =~ /^$/
    next if l =~ /^\s*#/
    if(l =~ /^(\S+):$/)
      @strings[$1] = Array.new
      current_key = $1
    elsif(l =~ /^\s*(.*)$/)
      @strings[current_key] << $1
    end
  }
end
set_language(language) click to toggle source
# File lib/rbot/language.rb, line 80
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: #{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