Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bad keys in translation files #5849

Closed
JeromeChignoli opened this issue Jun 30, 2024 · 14 comments · Fixed by #5852
Closed

Bad keys in translation files #5849

JeromeChignoli opened this issue Jun 30, 2024 · 14 comments · Fixed by #5852

Comments

@JeromeChignoli
Copy link

JeromeChignoli commented Jun 30, 2024

Hello.

I was having nil values in trade computer.
Searching from source code i found bad keys in lang/ui.core/fr.json:
i found {système} keys in TRADING_FROM and TRADING_TO sections.
Assuming it was auto-translation issue (as système is system), i was curious to see if it was the only one...

in lang directory:

find -name '*.json' -exec sed -n '/[}{]/{s/^[^{]*//;s/[^}]*$//;s/}[^{]*{/}\n{/g;p}' {} \;|sort|uniq -c|sort -n

Interesting results with my 20240314 (8b6ae92) on Linux version: a lot of auto-translated keys and some typos.
The real work will be to find the files... maybe by grep'ing the bad entries

EDIT: by "auto-translation" I mean "automatic translation". Tools are great but stupid.

@impaktor
Copy link
Member

impaktor commented Jun 30, 2024

i found {système} keys in TRADING_FROM and TRADING_TO sections.

Looks like the translator has translated the variable name, which is a big no-no. Anything within {...} should not be translated.

Would be most excellent if you could fix it: https://wiki.pioneerspacesim.net/wiki/Translations

The real work will be to find the files... maybe by grep'ing the bad entries

Files are in data/lang/**/fr.json'

EDIT: Note: the changes should be done in transifex.

@JeromeChignoli
Copy link
Author

Ok. Easy for french translations, but i will have to compare {} keys in the *.json for the others languages.
I assume the en.json files are the correct ones, from which i can start ?
A lot of sed, grep, awk and sort commands... i like sort ;)

@impaktor
Copy link
Member

i will have to compare {} keys in the *.json for the others languages.

Well, variable names are always in English, so if you see any in French, that needs fixing.

Simplest is to just identify when/who made the error and check those. I don't know if that feature exist in Transifex, but either way, you can do a git log on the french files, and identify when the change was made (recently, I'd venture to guess). You can see all commits made that transfer changes from Transifex to master: https://github.com/pioneerspacesim/pioneer/commits?author=pioneer-transifex

Also, we intend to do a release within a few days, so if you have time to play around with this in the not too distant future that would be great.

@impaktor
Copy link
Member

impaktor commented Jun 30, 2024

For anyone tagging along in the conversation, but not interested in running command in OP, result is below. Since we have 31 languages all occurrences should be multiples of 31, unless there's a parsing error, (which it looks like some lines are, where the whole sentence has been included).

E.g. I was curious about {body(r)} (the 4th hit in the output below) and it's is from Danish:

git grep -in "body(r)"
core/da.json:1460:    "message": "Stabilt system med %bodycount større %{body(r)} og %portcount %{starport(e)}"

going to line 1460 in en.json:

"message": "Stable system with %bodycount major %{body(s)} and %portcount %{starport(s)}"

