#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2013, Marten de Vries
#
# This file is part of OpenTeacher.
#
# OpenTeacher 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, either version 3 of the License, or
# (at your option) any later version.
#
# OpenTeacher 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenTeacher. If not, see <http://www.gnu.org/licenses/>.
import os
import collections
class LazyDict(collections.Mapping):
def __init__(self, iterable, *args, **kwargs):
super().__init__(*args, **kwargs)
self._iterable = iterable
self._actualDict = None
@property
def _dict(self):
if not self._actualDict:
self._actualDict = dict(self._iterable)
return self._actualDict
def __iter__(self):
return iter(self._dict)
def __len__(self):
return len(self._dict)
def __getitem__(self, key):
return self._dict[key]
def __repr__(self):
return "<%s %s>" % (self.__class__.__name__, repr(self._dict))
class TranslationIndexBuilderModule:
def __init__(self, moduleManager, *args, **kwargs):
super().__init__(*args, **kwargs)
self._mm = moduleManager
self.type = "translationIndexBuilder"
def enable(self):
global polib
try:
import polib
except ImportError:
pass
self.active = True
def _translationsIn(self, poPath):
po = polib.pofile(poPath)
for entry in po.translated_entries():
yield entry.msgid, entry.msgstr
def _translationIndex(self, path):
for poFile in os.listdir(path):
if not poFile.endswith(".po"):
continue
poPath = os.path.join(path, poFile)
langCode = poFile[:-len(".po")]
translations = dict(self._translationsIn(poPath))
yield langCode, translations
def buildTranslationIndex(self, path):
"""Builds an overview of all translations that are in the .po
files in ``path``. This overview is a dict with as key the
language code (e.g. pt_BR), and as value a dict that maps
English translations to their localized equivalents.
"""
#reading & parsing all .po files is relatively heavy (and
#necessary only for dev tools), so building the index is delayed
#until it's actually accessed.
return LazyDict(self._translationIndex(path))
def disable(self):
self.active = False
def init(moduleManager):
return TranslationIndexBuilderModule(moduleManager)