For a current project, I’ve been struggling with my language files. They’re all JSON files, and will always fallback to English if translations aren’t available.

My problem is that when a new key is required, I use my english file by default. This leads to situations where my client wants to translate new keys to other languages, and I have to spend time looking at all files, figuring out which keys i haven’t added there.

Essentially I want to get to a point where I can give all the translation files to my client, and he returns them with the translated content.

What do you guys use for managing this? And how would you solve the situation i’ve found myself in.

  • o11c@programming.dev
    link
    fedilink
    arrow-up
    13
    ·
    1 year ago

    Stop reinventing the wheel.

    Major translation systems like gettext (especially the GNU variant) have decades of tooling built up for “merging” and all sorts of other operations.

    Even if you don’t want to use their binary format at runtime, their tooling is still worth it.

  • Durotar@lemmy.ml
    link
    fedilink
    arrow-up
    10
    ·
    1 year ago

    I have to spend time looking at all files, figuring out which keys i haven’t added there

    It sounds like a simple bash script could do that for you. Take keys from the English language file, compare against other language files, find missing keys for each language.

  • DaleGribble88@programming.dev
    link
    fedilink
    English
    arrow-up
    6
    ·
    1 year ago

    A trick the indie game development community has used for years is just a simple excel file. CSVs are the easiest to work with if you are unfamiliar. First column is the ID of the text that you can reference in code, and each column is a translation of that text. Get the initial translation in place, typically English, then email the excel file to anyone who ask to create as fan translation. Also, unless you are translating the Illiad, the extra memory use is negligible.

    • Faresh@lemmy.ml
      link
      fedilink
      English
      arrow-up
      3
      ·
      edit-2
      1 year ago

      CSVs are the easiest to work with if you are unfamiliar

      A disadvantage with this is, if you ever want to collaborate with someone else using version control, it will increase the amount of merge conflicts, because multiple strings will be on the same line.

      • DaleGribble88@programming.dev
        link
        fedilink
        English
        arrow-up
        3
        ·
        1 year ago

        True, but if there is a large project with many different collaborators, they’d need a more verbose system than a CSV file anyway. (And likely a more senior developer who knows how to handle situations like this.) My point is that excel files, and CSVs in particular, are easy to parse, easy to check for completeness, and easy to distribute to less technical people. Basically, while not optimal, they will just work.

  • Almamu@lemmy.world
    link
    fedilink
    arrow-up
    4
    ·
    1 year ago

    Part of my CI/CD is a script that makes builds fail if any of my languages are missing keys, it takes English as the desired result and checks all the keys to ensure they all exist and prints a report of the ones that are missing in csv format so I can send them to translators. I generally run this manually before committing, but having it in the CI/CD helps preventing these errors from making it into production…

  • starman@programming.dev
    link
    fedilink
    English
    arrow-up
    4
    ·
    edit-2
    1 year ago

    You could write a script that updates other files based on english file. It could put someting like

    "key": "UNTRANSLATED"
    

    to missing fields.

    • coloredgrayscale@programming.dev
      link
      fedilink
      arrow-up
      3
      ·
      1 year ago

      Usually a translation system might return the key value if the translation is missing. By translating with “untranslated” as a default you’d get just that text filled as fallback.

      Unless you reinvent the wheel for lookup and can just ignore your magic value, or put an if on every value lookup.

      Might be a risk there.

        • Vorpal@programming.dev
          link
          fedilink
          arrow-up
          1
          ·
          1 year ago

          Your idea will work with minor changes (if comments are supported in your file format). At work our tooling create entries like 123="English text" // UNTRANSLATED. Obviously not quite the same format, but it should be adaptable to any format that supports comments.

  • Vorpal@programming.dev
    link
    fedilink
    arrow-up
    2
    ·
    1 year ago

    There are existing approaches: GNU gettext and Mozilla fluent comes to mind. I would try to use one of those. I understand that Mozilla Fluent has good support for the Web (unsurprisingly).

  • 🅿🅸🆇🅴🅻@lemmy.world
    link
    fedilink
    arrow-up
    1
    ·
    edit-2
    1 year ago

    We return / display the translation key name if no translation is available for that language, including for the default (English).

    Also, on dev / test environments we can enable a config (.env) setting to append the text " [UNTRANSLATED]" to every value that doesn’t have a translation, as they’re easier to spot in the website / interface.

    I’m talking about a PHP /Laravel project so it was easy to override the default translation engine behaviour.

    • BetaSalmon@lemmy.worldOP
      link
      fedilink
      arrow-up
      1
      ·
      1 year ago

      I suppose my main issue is with the actual language files. In terms of translation we also default to English. It’s just a tedious job to remember to add they new key to every language file, which is a problem I’m facing now.

      Due to so many new features, the non-English language files are quite outdated.