Output from command in OP:

      1 {alcance}
      1 {Alcancemáximo}
      1 {area). Potrzebujesz hipernapędu zdolnego pokonać odległość {dist}
      1 {body(r)}
      1 {cach}
      1 {cache}
      1 {cash na misję w {area}
      1 {combustível}
      1 {companhia}
      1 {corporação}
      1 {dano}
      1 {datas}
      1 {data_vencimento}
      1 {date|}
      1 {datum}
      1 {distans}
      1 {equipamento}
      1 {equipement}
      1 {f-2}
      1 {komodity}
      1 {local}
      1 {metallegering}
      1 {missione}
      1 {Name}
      1 {newpaper}
      1 {orbit_peiod}
      1 {Percentualreparo}
      1 {playedrShipLabel}
      1 {playershipbalel}
      1 {population}
      1 {preço}
      1 {primary}
      1 {propietor}
      1 {randezvous}
      1 {{secondary_info}, tertiary_info}
      1 {Setorz}
      1 {shiplabel的星舰因燃料耗尽停在附近。 我们将向任何为该船加油的人支付{cash}
      1 {sim}
      1 {starport(e)}
      1 {systém}
      1 {systeme}
      1 {system] ({sectorx}
      1 {systemu}
      1 {systému}
      1 {tak}
      1 {taxa_anuidade}
      1 {valor}
      1 {základen}
      1 {星球}
      1 {现金}
      1 {系统}
      1 {行星}
      2 {areax}
      2 {carportame}
      2 {combustível_militar}
      2 {naam}
      2 {nein}
      2 {nome da nave}
      2 {nome do clube}
      2 {quantidade}
      2 {registro da nave}
      2 {secretary}
      2 {sectionx}
      2 {todo{ ton {cargotype}
      3 {grupo}
      3 {proprietário}
      3 {système}
      4 {base de lançamento}
      4 {Org}
      4 {radioativos}
      5 {carga}
      5 {jornal}
      5 {quantia}
      6 {geld}
      8 {cliente}
     10 {porto estelar}
     13 {doelwit}
     20 {distância}
     28 {data}
     29 {bases}
     29 {body(s)}
     29 {shipname}
     29 {shipregid}
     29 {starport(s)}
     29 {SYSTEM}
     30 {alloy}
     30 {company}
     30 {corp}
     30 {damage}
     30 {deliver_crew}
     30 {expiry_date}
     30 {fuel}
     30 {maxRange}
     30 {membership_fee}
     30 {money}
     30 {orbit_period}
     30 {range}
     30 {rendezvous}
     30 {repairPercent}
     30 {tertiary_info}
     30 {value}
     31 {age}
     31 {bodies}
     31 {body}
     31 {bodycount}
     31 {countdown}
     31 {coverage}
     31 {crime}
     31 {d08}
     31 {destination}
     31 {distance}
     31 {duration}
     31 {engineering}
     31 {experience}
     31 {faction}
     31 {faction_police}
     31 {general}
     31 {high_gravity}
     31 {level}
     31 {minutes}
     31 {N}
     31 {navigation}
     31 {newAmount}
     31 {overall}
     31 {parent_body}
     31 {percent}
     31 {piloting}
     31 {portcount}
     31 {potentialCrewMember}
     31 {press}
     31 {pressure}
     31 {resolution}
     31 {response}
     31 {save}
     31 {seconds}
     31 {sensors}
     31 {ship_label}
     31 {tech_level}
     31 {total_docking_pads}
     31 {type}
     31 {units}
     31 {x}
     31 {y}
     31 {z}
     32 {path}
     34 {sectorX}
     34 {sectorY}
     34 {sectorZ}
     36 {nome}
     38 {setorz}
     39 {sector}
     39 {setorx}
     39 {setory}
     44 {alvo}
     45 {dinheiro}
     58 {spaceport}
     59 {military_fuel}
     60 {}
     60 {FACTION}
     60 {POLICE}
     61 {entity}
     61 {problem}
     61 {reward}
     61 {star}
     61 {time}
     62 {bay}
     62 {dom_sectorx}
     62 {dom_sectory}
     62 {dom_sectorz}
     62 {dom_system}
     62 {grav}
     62 {pass}
     62 {shipid}
     62 {wage}
     66 {sistema}
     90 {group}
     90 {MILITARY}
     91 {cargotype}
     91 {commodity}
     91 {location}
     91 {quantity}
     91 {ship}
     92 {secondary_info}
     93 {crew}
    121 {clubname}
    121 {dom_starport}
    122 {mass}
    123 {f.0}
    123 {fee}
    123 {mission}
    124 {f.3}
    124 {lat}
    124 {long}
    148 {no}
    148 {radioactives}
    149 {newspaper}
    150 {proprietor}
    155 {f.2}
    155 {gravity}
    174 {yes}
    184 {drive}
    184 {todo}
    185 {f.1}
    186 {done}
    186 {lasttime}
    186 {targetname}
    217 {due}
    246 {primary_info}
    246 {shiplabel}
    269 {client}
    272 {cargo}
    274 {org}
    341 {unit}
    395 {systembody}
    401 {playerShipLabel}
    461 {planet}
    462 {equipment}
    523 {price}
    587 {station}
    615 {amount}
    620 {cargoname}
    954 {area}
    990 {locality}
   1237 {target}
   1242 {date}
   1550 {dist}
   1563 {starport}
   2054 {sectorx}
   2056 {sectory}
   2061 {sectorz}
   2715 {name}
   2943 {cash}
   4515 {system}
 173045 

@impaktor
Copy link
Member

impaktor commented Jul 1, 2024

OK, there are 149 files that have errors lua-variable translation errors (I'll update this post when I have the C++ ones as well):

Files with errors
total files with errors: 149:
data/lang/quitconfirmation-core/pt_BR.json
data/lang/module-assassination/es.json
data/lang/ui-core/bg.json
data/lang/core/es.json
data/lang/module-combat/ru.json
data/lang/module-stationtrafficcontrol/sv.json
data/lang/module-soldout/zh.json
data/lang/module-searchrescue/zh.json
data/lang/module-fuelclub/pt_BR.json
data/lang/module-searchrescue/cs.json
data/lang/module-searchrescue/tr.json
data/lang/ui-core/ja.json
data/lang/module-searchrescue/de.json
data/lang/module-searchrescue/hu.json
data/lang/module-breakdownservicing/sv.json
data/lang/module-assassination/zh.json
data/lang/module-deliverpackage/zh.json
data/lang/module-system/ru.json
data/lang/module-assassination/hu.json
data/lang/core/ar.json
data/lang/module-secondhand/tr.json
data/lang/module-taxi/pt.json
data/lang/module-assassination/ja_JP.json
data/lang/module-combat/de.json
data/lang/module-newseventcommodity/da.json
data/lang/module-searchrescue/ru.json
data/lang/module-cargorun/zh.json
data/lang/module-assassination/ru.json
data/lang/module-newseventcommodity/es.json
data/lang/ui-core/ar.json
data/lang/core/hu.json
data/lang/core/sv.json
data/lang/module-cargorun/ja.json
data/lang/module-searchrescue/es.json
data/lang/module-assassination/tr.json
data/lang/module-breakdownservicing/ga.json
data/lang/ui-core/pl.json
data/lang/module-breakdownservicing/hu.json
data/lang/module-searchrescue/gd.json
data/lang/module-combat/hu.json
data/lang/module-breakdownservicing/ja.json
data/lang/module-breakdownservicing/de.json
data/lang/module-searchrescue/pl.json
data/lang/module-breakdownservicing/ja_JP.json
data/lang/module-taxi/tr.json
data/lang/module-scout/it.json
data/lang/module-assassination/nl.json
data/lang/module-searchrescue/sv.json
data/lang/module-newseventcommodity/sv.json
data/lang/ui-core/sv.json
data/lang/module-cargorun/el.json
data/lang/module-deliverpackage/pt_BR.json
data/lang/module-combat/cs.json
data/lang/module-deliverpackage/id.json
data/lang/module-newseventcommodity/pt_BR.json
data/lang/module-scout/hu.json
data/lang/module-cargorun/ga.json
data/lang/module-cargorun/ru.json
data/lang/module-system/pl.json
data/lang/module-assassination/ja.json
data/lang/module-deliverpackage/pt.json
data/lang/core/el.json
data/lang/module-combat/pl.json
data/lang/module-breakdownservicing/zh.json
data/lang/module-combat/it.json
data/lang/module-assassination/ga.json
data/lang/module-scout/zh.json
data/lang/module-scoop/tr.json
data/lang/module-cargorun/de.json
data/lang/module-taxi/pt_BR.json
data/lang/module-stationrefuelling/hu.json
data/lang/module-secondhand/hu.json
data/lang/module-taxi/da.json
data/lang/module-searchrescue/el.json
data/lang/module-searchrescue/fr.json
data/lang/quitconfirmation-core/de.json
data/lang/ui-core/fr.json
data/lang/module-newseventcommodity/zh.json
data/lang/module-combat/tr.json
data/lang/module-combat/zh.json
data/lang/core/id.json
data/lang/module-cargorun/tr.json
data/lang/ui-core/gd.json
data/lang/quitconfirmation-core/hu.json
data/lang/module-scout/de.json
data/lang/module-fuelclub/pl.json
data/lang/module-scoop/de.json
data/lang/ui-core/hu.json
data/lang/module-soldout/cs.json
data/lang/module-cargorun/es.json
data/lang/module-stationtrafficcontrol/it.json
data/lang/module-fuelclub/tr.json
data/lang/module-stationtrafficcontrol/zh.json
data/lang/module-cargorun/hu.json
data/lang/module-newseventcommodity/it.json
data/lang/module-combat/sv.json
data/lang/module-scout/el.json
data/lang/module-breakdownservicing/es.json
data/lang/module-breakdownservicing/cs.json
data/lang/module-system/cs.json
data/lang/module-assassination/pt.json
data/lang/ui-core/pt.json
data/lang/module-assassination/de.json
data/lang/module-deliverpackage/sv.json
data/lang/ui-core/zh.json
data/lang/module-soldout/hu.json
data/lang/module-cargorun/ro.json
data/lang/ui-core/tr.json
data/lang/module-donatetocranks/tr.json
data/lang/module-cargorun/pl.json
data/lang/ui-core/ru.json
data/lang/core/da.json
data/lang/module-searchrescue/ga.json
data/lang/quitconfirmation-core/pl.json
data/lang/module-cargorun/it.json
data/lang/module-combat/fr.json
data/lang/module-combat/el.json
data/lang/ui-core/da.json
data/lang/module-assassination/ja-Hira.json
data/lang/module-breakdownservicing/ja-Hira.json
data/lang/module-cargorun/fr.json
data/lang/module-fuelclub/ru.json
data/lang/module-fuelclub/zh.json
data/lang/ui-core/de.json
data/lang/module-assassination/pt_BR.json
data/lang/module-newseventcommodity/nl.json
data/lang/ui-core/pt_BR.json
data/lang/module-crewcontracts/hu.json
data/lang/module-breakdownservicing/pt_BR.json
data/lang/module-donatetocranks/hu.json
data/lang/module-scout/tr.json
data/lang/module-combat/nl.json
data/lang/module-taxi/id.json
data/lang/module-scoop/fr.json
data/lang/module-newseventcommodity/fr.json
data/lang/module-breakdownservicing/gd.json
data/lang/module-searchrescue/bg.json
data/lang/module-taxi/hu.json
data/lang/module-donatetocranks/zh.json
data/lang/module-cargorun/cs.json
data/lang/quitconfirmation-core/zh.json
data/lang/module-secondhand/de.json
data/lang/module-deliverpackage/tr.json
data/lang/module-newseventcommodity/ru.json
data/lang/module-scoop/zh.json
data/lang/ui-core/it.json
data/lang/module-secondhand/fr.json
data/lang/module-donatetocranks/el.json
data/lang/module-newseventcommodity/cs.json
KEYS in files with error

And for each of above files, this is what it barfed on (I've included english for each, thus every other line is the error, every other is the correct):

Checking file: data/lang/module-taxi/pt_BR.json FAIL:
{'FLAVOUR_0_HOWMANY': ['group']}
{'FLAVOUR_0_HOWMANY': ['grupo']}
{'FLAVOUR_0_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_0_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'FLAVOUR_10_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_10_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'FLAVOUR_11_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_11_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'FLAVOUR_12_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_12_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'FLAVOUR_1_HOWMANY': ['group']}
{'FLAVOUR_1_HOWMANY': ['grupo']}
{'FLAVOUR_1_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_1_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'FLAVOUR_1_WHYSOMUCH': ['corp']}
{'FLAVOUR_1_WHYSOMUCH': ['corporação']}
{'FLAVOUR_2_HOWMANY': ['group']}
{'FLAVOUR_2_HOWMANY': ['grupo']}
{'FLAVOUR_2_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_2_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'Setorz', 'distância', 'dinheiro']}
{'FLAVOUR_3_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_3_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'FLAVOUR_4_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_4_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'FLAVOUR_5_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'FLAVOUR_6_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_6_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'FLAVOUR_7_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_7_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'FLAVOUR_8_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_8_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'FLAVOUR_9_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_9_INTROTEXT': ['nome', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'dinheiro']}
{'PIRATE_TAUNTS_0': ['client']}
{'PIRATE_TAUNTS_0': ['cliente']}
{'PIRATE_TAUNTS_1': ['client']}
{'PIRATE_TAUNTS_1': ['cliente']}

Checking file: data/lang/module-taxi/hu.json FAIL:
{'FLAVOUR_10_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_10_INTROTEXT': ['name', 'system', 'dist', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_3_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_3_INTROTEXT': ['name', 'system', 'dist', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_8_ADTEXT': ['system']}
{'FLAVOUR_8_ADTEXT': ['system', 'cash']}

Checking file: data/lang/module-taxi/pt.json FAIL:
{'FLAVOUR_10_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_10_INTROTEXT': ['nome', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'dinheiro']}
{'FLAVOUR_12_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_12_INTROTEXT': ['nome', 'sistema', 'sectorx', 'sectory', 'sectorz', 'dist', 'dinheiro']}
{'FLAVOUR_3_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_3_INTROTEXT': ['nome', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'dinheiro']}
{'FLAVOUR_4_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_4_INTROTEXT': ['nome', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'dinheiro']}
{'FLAVOUR_5_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['nome', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'dinheiro']}
{'FLAVOUR_6_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_6_INTROTEXT': ['nome', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'dinheiro']}
{'FLAVOUR_7_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_7_INTROTEXT': ['nome', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'dinheiro']}
{'PIRATE_TAUNTS_0': ['client']}
{'PIRATE_TAUNTS_0': ['cliente']}
{'PIRATE_TAUNTS_1': ['client']}
{'PIRATE_TAUNTS_1': ['cliente']}

Checking file: data/lang/module-taxi/da.json FAIL:
{'FLAVOUR_10_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_10_INTROTEXT': ['name', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'cash']}
{'FLAVOUR_11_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_11_INTROTEXT': ['name', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'cash']}
{'FLAVOUR_1_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_1_INTROTEXT': ['name', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'cash']}
{'FLAVOUR_8_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_8_INTROTEXT': ['name', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'cash']}
{'FLAVOUR_9_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_9_INTROTEXT': ['name', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'cash']}

Checking file: data/lang/module-taxi/id.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-taxi/tr.json FAIL:
{'FLAVOUR_0_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_0_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_10_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_10_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_11_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_11_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_12_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_12_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_1_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_1_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_2_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_2_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_3_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_3_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_4_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_4_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_6_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_6_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_7_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_7_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_8_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_8_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}
{'FLAVOUR_9_INTROTEXT': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'FLAVOUR_9_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash']}

Checking file: data/lang/module-stationtrafficcontrol/it.json FAIL:
{'YOU_ARE_LEAVING_STATION_SPACE_4': ['station', 'playerShipLabel']}
{'YOU_ARE_LEAVING_STATION_SPACE_4': ['playerShipLabel', 'station']}

Checking file: data/lang/module-stationtrafficcontrol/zh.json FAIL:
{'YOU_ARE_LEAVING_STATION_SPACE_4': ['station', 'playerShipLabel']}
{'YOU_ARE_LEAVING_STATION_SPACE_4': ['station', 'playershipbalel']}

Checking file: data/lang/module-stationtrafficcontrol/sv.json FAIL:
{'YOU_ARE_ENTERING_STATION_SPACE_3': ['playerShipLabel', 'station']}
{'YOU_ARE_ENTERING_STATION_SPACE_3': ['playedrShipLabel', 'station']}

Checking file: data/lang/module-assassination/pt_BR.json FAIL:
{'FLAVOUR_0_FAILUREMSG': ['target']}
{'FLAVOUR_0_FAILUREMSG': ['alvo']}
{'FLAVOUR_0_FAILUREMSG2': ['target']}
{'FLAVOUR_0_FAILUREMSG2': ['alvo']}
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_0_INTROTEXT': ['nome', 'dinheiro', 'alvo']}
{'FLAVOUR_0_SUCCESSMSG': ['target']}
{'FLAVOUR_0_SUCCESSMSG': ['alvo']}
{'FLAVOUR_1_FAILUREMSG': ['target']}
{'FLAVOUR_1_FAILUREMSG': ['alvo']}
{'FLAVOUR_1_FAILUREMSG2': ['target']}
{'FLAVOUR_1_FAILUREMSG2': ['alvo']}
{'FLAVOUR_1_INTROTEXT': ['target', 'cash']}
{'FLAVOUR_1_INTROTEXT': ['alvo', 'dinheiro']}
{'FLAVOUR_1_SUCCESSMSG': ['target']}
{'FLAVOUR_1_SUCCESSMSG': ['alvo']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_2_INTROTEXT': ['nome', 'dinheiro', 'alvo']}
{'FLAVOUR_3_FAILUREMSG': ['target']}
{'FLAVOUR_3_FAILUREMSG': ['alvo']}
{'FLAVOUR_3_INTROTEXT': ['target', 'cash']}
{'FLAVOUR_3_INTROTEXT': ['alvo', 'dinheiro']}
{'FLAVOUR_3_SUCCESSMSG': ['target']}
{'FLAVOUR_3_SUCCESSMSG': ['alvo']}
{'FLAVOUR_4_FAILUREMSG': ['target']}
{'FLAVOUR_4_FAILUREMSG': ['alvo']}
{'FLAVOUR_4_FAILUREMSG2': ['target']}
{'FLAVOUR_4_FAILUREMSG2': ['alvo']}
{'FLAVOUR_4_INTROTEXT': ['cash', 'target']}
{'FLAVOUR_4_INTROTEXT': ['dinheiro', 'alvo']}
{'FLAVOUR_4_SUCCESSMSG': ['target']}
{'FLAVOUR_4_SUCCESSMSG': ['alvo']}
{'FLAVOUR_5_FAILUREMSG': ['target']}
{'FLAVOUR_5_FAILUREMSG': ['alvo']}
{'FLAVOUR_5_FAILUREMSG2': ['target']}
{'FLAVOUR_5_FAILUREMSG2': ['alvo']}
{'FLAVOUR_5_INTROTEXT': ['target', 'system', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['alvo', 'sistema', 'dinheiro']}
{'FLAVOUR_5_SUCCESSMSG': ['target', 'cash']}
{'FLAVOUR_5_SUCCESSMSG': ['alvo', 'dinheiro']}
{'IT_MUST_BE_DONE_AFTER': ['target', 'spaceport']}
{'IT_MUST_BE_DONE_AFTER': ['alvo', 'base de lançamento']}
{'WHERE_CAN_I_FIND_X': ['target']}
{'WHERE_CAN_I_FIND_X': ['alvo']}
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'date', 'shipname', 'shipregid']}
{'X_WILL_BE_LEAVING': ['alvo', 'base de lançamento', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'data', 'nome da nave', 'registro da nave']}

Checking file: data/lang/module-assassination/ja-Hira.json FAIL:
{'FLAVOUR_0_ADTEXT': ['target', 'system']}
{'FLAVOUR_0_ADTEXT': ['system', 'target']}
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_0_INTROTEXT': ['name', 'target', 'cash']}
{'FLAVOUR_1_ADTEXT': ['target', 'system']}
{'FLAVOUR_1_ADTEXT': ['system', 'target']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_2_INTROTEXT': ['name', 'target', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['target', 'system', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['cash', 'target', 'system']}
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'date', 'shipname', 'shipregid']}
{'X_WILL_BE_LEAVING': ['target', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'spaceport', 'date', 'shipname', 'shipregid']}

Checking file: data/lang/module-assassination/hu.json FAIL:
{'FLAVOUR_1_ADTEXT': ['target', 'system']}
{'FLAVOUR_1_ADTEXT': ['system', 'target']}
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'date', 'shipname', 'shipregid']}
{'X_WILL_BE_LEAVING': ['target', 'date', 'system', 'spaceport', 'sectorX', 'sectorY', 'sectorZ', 'shipname', 'shipregid']}

Checking file: data/lang/module-assassination/de.json FAIL:
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'date', 'shipname', 'shipregid']}
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'date', 'shipname', 'shipregid']}

Checking file: data/lang/module-assassination/pt.json FAIL:
{'FLAVOUR_0_FAILUREMSG': ['target']}
{'FLAVOUR_0_FAILUREMSG': ['alvo']}
{'FLAVOUR_0_FAILUREMSG2': ['target']}
{'FLAVOUR_0_FAILUREMSG2': ['alvo']}
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_0_INTROTEXT': ['nome', 'dinheiro', 'alvo']}
{'FLAVOUR_0_SUCCESSMSG': ['target']}
{'FLAVOUR_0_SUCCESSMSG': ['alvo']}
{'FLAVOUR_1_FAILUREMSG': ['target']}
{'FLAVOUR_1_FAILUREMSG': ['alvo']}
{'FLAVOUR_1_FAILUREMSG2': ['target']}
{'FLAVOUR_1_FAILUREMSG2': ['alvo']}
{'FLAVOUR_1_INTROTEXT': ['target', 'cash']}
{'FLAVOUR_1_INTROTEXT': ['alvo', 'dinheiro']}
{'FLAVOUR_1_SUCCESSMSG': ['target']}
{'FLAVOUR_1_SUCCESSMSG': ['alvo']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_2_INTROTEXT': ['nome', 'dinheiro', 'alvo']}
{'FLAVOUR_3_INTROTEXT': ['target', 'cash']}
{'FLAVOUR_3_INTROTEXT': ['alvo', 'dinheiro']}
{'FLAVOUR_3_SUCCESSMSG': ['target']}
{'FLAVOUR_3_SUCCESSMSG': ['alvo']}
{'FLAVOUR_4_FAILUREMSG': ['target']}
{'FLAVOUR_4_FAILUREMSG': ['alvo']}
{'FLAVOUR_4_FAILUREMSG2': ['target']}
{'FLAVOUR_4_FAILUREMSG2': ['alvo']}
{'FLAVOUR_4_INTROTEXT': ['cash', 'target']}
{'FLAVOUR_4_INTROTEXT': ['dinheiro', 'alvo']}
{'FLAVOUR_4_SUCCESSMSG': ['target']}
{'FLAVOUR_4_SUCCESSMSG': ['alvo']}
{'FLAVOUR_5_FAILUREMSG': ['target']}
{'FLAVOUR_5_FAILUREMSG': ['alvo']}
{'FLAVOUR_5_INTROTEXT': ['target', 'system', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['alvo', 'sistema', 'dinheiro']}
{'FLAVOUR_5_SUCCESSMSG': ['target', 'cash']}
{'FLAVOUR_5_SUCCESSMSG': ['alvo', 'dinheiro']}
{'IT_MUST_BE_DONE_AFTER': ['target', 'spaceport']}
{'IT_MUST_BE_DONE_AFTER': ['alvo', 'base de lançamento']}
{'WHERE_CAN_I_FIND_X': ['target']}
{'WHERE_CAN_I_FIND_X': ['alvo']}
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'date', 'shipname', 'shipregid']}
{'X_WILL_BE_LEAVING': ['alvo', 'base de lançamento', 'sistema', 'setorx', 'setory', 'setorz', 'distância', 'data', 'nome da nave', 'registro da nave']}

Checking file: data/lang/module-assassination/zh.json FAIL:
{'FLAVOUR_0_ADTEXT': ['target', 'system']}
{'FLAVOUR_0_ADTEXT': ['system', 'target']}
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_0_INTROTEXT': ['name', 'target', 'cash']}
{'FLAVOUR_1_ADTEXT': ['target', 'system']}
{'FLAVOUR_1_ADTEXT': ['system', 'target']}
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'date', 'shipname', 'shipregid']}
{'X_WILL_BE_LEAVING': ['target', 'date', 'system', 'sectorX', 'sectorY', 'sectorZ', 'spaceport', 'shipname', 'shipregid']}

Checking file: data/lang/module-assassination/ja_JP.json FAIL:
{'FLAVOUR_0_ADTEXT': ['target', 'system']}
{'FLAVOUR_0_ADTEXT': ['system', 'target']}
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_0_INTROTEXT': ['name', 'target', 'cash']}
{'FLAVOUR_1_ADTEXT': ['target', 'system']}
{'FLAVOUR_1_ADTEXT': ['system', 'target']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_2_INTROTEXT': ['name', 'target', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['target', 'system', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['cash', 'target', 'system']}
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'date', 'shipname', 'shipregid']}
{'X_WILL_BE_LEAVING': ['target', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'spaceport', 'date', 'shipname', 'shipregid']}

Checking file: data/lang/module-assassination/ga.json FAIL:
{'FLAVOUR_4_INTROTEXT': ['cash', 'target']}
{'FLAVOUR_4_INTROTEXT': ['target', 'cash']}

Checking file: data/lang/module-assassination/tr.json FAIL:
{'FLAVOUR_0_ADTEXT': ['target', 'system']}
{'FLAVOUR_0_ADTEXT': ['system', 'target']}
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_0_INTROTEXT': ['name', 'target', 'cash']}
{'FLAVOUR_1_ADTEXT': ['target', 'system']}
{'FLAVOUR_1_ADTEXT': ['system', 'target']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_2_INTROTEXT': ['name', 'target', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['target', 'system', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['system', 'target', 'cash']}
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'date', 'shipname', 'shipregid']}
{'X_WILL_BE_LEAVING': ['dist', 'system', 'sectorX', 'sectorY', 'sectorZ', 'spaceport', 'date', 'shipname', 'shipregid']}

