lib/world-flags.rb in world-flags-0.3.0 vs lib/world-flags.rb in world-flags-0.3.1

- old
+ new

@@ -6,11 +6,11 @@ require "world_flags/languages" require "world_flags/countries" module WorldFlags class << self - attr_accessor :auto_select + attr_accessor :auto_select, :raise_error, :default_code # TODO: Why both active and valid locales? Does this even make sense!? attr_writer :active_locales def active_locales @@ -26,10 +26,14 @@ def valid_locales= *list raise ArgumentError, "Must be a list of locales, was #{list}" if list.empty? @valid_locales ||= list.flatten end + def raise_error? + @raise_error + end + def auto_select? auto_select end def auto_select! @@ -43,67 +47,108 @@ label ||= WorldFlags.language(default_locale, code) end # Locale translation helper macros - def flag_code code + def flag_code code = :en locale_flag_map[code.to_sym] || code end - def locale code + def locale code = :en flag_locale_map[code.to_sym] || code end attr_writer :locale_flag_map # translate locales to flag code: ISO_3166-1_alpha-2 def locale_flag_map @locale_map ||= { :en => :us, :da => :dk, + :sv => :se, :'en_UK' => :gb, :'en_US' => :us } end def flag_locale_map locale_flag_map.hash_revert end + def default_code_used + WorldFlags.default_code || :en + end + # Language helper macros def language locale = :en, code = :en - locale ||= :en - languages[locale][code] + locale ||= default_code_used + locale_languages_map = languages[locale] || languages[default_code_used] + + raise "No language-locale map defined for locale: #{locale} in #{languages}" if locale_languages_map.blank? + + # raise("No language map defined for language code: #{code} in #{locale_languages_map[code]}") + locale_languages_map[code] ? locale_languages_map[code] : locale_languages_map[default_code_used] + rescue Exception => e + raise e if WorldFlags.raise_error? + "Undefined" end def languages= languages raise ArgumentError, "Must be a hash, was: #{languages}" unless languages.kind_of?(Hash) @languages = languages end def languages @languages ||= begin - active_locales.inject({}) do |res, locale| - res[locale] = Languages.send(locale) if Languages.respond_to?(locale) + active_locales.inject({}) do |res, loc| + res[locale] = find_language_map(loc) res end end end + def find_language_map loc + # return Countries.send(loc) if Countries.respond_to?(loc) + [loc, flag_code(loc), locale(loc)].each do |code| + return Languages.send(locale) if Languages.respond_to?(locale) + end + end + # Country helper macros def country locale = :en, code = :en - locale ||= :en - countries[locale][code] + locale ||= default_code_used + + locale_countries_map = countries[locale] || countries[default_code_used] + + raise "No country-locale map defined for locale: #{locale} in #{countries}" if locale_countries_map.blank? + + # raise("No country map defined for country code: #{code} in #{locale_countries_map[code]}") + locale_countries_map[code] ? locale_countries_map[code] : locale_countries_map[default_code_used] + rescue Exception => e + raise e if WorldFlags.raise_error? + "Undefined" end def countries= countries raise ArgumentError, "Must be a hash, was: #{countries}" unless countries.kind_of?(Hash) @countries = countries end def countries - @countries ||= {:en => Countries.en} + @countries ||= begin + active_locales.inject({}) do |res, loc| + res[loc] = find_country_map(loc) + res + end + end end + + def find_country_map loc + # return Countries.send(loc) if Countries.respond_to?(loc) + [loc, flag_code(loc), locale(loc)].each do |code| + return Countries.send(code) if Countries.respond_to?(code) + end + end end end