Advertisement
Guest User

Untitled

a guest
Nov 8th, 2013
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.03 KB | None | 0 0
  1. #!/usr/bin/env python
  2. from __future__ import print_function
  3.  
  4. import collections
  5. import itertools
  6. import io
  7.  
  8. try:
  9.     import cPickle as pickle
  10. except ImportError:
  11.     import pickle
  12.  
  13. import os
  14. import re
  15. import sys
  16.  
  17. TRANSFILE_ORIG = '/usr/share/trans/de-en'
  18. TRANSFILE_PICKLE = 'transfile.pkl'
  19.  
  20. ENCODING = 'utf-8'
  21.  
  22. TranslationEntry = collections.namedtuple(
  23.     'TranslationEntry', 'originals, translations'
  24. )
  25.  
  26. class Translator(object):
  27.     def __init__(self, translations={}, encoding=ENCODING, autosave=True):
  28.         self.encoding = encoding
  29.         self.autosave = autosave
  30.         self.translations = (
  31.             translations if translations else self.load_translations()
  32.         )
  33.  
  34.     def __enter__(self):
  35.         return self
  36.  
  37.     def __exit__(self, *unused):
  38.         if self.autosave:
  39.             self.save_translations()
  40.  
  41.     def translate(self, word):
  42.         return self.translations.get(word.lower())
  43.  
  44.     def load_translations(self, pickle_source=TRANSFILE_PICKLE,
  45.                                 text_source=TRANSFILE_ORIG):
  46.         if os.path.exists(pickle_source):
  47.             with io.open(pickle_source, 'rb') as infile:
  48.                 translations = pickle.load(infile)
  49.         else:
  50.             with io.open(text_source, 'rt', encoding=self.encoding) as infile:
  51.                 print('Parsing translation file...')
  52.                 translations = self.parse_translations(infile)
  53.                 print('...done\n')
  54.         return translations
  55.  
  56.     def save_translations(self, filename=TRANSFILE_PICKLE):
  57.         with io.open(filename, 'wb') as outfile:
  58.             pickle.dump(self.translations, outfile, pickle.HIGHEST_PROTOCOL)
  59.  
  60.     def parse_translations(self, data):
  61.         translations = {}
  62.         for line in data:
  63.             if line.startswith('#'):
  64.                 continue
  65.             cleaned_line = re.sub(r'{.*?}|\[.*?\]', '', line)
  66.             try:
  67.                 entry = self.parse_translation_entry(cleaned_line)
  68.             except ValueError:
  69.                 print(
  70.                     'Unable to parse {!r}'.format(line),
  71.                     file=sys.stderr)
  72.                 continue
  73.             for orig, trans in zip(entry.originals, entry.translations):
  74.                 translations[orig.lower()] = trans
  75.         return translations
  76.  
  77.     def parse_translation_entry(self, entry):
  78.         originals, translations = entry.split('::')
  79.         return TranslationEntry(
  80.             self._get_words(originals), self._get_words(translations)
  81.         )
  82.  
  83.     def _get_words(self, s):
  84.         groups = (group.split('|') for group in s.split(';'))
  85.         words = itertools.chain.from_iterable(groups)
  86.         return [word.strip() for word in words]
  87.  
  88.  
  89. def main():
  90.     if len(sys.argv) != 2:
  91.         print(
  92.             'Usage: {} word-to-translate'.format(sys.argv[0]),
  93.             file=sys.stderr
  94.         )
  95.     else:
  96.         with Translator() as tr:
  97.             translation = tr.translate(sys.argv[1])
  98.             print(translation)
  99.  
  100.  
  101. if __name__ == '__main__':
  102.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement