module Uncharted class Country attr_reader :alpha2, :alpha3, :name alias :code :alpha2 def initialize(alpha2, alpha3 = nil, name = nil) @alpha2 = alpha2 @alpha3 = alpha3 @name = name self.class.data[alpha2] = self end def inspect "#{@alpha2}: '#{@name}'" end def name(options = {}) I18n.t("countries.#{@alpha2}", {locale: options[:locale] || I18n.locale, default: @name}) end def names @names ||= Country.split_name(@name) end def to_s @alpha2 end def self.count countries.count end def self.find(objects) case objects when Array objects.collect {|c| data[c]} when Country objects else # code code = objects.to_s code.upcase! data[code] end end def self.find_by_name(name) closest = [nil, 0] @data.each do |code, country| return country if country.name == name intersection = country.names & Country.split_name(name) size = intersection.size return country if size == country.names.size closest = [country, size] if closest.last < size end return closest.first end def self.countries @data.values end def self.data @data ||= {} end def self.split_name(name) name = I18n.transliterate(name) name.downcase! name.split end end end