Semi-automated Text Translator for Websites and Apps

Overview

attranslate - Semi-automated Text Translator for Websites and Apps

macOS/Ubuntu/Windows: Actions Status

attranslate is a semi-automated tool for "synchronizing" translation-files. attranslate is optimized for fast and smooth rollouts in hectic project environments, even if you already have many translations. Optionally, attranslate works with automated translation-services. For example, let's say that a translation-service achieves 80% correct translations. Thanks to attranslate, a quick fix of the remaining 20% may be faster than doing everything by hand. Other than that, attranslate supports purely manual translations and even file-format-conversions without changing the language.

Why attranslate?

In contrast to paid services, a single developer can integrate attranslate in a matter of minutes. In contrast to many other tools, attranslate can operate on the very same translations-files that you are already using. This is possible because attranslate operates on your file in a surgical way, with as little changes as possible. See tools comparison for an overview about translation-tools.

Features

Cross-platform Support

attranslate is designed to translate any website or app with any toolchain. attranslate works for i18n/JavaScript-frameworks/Android/iOS/Flutter/Ruby/Jekyll/Symfony/Django/WordPress and many other platforms. To make this possible, attranslate supports the following file formats:

  • Flat or nested JSON
  • Flat or nested YAML
  • PO/POT-files
  • Android-XML or any other XMLs with text-contents
  • iOS-Strings
  • Flutter-ARB
  • CSV (e.g. for Google Docs or Microsoft Excel)

Preserve Manual Translations

attranslate recognizes that automated translations are not perfect. Therefore, whenever you are unhappy with the produced results, attranslate allows you to simply overwrite texts in your target-files. attranslate will never ever overwrite a manual correction in subsequent runs.

Optionally Overwrite Outdated Translations

attranslate is capable of detecting outdated translations. Normally, overwriting outdated translations helps to ensure the freshness of translations. However, in hectic project environments, it might be easier to leave outdated translations as-is. Therefore, attranslate leaves outdated translations as-is unless you explicitly configure it to overwrite them.

Available Services

attranslate supports the following translation-services:

  • manual: Translate texts manually by entering them into attranslate.
  • Google Cloud Translate
  • Azure Translator
  • sync-without-translate: Does not change the language. This can be useful for converting between file formats, or for maintaining region-specific differences.

High Performance

If some texts have already been translated, then attranslate won't translate them again. This does not only speedup your workflow, but also saves cost for paid translation-services.

Detect Common Mistakes

Although (some) humans have excellent translation-skills, humans are notoriously bad at detecting "trivial" mistakes like outdated, missing, stale or duplicate translations. In contrast, attranslate detects such "trivial" mistakes with 100% reliability.

Usage Examples

Translating a single file is as simple as the following line:

attranslate --srcFile=json-simple/en.json --srcLng=en --srcFormat=nested-json --targetFile=json-simple/de.json --targetLng=de --targetFormat=nested-json --service=manual

If you have multiple target-languages, then you will need multiple calls to attranslate. You can write something like the following script to avoid unnecessary duplication:

# This example translates an english JSON-file into spanish, chinese and german. It uses Google Cloud Translate.
BASE_DIR="json-advanced"
SERVICE_ACCOUNT_KEY="gcloud/gcloud_service_account.json"
COMMON_ARGS=( "--srcLng=en" "--srcFormat=nested-json" "--targetFormat=nested-json" "--service=google-translate" "--serviceConfig=$SERVICE_ACCOUNT_KEY" "--cacheDir=$BASE_DIR" "--matcher=i18next" )

# install attranslate if it is not installed yet
attranslate --version || npm install --global attranslate

attranslate --srcFile=$BASE_DIR/en/fruits.json --targetFile=$BASE_DIR/es/fruits.json --targetLng=es "${COMMON_ARGS[@]}"
attranslate --srcFile=$BASE_DIR/en/fruits.json --targetFile=$BASE_DIR/zh/fruits.json --targetLng=zh "${COMMON_ARGS[@]}"
attranslate --srcFile=$BASE_DIR/en/fruits.json --targetFile=$BASE_DIR/de/fruits.json --targetLng=de "${COMMON_ARGS[@]}"

Similarly, you can use attranslate to convert between file-formats. See sample scripts for more examples.

Usage Options

Run attranslate --help to see a list of available options:

Usage: attranslate [options]