Checking file: data/lang/module-assassination/ja.json FAIL:
{'FLAVOUR_0_ADTEXT': ['target', 'system']}
{'FLAVOUR_0_ADTEXT': ['system', 'target']}
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_0_INTROTEXT': ['name', 'target', 'cash']}
{'FLAVOUR_1_ADTEXT': ['target', 'system']}
{'FLAVOUR_1_ADTEXT': ['system', 'target']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_2_INTROTEXT': ['name', 'target', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['target', 'system', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['cash', 'target', 'system']}
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'date', 'shipname', 'shipregid']}
{'X_WILL_BE_LEAVING': ['target', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'spaceport', 'date', 'shipname', 'shipregid']}

Checking file: data/lang/module-assassination/nl.json FAIL:
{'FLAVOUR_0_FAILUREMSG': ['target']}
{'FLAVOUR_0_FAILUREMSG': ['doelwit']}
{'FLAVOUR_0_FAILUREMSG2': ['target']}
{'FLAVOUR_0_FAILUREMSG2': ['doelwit']}
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_0_INTROTEXT': ['naam', 'geld', 'doelwit']}
{'FLAVOUR_1_FAILUREMSG': ['target']}
{'FLAVOUR_1_FAILUREMSG': ['doelwit']}
{'FLAVOUR_1_INTROTEXT': ['target', 'cash']}
{'FLAVOUR_1_INTROTEXT': ['doelwit', 'geld']}
{'FLAVOUR_1_SUCCESSMSG': ['target']}
{'FLAVOUR_1_SUCCESSMSG': ['doelwit']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'target']}
{'FLAVOUR_2_INTROTEXT': ['naam', 'geld', 'doelwit']}
{'FLAVOUR_3_FAILUREMSG': ['target']}
{'FLAVOUR_3_FAILUREMSG': ['doelwit']}
{'FLAVOUR_3_INTROTEXT': ['target', 'cash']}
{'FLAVOUR_3_INTROTEXT': ['doelwit', 'geld']}
{'FLAVOUR_3_SUCCESSMSG': ['target']}
{'FLAVOUR_3_SUCCESSMSG': ['doelwit']}
{'FLAVOUR_4_FAILUREMSG': ['target']}
{'FLAVOUR_4_FAILUREMSG': ['doelwit']}
{'FLAVOUR_4_INTROTEXT': ['cash', 'target']}
{'FLAVOUR_4_INTROTEXT': ['geld', 'doelwit']}
{'FLAVOUR_5_SUCCESSMSG': ['target', 'cash']}
{'FLAVOUR_5_SUCCESSMSG': ['doelwit', 'geld']}

Checking file: data/lang/module-assassination/es.json FAIL:
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'dist', 'date', 'shipname', 'shipregid']}
{'X_WILL_BE_LEAVING': ['target', 'spaceport', 'system', 'sectorX', 'sectorY', 'sectorZ', 'date', 'shipname', 'shipregid']}

Checking file: data/lang/module-assassination/ru.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-donatetocranks/hu.json FAIL:
{'FLAVOUR_7_MESSAGE': ['POLICE', 'SYSTEM']}
{'FLAVOUR_7_MESSAGE': ['POLICE', 'system']}

Checking file: data/lang/module-donatetocranks/zh.json FAIL:
{'FLAVOUR_7_MESSAGE': ['POLICE', 'SYSTEM']}
{'FLAVOUR_7_MESSAGE': ['SYSTEM', 'POLICE']}
{'SALES_PITCH': ['cash']}
{'SALES_PITCH': ['现金']}

Checking file: data/lang/module-donatetocranks/el.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-donatetocranks/tr.json FAIL:
{'FLAVOUR_7_MESSAGE': ['POLICE', 'SYSTEM']}
{'FLAVOUR_7_MESSAGE': ['SYSTEM', 'POLICE']}

Checking file: data/lang/core/ar.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/core/hu.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/core/da.json FAIL:
{'STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS': ['body(s)', 'starport(s)']}
{'STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS': ['body(r)', 'starport(e)']}

Checking file: data/lang/core/el.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/core/id.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/core/sv.json FAIL:
{'PRESSURE_N_ATMOSPHERES': ['f.2']}
{'PRESSURE_N_ATMOSPHERES': ['f-2']}

Checking file: data/lang/core/es.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-secondhand/hu.json FAIL:
{'FLAVOUR_1_BODY': ['name', 'equipment', 'price']}
{'FLAVOUR_1_BODY': ['equipment', 'price']}

Checking file: data/lang/module-secondhand/fr.json FAIL:
{'FLAVOUR_0_BODY': ['name', 'equipment', 'price']}
{'FLAVOUR_0_BODY': ['name', 'equipment']}
{'FLAVOUR_0_TEXT': ['equipment']}
{'FLAVOUR_0_TEXT': ['equipement']}

Checking file: data/lang/module-secondhand/de.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-secondhand/tr.json FAIL:
{'FLAVOUR_1_BODY': ['name', 'equipment', 'price']}
{'FLAVOUR_1_BODY': ['name', 'price', 'equipment']}
{'FLAVOUR_2_BODY': ['name', 'equipment', 'price']}
{'FLAVOUR_2_BODY': ['name', 'price', 'equipment']}
{'FLAVOUR_4_BODY': ['equipment', 'price']}
{'FLAVOUR_4_BODY': ['price', 'equipment']}

Checking file: data/lang/module-fuelclub/pt_BR.json FAIL:
{'FLAVOUR_0_NONMEMBER_INTRO': ['clubname']}
{'FLAVOUR_0_NONMEMBER_INTRO': ['nome do clube']}
{'FLAVOUR_0_WELCOME': ['clubname']}
{'FLAVOUR_0_WELCOME': ['nome do clube']}
{'LIST_BENEFITS_DISPOSAL': ['radioactives']}
{'LIST_BENEFITS_DISPOSAL': ['radioativos']}
{'LIST_BENEFITS_FUEL': ['fuel']}
{'LIST_BENEFITS_FUEL': ['combustível']}
{'LIST_BENEFITS_JOIN': ['membership_fee']}
{'LIST_BENEFITS_JOIN': ['taxa_anuidade']}
{'WE_WILL_ONLY_DISPOSE_OF': ['radioactives', 'military_fuel']}
{'WE_WILL_ONLY_DISPOSE_OF': ['radioativos', 'combustível_militar']}
{'WHAT_CONDITIONS_APPLY': ['radioactives']}
{'WHAT_CONDITIONS_APPLY': ['radioativos']}
{'YOU_ARE_NOW_A_MEMBER': ['expiry_date']}
{'YOU_ARE_NOW_A_MEMBER': ['data_vencimento']}
{'YOU_MUST_BUY': ['military_fuel', 'radioactives']}
{'YOU_MUST_BUY': ['combustível_militar', 'radioativos']}

Checking file: data/lang/module-fuelclub/pl.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-fuelclub/zh.json FAIL:
{'WE_WILL_ONLY_DISPOSE_OF': ['radioactives', 'military_fuel']}
{'WE_WILL_ONLY_DISPOSE_OF': ['military_fuel', 'radioactives']}
{'YOU_MUST_BUY': ['military_fuel', 'radioactives']}
{'YOU_MUST_BUY': ['radioactives', 'military_fuel']}

Checking file: data/lang/module-fuelclub/tr.json FAIL:
{'WE_WILL_ONLY_DISPOSE_OF': ['radioactives', 'military_fuel']}
{'WE_WILL_ONLY_DISPOSE_OF': ['military_fuel', 'radioactives']}
{'YOU_MUST_BUY': ['military_fuel', 'radioactives']}
{'YOU_MUST_BUY': ['radioactives', 'military_fuel']}

Checking file: data/lang/module-fuelclub/ru.json FAIL:
{'YOU_MUST_BUY': ['military_fuel', 'radioactives']}
{'YOU_MUST_BUY': ['radioactives', 'military_fuel']}

Checking file: data/lang/module-breakdownservicing/pt_BR.json FAIL:
{'FLAVOUR_0_TITLE': ['name']}
{'FLAVOUR_0_TITLE': ['nome']}
{'FLAVOUR_1_TITLE': ['proprietor']}
{'FLAVOUR_1_TITLE': ['proprietário']}
{'FLAVOUR_2_TITLE': ['proprietor']}
{'FLAVOUR_2_TITLE': ['proprietário']}
{'FLAVOUR_3_TITLE': ['name']}
{'FLAVOUR_3_TITLE': ['nome']}
{'FLAVOUR_5_TITLE': ['proprietor']}
{'FLAVOUR_5_TITLE': ['proprietário']}
{'YOUR_DRIVE_HAS_NOT_BEEN_SERVICED': ['date']}
{'YOUR_DRIVE_HAS_NOT_BEEN_SERVICED': ['data']}
{'YOUR_DRIVE_WAS_LAST_SERVICED_ON': ['date', 'company']}
{'YOUR_DRIVE_WAS_LAST_SERVICED_ON': ['data', 'companhia']}

Checking file: data/lang/module-breakdownservicing/gd.json FAIL:
{'YOUR_DRIVE_WAS_LAST_SERVICED_ON': ['date', 'company']}
{'YOUR_DRIVE_WAS_LAST_SERVICED_ON': ['company', 'date']}

Checking file: data/lang/module-breakdownservicing/ja-Hira.json FAIL:
{'FLAVOUR_3_PRICE': ['lasttime', 'drive', 'price']}
{'FLAVOUR_3_PRICE': ['lasttime', 'price', 'drive']}

Checking file: data/lang/module-breakdownservicing/hu.json FAIL:
{'FLAVOUR_3_PRICE': ['lasttime', 'drive', 'price']}
{'FLAVOUR_3_PRICE': ['lasttime', 'price', 'drive']}

Checking file: data/lang/module-breakdownservicing/de.json FAIL:
{'FLAVOUR_1_PRICE': ['drive', 'price', 'lasttime']}
{'FLAVOUR_1_PRICE': ['price', 'lasttime']}
{'FLAVOUR_3_PRICE': ['lasttime', 'drive', 'price']}
{'FLAVOUR_3_PRICE': ['lasttime', 'price']}
{'FLAVOUR_5_TITLE': ['proprietor']}
{'FLAVOUR_5_TITLE': ['name']}

