2ce2cc827402c05a8ee708f5711006232b88dc86
[packages/precise/mcollective.git] / lib / mcollective / vendor / i18n / lib / i18n / backend / transliterator.rb
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