Options:
  --srcFile <sourceFile>              The source file to be translated
  --srcLng <sourceLanguage>           A language code for the source language
  --srcFormat <sourceFileFormat>      One of "flat-json", "nested-json",
                                      "yaml", "po", "xml", "ios-strings",
                                      "arb", "csv"
  --targetFile <targetFile>           The target file for the translations
  --targetLng <targetLanguage>        A language code for the target language
  --targetFormat <targetFileFormat>   One of "flat-json", "nested-json",
                                      "yaml", "po", "xml", "ios-strings",
                                      "arb", "csv"
  --service <translationService>      One of "manual",
                                      "sync-without-translate",
                                      "google-translate", "azure"
  --serviceConfig <serviceKey>        supply configuration for a translation
                                      service (either a path to a key-file or
                                      an API-key)
  --cacheDir <cacheDir>               The directory where a translation-cache
                                      is expected to be found (default: ".")
  --matcher <matcher>                 One of "none", "icu", "i18next",
                                      "sprintf" (default: "none")
  --overwriteOutdated <true | false>  If true, overwrite outdated translations
                                      in subsequent runs. Leave this at false
                                      unless you know what you are doing.
                                      (default: "false")
  --keySearch <regExp>                A regular expression to replace
                                      translation-keys (can be used for
                                      file-format conversions) (default: "x")
  --keyReplace <string>               The replacement for occurrences of
                                      keySearch (default: "x")
  -v, --version                       output the version number
  -h, --help                          display help for command

Integration Guide

Firstly, ensure that nodejs is installed on your machine. Once you have nodejs, you can install attranslate via:

npm install --global attranslate

Alternatively, if you are a JavaScript-developer, then you should install attranslate via:

npm install --save-dev attranslate

Next, you should write a project-specific script that invokes attranslate for your specific files. See sample scripts for guidance on how to translate your project-specific files.

Service Configuration

If you use attranslate with an automated translation-service, then you need to configure an API-key. API-keys can be obtained for free, but you might need to register an account. See service config for guidance on how to obtain API-keys for specific services.

Once you have an API-key, pass your API-key to attranslate via the --serviceConfig flag.

Interpolations and Matchers

⚠️ For many projects, attranslate works out of the box without configuring any matchers. Therefore, we recommend skipping this section unless you encounter unexpected problems that are hard to fix manually.

Many websites/apps use interpolations to insert dynamic values into translations. For example, an interpolation like Your name is {{name}} might be replaced with Your name is Felix.

To help with interpolations, attranslate provides so-called matchers. A matcher replaces interpolations with placeholders before they are sent to a translation service. attranslate offers the following matchers for different styles of interpolations:

  • ICU: Matches ICU interpolations like {name}.
  • i18n: Matches i18next interpolations like {{name}}.
  • sprintf: Matches sprintf-style interpolations like %s.
  • None: Doesn't match any interpolations.

You can select a matcher with the --matcher option.

Translation Cache

⚠️ If --overwriteOutdated is set to false, then attranslate does not generate any translation-cache.

The purpose of the translation-cache is to detect outdated translations, such that outdated translations can be overwritten in subsequent runs. The translation-cache consists of attranslate-cache-*-files. It is allowed to delete a translation-cache at any time. However, to make it work smoothly, you should put your attranslate-cache-*-files under version control.

Continuous Integration

To detect common mistakes like missing translations, it is advisable to run attranslate via continuous integration (CI). For example, the command git diff --exit-code can be used to trigger a CI failure whenever a file has been modified by attranslate.