Checking file: data/lang/module-breakdownservicing/zh.json FAIL:
{'YOUR_DRIVE_WAS_LAST_SERVICED_ON': ['date', 'company']}
{'YOUR_DRIVE_WAS_LAST_SERVICED_ON': ['company', 'date']}

Checking file: data/lang/module-breakdownservicing/ja_JP.json FAIL:
{'FLAVOUR_3_PRICE': ['lasttime', 'drive', 'price']}
{'FLAVOUR_3_PRICE': ['lasttime', 'price', 'drive']}

Checking file: data/lang/module-breakdownservicing/ga.json FAIL:
{'FLAVOUR_1_PRICE': ['drive', 'price', 'lasttime']}
{'FLAVOUR_1_PRICE': ['price', 'drive', 'lasttime']}
{'YOUR_DRIVE_WAS_LAST_SERVICED_ON': ['date', 'company']}
{'YOUR_DRIVE_WAS_LAST_SERVICED_ON': ['company', 'date']}

Checking file: data/lang/module-breakdownservicing/ja.json FAIL:
{'FLAVOUR_3_PRICE': ['lasttime', 'drive', 'price']}
{'FLAVOUR_3_PRICE': ['lasttime', 'price', 'drive']}
{'YOUR_DRIVE_WAS_LAST_SERVICED_ON': ['date', 'company']}
{'YOUR_DRIVE_WAS_LAST_SERVICED_ON': ['company', 'date']}

Checking file: data/lang/module-breakdownservicing/sv.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-breakdownservicing/cs.json FAIL:
{'FLAVOUR_5_TITLE': ['proprietor']}
{'FLAVOUR_5_TITLE': ['name']}

Checking file: data/lang/module-breakdownservicing/es.json FAIL:
{'FLAVOUR_2_INTRO': ['proprietor']}
{'FLAVOUR_2_INTRO': ['propietor']}

Checking file: data/lang/module-stationrefuelling/hu.json FAIL:
{'THIS_IS_STATION_YOU_DO_NOT_HAVE_ENOUGH_LANDING': ['station', 'fee']}
{'THIS_IS_STATION_YOU_DO_NOT_HAVE_ENOUGH_LANDING': ['station']}

Checking file: data/lang/module-scout/hu.json FAIL:
{'ADTEXT_1_INTRO': ['name', 'systembody', 'system', 'dist', 'cash']}
{'ADTEXT_1_INTRO': ['name', 'system', 'systembody', 'dist', 'cash']}
{'ADTEXT_2_INTRO': ['name', 'cash', 'systembody', 'system', 'dist']}
{'ADTEXT_2_INTRO': ['name', 'cash', 'dist', 'system', 'systembody']}
{'ADTEXT_3_INTRO': ['name', 'cash', 'systembody', 'system', 'dist']}
{'ADTEXT_3_INTRO': ['name', 'cash', 'dist', 'system', 'systembody']}
{'ADTEXT_4_INTRO': ['name', 'system', 'dist', 'systembody', 'cash']}
{'ADTEXT_4_INTRO': ['name', 'dist', 'system', 'systembody', 'cash']}
{'ADTEXT_9': ['systembody', 'system']}
{'ADTEXT_9': ['system', 'systembody']}
{'ADTEXT_9_INTRO': ['name', 'systembody', 'system', 'cash']}
{'ADTEXT_9_INTRO': ['name', 'systembody', 'system']}
{'SCAN_DETAILS': ['type', 'body', 'coverage', 'resolution']}
{'SCAN_DETAILS': ['body', 'type', 'coverage', 'resolution']}

Checking file: data/lang/module-scout/it.json FAIL:
{'ADTEXT_9_INTRO': ['name', 'systembody', 'system', 'cash']}
{'ADTEXT_9_INTRO': ['name', 'systembody', 'system', 'cache']}

Checking file: data/lang/module-scout/de.json FAIL:
{'ADTEXT_9_INTRO': ['name', 'systembody', 'system', 'cash']}
{'ADTEXT_9_INTRO': ['name', 'systembody', 'system', 'systembody', 'cash']}
{'DROP_OFF_DATA': ['location', 'date']}
{'DROP_OFF_DATA': ['date', 'location']}

Checking file: data/lang/module-scout/zh.json FAIL:
{'ADTEXT_1_INTRO': ['name', 'systembody', 'system', 'dist', 'cash']}
{'ADTEXT_1_INTRO': ['name', 'system', 'systembody', 'dist', 'cash']}
{'ADTEXT_2_INTRO': ['name', 'cash', 'systembody', 'system', 'dist']}
{'ADTEXT_2_INTRO': ['name', 'cash', 'system', 'systembody', 'dist']}
{'ADTEXT_3_INTRO': ['name', 'cash', 'systembody', 'system', 'dist']}
{'ADTEXT_3_INTRO': ['name', 'cash', 'system', 'systembody', 'dist']}
{'ADTEXT_5_INTRO': ['name', 'cash', 'systembody', 'system', 'dist']}
{'ADTEXT_5_INTRO': ['name', 'cash', 'system', 'dist', 'systembody']}
{'ADTEXT_7_INTRO': ['name', 'cash', 'systembody']}
{'ADTEXT_7_INTRO': ['name', 'systembody', 'cash']}
{'ADTEXT_9': ['systembody', 'system']}
{'ADTEXT_9': ['system', 'systembody']}
{'ADTEXT_9_INTRO': ['name', 'systembody', 'system', 'cash']}
{'ADTEXT_9_INTRO': ['name', 'system', 'systembody', 'cash']}
{'DROP_OFF_DATA': ['location', 'date']}
{'DROP_OFF_DATA': ['date', 'location']}
{'SCAN_DETAILS': ['type', 'body', 'coverage', 'resolution']}
{'SCAN_DETAILS': ['body', 'type', 'coverage', 'resolution']}

Checking file: data/lang/module-scout/el.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-scout/tr.json FAIL:
{'ADTEXT_1_INTRO': ['name', 'systembody', 'system', 'dist', 'cash']}
{'ADTEXT_1_INTRO': ['name', 'dist', 'system', 'systembody', 'cash']}
{'ADTEXT_2_INTRO': ['name', 'cash', 'systembody', 'system', 'dist']}
{'ADTEXT_2_INTRO': ['name', 'dist', 'system', 'systembody', 'cash']}
{'ADTEXT_3_INTRO': ['name', 'cash', 'systembody', 'system', 'dist']}
{'ADTEXT_3_INTRO': ['name', 'dist', 'system', 'systembody', 'cash']}
{'ADTEXT_5_INTRO': ['name', 'cash', 'systembody', 'system', 'dist']}
{'ADTEXT_5_INTRO': ['name', 'dist', 'system', 'systembody', 'cash']}
{'ADTEXT_6_INTRO': ['name', 'system', 'cash', 'systembody']}
{'ADTEXT_6_INTRO': ['name', 'system', 'systembody', 'cash']}
{'ADTEXT_7_INTRO': ['name', 'cash', 'systembody']}
{'ADTEXT_7_INTRO': ['name', 'systembody', 'cash']}
{'ADTEXT_9': ['systembody', 'system']}
{'ADTEXT_9': ['system', 'systembody']}
{'ADTEXT_9_INTRO': ['name', 'systembody', 'system', 'cash']}
{'ADTEXT_9_INTRO': ['name', 'system', 'systembody', 'cash']}
{'DROP_OFF_DATA': ['location', 'date']}
{'DROP_OFF_DATA': ['date', 'location']}
{'SCAN_DETAILS': ['type', 'body', 'coverage', 'resolution']}
{'SCAN_DETAILS': ['body', 'type', 'coverage', 'resolution']}

Checking file: data/lang/module-scoop/fr.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-scoop/de.json FAIL:
{'INTROTEXT_RESCUE': ['client', 'cash', 'planet']}
{'INTROTEXT_RESCUE': ['client', 'planet', 'cash']}

Checking file: data/lang/module-scoop/zh.json FAIL:
{'INTROTEXT_ARMS_DEALER': ['client', 'planet', 'shipid', 'star', 'cash']}
{'INTROTEXT_ARMS_DEALER': ['client', '星球', 'star', 'shipid', 'cash']}
{'INTROTEXT_LEGAL_GOODS': ['client', 'planet', 'cash']}
{'INTROTEXT_LEGAL_GOODS': ['client', 'planet']}
{'SHIP_DESTROYED': ['shipid', 'station']}
{'SHIP_DESTROYED': ['shipid']}

Checking file: data/lang/module-scoop/tr.json FAIL:
{'INTROTEXT_ARMS_DEALER': ['client', 'planet', 'shipid', 'star', 'cash']}
{'INTROTEXT_ARMS_DEALER': ['client', 'planet', 'star', 'shipid', 'cash']}

Checking file: data/lang/ui-core/pt_BR.json FAIL:
{'CABIN_FREE': ['amount']}
{'CABIN_FREE': ['quantia']}
{'CABIN_USED': ['amount']}
{'CABIN_USED': ['quantia']}
{'CARGO_T_FREE': ['amount']}
{'CARGO_T_FREE': ['quantia']}
{'CARGO_T_USED': ['amount']}
{'CARGO_T_USED': ['quantia']}
{'CASH_N': ['money']}
{'CASH_N': ['dinheiro']}
{'HULL_REPAIRED_BY_NAME_NOW_AT_N_PERCENT': ['name', 'repairPercent']}
{'HULL_REPAIRED_BY_NAME_NOW_AT_N_PERCENT': ['nome', 'Percentualreparo']}
{'NOT_SUPPORTED_ON_THIS_SHIP': ['equipment']}
{'NOT_SUPPORTED_ON_THIS_SHIP': ['equipamento']}
{'N_UNOCCUPIED_PASSENGER_CABINS': ['quantity']}
{'N_UNOCCUPIED_PASSENGER_CABINS': ['quantidade']}
{'PAY_FINE_OF_N': ['amount']}
{'PAY_FINE_OF_N': ['quantia']}
{'PILOT_SEAT_IS_NOW_OCCUPIED_BY_NAME': ['name']}
{'PILOT_SEAT_IS_NOW_OCCUPIED_BY_NAME': ['nome']}
{'REPAIR_X_HULL_DAMAGE_FOR_X': ['damage', 'price']}
{'REPAIR_X_HULL_DAMAGE_FOR_X': ['dano', 'preço']}
{'YOUR_HULL_IS_AT_X_INTEGRITY': ['value']}
{'YOUR_HULL_IS_AT_X_INTEGRITY': ['valor']}

Checking file: data/lang/ui-core/gd.json FAIL:
{'STATION_ORBIT': ['orbit_period', 'parent_body']}
{'STATION_ORBIT': ['parent_body', 'orbit_period']}

Checking file: data/lang/ui-core/ar.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/ui-core/hu.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/ui-core/fr.json FAIL:
{'TRADING_FROM': ['system']}
{'TRADING_FROM': ['système']}
{'TRADING_TO': ['system']}
{'TRADING_TO': ['système']}

Checking file: data/lang/ui-core/it.json FAIL:
{'STATION_ORBIT': ['orbit_period', 'parent_body']}
{'STATION_ORBIT': ['parent_body', 'orbit_peiod']}

Checking file: data/lang/ui-core/de.json FAIL:
{'STATION_ORBIT': ['orbit_period', 'parent_body']}
{'STATION_ORBIT': ['parent_body', 'orbit_period']}

Checking file: data/lang/ui-core/pt.json FAIL:
{'N_LIGHT_YEARS_N_MAX': ['range', 'maxRange']}
{'N_LIGHT_YEARS_N_MAX': ['alcance', 'Alcancemáximo']}
{'N_OCCUPIED_PASSENGER_CABINS': ['quantity']}
{'N_OCCUPIED_PASSENGER_CABINS': ['quantidade']}

Checking file: data/lang/ui-core/da.json FAIL:
{'NOT_ENOUGH_ALLOY_TO_ATTEMPT_A_REPAIR': ['alloy']}
{'NOT_ENOUGH_ALLOY_TO_ATTEMPT_A_REPAIR': ['metallegering']}

Checking file: data/lang/ui-core/pl.json FAIL:
{'FLIGHTLOG_LANDED': ['primary_info', 'secondary_info', 'tertiary_info']}
{'FLIGHTLOG_LANDED': ['primary_info', '{secondary_info']}

Checking file: data/lang/ui-core/zh.json FAIL:
{'FLIGHTLOG_LANDED': ['primary_info', 'secondary_info', 'tertiary_info']}
{'FLIGHTLOG_LANDED': ['primary', 'secondary_info', 'tertiary_info']}
{'HUD_HYPERSPACING_TO_N_IN_N_SECONDS': ['destination', 'countdown']}
{'HUD_HYPERSPACING_TO_N_IN_N_SECONDS': ['countdown', 'destination']}
{'LOCATED_N_KM_FROM_THE_CENTRE_OF_NAME': ['distance', 'name']}
{'LOCATED_N_KM_FROM_THE_CENTRE_OF_NAME': ['name', 'distance']}
{'REPAIR_X_HULL_DAMAGE_FOR_X': ['damage', 'price']}
{'REPAIR_X_HULL_DAMAGE_FOR_X': ['price', 'damage']}

