lib/locale/driver/env.rb in locale-2.0.8 vs lib/locale/driver/env.rb in locale-2.0.9

- old
+ new

@@ -22,33 +22,41 @@ require 'locale/tag' require 'locale/taglist' require "locale/driver" -module Locale +module Locale module Driver # Locale::Driver::Env module. # Detect the user locales and the charset. - # All drivers(except CGI) refer environment variables first and use it + # All drivers(except CGI) refer environment variables first and use it # as the locale if it's defined. # This is a low-level module. Application shouldn't use this directly. module Env module_function - # Gets the locale from environment variable. (LC_ALL > LC_CTYPES > LANG) + # Gets the locale from environment variable. + # Priority order except charset is LC_ALL > LC_MESSAGES > LANG. + # Priority order for charset is LC_ALL > LC_CTYPE > LANG. # Returns: the locale as Locale::Tag::Posix. def locale - # At least one environment valiables should be set on *nix system. - [ENV["LC_ALL"], ENV["LC_CTYPES"], ENV["LANG"]].each do |loc| - if loc != nil and loc.size > 0 - return Locale::Tag::Posix.parse(loc) - end - end - nil + lc_all = Private.parse(ENV["LC_ALL"]) + return lc_all if lc_all + + lc_messages = Private.parse(ENV["LC_MESSAGES"]) + lang = Private.parse(ENV["LANG"]) + + tag = lc_messages || lang + return nil if tag.nil? + + lc_ctype = Private.parse(ENV["LC_CTYPE"]) + tag.charset = lc_ctype.charset if lc_ctype + + tag end - # Gets the locales from environment variables. (LANGUAGE > LC_ALL > LC_CTYPES > LANG) + # Gets the locales from environment variables. (LANGUAGE > LC_ALL > LC_MESSAGES > LANG) # * Returns: an Array of the locale as Locale::Tag::Posix or nil. def locales locales = ENV["LANGUAGE"] if (locales != nil and locales.size > 0) locs = locales.split(/:/).collect{|v| Locale::Tag::Posix.parse(v)}.compact @@ -59,19 +67,29 @@ return Locale::TagList.new([loc]) end nil end - # Gets the charset from environment variable or return nil. + # Gets the charset from environment variables + # (LC_ALL > LC_CTYPE > LANG) or return nil. # * Returns: the system charset. def charset # :nodoc: - if loc = locale - loc.charset - else - nil + [ENV["LC_ALL"], ENV["LC_CTYPE"], ENV["LANG"]].each do |env| + tag = Private.parse(env) + next if tag.nil? + return tag.charset end + nil end - + + module Private + module_function + def parse(env_value) + return nil if env_value.nil? + return nil if env_value.empty? + Locale::Tag::Posix.parse(env_value) + end + end end MODULES[:env] = Env end end