Export Translation manager to readable and editable file

Hey,

Is there a way to easily export the Translation manager and edit those files so i can send them to a translator that does not have experience in XML or so?

I already tried Excel but i cant even import the xml.

Are there some people that had the same issues, that have a tool they could recommend or something.

The issue already was there in 2016 regarding:

I hope there are better solutions available 8 years later?

Thanks in advance!

-Thijs

As mentioned at the bottom of that thread, translation export/import in "properties" format will be a pretty much human readable format like:

someKey=someValue
someOtherKey=someOtherValue

For all your defined translation terms, one file per supported locale.
Is there something this format doesn't offer you that you're looking for?

Optimally a CSV export/import would be pretty useful i think.

I build it myself with scripts and that works great.

Its essentially so i can send just one file to a translation bureau and they can easily add all the languages i need in excel or other format where they have experience in.

What's the format of that CSV?
Something like:

locale, term, translation
"en-US", "abc", "abc_translation"

I'm hoping to add a translation bundle import/export tool that works with Ignition's somewhat odd format to Kindling, the semi-official GUI tool I created to work with Ignition files.

It would also be good to add first-party support to Ignition, obviously; the entire translation management system needs some attention. It's on our list to get to, but hasn't risen to the top of the pile yet.

2 Likes

Nice to hear you are looking into the translation manager!

an example of the CSV:

Key,es,zh,en,nl
Menu Item 2,Elemento de Menú 2,菜单项 二,Menu Item 2,Menu Item 2
Dutch,Holandés,荷兰语,Dutch,Nederlands

So if i want to add another language i just put the language code after the last in the header and then adjust it, but that works easily in Excel for example.

My script to export CSV:

def runAction(self, event):
    import csv
    from com.inductiveautomation.ignition.gateway import IgnitionGateway

    # Get the localization manager
    localization_manager = IgnitionGateway.get().getLocalizationManager()

    # Load the full translation package
    translation_package = localization_manager.loadFullPackage()

    # Get all translation keys
    keys = translation_package.getAvailableKeys()

    # Collect all available languages
    all_languages = set()
    for key in keys:
        translations = translation_package.getTranslationsFor(key)
        all_languages.update(translations.keys())

    # Define the CSV file path
    csv_file_path = "filepath"

    # Write to CSV
    with open(csv_file_path, mode='w') as file:
        writer = csv.writer(file, lineterminator='\n')
        # Create header row
        header = ["Key"] + list(all_languages)
        writer.writerow(header)

        # Write translation rows
        for key in keys:
            translations = translation_package.getTranslationsFor(key)
            row = [key] + [translations.get(lang, '') for lang in all_languages]
            writer.writerow(row)

    print("Export successful!")

And import back to the translationmanager:

    import system.util
    import io

    # Define the CSV file path
    csv_file_path = "filepath"

    # Read from CSV and update translations
    with io.open(csv_file_path, mode='r', encoding='utf-8-sig') as file:
        # Read all lines
        lines = file.readlines()

    # Split the lines into headers and rows
    headers = lines[0].strip().split(',')
    system.perspective.print("CSV Headers: " + str(headers))

    if 'Key' not in headers:
        system.perspective.print("Error: 'Key' column not found in CSV file.")
        return

    languages = headers[1:]  # Get languages from the header row
    system.perspective.print("Languages found: " + str(languages))

    for line in lines[1:]:
        try:
            row = line.strip().split(',')
            key = row[headers.index('Key')]
            translations = {lang: row[headers.index(lang)] for lang in languages if row[headers.index(lang)]}
            for lang, translation in translations.items():
                try:
                    system.util.modifyTranslation(key, translation, lang)
                except Exception as e:
                    system.perspective.print("Error adding translation for {key} in {lang}: {e}")
        except Exception as e:
            system.perspective.print("Error processing row: {e}")

    system.perspective.print("Import successful!")

*I am not an expert in Ignition, but this works as expected

1 Like