# encoding: UTF-8
=begin
language.rb - Locale::Info::Language class
Copyright (C) 2008 Masao Mutoh
Original Author:: Brian Pontarelli
$Id: language.rb 27 2008-12-03 15:06:50Z mutoh $
=end
require 'zlib'
module Locale
module Info
# This class contains all the of the ISO information for the ISO 639-3
# languages. This class is immutable once constructed.
class Language
attr_reader :two_code, :three_code, :scope, :type, :name
#
# Constructs a new Language instance.
#
# * code The 2 or 3 digit ISO 639-3 language code.
# * scope A single character that defines the ISO scope of the language - (I)ndividual,
# (M)acrolanguage, or (S)pecial.
# * type A single character that defines the ISO type of the language - (A)ncient,
# (C)onstructed, (E)xtinct, (H)istorical, (L)iving,
# or (S)pecial.
# * name The name of the language.
#
def initialize(two_code, three_code, scope, type, name)
@two_code, @three_code, @scope, @type, @name = two_code, three_code, scope, type, name
@individual = (scope == "I")
@macro = (scope == "M")
@special = (scope == "S")
@constructed = (type == "C")
@living = (type == "L")
@extinct = (type == "E")
@ancient = (type == "A")
@historical = (type == "H")
@special_type = (type == "S")
end
# Returns true if the language is an individual language according to the ISO 639-3 data.
def individual?; @individual; end
# Returns true if the language is a macro language according to the ISO 639-3 data.
def macro?; @macro; end
# Returns true if the language is a special language according to the ISO 639-3 data.
def special?; @special; end
# Returns true if the language is a constructed language according to the ISO 639-3 data.
def constructed?; @constructed; end
# Returns true if the language is a living language according to the ISO 639-3 data.
def living?; @living; end
# Returns true if the language is an extinct language according to the ISO 639-3 data.
def extinct?; @extinct; end
# Returns true if the language is an ancient language according to the ISO 639-3 data.
def ancient?; @ancient; end
# Returns true if the language is an historical language according to the ISO 639-3 data.
def historical?; @historical; end
# Returns true if the language is a special type language according to the ISO 639-3 data.
def special_type?; @special_type; end
# Returns the two or three code.
def to_s
if two_code and two_code.size > 0
two_code
else
three_code
end
end
# Returns this object is valid as ISO 639 data.
def iso_language?
@@lang_two_codes[two_code] != nil || @@lang_three_codes[three_code] != nil
end
end
@@lang_two_codes = Hash.new
@@lang_three_codes = Hash.new
Zlib::GzipReader.open(File.dirname(__FILE__) + "/../data/languages.tab.gz") do |gz|
gz.readlines.each do |l|
l.force_encoding('UTF-8') if l.respond_to?(:force_encoding)
unless l =~ /^\s*$/
parts = l.split(/\t/)
lang = Language.new(parts[2], parts[0], parts[3], parts[4], parts[5].strip)
@@lang_three_codes[parts[0]] = lang
@@lang_two_codes[parts[2]] = lang if parts[2].length > 0
end
end
end
module_function
# Returns a hash of all the ISO languages. The hash is {String, language} where
# the string is the 3 digit language code from the ISO 639 data. This contains
# all of the data from the ISO 639-3 data (7600 Languages).
#
# Need to require 'locale/info' or 'locale/language'.
def three_languages
@@lang_three_codes
end
# Returns a hash of all the ISO languages. The hash is {String, language} where
# the string is the 2 digit language code from the ISO 639-1 data. This contains
# all of the data from the ISO 639-1 data (186 Languages).
#
# Need to require 'locale/info' or 'locale/language'.
def two_languages
@@lang_two_codes
end
# Returns the language for the given 2 or 3 digit code.
#
# Need to require 'locale/info' or 'locale/language'.
def get_language(code)
@@lang_three_codes[code] || @@lang_two_codes[code]
end
# Returns the language code is valid.
#
# Need to require 'locale/info' or 'locale/language'.
def language_code?(code)
get_language(code) != nil
end
end
end