Checking file: data/lang/ui-core/tr.json FAIL:
{'FLIGHTLOG_STARPORT_ORBITAL': ['primary_info', 'secondary_info']}
{'FLIGHTLOG_STARPORT_ORBITAL': ['secondary_info', 'primary_info']}
{'FLIGHTLOG_STARPORT_SURFACE': ['primary_info', 'secondary_info']}
{'FLIGHTLOG_STARPORT_SURFACE': ['secondary_info', 'primary_info']}
{'HUD_HYPERSPACING_TO_N_IN_N_SECONDS': ['destination', 'countdown']}
{'HUD_HYPERSPACING_TO_N_IN_N_SECONDS': ['countdown', 'destination']}
{'LOCATED_N_KM_FROM_THE_CENTRE_OF_NAME': ['distance', 'name']}
{'LOCATED_N_KM_FROM_THE_CENTRE_OF_NAME': ['name', 'distance']}
{'MARKET_BUYLINE': ['amount', 'price']}
{'MARKET_BUYLINE': ['price', 'amount']}
{'MARKET_SELLINE': ['amount', 'price']}
{'MARKET_SELLINE': ['price', 'amount']}
{'STATION_ORBIT': ['orbit_period', 'parent_body']}
{'STATION_ORBIT': ['parent_body', 'orbit_period']}
{'THIS_IS_FACTION_POLICE': ['faction_police', 'faction']}
{'THIS_IS_FACTION_POLICE': ['faction', 'faction_police']}

Checking file: data/lang/ui-core/bg.json FAIL:
{'HULL_REPAIRED_BY_NAME_NOW_AT_N_PERCENT': ['name', 'repairPercent']}
{'HULL_REPAIRED_BY_NAME_NOW_AT_N_PERCENT': ['repairPercent', 'name']}

Checking file: data/lang/ui-core/ja.json FAIL:
{'FLIGHTLOG_STARPORT_ORBITAL': ['primary_info', 'secondary_info']}
{'FLIGHTLOG_STARPORT_ORBITAL': ['secondary_info', 'primary_info']}
{'FLIGHTLOG_STARPORT_SURFACE': ['primary_info', 'secondary_info']}
{'FLIGHTLOG_STARPORT_SURFACE': ['secondary_info', 'primary_info']}
{'HUD_HYPERSPACING_TO_N_IN_N_SECONDS': ['destination', 'countdown']}
{'HUD_HYPERSPACING_TO_N_IN_N_SECONDS': ['countdown', 'destination']}
{'LOCATED_N_KM_FROM_THE_CENTRE_OF_NAME': ['distance', 'name']}
{'LOCATED_N_KM_FROM_THE_CENTRE_OF_NAME': ['name', 'distance']}
{'MARKET_BUYLINE': ['amount', 'price']}
{'MARKET_BUYLINE': ['price', 'amount']}
{'MARKET_SELLINE': ['amount', 'price']}
{'MARKET_SELLINE': ['price', 'amount']}
{'REPAIR_X_HULL_DAMAGE_FOR_X': ['damage', 'price']}
{'REPAIR_X_HULL_DAMAGE_FOR_X': ['price', 'damage']}
{'STATION_ORBIT': ['orbit_period', 'parent_body']}
{'STATION_ORBIT': ['parent_body', 'orbit_period']}
{'THIS_IS_FACTION_POLICE': ['faction_police', 'faction']}
{'THIS_IS_FACTION_POLICE': ['faction', 'faction_police']}

Checking file: data/lang/ui-core/sv.json FAIL:
{'PLEASE_REPORT_THIS_ERROR': ['path']}
{'PLEASE_REPORT_THIS_ERROR': ['path', 'path']}

Checking file: data/lang/ui-core/ru.json FAIL:
{'STATION_ORBIT': ['orbit_period', 'parent_body']}
{'STATION_ORBIT': ['parent_body', 'orbit_period']}