Comments
  • Arrays are converted to objects

    Arrays are converted to objects

    Describe the bug Currently when translating JSON files from source to target, it converts any arrays inside the source JSON files to object representations of such like so from:

    "address": {
        "lines": [
            "Line 1",
            "Line 2",
            "Line 3"
        ]
    },
    

    to

    "address": {
      "lines": {
        "0": "Line 1",
        "1": "Line 2",
        "2": "Line 3"
      }
    },
    

    To Reproduce

    1. Create a new source JSON file containing an array
    2. Convert the JSON file to another language

    Expected behavior The expected behavior would be that the datatype stays the same.

    Files This could be done using any simple JSON file containing the above example content.

    Additional context N/A

    opened by dwknippers 14
  • Azure Info

    Azure Info

    Great project!

    I'm trying to configure attranslate to work with the Azure translator. Unfortunately, I'm not getting very far and I can't find any documentation that explains how to configure it.

    Any pointers / documentation would be appreciated.

    Thanks!

    opened by MuchoDart 14
  • Bump lodash from 4.17.20 to 4.17.21

    Bump lodash from 4.17.20 to 4.17.21

    Bumps lodash from 4.17.20 to 4.17.21.

    Commits
    • f299b52 Bump to v4.17.21
    • c4847eb Improve performance of toNumber, trim and trimEnd on large input strings
    • 3469357 Prevent command injection through _.template's variable option
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the Security Alerts page.
    dependencies 
    opened by dependabot[bot] 4
  • Bump prettier from 2.1.2 to 2.2.1

    Bump prettier from 2.1.2 to 2.2.1

    Bumps prettier from 2.1.2 to 2.2.1.

    Release notes

    Sourced from prettier's releases.

    2.2.1

    🔗 Changelog

    2.2.0

    diff

    🔗 Release Notes

    Changelog

    Sourced from prettier's changelog.

    2.2.1

    diff

    Fix formatting for AssignmentExpression with ClassExpression (#9741 by @sosukesuzuki)

    // Input
    module.exports = class A extends B {
      method() {
        console.log("foo");
      }
    };
    

    // Prettier 2.2.0 module.exports = class A extends ( B ) { method() { console.log("foo"); } };

    // Prettier 2.2.1 module.exports = class A extends B { method() { console.log("foo"); } };

    2.2.0

    diff

    🔗 Release Notes

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 4
  • Preserve XML comments and XML multi-line-breaks

    Preserve XML comments and XML multi-line-breaks

    This does not work with our fork of https://github.com/Leonidas-from-XIV/node-xml2js. It might be doable to add this functionality to the fork. However, perhaps it would be better to migrate to a well-maintained XML-library.

    opened by fkirc 4
  • Bump @types/node from 14.14.0 to 14.14.2

    Bump @types/node from 14.14.0 to 14.14.2

    Bumps @types/node from 14.14.0 to 14.14.2.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 3
  • Bump node-fetch from 2.6.5 to 3.2.3

    Bump node-fetch from 2.6.5 to 3.2.3

    Bumps node-fetch from 2.6.5 to 3.2.3.

    Release notes

    Sourced from node-fetch's releases.

    v3.2.3

    3.2.3 (2022-03-11)

    Bug Fixes

    v3.2.1

    3.2.1 (2022-03-01)

    Bug Fixes

    v3.2.0

    3.2.0 (2022-01-20)

    Features

    • export Blob, File and FormData + utilities (#1463) (81b1378)

    v3.1.1

    Security patch release

    Recommended to upgrade, to not leak sensitive cookie and authentication header information to 3th party host while a redirect occurred

    What's Changed

    New Contributors

    ... (truncated)

    Commits
    Maintainer changes

    This version was pushed to npm by node-fetch-bot, a new releaser for node-fetch since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 2
  • Bump @types/inquirer from 7.3.3 to 8.1.3

    Bump @types/inquirer from 7.3.3 to 8.1.3

    Bumps @types/inquirer from 7.3.3 to 8.1.3.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 2
  • Bump tmpl from 1.0.4 to 1.0.5

    Bump tmpl from 1.0.4 to 1.0.5

    Bumps tmpl from 1.0.4 to 1.0.5.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the Security Alerts page.
    dependencies 
    opened by dependabot[bot] 2
  • Bump @types/jest from 26.0.15 to 27.0.2

    Bump @types/jest from 26.0.15 to 27.0.2

    Bumps @types/jest from 26.0.15 to 27.0.2.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 2
  • Bump @types/node-fetch from 2.5.7 to 3.0.3

    Bump @types/node-fetch from 2.5.7 to 3.0.3

    Bumps @types/node-fetch from 2.5.7 to 3.0.3.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 2
  • Error: 8 RESOURCE_EXHAUSTED: Quota Error: RESOURCE_EXHAUSTED

    Error: 8 RESOURCE_EXHAUSTED: Quota Error: RESOURCE_EXHAUSTED

    I tried to translate content of XML file and ended with this error:

    "8 RESOURCE_EXHAUSTED: Quota Error: RESOURCE_EXHAUSTED Quota exceeded for quota metric 'v2 and v3 general model characters' and limit 'v2 and v3 general model characters per minute' of service 'translate.googleapis.com' for consumer"

    I have invoked 'google-translate' from 'pl' to 'sk' with 223559 inputs. Does anyone knows what should I do? Minute limite in GCloud is by default set to 6 000 000 char. per minute. If I want to increase limit, it has to be approved by service provider. If I should increase limit, to what number? Can anyone help? Thanks.

    opened by MartinMajernicek 0
  • Error 16 UNAUTHENTICATED when invoking Google Cloud Translate

    Error 16 UNAUTHENTICATED when invoking Google Cloud Translate

    Describe the bug I get an UNAUTHENTICATED error, despite having registered for Google Cloud Translate API and getting a key. I suspect my json file has the wrong structure.

    To Reproduce A description of what the bug is. When I attempt to run the script below

    #!/bin/bash
    set -e # abort on errors
    
    # This example translates an english JSON-file into spanish, chinese and german. It uses Google Cloud Translate.
    BASE_DIR="static/locales"
    SERVICE_ACCOUNT_KEY="gcloud_translation_key.json"
    COMMON_ARGS=( "--srcLng=en" "--srcFormat=nested-json" "--targetFormat=nested-json" "--service=google-translate" "--serviceConfig=$SERVICE_ACCOUNT_KEY" )
    
    # install attranslate if it is not installed yet
    attranslate --version || npm install -g attranslate
    
    attranslate --srcFile=$BASE_DIR/en/translation.json --targetFile=$BASE_DIR/de/translation.json --targetLng=de "${COMMON_ARGS[@]}"
    

    I get the following error

    1.8.1
    Invoke 'google-translate' from 'en' to 'de' with 8 inputs...
    An error occurred:
    16 UNAUTHENTICATED: Failed to retrieve auth metadata with error: key must be a string, a buffer or an object
    Error: 16 UNAUTHENTICATED: Failed to retrieve auth metadata with error: key must be a string, a buffer or an object
    

    I suspect it is because my gcloud_translation_key.json file is malformed

    {
      "key": "<the key I got from 'Enable APIs and services' on GCloud for translation>",
      "project_id": "<my project id>"
    }
    

    Expected behavior I expect the translated files to be output.

    Files I've added the script and config I use inline.

    Additional context Nothing else.

    Thank you in advance for your help.

    opened by Jan-Jan 1
  • Double quotes in Localizable.strings

    Double quotes in Localizable.strings

    Describe the bug If I run script to convert android xml to iOS Localizable.strings I have double quotes:

    Android source: "Incorrect id"

    Actual results: "incorrect_id" = ""Incorrect id.";

    Expect results: "incorrect_id" = "Incorrect id. ";

    To Reproduce

    ANDROID_EN="app/src/main/res/external/strings/values/strings.xml"
    iOS_EN="/Base.lproj/Localizable.strings"
    
    ANDROID_TO_iOS=( "--srcFormat=xml" "--targetFormat=ios-strings" "--service=sync-without-translate" "--cacheDir=android")
    
    attranslate "${ANDROID_TO_iOS[@]}" --srcFile=$ANDROID_EN --targetFile=$iOS_EN --srcLng="en" --targetLng="en"
    
    

    Expected behavior Expect results: "incorrect_id" = "Incorrect id. ";

    opened by yoman07 1
  • cant translate pot file en to es?

    cant translate pot file en to es?

    https://gist.github.com/0b4ecd4380f47794c6f5a04f54d85325

    attranslate --srcFile=wp-erp/i18n/languages/erp.pot --srcLng=en --srcFormat=po --targetFile=wp-erp/i18n/languages/erp-es.pot --targetLng=es --targetFormat=po --service=google-translate --serviceConfig=traducciones-352415-79659df1c6f1.json

    and show me this

    Bypass 7129 strings because they are empty...
    Invoke 'google-translate' from 'en' to 'es' with 11 inputs...
    Add 7140 new translations
    Write target '/root/attranslate/wp-erp/i18n/languages/erp-es.pot'
    
    

    https://gist.github.com/1b715430007ff5aec99af3594a3b7010

    tnks for your help in this one

    im using before this one https://github.com/sourcecodeit/po-gtranslator

    opened by johnfelipe 1
  • xml translate not works with specific type of xml file

    xml translate not works with specific type of xml file

    https://github.com/statisticssweden/PxWeb/blob/master/PXWeb/Resources/Languages/pxlang.xml

    attranslate --srcFile=pxlang.xml --srcLng=en --srcFormat=xml --targetFile=pxlang-es.xml --targetLng=es --targetFormat=xml --service=google-translate --serviceConfig=traducciones-352415-79659df1c6f1.json
    
    
    Bypass 1285 strings because they are empty...
    Add 1285 new translations
    Write target '/root/attranslate/pxlang-es.xml'
    

    how can solve this?

    opened by johnfelipe 5
Owner
Felix Kirchengast
Cross-Platform App Developer https://gist.github.com/fkirc
Felix Kirchengast
Android/iOS Apps created to practice with different iOS/Android Tech. These apps were built to have similar feature sets using native Android/iOS.

AgilityFitTodayApp Android/iOS Apps created to practice with different iOS/Android Tech. These apps were built to have similar feature sets using nati

Lauren Yew 1 Feb 25, 2022
Localize iOS apps in a smarter way using JSON files. Swift framework.

Swifternalization Swift library that helps in localizing apps in a different, better, simpler, more powerful way than system localization does. It use

Tomasz Szulc 575 Nov 3, 2022
Check Localizable.strings files of iOS Apps

Rubustrings Check the format and consistency of the Localizable.strings files of iOS Apps with multi-language support Rubustrings is also available fo

David Cordero 110 Nov 12, 2022
Will Powell 1.2k Dec 29, 2022
Localization of the application with ability to change language "on the fly" and support for plural form in any language.

L10n-swift is a simple framework that improves localization in swift app, providing cleaner syntax and in-app language switching. Overview ?? Features

Adrian Bobrowski 287 Dec 24, 2022
Localize is a framework writed in swift to localize your projects easier improves i18n, including storyboards and strings.

Localize Localize is a framework written in swift to help you localize and pluralize your projects. It supports both storyboards and strings. Features

Andres Silva 279 Dec 24, 2022
Swift friendly localization and i18n with in-app language switching

Localize-Swift Localize-Swift is a simple framework that improves i18n and localization in Swift iOS apps - providing cleaner syntax and in-app langua

Roy Marmelstein 2.9k Dec 29, 2022
NoOptionalInterpolation gets rid of "Optional(...)" and "nil" in Swift's string interpolation

NoOptionalInterpolation gets rid of "Optional(...)" and "nil" in Swift's string interpolation

Thanh Pham 48 Jun 5, 2022
transai is a localization tool on Android and iOS.

transai transai is a command line tool to help you do Android and iOS translation management. You can extract string files to csv format, or generate

Jintin 56 Nov 12, 2022
A tool for finding missing and unused NSLocalizedStrings

nslocalizer This is a command line tool that is used for discovering missing and unused localization strings in Xcode projects. Contributing and Code

Samantha Demi 155 Sep 17, 2022
Mathias Köhnke 1.1k Dec 16, 2022
Screen translator for macOS with Apple Vision API and IBM Watson, Google Cloud Translator

Swifty-OCR-Translator Screen translator for macOS with Apple Vision API and IBM Watson, Google Cloud Translator Usage Select Translator Fill in the AP

Kwangmin Bae 21 Sep 13, 2022
Semi-automatic installation of mods for the iOS version of KOTOR 1

KOTOR 1 Mod Manager Welcome to KOTOR 1 Mod Manager (K1MM for short), a tool designed to allow easy and simple installation of mods for the iOS version

Lilly 3 Jul 11, 2022
iOS 8.4b4-9.3.6 Semi-Untethered jailbreak

Credits: jailbreak made by zachary7829 (jk?) kpmap patch spv/p0laris for patchfinder dora2-ios for part of patchfinder openpwnage Open source iOS 8.4b

0xilis 52 Dec 28, 2022
A flexible mock server for automated and regression testing of iOS, Android and other apps.

Note: This document is intended as a quick introduction to Voodoo. As Voodoo has a large number of features, please refer to Voodoo's Github Wiki for

Derek Clarkson 7 Nov 23, 2022
Vapor-telemetrydeck - Vapor client for posting signals to TelemetryDeck, a privacy-conscious analytics service for apps and websites

Vapor-telemetrydeck - Vapor client for posting signals to TelemetryDeck, a privacy-conscious analytics service for apps and websites

Sidetrack 7 Jun 16, 2022
A CLI tool for localization resource management on Xcode. Built with Google Translator.

Supported by Jetbrains Open Source License Program Automatically translate and synchronize '.strings' files from the defined base language The basic c

gitmerge 164 May 4, 2022
Open Source iOS Translator.

About LiTranslate is an application which purpose is a convenient use of open source translation technology. Download on the App Store! For developers

Viktor 6 Dec 30, 2022
NP-Open-House-Setup - Automated setup utility and instructions for Friction booth at NP Open House 2022

Friction Setup Setup Instructions Friction setup Start up the iMac Give it a cou

Jia Chen 0 Jan 4, 2022
A simple, reliable and scalable delivery API for transactional push notifications for websites and applications

Catapush is a simple, reliable and scalable delivery API for transactional push notifications for websites and applications. Ideal for sending data-dr

Catapush 0 Dec 29, 2021