transliterate
transliterate(string, replacement = "?", locale: nil)
public
Replaces non-ASCII characters with an ASCII approximation, or if none exists, a replacement character which defaults to “?”.
transliterate('Ãrøskøbing') # => "AEroskobing"
Default approximations are provided for Western/Latin characters, e.g, “ø”, “ñ”, “é”, “Ô, etc.
This method is I18n aware, so you can set up custom approximations for a locale. This can be useful, for example, to transliterate German’s “ü” and “ö” to “ue” and “oe”, or to add support for transliterating Russian to ASCII.
In order to make your custom transliterations available, you must set them as the i18n.transliterate.rule i18n key:
# Store the transliterations in locales/de.yml i18n: transliterate: rule: ü: "ue" ö: "oe" # Or set them using Ruby I18n.backend.store_translations(:de, i18n: { transliterate: { rule: { 'ü' => 'ue', 'ö' => 'oe' } } })
The value for i18n.transliterate.rule can be a simple Hash that maps characters to ASCII approximations as shown above, or, for more complex requirements, a Proc:
I18n.backend.store_translations(:de, i18n: { transliterate: { rule: ->(string) { MyTransliterator.transliterate(string) } } })
Now you can have different transliterations for each locale:
transliterate('Jürgen', locale: :en) # => "Jurgen" transliterate('Jürgen', locale: :de) # => "Juergen"
Transliteration is restricted to UTF-8, US-ASCII, and GB18030 strings. Other encodings will raise an ArgumentError.