コード例 #1
0
ファイル: translation.py プロジェクト: sinnwerkstatt/lokp
def translation_batch(request):
    """
    Do a batch translation based on csv-like file in the following format:
    {translation} {delimiter} {value} [{delimiter} {helptext_original} {delimiter} {helptext_translation}]
    """

    def _translate_keyvalue(original, translation, TableItem, isKey,
        locale, helptext_translation):
        """
        Helper function to insert or update a single translation for a key or a
        value
        """

        # Query the database to find english entry of key or value
        if isKey:
            english_query = Session.query(TableItem).\
                filter(TableItem.key == original).\
                filter(TableItem.fk_language == 1)
        else:
            english_query = Session.query(TableItem).\
                filter(TableItem.value == original).\
                filter(TableItem.fk_language == 1)
        eng = english_query.all()

        if eng is None or len(eng) == 0:
            return {'success': False, 'msg': 'No english value found for "%s", translation "%s" not inserted.' % (original, translation)}

        for e in eng:
            # Check if translation already exists for value
            if isKey:
                originalEntry = e.original
                translation_query = Session.query(TableItem).\
                    filter(TableItem.original == originalEntry).\
                    filter(TableItem.language == locale)
            else:
                originalEntry = e
                translation_query = Session.query(TableItem).\
                    filter(TableItem.original == originalEntry).\
                    filter(TableItem.language == locale)
            translation_entry = translation_query.first()

            if translation_entry is None:
                # No translation found, insert a new translation
                if isKey:
                    new_translation = TableItem(translation, e.type)
                else:
                    new_translation = TableItem(translation)
                new_translation.language = locale
                new_translation.original = originalEntry
                if helptext_translation != '':
                    new_translation.helptext = helptext_translation
                Session.add(new_translation)
            else:
                # There is already a translation, update it
                if isKey:
                    translation_entry.key = translation
                else:
                    translation_entry.value = translation
                if helptext_translation != '':
                    translation_entry.helptext = helptext_translation

        return {'success': True, 'msg': 'Translation "%s" inserted for value "%s".' % (translation, original)}

    def _translate_category(original, translation, TableItem, locale):
        """
        Helper function to insert or update a single translation for a category.
        """

        # Query the database to find the english entry of the category
        english_query = Session.query(TableItem).\
            filter(TableItem.name == original).\
            filter(TableItem.fk_language == 1)
        eng = english_query.all()

        if len(eng) == 0:
            return {
                'success': False,
                'msg': 'No english value found for "%s", translation "%s" not inserted.' % (original, translation)
            }

        for e in eng:
            # Check if translation already exists
            translation_query = Session.query(TableItem).\
                filter(TableItem.original == e).\
                filter(TableItem.language == locale)
            translation_entry = translation_query.first()

            if translation_entry is None:
                # Insert a new translation
                new_translation = TableItem(translation)
                new_translation.language = locale
                new_translation.original = e
                Session.add(new_translation)
            else:
                # Update an existing translation
                translation_entry.name = translation

        return {
            'success': True,
            'msg': 'Translation "%s" inserted for value "%s".' % (translation, original)
        }

    ret = {'success': False}

    filename = request.params.get('filename', None)
    delimiter = request.params.get('delimiter', None)
    locale = request.params.get('locale', None)

    if filename is None or delimiter is None or locale is None:
        ret['msg'] = 'Not all needed values provided.'
        return ret

    if len(delimiter) != 1:
        ret['msg'] = 'Delimiter must be a 1-character string'
        return ret

    item_type = request.params.get('item_type', None)
    if item_type == 'A_Value':
        TableItem = A_Value
        translationType = 'value'
    elif item_type == 'A_Key':
        TableItem = A_Key
        translationType = 'key'
    elif item_type == 'SH_Value':
        TableItem = SH_Value
        translationType = 'value'
    elif item_type == 'SH_Key':
        TableItem = SH_Key
        translationType = 'key'
    elif item_type == 'Category':
        TableItem = Category
        translationType = 'category'
    else:
        ret['msg'] = 'Database item not found.'
        return ret

    if locale == 'en':
        ret['msg'] = 'The language "English" cannot be selected!'
        return ret

    language = Session.query(Language).\
        filter(Language.locale == locale).\
        first()

    try:
        stream = open("%s/%s" % (translation_directory_path(), filename), 'rb')
    except IOError:
        ret['msg'] = 'File (%s) not found' % filename
        return ret

    errorCount = 0
    insertCount = 0
    msgStack = []

    csvReader = csv.reader(stream, delimiter=str(delimiter))
    for row in csvReader:
        # Skip the first item
        if csvReader.line_num > 1:
            try:
                if row[0] != '' and row[1] != '':
                    if translationType in ['key', 'value']:
                        # Key or value
                        helptext_translation = ''
                        if len(row) >= 4:
                            helptext_translation = row[3]
                        inserted = _translate_keyvalue(row[0], row[1], TableItem,
                            translationType == 'key', language, helptext_translation)
                    else:
                        # Category
                        inserted = _translate_category(row[0], row[1], TableItem,
                            language)
                else:
                    inserted = None
            except:
                ret['msg'] = 'Wrong delimiter or wrong value type?'
                return ret
            if inserted is not None:
                msgStack.append(inserted)
                if inserted['success'] is True:
                    insertCount += 1
                elif inserted['success'] is None:
                    pass
                else:
                    errorCount += 1

    if errorCount == 0:
        ret['success'] = True

    ret['insertCount'] = insertCount
    ret['errorCount'] = errorCount
    ret['messages'] = msgStack

    return ret
コード例 #2
0
ファイル: translation.py プロジェクト: sinnwerkstatt/lokp
def translation_files(request):
    """
    List all the batch translation files available in the directory
    """

    ret = {'success': False}

    files = []

    # Empty file to allow deselecting a file
    files.append({
        'description': '',
        'delimiter': '',
        'item': '',
        'success': True,
        'filename': '-',
        'language': ''
    })

    dirList = os.listdir(translation_directory_path())
    for filename in dirList:
        try:
            stream = open("%s/%s" % (translation_directory_path(), filename), 'rb')
        except IOError:
            ret['msg'] = 'Unable to open file %s' % filename
            return ret

        csvReader = csv.reader(stream, delimiter=";")

        line = None

        try:
            line = csvReader.next()
        except StopIteration:
            # This happens if file is empty
            pass

        if line is None:
            item = {
                'description': 'Empty file',
                'success': False,
                'filename': filename + ' (seems to be empty)'
            }

        elif len(line) > 3:
            item = {
                'description': line[0],
                'delimiter': line[1],
                'item': line[2],
                'success': True,
                'filename': filename,
                'language': line[3]
            }
        else:
            item = {
                'description': 'Unable to parse file information.',
                'success': False,
                'filename': filename
            }
        files.append(item)

    ret['success'] = True
    ret['files'] = files

    return ret