# # This module provides an interface for localization. # module Archetype::SassExtensions::Locale # # get the current locale specified in config or test a list of locales against the current locale # # *Parameters*: # - $locales {List} the list of locales to test # *Returns*: # - {String|Boolean} the current locale or whether or not the current locale is in the test set # def locale(locales = nil) locale = get_locale(locale) # if the locales are nil, just return the current locale return identifier(locale) if locales.nil? locales = locales.to_a.collect{|i| i.to_s} # normalize the pieces of the locale locale = normalize_locale(locale) # for each item, look it up in the alias list locales.each do |key| if a = locale_aliases[key] locales.delete(key) locales.concat(a) end end return Sass::Script::Bool.new( locales.include?(locale) || locales.include?("#{locale[:language]}_#{locale[:territory]}") || locales.include?(locale[:language] + '_') || locales.include?('_' + locale[:territory]) ) end alias_method :lang, :locale # # returns the locale language code # # *Parameters*: # - $locale {String} the locale to examine # *Returns*: # - {String|Null} the language code within the locale string # def locale_language(locale = nil) return get_locale_piece(locale, :language) end # # returns the locale territory code # # *Parameters*: # - $locale {String} the locale to examine # *Returns*: # - {String|Null} the territory code within the locale string # def locale_territory(locale = nil) return get_locale_piece(locale, :territory) end alias_method :locale_country, :locale_territory # # returns the locale modifier # # *Parameters*: # - $locale {String} the locale to examine # *Returns*: # - {String|Null} the modifier code within the locale string # def locale_modifier(locale = nil) return get_locale_piece(locale, :modifier) end # # temporarily switch the interface locale # # *Parameters*: # - $code {String} the locale code to switch to # *Returns*: # - {String} the previously set locale code # def switch_locale(locale) previous = identifier(get_locale()) environment.global_env.set_var('CONFIG_LOCALE', locale) return previous end private # pieces of the locale code # (1) language # (2) territory # (3) encoding (not currently used) # (4) modifier (e.g. @Cyrillic) LOCALE_PATTERN = /\"?([a-z]{2})?[-_]?([a-z]{2})?(\.[^@]*)?(?:\@([^\"]+))?\"?/i # # normalizes the locale string into an object # # *Parameters*: # - locale {String} the locale to normalize # *Returns*: # - {Hash} the normalized locale object # def normalize_locale(locale = nil) match = get_locale(locale).match(LOCALE_PATTERN) || [] return { :language => match[1].nil? ? nil : match[1].downcase, :territory => match[2].nil? ? nil : match[2].upcase, :encoding => match[3], :modifier => match[4] } end # # get the locale from the given input # if nil, will use either the current global locale in $CONFIG_LOCALE or the locale set on the compiler # # *Parameters*: # - locale {Sass::String} the locale to use # *Returns*: # - {String} the locale string # def get_locale(locale = nil) return (locale || environment.var('CONFIG_LOCALE') || Compass.configuration.locale || 'en_US').to_s end # # returns a normalized piece of the locale # # *Parameters*: # - locale {String} the locale to examine # - piece {Symbol} the piece of the locale to extract # *Returns*: # - {Sass::String} a string of the locale piece requested # def get_locale_piece(locale = nil, piece = :language) piece = normalize_locale(locale)[piece] if piece.nil? return null else return identifier(piece) end end # # provides an alias mapping for locale names # # *Returns*: # - {Hash} a hash of aliases # def locale_aliases @locale_aliases ||= { 'CJK' => ['ja_JP', 'ko_KR', 'zh_TW', 'zh_CN'] }.merge(Compass.configuration.locale_aliases || {}) end end