3 commits - pykolab/translit.py pykolab/utils.py tests/unit

Jeroen van Meeuwen vanmeeuwen at kolabsys.com
Fri Feb 8 17:18:05 CET 2013


 pykolab/translit.py                  |  107 +++++++++++++++++++++++++++++++++++
 pykolab/utils.py                     |   10 ++-
 tests/unit/test-010-transliterate.py |   39 ++++++++++++
 3 files changed, 155 insertions(+), 1 deletion(-)

New commits:
commit 8565c4c13d454819550744672e566bac6714f6c3
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Fri Feb 8 16:17:36 2013 +0000

    Add tests for transliteration of ru_RU using the new transliterate() function fallback for utils.translate()

diff --git a/tests/unit/test-010-transliterate.py b/tests/unit/test-010-transliterate.py
index 7f70700..3c98a1a 100644
--- a/tests/unit/test-010-transliterate.py
+++ b/tests/unit/test-010-transliterate.py
@@ -59,6 +59,45 @@ class TestTransliteration(unittest.TestCase):
         self.assertEqual('Alvaro', utils.translate(givenname, preferredlanguage))
         self.assertEqual('Fuentes', utils.translate(surname, preferredlanguage))
 
+    def test_005_raw_ru_RU(self):
+        from pykolab import utils
+        givenname = r'Николай'
+        surname = r'Римский-Корсаков'
+
+        preferredlanguage = 'ru_RU'
+
+        self.assertEqual('Nikolaj', utils.translate(givenname, preferredlanguage))
+        self.assertEqual('Rimskij-Korsakov', utils.translate(surname, preferredlanguage))
+
+    def test_006_unicode_ru_RU(self):
+        from pykolab import utils
+        givenname = u'Николай'
+        surname = u'Римский-Корсаков'
+
+        preferredlanguage = 'ru_RU'
+
+        self.assertEqual('Nikolaj', utils.translate(givenname, preferredlanguage))
+        self.assertEqual('Rimskij-Korsakov', utils.translate(surname, preferredlanguage))
+
+    def test_007_raw_ru_RU(self):
+        from pykolab import utils
+        givenname = r'Юлия'
+        surname = r'Ёлкина'
+
+        preferredlanguage = 'ru_RU'
+
+        self.assertEqual('Yuliya', utils.translate(givenname, preferredlanguage))
+        self.assertEqual('Yolkina', utils.translate(surname, preferredlanguage))
+
+    def test_008_unicode_ru_RU(self):
+        from pykolab import utils
+        givenname = u'Юлия'
+        surname = u'Ёлкина'
+
+        preferredlanguage = 'ru_RU'
+
+        self.assertEqual('Yuliya', utils.translate(givenname, preferredlanguage))
+        self.assertEqual('Yolkina', utils.translate(surname, preferredlanguage))
 
 if __name__ == '__main__':
     unittest.main()


commit 6c82952f1f737e619d7ef95c0308a83336fa1ce1
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Fri Feb 8 16:16:56 2013 +0000

    Attempt to use iconv, but if it fails, fall back to using our own translit function (#1536)

diff --git a/pykolab/utils.py b/pykolab/utils.py
index 7f56c29..c10bbb2 100644
--- a/pykolab/utils.py
+++ b/pykolab/utils.py
@@ -415,10 +415,18 @@ def translate(mystring, locale_name='en_US'):
     log.debug(_("Executing '%s | %s'") % (r"%s" % (mystring), ' '.join(command)), level=8)
     process = subprocess.Popen(command, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, env={'LANG': locale.normalize(locale_name)})
 
-    print >> process.stdin, r"%s" % mystring
+    try:
+        print >> process.stdin, r"%s" % mystring
+    except UnicodeEncodeError, errmsg:
+        pass
 
     result = process.communicate()[0].strip()
 
+    if '?' in result or (result == '' and not mystring == ''):
+        log.warning(_("Could not translate %s using locale %s") % (mystring, locale_name))
+        from pykolab import translit
+        result = translit.transliterate(mystring, locale_name)
+
     return result
 
 def true_or_false(val):


commit 45078a3b0d84429ccaf8dc6ff5ae7a5eb6751078
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Fri Feb 8 16:16:23 2013 +0000

    Provide an initial locale -> translit lookup table set and a function to call

diff --git a/pykolab/translit.py b/pykolab/translit.py
new file mode 100644
index 0000000..ac4d2d7
--- /dev/null
+++ b/pykolab/translit.py
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+# Copyright 2010-2012 Kolab Systems AG (http://www.kolabsys.com)
+#
+# Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen a kolabsys.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 3 or, at your option, any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Library General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+
+locale_translit_map = {
+        'ru_RU': 'cyrillic'
+    }
+
+translit_map = {
+        'cyrillic': {
+                u'А': 'A',
+                u'а': 'a',
+                u'Б': 'B',
+                u'б': 'b',
+                u'Ð’': 'V',
+                u'в': 'v',
+                u'Г': 'G',
+                u'г': 'g',
+                u'Д': 'D',
+                u'д': 'd',
+                u'Е': 'E',
+                u'е': 'e',
+                u'Ё': 'Yo',
+                u'Ñ‘': 'e',
+                u'Ж': 'Zh',
+                u'ж': 'zh',
+                u'З': 'Z',
+                u'з': 'z',
+                u'И': 'I',
+                u'и': 'i',
+                u'Й': 'J',
+                u'й': 'j',
+                u'К': 'K',
+                u'к': 'k',
+                u'Л': 'L',
+                u'л': 'l',
+                u'М': 'M',
+                u'м': 'm',
+                u'Н': 'N',
+                u'н': 'n',
+                u'О': 'O',
+                u'о': 'o',
+                u'П': 'P',
+                u'п': 'p',
+                u'Р': 'R',
+                u'Ñ€': 'r',
+                u'С': 'S',
+                u'с': 's',
+                u'Т': 'T',
+                u'Ñ‚': 't',
+                u'У': 'U',
+                u'у': 'u',
+                u'Ф': 'F',
+                u'Ñ„': 'f',
+                u'Ð¥': 'Kh',
+                u'Ñ…': 'kh',
+                u'Ц': 'Tc',
+                u'ц': 'tc',
+                u'Ч': 'Ch',
+                u'ч': 'ch',
+                u'Ш': 'Sh',
+                u'ш': 'sh',
+                u'Щ': 'Shch',
+                u'щ': 'shch',
+                u'Ъ': '',
+                u'ÑŠ': '',
+                u'Ы': 'Y',
+                u'Ñ‹': 'y',
+                u'Ь': '',
+                u'ь': '',
+                u'Э': 'E',
+                u'э': 'e',
+                u'Ю': 'Yu',
+                u'ÑŽ': 'yu',
+                u'Я': 'Ya',
+                u'я': 'ya',
+            }
+    }
+
+def transliterate(_input, lang, _output_expected=None):
+    _translit_name = locale_translit_map[lang]
+
+    _output = ''
+
+    for char in _input:
+        if translit_map[_translit_name].has_key(char):
+            _output += translit_map[_translit_name][char]
+        else:
+            _output += char
+
+    return _output
+





More information about the commits mailing list