File: active_support/vendor/i18n-0.4.1/i18n/backend/transliterator.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: I18n#2
  module: Backend#3
  module: Transliterator#4
has properties
constant: DEFAULT_REPLACEMENT_CHAR #5
method: transliterate / 3 #9
module method: get / 1 #17
  class: ProcTransliterator#28
inherits from
  Object ( Builtin-Module )
has properties
method: initialize / 1 #29
method: transliterate / 2 #33
  class: HashTransliterator#40
inherits from
  Object ( Builtin-Module )
has properties
constant: DEFAULT_APPROXIMATIONS #41
method: initialize / 1 #72
method: transliterate / 2 #78
method: approximations #86
method: add / 1 #91

Code

   1  # encoding: utf-8
   2  module I18n
   3    module Backend
   4      module Transliterator
   5        DEFAULT_REPLACEMENT_CHAR = "?"
   6 
   7        # Given a locale and a UTF-8 string, return the locale's ASCII
   8        # approximation for the string.
   9        def transliterate(locale, string, replacement = nil)
  10          @transliterators ||= {}
  11          @transliterators[locale] ||= Transliterator.get I18n.t(:'i18n.transliterate.rule',
  12            :locale => locale, :resolve => false, :default => {})
  13          @transliterators[locale].transliterate(string, replacement)
  14        end
  15 
  16        # Get a transliterator instance.
  17        def self.get(rule = nil)
  18          if !rule || rule.kind_of?(Hash)
  19            HashTransliterator.new(rule)
  20          elsif rule.kind_of? Proc
  21            ProcTransliterator.new(rule)
  22          else
  23            raise I18n::ArgumentError, "Transliteration rule must be a proc or a hash."
  24          end
  25        end
  26 
  27        # A transliterator which accepts a Proc as its transliteration rule.
  28        class ProcTransliterator
  29          def initialize(rule)
  30            @rule = rule
  31          end
  32 
  33          def transliterate(string, replacement = nil)
  34            @rule.call(string)
  35          end
  36        end
  37 
  38        # A transliterator which accepts a Hash of characters as its translation
  39        # rule.
  40        class HashTransliterator
  41          DEFAULT_APPROXIMATIONS = {
  42            "À"=>"A", "Á"=>"A", "Â"=>"A", "Ã"=>"A", "Ä"=>"A", "Å"=>"A", "Æ"=>"AE",
  43            "Ç"=>"C", "È"=>"E", "É"=>"E", "Ê"=>"E", "Ë"=>"E", "Ì"=>"I", "Í"=>"I",
  44            "Î"=>"I", "Ï"=>"I", "Ð"=>"D", "Ñ"=>"N", "Ò"=>"O", "Ó"=>"O", "Ô"=>"O",
  45            "Õ"=>"O", "Ö"=>"O", "×"=>"x", "Ø"=>"O", "Ù"=>"U", "Ú"=>"U", "Û"=>"U",
  46            "Ü"=>"U", "Ý"=>"Y", "Þ"=>"Th", "ß"=>"ss", "à"=>"a", "á"=>"a", "â"=>"a",
  47            "ã"=>"a", "ä"=>"a", "å"=>"a", "æ"=>"ae", "ç"=>"c", "è"=>"e", "é"=>"e",
  48            "ê"=>"e", "ë"=>"e", "ì"=>"i", "í"=>"i", "î"=>"i", "ï"=>"i", "ð"=>"d",
  49            "ñ"=>"n", "ò"=>"o", "ó"=>"o", "ô"=>"o", "õ"=>"o", "ö"=>"o", "ø"=>"o",
  50            "ù"=>"u", "ú"=>"u", "û"=>"u", "ü"=>"u", "ý"=>"y", "þ"=>"th", "ÿ"=>"y",
  51            "Ā"=>"A", "ā"=>"a", "Ă"=>"A", "ă"=>"a", "Ą"=>"A", "ą"=>"a", "Ć"=>"C",
  52            "ć"=>"c", "Ĉ"=>"C", "ĉ"=>"c", "Ċ"=>"C", "ċ"=>"c", "Č"=>"C", "č"=>"c",
  53            "Ď"=>"D", "ď"=>"d", "Đ"=>"D", "đ"=>"d", "Ē"=>"E", "ē"=>"e", "Ĕ"=>"E",
  54            "ĕ"=>"e", "Ė"=>"E", "ė"=>"e", "Ę"=>"E", "ę"=>"e", "Ě"=>"E", "ě"=>"e",
  55            "Ĝ"=>"G", "ĝ"=>"g", "Ğ"=>"G", "ğ"=>"g", "Ġ"=>"G", "ġ"=>"g", "Ģ"=>"G",
  56            "ģ"=>"g", "Ĥ"=>"H", "ĥ"=>"h", "Ħ"=>"H", "ħ"=>"h", "Ĩ"=>"I", "ĩ"=>"i",
  57            "Ī"=>"I", "ī"=>"i", "Ĭ"=>"I", "ĭ"=>"i", "Į"=>"I", "į"=>"i", "İ"=>"I",
  58            "ı"=>"i", "IJ"=>"IJ", "ij"=>"ij", "Ĵ"=>"J", "ĵ"=>"j", "Ķ"=>"K", "ķ"=>"k",
  59            "ĸ"=>"k", "Ĺ"=>"L", "ĺ"=>"l", "Ļ"=>"L", "ļ"=>"l", "Ľ"=>"L", "ľ"=>"l",
  60            "Ŀ"=>"L", "ŀ"=>"l", "Ł"=>"L", "ł"=>"l", "Ń"=>"N", "ń"=>"n", "Ņ"=>"N",
  61            "ņ"=>"n", "Ň"=>"N", "ň"=>"n", "ʼn"=>"'n", "Ŋ"=>"NG", "ŋ"=>"ng",
  62            "Ō"=>"O", "ō"=>"o", "Ŏ"=>"O", "ŏ"=>"o", "Ő"=>"O", "ő"=>"o", "Œ"=>"OE",
  63            "œ"=>"oe", "Ŕ"=>"R", "ŕ"=>"r", "Ŗ"=>"R", "ŗ"=>"r", "Ř"=>"R", "ř"=>"r",
  64            "Ś"=>"S", "ś"=>"s", "Ŝ"=>"S", "ŝ"=>"s", "Ş"=>"S", "ş"=>"s", "Š"=>"S",
  65            "š"=>"s", "Ţ"=>"T", "ţ"=>"t", "Ť"=>"T", "ť"=>"t", "Ŧ"=>"T", "ŧ"=>"t",
  66            "Ũ"=>"U", "ũ"=>"u", "Ū"=>"U", "ū"=>"u", "Ŭ"=>"U", "ŭ"=>"u", "Ů"=>"U",
  67            "ů"=>"u", "Ű"=>"U", "ű"=>"u", "Ų"=>"U", "ų"=>"u", "Ŵ"=>"W", "ŵ"=>"w",
  68            "Ŷ"=>"Y", "ŷ"=>"y", "Ÿ"=>"Y", "Ź"=>"Z", "ź"=>"z", "Ż"=>"Z", "ż"=>"z",
  69            "Ž"=>"Z", "ž"=>"z"
  70          }
  71 
  72          def initialize(rule = nil)
  73            @rule = rule
  74            add DEFAULT_APPROXIMATIONS
  75            add rule if rule
  76          end
  77 
  78          def transliterate(string, replacement = nil)
  79            string.gsub(/[^\x00-\x7f]/u) do |char|
  80              approximations[char] || replacement || DEFAULT_REPLACEMENT_CHAR
  81            end
  82          end
  83 
  84          private
  85 
  86            def approximations
  87              @approximations ||= {}
  88            end
  89 
  90            # Add transliteration rules to the approximations hash.
  91            def add(hash)
  92              hash.keys.each {|key| hash[key.to_s] = hash.delete(key).to_s}
  93              approximations.merge! hash
  94            end
  95        end
  96      end
  97    end
  98  end