Checking file: data/lang/module-combat/hu.json FAIL:
{'HARVESTING_2': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'org', 'cash', 'area', 'area', 'dist']}
{'HARVESTING_2': ['system', 'area', 'sectorx', 'sectory', 'sectorz', 'org', 'cash', 'area', 'area', 'dist']}
{'MILITARY_1': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'area', 'dist']}
{'MILITARY_1': ['system', 'area', 'sectorx', 'sectory', 'sectorz', 'cash', 'area', 'dist']}
{'MILITARY_2': ['system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'area']}
{'MILITARY_2': ['cash', 'area', 'system', 'sectorx', 'sectory', 'sectorz']}
{'MILITARY_3': ['mission', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'MILITARY_3': ['mission', 'sectorx', 'sectorz', 'dist', 'cash']}
{'MILITARY_IT_MUST_BE_COMPLETED_BY': ['area', 'date']}
{'MILITARY_IT_MUST_BE_COMPLETED_BY': ['date']}
{'MINING_1': ['org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'system', 'dist']}
{'MINING_1': ['org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'MINING_3': ['org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'mission', 'area', 'dist']}
{'MINING_3': ['org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'mission']}
{'POLICE_1': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'area']}
{'POLICE_1': ['system', 'area', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'POLICE_2': ['org', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'dist']}
{'POLICE_2': ['org', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'area', 'dist']}

Checking file: data/lang/module-combat/fr.json FAIL:
{'HARVESTING_3': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'system', 'dist', 'cash']}
{'HARVESTING_3': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'système', 'dist', 'cash']}

Checking file: data/lang/module-combat/it.json FAIL:
{'ADTEXT_5': ['mission', 'cash']}
{'ADTEXT_5': ['missione', 'cash']}
{'POLICE_3': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'POLICE_3': ['area', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}

Checking file: data/lang/module-combat/de.json FAIL:
{'MINING_1': ['org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'system', 'dist']}
{'MINING_1': ['org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'POLICE_1': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'area']}
{'POLICE_1': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'area']}

Checking file: data/lang/module-combat/pl.json FAIL:
{'HARVESTING_2': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'org', 'cash', 'area', 'area', 'dist']}
{'HARVESTING_2': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'org', 'cash', 'area', 'dist']}
{'MEET_ME_THERE': ['rendezvous']}
{'MEET_ME_THERE': ['randezvous']}
{'MINING_1': ['org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'system', 'dist']}
{'MINING_1': ['org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'systemu', 'dist']}
{'MINING_IT_MUST_BE_COMPLETED_BY': ['area', 'date']}
{'MINING_IT_MUST_BE_COMPLETED_BY': ['area', 'date|']}
{'POLICE_1': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'area']}
{'POLICE_1': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash na misję w {area']}
{'POLICE_2': ['org', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'dist']}
{'POLICE_2': ['org', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'area). Potrzebujesz hipernapędu zdolnego pokonać odległość {dist']}

Checking file: data/lang/module-combat/zh.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-combat/el.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-combat/tr.json FAIL:
{'HARVESTING_1': ['org', 'cash', 'mission', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'dist']}
{'HARVESTING_1': ['org', 'system', 'sectorx', 'sectory', 'sectorz', 'mission', 'cash', 'area', 'dist']}
{'HARVESTING_2': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'org', 'cash', 'area', 'area', 'dist']}
{'HARVESTING_2': ['system', 'sectorx', 'sectory', 'sectorz', 'area', 'org', 'area', 'cash', 'area', 'dist']}
{'HARVESTING_3': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'system', 'dist', 'cash']}
{'HARVESTING_3': ['system', 'sectorx', 'sectory', 'sectorz', 'area', 'system', 'dist', 'cash']}
{'MILITARY_1': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'area', 'dist']}
{'MILITARY_1': ['system', 'sectorx', 'sectory', 'sectorz', 'area', 'cash', 'area', 'dist']}
{'MILITARY_2': ['system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'area']}
{'MILITARY_2': ['dist', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'cash']}
{'MILITARY_3': ['mission', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'MILITARY_3': ['dist', 'system', 'sectorx', 'sectory', 'sectorz', 'mission', 'cash']}
{'MINING_1': ['org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'system', 'dist']}
{'MINING_1': ['org', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'cash', 'system', 'dist']}
{'MINING_2': ['org', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'area', 'cash']}
{'MINING_2': ['org', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'area']}
{'MINING_3': ['org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'mission', 'area', 'dist']}
{'MINING_3': ['org', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'mission', 'cash', 'area', 'dist']}
{'POLICE_1': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'area']}
{'POLICE_1': ['dist', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'area', 'cash']}
{'POLICE_2': ['org', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'dist']}
{'POLICE_2': ['org', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'area', 'dist']}
{'POLICE_3': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'POLICE_3': ['system', 'sectorx', 'sectory', 'sectorz', 'area', 'dist', 'cash']}

Checking file: data/lang/module-combat/sv.json FAIL:
{'HARVESTING_2': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'org', 'cash', 'area', 'area', 'dist']}
{'HARVESTING_2': ['area', 'system', 'sectorx', 'sector', 'sectorz', 'org', 'cash', 'area', 'area', 'dist']}
{'POLICE_3': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'POLICE_3': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'distans', 'cash']}

Checking file: data/lang/module-combat/nl.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-combat/cs.json FAIL:
{'MINING_2': ['org', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'area', 'cash']}
{'MINING_2': ['org', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'area']}

Checking file: data/lang/module-combat/ru.json FAIL:
{'HARVESTING_1': ['org', 'cash', 'mission', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'dist']}
{'HARVESTING_1': ['Org', 'cash', 'mission', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'dist']}
{'HARVESTING_2': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'org', 'cash', 'area', 'area', 'dist']}
{'HARVESTING_2': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'Org', 'cash', 'area', 'dist']}
{'HARVESTING_3': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'system', 'dist', 'cash']}
{'HARVESTING_3': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'MINING_1': ['org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'system', 'dist']}
{'MINING_1': ['Org', 'area', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'system', 'dist']}
{'MINING_2': ['org', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'area', 'cash']}
{'MINING_2': ['org', 'system', 'sectorx', 'sectory', 'dist', 'cash', 'area']}
{'POLICE_1': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'area']}
{'POLICE_1': ['area', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'POLICE_2': ['org', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'dist']}
{'POLICE_2': ['Org', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'area', 'dist']}

Checking file: data/lang/module-deliverpackage/pt_BR.json FAIL:
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_0_INTROTEXT': ['nome', 'dinheiro', 'porto estelar', 'sistema', 'setorx', 'setory', 'setorz', 'distância']}
{'FLAVOUR_1_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_1_INTROTEXT': ['nome', 'dinheiro', 'porto estelar', 'sistema', 'setorx', 'setory', 'setorz', 'distância']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_2_INTROTEXT': ['nome', 'dinheiro', 'porto estelar', 'sistema', 'setorx', 'setory', 'setorz', 'distância']}
{'FLAVOUR_3_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_3_INTROTEXT': ['nome', 'dinheiro', 'porto estelar', 'sistema', 'setorx', 'setory', 'setorz', 'distância']}
{'FLAVOUR_4_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_4_INTROTEXT': ['nome', 'dinheiro', 'porto estelar', 'sistema', 'setorx', 'setory', 'setorz', 'distância']}
{'FLAVOUR_5_INTROTEXT': ['name', 'cash', 'starport']}
{'FLAVOUR_5_INTROTEXT': ['nome', 'dinheiro', 'porto estelar']}
{'FLAVOUR_6_INTROTEXT': ['name', 'cash', 'starport']}
{'FLAVOUR_6_INTROTEXT': ['nome', 'dinheiro', 'porto estelar']}
{'FLAVOUR_7_INTROTEXT': ['starport', 'cash']}
{'FLAVOUR_7_INTROTEXT': ['porto estelar', 'dinheiro']}
{'FLAVOUR_8_INTROTEXT': ['name', 'starport', 'cash']}
{'FLAVOUR_8_INTROTEXT': ['nome', 'porto estelar', 'dinheiro']}
{'FLAVOUR_9_INTROTEXT': ['starport', 'cash']}
{'FLAVOUR_9_INTROTEXT': ['porto estelar', 'dinheiro']}
{'PIRATE_TAUNTS_0': ['client']}
{'PIRATE_TAUNTS_0': ['cliente']}
{'PIRATE_TAUNTS_2': ['client']}
{'PIRATE_TAUNTS_2': ['cliente']}
{'PIRATE_TAUNTS_6': ['client']}
{'PIRATE_TAUNTS_6': ['cliente']}
{'PIRATE_TAUNTS_8': ['location']}
{'PIRATE_TAUNTS_8': ['local']}

Checking file: data/lang/module-deliverpackage/pt.json FAIL:
{'PIRATE_TAUNTS_0': ['client']}
{'PIRATE_TAUNTS_0': ['cliente']}

Checking file: data/lang/module-deliverpackage/zh.json FAIL:
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'starport']}
{'FLAVOUR_1_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_1_INTROTEXT': ['name', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'dist']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'dist']}
{'FLAVOUR_3_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_3_INTROTEXT': ['name', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'dist']}
{'FLAVOUR_4_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_4_INTROTEXT': ['name', 'cash', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'dist']}
{'FLAVOUR_5_INTROTEXT': ['name', 'cash', 'starport']}
{'FLAVOUR_5_INTROTEXT': ['name', 'starport', 'cash']}

Checking file: data/lang/module-deliverpackage/id.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-deliverpackage/tr.json FAIL:
{'FLAVOUR_0_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_0_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cash']}
{'FLAVOUR_1_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_1_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cash']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_2_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cash']}
{'FLAVOUR_3_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_3_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cash']}
{'FLAVOUR_4_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_4_INTROTEXT': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['name', 'cash', 'starport']}
{'FLAVOUR_5_INTROTEXT': ['name', 'starport', 'cash']}
{'FLAVOUR_6_INTROTEXT': ['name', 'cash', 'starport']}
{'FLAVOUR_6_INTROTEXT': ['name', 'starport', 'cash']}

Checking file: data/lang/module-deliverpackage/sv.json FAIL:
{'FLAVOUR_1_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_1_INTROTEXT': ['name', 'cash', 'starport', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_2_INTROTEXT': ['name', 'cash', 'starport', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_3_INTROTEXT': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_3_INTROTEXT': ['name', 'cash', 'starport', 'sectorx', 'sectory', 'sectorz', 'dist']}

Checking file: data/lang/module-soldout/hu.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-soldout/zh.json FAIL:
{'MESSAGE': ['name', 'commodity', 'price']}
{'MESSAGE': ['name', 'commodity']}

Checking file: data/lang/module-soldout/cs.json FAIL:
{'NOT_IN_STOCK': ['commodity']}
{'NOT_IN_STOCK': ['komodity']}

Checking file: data/lang/module-searchrescue/gd.json FAIL:
{'ENTITY_FAMILY_BUSINESS_8': ['name', 'locality']}
{'ENTITY_FAMILY_BUSINESS_8': ['locality', 'name']}
{'FLAVOUR_4_INTROTEXT': ['starport', 'shiplabel', 'cash']}
{'FLAVOUR_4_INTROTEXT': ['shiplabel', 'starport', 'cash']}
{'FLAVOUR_7_INTROTEXT': ['name', 'entity', 'ship', 'shiplabel', 'crew', 'problem', 'cash']}
{'FLAVOUR_7_INTROTEXT': ['name', 'entity', 'ship', 'shiplabel', 'problem', 'crew', 'cash']}

Checking file: data/lang/module-searchrescue/hu.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-searchrescue/fr.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-searchrescue/de.json FAIL:
{'FLAVOUR_2_INTROTEXT': ['starport', 'shiplabel', 'cash']}
{'FLAVOUR_2_INTROTEXT': ['starport', 'cash']}

Checking file: data/lang/module-searchrescue/pl.json FAIL:
{'RESULT_DELIVERY_COMM': ['done', 'todo', 'cargotype']}
{'RESULT_DELIVERY_COMM': ['done', 'todo{ ton {cargotype']}
{'RESULT_PICKUP_COMM': ['done', 'todo', 'cargotype']}
{'RESULT_PICKUP_COMM': ['done', 'todo{ ton {cargotype']}

Checking file: data/lang/module-searchrescue/zh.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-searchrescue/el.json FAIL:
{'FLAVOUR_4_INTROTEXT': ['starport', 'shiplabel', 'cash']}
{'FLAVOUR_4_INTROTEXT': ['shiplabel', 'starport', 'cash']}

Checking file: data/lang/module-searchrescue/ga.json FAIL:
{'ENTITY_FAMILY_BUSINESS_8': ['name', 'locality']}
{'ENTITY_FAMILY_BUSINESS_8': ['locality', 'name']}
{'FLAVOUR_1_INTROTEXT': ['starport', 'ship', 'planet', 'starport', 'cash']}
{'FLAVOUR_1_INTROTEXT': ['starport', 'ship', 'planet', 'cash', 'starport']}
{'FLAVOUR_1_LOCATIONTEXT': ['planet', 'lat', 'long', 'shiplabel']}
{'FLAVOUR_1_LOCATIONTEXT': ['lat', 'long', 'planet', 'shiplabel']}

Checking file: data/lang/module-searchrescue/tr.json FAIL:
{'FLAVOUR_1_INTROTEXT': ['starport', 'ship', 'planet', 'starport', 'cash']}
{'FLAVOUR_1_INTROTEXT': ['starport', 'planet', 'ship', 'starport', 'cash']}
{'FLAVOUR_2_LOCATIONTEXT': ['lat', 'long', 'planet']}
{'FLAVOUR_2_LOCATIONTEXT': ['planet', 'lat', 'long']}
{'FLAVOUR_3_INTROTEXT': ['name', 'starport', 'shiplabel', 'starport']}
{'FLAVOUR_3_INTROTEXT': ['starport', 'name', 'starport', 'shiplabel']}
{'FLAVOUR_3_TYPEOFHELPTEXT': ['starport', 'starport']}
{'FLAVOUR_3_TYPEOFHELPTEXT': ['starport']}
{'FLAVOUR_4_INTROTEXT': ['starport', 'shiplabel', 'cash']}
{'FLAVOUR_4_INTROTEXT': ['shiplabel', 'starport', 'cash']}
{'FLAVOUR_5_INTROTEXT': ['starport', 'shiplabel', 'cash', 'starport']}
{'FLAVOUR_5_INTROTEXT': ['starport', 'shiplabel', 'starport', 'cash']}
{'FLAVOUR_6_INTROTEXT': ['name', 'entity', 'ship', 'shiplabel', 'problem', 'cash']}
{'FLAVOUR_6_INTROTEXT': ['entity', 'name', 'problem', 'ship', 'shiplabel', 'cash']}
{'FLAVOUR_6_LOCATIONTEXT': ['planet', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'FLAVOUR_6_LOCATIONTEXT': ['dist', 'system', 'sectorx', 'sectory', 'sectorz', 'planet']}
{'FLAVOUR_7_INTROTEXT': ['name', 'entity', 'ship', 'shiplabel', 'crew', 'problem', 'cash']}
{'FLAVOUR_7_INTROTEXT': ['entity', 'name', 'ship', 'shiplabel', 'problem', 'crew', 'cash']}
{'FLAVOUR_7_LOCATIONTEXT': ['system', 'sectorx', 'sectory', 'sectorz', 'dist', 'planet']}
{'FLAVOUR_7_LOCATIONTEXT': ['dist', 'system', 'sectorx', 'sectory', 'sectorz', 'planet']}
{'RESULT_DELIVERY_COMM': ['done', 'todo', 'cargotype']}
{'RESULT_DELIVERY_COMM': ['todo', 'cargotype', 'done']}
{'RESULT_DELIVERY_CREW': ['done', 'todo']}
{'RESULT_DELIVERY_CREW': ['todo', 'done']}
{'RESULT_DELIVERY_PASS': ['done', 'todo']}
{'RESULT_DELIVERY_PASS': ['todo', 'done']}
{'RESULT_PICKUP_COMM': ['done', 'todo', 'cargotype']}
{'RESULT_PICKUP_COMM': ['todo', 'cargotype', 'done']}
{'RESULT_PICKUP_CREW': ['done', 'todo']}
{'RESULT_PICKUP_CREW': ['todo', 'done']}
{'RESULT_PICKUP_PASS': ['done', 'todo']}
{'RESULT_PICKUP_PASS': ['todo', 'done']}

Checking file: data/lang/module-searchrescue/bg.json FAIL:
{'FLAVOUR_4_LOCATIONTEXT': ['planet', 'lat', 'long']}
{'FLAVOUR_4_LOCATIONTEXT': ['lat', 'long', 'planet']}
{'FLAVOUR_5_INTROTEXT': ['starport', 'shiplabel', 'cash', 'starport']}
{'FLAVOUR_5_INTROTEXT': ['starport', 'shiplabel', 'starport', 'cash']}
{'RESULT_DELIVERY_COMM': ['done', 'todo', 'cargotype']}
{'RESULT_DELIVERY_COMM': ['done', 'cargotype', 'todo']}
{'RESULT_PICKUP_COMM': ['done', 'todo', 'cargotype']}
{'RESULT_PICKUP_COMM': ['done', 'cargotype', 'todo']}

Checking file: data/lang/module-searchrescue/sv.json FAIL:
{'FLAVOUR_5_INTROTEXT': ['starport', 'shiplabel', 'cash', 'starport']}
{'FLAVOUR_5_INTROTEXT': ['starport', 'shiplabel', 'cach', 'starport']}
{'FLAVOUR_6_INTROTEXT': ['name', 'entity', 'ship', 'shiplabel', 'problem', 'cash']}
{'FLAVOUR_6_INTROTEXT': ['name', 'ship', 'shiplabel', 'problem', 'cash']}

Checking file: data/lang/module-searchrescue/cs.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-searchrescue/es.json FAIL:
{'ENTITY_FAMILY_BUSINESS_3': ['name', 'locality']}
{'ENTITY_FAMILY_BUSINESS_3': ['locality', 'name']}
{'ENTITY_FAMILY_BUSINESS_8': ['name', 'locality']}
{'ENTITY_FAMILY_BUSINESS_8': ['locality', 'name']}

Checking file: data/lang/module-searchrescue/ru.json FAIL:
{'ENTITY_FAMILY_BUSINESS_8': ['name', 'locality']}
{'ENTITY_FAMILY_BUSINESS_8': ['locality', 'name']}

Checking file: data/lang/module-crewcontracts/hu.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-cargorun/hu.json FAIL:
{'INTROTEXT_1': ['name', 'cash', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_1': ['name', 'cash', 'cargoname', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_2': ['name', 'cargoname', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}

Checking file: data/lang/module-cargorun/fr.json FAIL:
{'INTROTEXT_1': ['name', 'cash', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_1': ['name', 'cash', 'cargoname', 'starport', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_2': ['name', 'cargoname', 'starport', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'WHYSOMUCH_FLUFFY_1': ['cargoname', 'cargoname']}
{'WHYSOMUCH_FLUFFY_1': ['cargoname']}

Checking file: data/lang/module-cargorun/it.json FAIL:
{'INTROTEXT_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_2': ['Name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}

Checking file: data/lang/module-cargorun/de.json FAIL:
{'INTROTEXT_PICKUP_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz']}
{'INTROTEXT_PICKUP_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz']}

Checking file: data/lang/module-cargorun/pl.json FAIL:
{'INTROTEXT_EXPENSIVE_1': ['starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'INTROTEXT_EXPENSIVE_1': ['starport', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'INTROTEXT_INFRASTRUCTURE_1': ['name', 'system', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'system', 'dist']}
{'INTROTEXT_INFRASTRUCTURE_1': ['name', 'system', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'OFFER': ['amount', 'reward']}
{'OFFER': ['amount', 'amount']}

Checking file: data/lang/module-cargorun/ro.json FAIL:
{'INTROTEXT_MINING_1': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_MINING_1': ['name', 'cargoname', 'starport', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'WHYSOMUCH_FLUFFY_1': ['cargoname', 'cargoname']}
{'WHYSOMUCH_FLUFFY_1': ['cargoname']}

Checking file: data/lang/module-cargorun/zh.json FAIL:
{'INTROTEXT_1': ['name', 'cash', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_1': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'starport', 'cash', 'dist']}
{'INTROTEXT_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_2': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'starport', 'dist', 'cash']}
{'INTROTEXT_3': ['name', 'name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'INTROTEXT_3': ['name', 'name', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'starport', 'dist', 'cash']}
{'INTROTEXT_EXPENSIVE_1': ['starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'INTROTEXT_EXPENSIVE_1': ['system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cash', 'dist']}
{'INTROTEXT_FLUFFY_1': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_FLUFFY_1': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'starport', 'dist', 'cash']}
{'INTROTEXT_INFRASTRUCTURE_1': ['name', 'system', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'system', 'dist']}
{'INTROTEXT_INFRASTRUCTURE_1': ['name', 'system', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'cash', 'system', 'dist']}
{'INTROTEXT_LOCAL_1': ['name', 'starport', 'cash', 'cargoname', 'starport']}
{'INTROTEXT_LOCAL_1': ['name', 'starport', 'cargoname', 'starport', 'cash']}
{'INTROTEXT_LOCAL_2': ['name', 'cash', 'cargoname', 'starport']}
{'INTROTEXT_LOCAL_2': ['name', 'starport', 'cash', 'cargoname']}
{'INTROTEXT_MINING_1': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_MINING_1': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'starport', 'dist', 'cash']}
{'INTROTEXT_PICKUP_1': ['name', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz', 'cash', 'system', 'dist']}
{'INTROTEXT_PICKUP_1': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz', 'system', 'dist', 'cash']}
{'INTROTEXT_PICKUP_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz']}
{'INTROTEXT_PICKUP_2': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'cash', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz', 'dom_starport']}
{'INTROTEXT_PICKUP_LOCAL_1': ['name', 'cash', 'cargoname', 'starport', 'dom_starport']}
{'INTROTEXT_PICKUP_LOCAL_1': ['name', 'carportame', 'starport', 'dom_starport', 'cash']}
{'INTROTEXT_PICKUP_LOCAL_2': ['name', 'cash', 'cargoname', 'starport', 'dom_starport']}
{'INTROTEXT_PICKUP_LOCAL_2': ['name', 'cash', 'carportame', 'starport', 'dom_starport']}
{'INTROTEXT_WEDDING_1': ['starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'dist', 'cash']}
{'INTROTEXT_WEDDING_1': ['system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'cash']}
{'INTROTEXT_WHOLESALER_1': ['name', 'system', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_WHOLESALER_1': ['name', 'system', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cash', 'dist']}
{'INTROTEXT_WHOLESALER_2': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_WHOLESALER_2': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cash', 'dist']}

Checking file: data/lang/module-cargorun/el.json FAIL:
{'INTROTEXT_PICKUP_1': ['name', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz', 'cash', 'system', 'dist']}
{'INTROTEXT_PICKUP_1': ['name', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz', 'cash', 'system', 'dist']}
{'INTROTEXT_PICKUP_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz']}
{'INTROTEXT_PICKUP_2': ['name', 'cargoname', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz']}

Checking file: data/lang/module-cargorun/ga.json FAIL:
{'INTROTEXT_EXPENSIVE_1': ['starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'INTROTEXT_EXPENSIVE_1': ['starport', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_INFRASTRUCTURE_1': ['name', 'system', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'system', 'dist']}
{'INTROTEXT_INFRASTRUCTURE_1': ['name', 'system', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}

Checking file: data/lang/module-cargorun/tr.json FAIL:
{'INTROTEXT_1': ['name', 'cash', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_1': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'cash']}
{'INTROTEXT_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_2': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'cash']}
{'INTROTEXT_3': ['name', 'name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'INTROTEXT_3': ['name', 'name', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'dist', 'cash']}
{'INTROTEXT_EXPENSIVE_1': ['starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'INTROTEXT_EXPENSIVE_1': ['system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cash', 'dist']}
{'INTROTEXT_FLUFFY_1': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_FLUFFY_1': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'dist', 'cash']}
{'INTROTEXT_INFRASTRUCTURE_1': ['name', 'system', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'system', 'dist']}
{'INTROTEXT_INFRASTRUCTURE_1': ['name', 'system', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'cash', 'system', 'dist']}
{'INTROTEXT_LOCAL_1': ['name', 'starport', 'cash', 'cargoname', 'starport']}
{'INTROTEXT_LOCAL_1': ['name', 'starport', 'starport', 'cargoname', 'cash']}
{'INTROTEXT_LOCAL_2': ['name', 'cash', 'cargoname', 'starport']}
{'INTROTEXT_LOCAL_2': ['name', 'starport', 'cargoname', 'cash']}
{'INTROTEXT_LOCAL_3': ['name', 'cargoname', 'starport', 'cash']}
{'INTROTEXT_LOCAL_3': ['name', 'starport', 'cargoname', 'cash']}
{'INTROTEXT_MINING_1': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_MINING_1': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'cash']}
{'INTROTEXT_PICKUP_1': ['name', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz', 'cash', 'system', 'dist']}
{'INTROTEXT_PICKUP_1': ['name', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz', 'dom_starport', 'system', 'dist', 'cash']}
{'INTROTEXT_PICKUP_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz']}
{'INTROTEXT_PICKUP_2': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'cash', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz']}
{'INTROTEXT_PICKUP_LOCAL_1': ['name', 'cash', 'cargoname', 'starport', 'dom_starport']}
{'INTROTEXT_PICKUP_LOCAL_1': ['name', 'starport', 'dom_starport', 'cargoname', 'cash']}
{'INTROTEXT_PICKUP_LOCAL_2': ['name', 'cash', 'cargoname', 'starport', 'dom_starport']}
{'INTROTEXT_PICKUP_LOCAL_2': ['name', 'starport', 'dom_starport', 'cargoname', 'cash']}
{'INTROTEXT_WEDDING_1': ['starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'dist', 'cash']}
{'INTROTEXT_WEDDING_1': ['system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'dist', 'cash']}
{'INTROTEXT_WHOLESALER_1': ['name', 'system', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_WHOLESALER_1': ['name', 'system', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cash']}
{'INTROTEXT_WHOLESALER_2': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_WHOLESALER_2': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cash']}
{'OFFER': ['amount', 'reward']}
{'OFFER': ['reward', 'amount']}
{'OK_WE_AGREE': ['amount', 'reward']}
{'OK_WE_AGREE': ['reward', 'amount']}

Checking file: data/lang/module-cargorun/ja.json FAIL:
{'HOWMUCH_WHOLESALER_1': ['amount', 'cargoname']}
{'HOWMUCH_WHOLESALER_1': ['cargoname', 'amount']}
{'INTROTEXT_1': ['name', 'cash', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_1': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'cash']}
{'INTROTEXT_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_2': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'cash']}
{'INTROTEXT_3': ['name', 'name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'INTROTEXT_3': ['name', 'name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'dist', 'cash']}
{'INTROTEXT_MINING_1': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_MINING_1': ['name', 'dist', 'system', 'sectorx', 'sectory', 'sectorz', 'starport', 'cargoname', 'cash']}

Checking file: data/lang/module-cargorun/cs.json FAIL:
{'INTROTEXT_3': ['name', 'name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'INTROTEXT_3': ['name', 'name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_PICKUP_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz']}
{'INTROTEXT_PICKUP_2': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash', 'cargoname', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz']}

Checking file: data/lang/module-cargorun/es.json FAIL:
{'ADTEXT_LOCAL_1': ['starport']}
{'ADTEXT_LOCAL_1': ['starport', 'starport']}
{'INTROTEXT_EXPENSIVE_1': ['starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'INTROTEXT_EXPENSIVE_1': ['system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}

Checking file: data/lang/module-cargorun/ru.json FAIL:
{'INTROTEXT_EXPENSIVE_1': ['starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'dist']}
{'INTROTEXT_EXPENSIVE_1': ['cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_INFRASTRUCTURE_1': ['name', 'system', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cash', 'system', 'dist']}
{'INTROTEXT_INFRASTRUCTURE_1': ['name', 'system', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist', 'cash']}
{'INTROTEXT_PICKUP_1': ['name', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'cargoname', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz', 'cash', 'system', 'dist']}
{'INTROTEXT_PICKUP_1': ['name', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dom_starport', 'dom_system', 'dom_sectorx', 'dom_sectory', 'dom_sectorz', 'cash', 'system', 'dist']}
{'INTROTEXT_WHOLESALER_1': ['name', 'system', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_WHOLESALER_1': ['name', 'system', 'cash', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_WHOLESALER_2': ['name', 'cash', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}
{'INTROTEXT_WHOLESALER_2': ['name', 'cash', 'cargoname', 'starport', 'system', 'sectorx', 'sectory', 'sectorz', 'dist']}

Checking file: data/lang/quitconfirmation-core/pt_BR.json FAIL:
{'MSG_5': ['no', 'yes']}
{'MSG_5': ['no', 'sim']}

Checking file: data/lang/quitconfirmation-core/hu.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/quitconfirmation-core/de.json FAIL:
{'MSG_10': ['no']}
{'MSG_10': ['nein']}
{'MSG_8': ['no']}
{'MSG_8': ['nein']}

Checking file: data/lang/quitconfirmation-core/pl.json FAIL:
{'MSG_12': ['no', 'yes']}
{'MSG_12': ['no', 'tak']}

Checking file: data/lang/quitconfirmation-core/zh.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-newseventcommodity/pt_BR.json FAIL:
{'FLAVOUR_0_HEADLINE': ['date', 'system']}
{'FLAVOUR_0_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_0_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_0_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_10_HEADLINE': ['date', 'system']}
{'FLAVOUR_10_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_10_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_10_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_11_HEADLINE': ['date', 'system']}
{'FLAVOUR_11_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_11_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_11_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_12_HEADLINE': ['date', 'system']}
{'FLAVOUR_12_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_12_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_12_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_13_HEADLINE': ['date', 'system']}
{'FLAVOUR_13_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_15_HEADLINE': ['date', 'system']}
{'FLAVOUR_15_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_15_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_15_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_16_HEADLINE': ['date', 'system']}
{'FLAVOUR_16_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_17_HEADLINE': ['date', 'system']}
{'FLAVOUR_17_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_17_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_17_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_18_HEADLINE': ['date', 'system']}
{'FLAVOUR_18_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_18_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_18_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_19_HEADLINE': ['date', 'system']}
{'FLAVOUR_19_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_19_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_19_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_1_HEADLINE': ['date', 'system']}
{'FLAVOUR_1_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_1_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_1_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_20_HEADLINE': ['date', 'system']}
{'FLAVOUR_20_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_20_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_20_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_21_HEADLINE': ['date', 'system']}
{'FLAVOUR_21_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_21_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_21_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_22_HEADLINE': ['date', 'system']}
{'FLAVOUR_22_HEADLINE': ['datas', 'sistema']}
{'FLAVOUR_22_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_22_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_23_HEADLINE': ['date', 'system']}
{'FLAVOUR_23_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_2_HEADLINE': ['date', 'system']}
{'FLAVOUR_2_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_2_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_2_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_3_HEADLINE': ['date', 'system']}
{'FLAVOUR_3_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_3_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_3_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_4_HEADLINE': ['date', 'system']}
{'FLAVOUR_4_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_4_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_4_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_5_HEADLINE': ['date', 'system']}
{'FLAVOUR_5_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_6_HEADLINE': ['date', 'system']}
{'FLAVOUR_6_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_6_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_6_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_7_HEADLINE': ['date', 'system']}
{'FLAVOUR_7_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_7_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_7_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_8_HEADLINE': ['date', 'system']}
{'FLAVOUR_8_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_8_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_8_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'FLAVOUR_9_HEADLINE': ['date', 'system']}
{'FLAVOUR_9_HEADLINE': ['data', 'sistema']}
{'FLAVOUR_9_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_9_NEWSBODY': ['sistema', 'setorx', 'setory', 'setorz']}
{'GRATEFUL_GREETING_1': ['cargo']}
{'GRATEFUL_GREETING_1': ['carga']}
{'GRATEFUL_GREETING_2': ['cargo']}
{'GRATEFUL_GREETING_2': ['carga']}
{'GRATEFUL_GREETING_3': ['cargo']}
{'GRATEFUL_GREETING_3': ['carga']}
{'GRATEFUL_GREETING_4': ['cargo']}
{'GRATEFUL_GREETING_4': ['carga']}
{'GRATEFUL_GREETING_5': ['cargo']}
{'GRATEFUL_GREETING_5': ['carga']}
{'TITLE_0': ['newspaper']}
{'TITLE_0': ['jornal']}
{'TITLE_1': ['newspaper']}
{'TITLE_1': ['jornal']}
{'TITLE_2': ['newspaper']}
{'TITLE_2': ['jornal']}
{'TITLE_3': ['newspaper']}
{'TITLE_3': ['jornal']}
{'TITLE_4': ['newspaper']}
{'TITLE_4': ['jornal']}

Checking file: data/lang/module-newseventcommodity/fr.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-newseventcommodity/it.json FAIL:
{'FLAVOUR_16_HEADLINE': ['date', 'system']}
{'FLAVOUR_16_HEADLINE': ['data', 'system']}
{'FLAVOUR_19_HEADLINE': ['date', 'system']}
{'FLAVOUR_19_HEADLINE': ['data', 'system']}
{'FLAVOUR_7_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_7_NEWSBODY': ['system']}

Checking file: data/lang/module-newseventcommodity/da.json FAIL:
{'FLAVOUR_2_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_2_NEWSBODY': ['system] ({sectorx', 'sectory', 'sectorz']}

Checking file: data/lang/module-newseventcommodity/zh.json FAIL:
{'FLAVOUR_11_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_11_NEWSBODY': ['system']}
{'FLAVOUR_13_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_13_NEWSBODY': ['system', 'sectorx', 'sectorz', 'sectorz']}
{'FLAVOUR_16_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_16_NEWSBODY': ['system', 'sectorx', 'sectorz', 'sectorz']}
{'FLAVOUR_22_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_22_NEWSBODY': ['system']}
{'FLAVOUR_5_HEADLINE': ['date', 'system']}
{'FLAVOUR_5_HEADLINE': ['system']}

Checking file: data/lang/module-newseventcommodity/sv.json FAIL:
{'FLAVOUR_13_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_13_NEWSBODY': ['system', 'sector', 'sector', 'sector']}
{'FLAVOUR_16_HEADLINE': ['date', 'system']}
{'FLAVOUR_16_HEADLINE': ['date']}
{'FLAVOUR_6_HEADLINE': ['date', 'system']}
{'FLAVOUR_6_HEADLINE': ['date']}
{'FLAVOUR_7_HEADLINE': ['date', 'system']}
{'FLAVOUR_7_HEADLINE': ['datum', 'system']}

Checking file: data/lang/module-newseventcommodity/nl.json FAIL:
{'TITLE_0': ['newspaper']}
{'TITLE_0': ['newpaper']}

Checking file: data/lang/module-newseventcommodity/cs.json FAIL:
{'FLAVOUR_21_HEADLINE': ['date', 'system']}
{'FLAVOUR_21_HEADLINE': ['date', 'systému']}
{'FLAVOUR_21_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_21_NEWSBODY': ['systém', 'sectorx', 'sectory', 'sectorz']}

Checking file: data/lang/module-newseventcommodity/es.json FAIL:
{'FLAVOUR_11_NEWSBODY': ['system', 'sectorx', 'sectory', 'sectorz']}
{'FLAVOUR_11_NEWSBODY': ['sistema', 'sectorx', 'sectory', 'sectorz']}

Checking file: data/lang/module-newseventcommodity/ru.json FAIL:
{'FLAVOUR_0_HEADLINE': ['date', 'system']}
{'FLAVOUR_0_HEADLINE': ['system']}
{'FLAVOUR_10_HEADLINE': ['date', 'system']}
{'FLAVOUR_10_HEADLINE': ['system']}
{'FLAVOUR_11_HEADLINE': ['date', 'system']}
{'FLAVOUR_11_HEADLINE': ['system']}
{'FLAVOUR_12_HEADLINE': ['date', 'system']}
{'FLAVOUR_12_HEADLINE': ['system']}
{'FLAVOUR_13_HEADLINE': ['date', 'system']}
{'FLAVOUR_13_HEADLINE': ['system']}
{'FLAVOUR_14_HEADLINE': ['date', 'system']}
{'FLAVOUR_14_HEADLINE': ['system']}
{'FLAVOUR_15_HEADLINE': ['date', 'system']}
{'FLAVOUR_15_HEADLINE': ['system']}
{'FLAVOUR_16_HEADLINE': ['date', 'system']}
{'FLAVOUR_16_HEADLINE': ['system']}
{'FLAVOUR_17_HEADLINE': ['date', 'system']}
{'FLAVOUR_17_HEADLINE': ['system']}
{'FLAVOUR_18_HEADLINE': ['date', 'system']}
{'FLAVOUR_18_HEADLINE': ['system']}
{'FLAVOUR_19_HEADLINE': ['date', 'system']}
{'FLAVOUR_19_HEADLINE': ['system']}
{'FLAVOUR_1_HEADLINE': ['date', 'system']}
{'FLAVOUR_1_HEADLINE': ['system']}
{'FLAVOUR_20_HEADLINE': ['date', 'system']}
{'FLAVOUR_20_HEADLINE': ['system']}
{'FLAVOUR_21_HEADLINE': ['date', 'system']}
{'FLAVOUR_21_HEADLINE': ['system']}
{'FLAVOUR_22_HEADLINE': ['date', 'system']}
{'FLAVOUR_22_HEADLINE': ['system']}
{'FLAVOUR_23_HEADLINE': ['date', 'system']}
{'FLAVOUR_23_HEADLINE': ['system']}
{'FLAVOUR_2_HEADLINE': ['date', 'system']}
{'FLAVOUR_2_HEADLINE': ['system']}
{'FLAVOUR_3_HEADLINE': ['date', 'system']}
{'FLAVOUR_3_HEADLINE': ['system']}
{'FLAVOUR_4_HEADLINE': ['date', 'system']}
{'FLAVOUR_4_HEADLINE': ['system']}
{'FLAVOUR_5_HEADLINE': ['date', 'system']}
{'FLAVOUR_5_HEADLINE': ['system']}
{'FLAVOUR_6_HEADLINE': ['date', 'system']}
{'FLAVOUR_6_HEADLINE': ['system']}
{'FLAVOUR_7_HEADLINE': ['date', 'system']}
{'FLAVOUR_7_HEADLINE': ['system']}
{'FLAVOUR_8_HEADLINE': ['date', 'system']}
{'FLAVOUR_8_HEADLINE': ['system']}
{'FLAVOUR_9_HEADLINE': ['date', 'system']}
{'FLAVOUR_9_HEADLINE': ['system']}

Checking file: data/lang/module-system/pl.json FAIL:
{'DISCOVERED_HIDDEN_BASES': ['portcount', 'bases']}
{'DISCOVERED_HIDDEN_BASES': ['portcount']}

Checking file: data/lang/module-system/cs.json FAIL:
{'DISCOVERED_HIDDEN_BASES': ['portcount', 'bases']}
{'DISCOVERED_HIDDEN_BASES': ['portcount', 'základen']}

Checking file: data/lang/module-system/ru.json FAIL:
{'DISCOVERED_HIDDEN_BASES': ['portcount', 'bases']}
{'DISCOVERED_HIDDEN_BASES': ['bases', 'portcount']}

@JeromeChignoli
Copy link
Author

nice work.
Did you work from the shell command output ?
There are typos on the « } » tags (as in the 3rd & 7th outputs of the shell command). By luck, a second {key} was present so first tag is printed.
There may be typos on « { » tags, or on « } » tags without second {key}: these will not be displayed by the shell command.

@impaktor
Copy link
Member

impaktor commented Jul 1, 2024

@JeromeChignoli I wrote a python script this morning. I should be able to extend it to just fix all the errors, and we'll push it to transifex directly, so you don't need to do anything.

@JeromeChignoli
Copy link
Author

Nice.
But be warned: tools are great but stupid… ;)

@zonkmachine
Copy link
Member

so you don't need to do anything.

Right, sorry! I should have read the whole thread, obviously, before manually fixing strings. I solved some 4-5 cases before noticing this part. I hope this doesn't create any problems for the script.

@impaktor
Copy link
Member

impaktor commented Jul 2, 2024

before manually fixing strings

@zonkmachine no worries. You might have been on to something...

But be warned: tools are great but stupid… ;)

@JeromeChignoli Indeed. See below:

1. Where we stand

I've done some more tinkering, and looked more at the output, and reached the conclusion: there be complications. the TL;DR, I could just compile a list of errors from each language and send that out to the translators, and "pretty please fix"-them, or we just brute force the fixes, and nuke 95% of the errors, in my guesstimation.

2. Edge cases

Below are some edge cases that make it challenging to (correctly) automate fixing in script.

2.1 "Not even wrong"

...to quote Wolfgang Pauli. This is going to be tough to fix in script

Checking file: data/lang/module-searchrescue/pl.json FAIL:
ERROR:   {'RESULT_DELIVERY_COMM': ['{done}', '{todo{ ton {cargotype}']}
correct: {'RESULT_DELIVERY_COMM': ['{done}', '{todo}', '{cargotype}']}
ERROR:   {'RESULT_PICKUP_COMM': ['{done}', '{todo{ ton {cargotype}']}
correct: {'RESULT_PICKUP_COMM': ['{done}', '{todo}', '{cargotype}']}
erros: 2, warnings: 0

or here } vs ):

Checking file: data/lang/module-combat/pl.json FAIL:
ERROR:   {'POLICE_2': ['{org}', '{cash}', '{system}', '{sectorx}', '{sectory}', '{sectorz}', '{area). Potrzebujesz hipernapędu zdolnego pokonać odległość {dist}']}
correct: {'POLICE_2': ['{org}', '{cash}', '{system}', '{sectorx}', '{sectory}', '{sectorz}', '{area}', '{dist}']}

or missing closing bracket all together:

Checking file: data/lang/module-combat/pl.json FAIL:
ERROR:   {'POLICE_1': ['{area}', '{system}', '{sectorx}', '{sectory}', '{sectorz}', '{dist}', '{cash na misję w {area}']}
correct: {'POLICE_1': ['{area}', '{system}', '{sectorx}', '{sectory}', '{sectorz}', '{dist}', '{cash}', '{area}']}

maybe above warrants some regex magic to detect? (all three examples from polish).

2.2 False positives?

Below, the percentage sign is lacking a space, thus being interpreted as a C-variable string by my script (variables from C++ code:foo %my_variable bar, variables from Lua code: foo {my_variable} bar), and we have several of these from Chinese (Mandarin?). I assume this will not be a problem in the game (unless this happens to be a string where we're trying to substitute another variable from C++, I suspect)

Checking file: data/lang/ui-core/ja.json FAIL:
ERROR:   {'YOUR_HULL_IS_AT_X_INTEGRITY': ['{value}', '%の強度です']}
correct: {'YOUR_HULL_IS_AT_X_INTEGRITY': ['{value}']}

2.3 Assume there be order

Below is probably fine (thus script only considers it as "warning"), but I if the variables also had been wrong (e.g. translated), then I would replace them assuming the order would be the same as in the English string. This is not an issue when the string only has a single {variable}, but most strings (with errors at least) contain multiple variables. I don't see a way around this without manual intervention (or some fancy-schmancy stuff as I suggest in "conclusions" section below).

Checking file: data/lang/module-system/ru.json FAIL: 
WARNING: {'DISCOVERED_HIDDEN_BASES': ['{bases}', '{portcount}']} 
correct: {'DISCOVERED_HIDDEN_BASES': ['{portcount}', '{bases}']} 
erros: 0, warnings: 1 

(Seems like like German (to no surprise) and Russian often swaps order of variables)

2.4 Can't even handle the error

Below, number of strings is mismatched between English and translated. This might be because the string is foo instead of {foo} or %foo, thus the script isn't (currently) detecting the string (it only keeps strings with variable substitutions in them).

Checking file: data/lang/ui-core/ar.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/ui-core/hu.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

Checking file: data/lang/module-taxi/id.json FAIL:
ERROR: mismatching keys, probably missing required {variable} all together

3 Conclusion

I think 2.3 is a very (imagined?) edge case, and we could just ignore it, I think the script would do the right thing 95 % of the time, and the translations would be less wrongier than before (but now the error might be so subtle as to be not obviously noticeable in game play, making the translation "bug" more deceptive?).

One could also measure some kind of "distance" (character Hamming distance, or word2vec embedding space, or LLM) between the wrong and correct variable, for most cases the wrong and correct are quite close, either because they're:

  1. misspelled
  2. translated to other Germanic / Latin language close to English
  3. accidentally capitalized / upper cased
  4. copy-paste error (e.g. {sextorx}, {sextory}, {sextory})

As teased in the Introduction, we could ask translators to do the work for us, and we'll see where that gets us. (Also: I'm yet to figure out how to implement the regex string subsitution from the list of correct variables)

@JeromeChignoli
Copy link
Author

Said differently: only about 5% of the messages need a human correction.
A tool displaying the correct and the incorrect strings side by side, highlighting detected {keys} and « {, } or % » tags, english key_name…

@zonkmachine
Copy link
Member

the TL;DR, I could just compile a list of errors from each language and send that out to the translators, and "pretty please fix"-them, or we just brute force the fixes, and nuke 95% of the errors, in my guesstimation.

I would rather inform the translators.

impaktor added a commit to impaktor/pioneer that referenced this issue Jul 2, 2024
This mostly fixes pioneerspacesim#5849 (translators getting the placeholders in strings
wrong), BUT:

- I assume we don't want to merge this PR, but push branch to transifex

- Ignoring lang/core/ for now, due to some parsing issue with % and it
  getting close to my bed time (I'll fix tomorrow), that will add < 10 more
  files with corrections

- As mentioned in the issue above, this only solves for strings where number
  of placeholders in translated and original strings are the same / unambiguous)
impaktor added a commit to impaktor/pioneer that referenced this issue Jul 3, 2024
This mostly fixes pioneerspacesim#5849 (translators getting the placeholders in strings
wrong), BUT:

- I assume we don't want to merge this PR, but push branch to transifex

- Ignoring lang/core/ for now, due to some parsing issue with % and it
  getting close to my bed time (I'll fix tomorrow), that will add < 10 more
  files with corrections

- As mentioned in the issue above, this only solves for strings where number
  of placeholders in translated and original strings are the same / unambiguous)
impaktor added a commit to impaktor/pioneer that referenced this issue Jul 3, 2024
This mostly fixes pioneerspacesim#5849 (translators getting the placeholders in strings
wrong), BUT:

- I assume we don't want to merge this PR, but push branch to transifex

- Ignoring lang/core/ for now, due to some parsing issue with % and it
  getting close to my bed time (I'll fix tomorrow), that will add < 10 more
  files with corrections

- As mentioned in the issue above, this only solves for strings where number
  of placeholders in translated and original strings are the same / unambiguous)
@JeromeChignoli
Copy link
Author

JeromeChignoli commented Jul 3, 2024

Maybe it is too late, i writed a bash script (sorry to not be python aware).
I dont know if it may be of some utility, it is slow, ugly writed, it cant log colors, but it seems to highlight some more ways to fix in the console.
[findTheBadKeys.sh.txt]

EDIT: Ooops wrong buggy script. updated
findTheBadKeys2.sh.txt

impaktor added a commit to impaktor/pioneer that referenced this issue Jul 4, 2024
This mostly fixes pioneerspacesim#5849 (translators getting the placeholders in strings
wrong), BUT:

- I assume we don't want to merge this PR, but push branch to transifex

- As mentioned in the issue above, this only solves for strings where number
  of placeholders in translated and original strings are the same / unambiguous)
impaktor added a commit to impaktor/pioneer that referenced this issue Jul 4, 2024
This mostly fixes pioneerspacesim#5849 (translators getting the placeholders in strings
wrong), BUT:

- I assume we don't want to merge this PR, but push branch to transifex

- As mentioned in the issue above, this only solves for strings where number
  of placeholders in translated and original strings are the same / unambiguous)
@impaktor
Copy link
Member

impaktor commented Jul 4, 2024

@JeromeChignoli I've now applied the changes I've proposed. Please feel free to add any additional fixes you can identify.

I've briefly tried your script, and e.g. for where translation is missing one or several keys, it's hard to know what is the correct answer, unless you speak the language in question. I have those strings identified, and I'm thinking to just give them to the translators, and hope they'll fix it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants