Multilang: handle localized plurals (#25337)

* Add localized plural handling

* Do another location with plurals

* fix test
pull/25338/head
Shane Smiskol 3 years ago committed by GitHub
parent 32201bbbbd
commit ecba873208
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      selfdrive/ui/qt/util.cc
  2. 2
      selfdrive/ui/qt/widgets/input.cc
  3. 2
      selfdrive/ui/tests/test_translations.py
  4. 2
      selfdrive/ui/translations/languages.json
  5. 38
      selfdrive/ui/translations/main_en.ts
  6. 200
      selfdrive/ui/translations/main_ja.ts
  7. 40
      selfdrive/ui/translations/main_ko.ts
  8. 40
      selfdrive/ui/translations/main_zh-CHS.ts
  9. 40
      selfdrive/ui/translations/main_zh-CHT.ts
  10. 10
      selfdrive/ui/update_translations.py

@ -79,13 +79,13 @@ QString timeAgo(const QDateTime &date) {
s = "now";
} else if (diff < 60 * 60) {
int minutes = diff / 60;
s = QObject::tr("%1 minute%2 ago").arg(minutes).arg(minutes > 1 ? "s" : "");
s = QObject::tr("%n minute(s) ago", "", minutes);
} else if (diff < 60 * 60 * 24) {
int hours = diff / (60 * 60);
s = QObject::tr("%1 hour%2 ago").arg(hours).arg(hours > 1 ? "s" : "");
s = QObject::tr("%n hour(s) ago", "", hours);
} else if (diff < 3600 * 24 * 7) {
int days = diff / (60 * 60 * 24);
s = QObject::tr("%1 day%2 ago").arg(days).arg(days > 1 ? "s" : "");
s = QObject::tr("%n day(s) ago", "", days);
} else {
s = date.date().toString();
}

@ -165,7 +165,7 @@ void InputDialog::handleEnter() {
done(QDialog::Accepted);
emitText(line->text());
} else {
setMessage(tr("Need at least %1 characters!").arg(minLength), false);
setMessage(tr("Need at least %n character(s)!", "", minLength), false);
}
}

@ -39,7 +39,7 @@ class TestTranslations(unittest.TestCase):
f"{name} has no XML translation file, run selfdrive/ui/update_translations.py")
def test_translations_updated(self):
update_translations(translations_dir=TMP_TRANSLATIONS_DIR)
update_translations(plural_only=["main_en"], translations_dir=TMP_TRANSLATIONS_DIR)
for name, file in self.translation_files.items():
with self.subTest(name=name, file=file):

@ -1,5 +1,5 @@
{
"English": "",
"English": "main_en",
"中文(繁體)": "main_zh-CHT",
"中文(简体)": "main_zh-CHS",
"한국어": "main_ko"

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
<name>InputDialog</name>
<message numerus="yes">
<source>Need at least %n character(s)!</source>
<translation>
<numerusform>Need at least %n character!</numerusform>
<numerusform>Need at least %n characters!</numerusform>
</translation>
</message>
</context>
<context>
<name>QObject</name>
<message numerus="yes">
<source>%n minute(s) ago</source>
<translation>
<numerusform>%n minute ago</numerusform>
<numerusform>%n minutes ago</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s) ago</source>
<translation>
<numerusform>%n hour ago</numerusform>
<numerusform>%n hours ago</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s) ago</source>
<translation>
<numerusform>%n day ago</numerusform>
<numerusform>%n days ago</numerusform>
</translation>
</message>
</context>
</TS>

@ -108,152 +108,152 @@
<context>
<name>DevicePanel</name>
<message>
<location filename="../qt/offroad/settings.cc" line="106"/>
<location filename="../qt/offroad/settings.cc" line="100"/>
<source>Dongle ID</source>
<translation> (Dongle ID)</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="106"/>
<location filename="../qt/offroad/settings.cc" line="100"/>
<source>N/A</source>
<translation>N/A</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="107"/>
<location filename="../qt/offroad/settings.cc" line="101"/>
<source>Serial</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="111"/>
<location filename="../qt/offroad/settings.cc" line="105"/>
<source>Driver Camera</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="111"/>
<location filename="../qt/offroad/settings.cc" line="105"/>
<source>PREVIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="112"/>
<location filename="../qt/offroad/settings.cc" line="106"/>
<source>Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)</source>
<translation>()</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="116"/>
<location filename="../qt/offroad/settings.cc" line="110"/>
<source>Reset Calibration</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="116"/>
<location filename="../qt/offroad/settings.cc" line="110"/>
<source>RESET</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="119"/>
<location filename="../qt/offroad/settings.cc" line="113"/>
<source>Are you sure you want to reset calibration?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="126"/>
<location filename="../qt/offroad/settings.cc" line="120"/>
<source>Review Training Guide</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="126"/>
<location filename="../qt/offroad/settings.cc" line="120"/>
<source>REVIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="126"/>
<location filename="../qt/offroad/settings.cc" line="120"/>
<source>Review the rules, features, and limitations of openpilot</source>
<translation>openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="128"/>
<location filename="../qt/offroad/settings.cc" line="122"/>
<source>Are you sure you want to review the training guide?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="136"/>
<location filename="../qt/offroad/settings.cc" line="130"/>
<source>Regulatory</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="136"/>
<location filename="../qt/offroad/settings.cc" line="130"/>
<source>VIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="144"/>
<location filename="../qt/offroad/settings.cc" line="138"/>
<source>Change Language</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="144"/>
<location filename="../qt/offroad/settings.cc" line="138"/>
<source>CHANGE</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="148"/>
<location filename="../qt/offroad/settings.cc" line="142"/>
<source>Select a language</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="168"/>
<location filename="../qt/offroad/settings.cc" line="162"/>
<source>Reboot</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="173"/>
<location filename="../qt/offroad/settings.cc" line="167"/>
<source>Power Off</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="193"/>
<location filename="../qt/offroad/settings.cc" line="187"/>
<source>openpilot requires the device to be mounted within 4° left or right and within 5° up or 8° down. openpilot is continuously calibrating, resetting is rarely required.</source>
<translation>openpilot 4°5°8°</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="204"/>
<location filename="../qt/offroad/settings.cc" line="198"/>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> %2%1°%4%3°</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="205"/>
<location filename="../qt/offroad/settings.cc" line="199"/>
<source>down</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="205"/>
<location filename="../qt/offroad/settings.cc" line="199"/>
<source>up</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="206"/>
<location filename="../qt/offroad/settings.cc" line="200"/>
<source>left</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="206"/>
<location filename="../qt/offroad/settings.cc" line="200"/>
<source>right</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="217"/>
<location filename="../qt/offroad/settings.cc" line="211"/>
<source>Are you sure you want to reboot?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="224"/>
<location filename="../qt/offroad/settings.cc" line="218"/>
<source>Disengage to Reboot</source>
<translation>openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="230"/>
<location filename="../qt/offroad/settings.cc" line="224"/>
<source>Are you sure you want to power off?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="237"/>
<location filename="../qt/offroad/settings.cc" line="231"/>
<source>Disengage to Power Off</source>
<translation>openpilot </translation>
</message>
@ -294,7 +294,7 @@
<context>
<name>DriverViewScene</name>
<message>
<location filename="../qt/offroad/driverview.cc" line="56"/>
<location filename="../qt/offroad/driverview.cc" line="55"/>
<source>camera starting</source>
<translation></translation>
</message>
@ -306,10 +306,16 @@
<source>Cancel</source>
<translation></translation>
</message>
<message>
<message numerus="yes">
<location filename="../qt/widgets/input.cc" line="168"/>
<source>Need at least %n character(s)!</source>
<translation>
<numerusform>%n文字以上で入力してください</numerusform>
</translation>
</message>
<message>
<source>Need at least %1 characters!</source>
<translation>%1</translation>
<translation type="vanished">%1</translation>
</message>
</context>
<context>
@ -488,30 +494,30 @@ location set</source>
<context>
<name>NvgWindow</name>
<message>
<location filename="../qt/onroad.cc" line="208"/>
<location filename="../qt/onroad.cc" line="212"/>
<source>km/h</source>
<translation>km/h</translation>
</message>
<message>
<location filename="../qt/onroad.cc" line="208"/>
<location filename="../qt/onroad.cc" line="212"/>
<source>mph</source>
<translation>mph</translation>
</message>
<message>
<location filename="../qt/onroad.cc" line="275"/>
<location filename="../qt/onroad.cc" line="278"/>
<location filename="../qt/onroad.cc" line="280"/>
<location filename="../qt/onroad.cc" line="283"/>
<source>MAX</source>
<translation></translation>
</message>
<message>
<location filename="../qt/onroad.cc" line="322"/>
<location filename="../qt/onroad.cc" line="325"/>
<location filename="../qt/onroad.cc" line="327"/>
<location filename="../qt/onroad.cc" line="330"/>
<source>SPEED</source>
<translation></translation>
</message>
<message>
<location filename="../qt/onroad.cc" line="328"/>
<location filename="../qt/onroad.cc" line="331"/>
<location filename="../qt/onroad.cc" line="333"/>
<location filename="../qt/onroad.cc" line="336"/>
<source>LIMIT</source>
<translation></translation>
</message>
@ -635,20 +641,38 @@ location set</source>
<source>openpilot</source>
<translation>openpilot</translation>
</message>
<message>
<message numerus="yes">
<location filename="../qt/util.cc" line="82"/>
<source>%n minute(s) ago</source>
<translation>
<numerusform>%n </numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../qt/util.cc" line="85"/>
<source>%n hour(s) ago</source>
<translation>
<numerusform>%n </numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../qt/util.cc" line="88"/>
<source>%n day(s) ago</source>
<translation>
<numerusform>%n </numerusform>
</translation>
</message>
<message>
<source>%1 minute%2 ago</source>
<translation>%1 %2 </translation>
<translation type="vanished">%1 %2 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="85"/>
<source>%1 hour%2 ago</source>
<translation>%1 %2 </translation>
<translation type="vanished">%1 %2 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="88"/>
<source>%1 day%2 ago</source>
<translation>%1 %2 </translation>
<translation type="vanished">%1 %2 </translation>
</message>
</context>
<context>
@ -710,33 +734,33 @@ location set</source>
<context>
<name>SettingsWindow</name>
<message>
<location filename="../qt/offroad/settings.cc" line="338"/>
<location filename="../qt/offroad/settings.cc" line="332"/>
<source>×</source>
<translation>×</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="364"/>
<location filename="../qt/offroad/settings.cc" line="358"/>
<source>Device</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="365"/>
<location filename="../qt/offroad/settings.cc" line="404"/>
<location filename="../qt/offroad/settings.cc" line="359"/>
<location filename="../qt/offroad/settings.cc" line="398"/>
<source>Network</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="366"/>
<location filename="../qt/offroad/settings.cc" line="360"/>
<source>Toggles</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="367"/>
<location filename="../qt/offroad/settings.cc" line="361"/>
<source>Software</source>
<translation>ソ</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="372"/>
<location filename="../qt/offroad/settings.cc" line="366"/>
<source>Navigation</source>
<translation></translation>
</message>
@ -975,89 +999,89 @@ location set</source>
<context>
<name>SoftwarePanel</name>
<message>
<location filename="../qt/offroad/settings.cc" line="242"/>
<location filename="../qt/offroad/settings.cc" line="236"/>
<source>Git Branch</source>
<translation>Git </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="243"/>
<location filename="../qt/offroad/settings.cc" line="237"/>
<source>Git Commit</source>
<translation>Git </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="244"/>
<location filename="../qt/offroad/settings.cc" line="238"/>
<source>OS Version</source>
<translation>OS </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="245"/>
<location filename="../qt/offroad/settings.cc" line="239"/>
<source>Version</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="246"/>
<location filename="../qt/offroad/settings.cc" line="240"/>
<source>Last Update Check</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="246"/>
<location filename="../qt/offroad/settings.cc" line="240"/>
<source>The last time openpilot successfully checked for an update. The updater only runs while the car is off.</source>
<translation>openpilotが最後にアップデートの確認に成功してからの時間です</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="247"/>
<location filename="../qt/offroad/settings.cc" line="241"/>
<source>Check for Update</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="252"/>
<location filename="../qt/offroad/settings.cc" line="246"/>
<source>CHECKING</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="259"/>
<location filename="../qt/offroad/settings.cc" line="253"/>
<source>Switch Branch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="259"/>
<location filename="../qt/offroad/settings.cc" line="253"/>
<source>ENTER</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="259"/>
<location filename="../qt/offroad/settings.cc" line="261"/>
<location filename="../qt/offroad/settings.cc" line="253"/>
<location filename="../qt/offroad/settings.cc" line="255"/>
<source>The new branch will be pulled the next time the updater runs.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="261"/>
<location filename="../qt/offroad/settings.cc" line="255"/>
<source>Enter branch name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="272"/>
<location filename="../qt/offroad/settings.cc" line="266"/>
<source>UNINSTALL</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="272"/>
<location filename="../qt/offroad/settings.cc" line="266"/>
<source>Uninstall %1</source>
<translation>%1</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="274"/>
<location filename="../qt/offroad/settings.cc" line="268"/>
<source>Are you sure you want to uninstall?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="291"/>
<location filename="../qt/offroad/settings.cc" line="285"/>
<source>failed to fetch update</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="292"/>
<location filename="../qt/offroad/settings.cc" line="313"/>
<location filename="../qt/offroad/settings.cc" line="286"/>
<location filename="../qt/offroad/settings.cc" line="307"/>
<source>CHECK</source>
<translation></translation>
</message>
@ -1165,72 +1189,70 @@ location set</source>
<translation>3150km</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="46"/>
<source>Enable Right-Hand Drive</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="47"/>
<source>Allow openpilot to obey left-hand traffic conventions and perform driver monitoring on right driver seat.</source>
<translation>openpilot </translation>
<translation type="vanished">openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="52"/>
<location filename="../qt/offroad/settings.cc" line="46"/>
<source>Use Metric System</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="53"/>
<location filename="../qt/offroad/settings.cc" line="47"/>
<source>Display speed in km/h instead of mph.</source>
<translation> mph km/h </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="58"/>
<location filename="../qt/offroad/settings.cc" line="52"/>
<source>Record and Upload Driver Camera</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="59"/>
<location filename="../qt/offroad/settings.cc" line="53"/>
<source>Upload data from the driver facing camera and help improve the driver monitoring algorithm.</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="64"/>
<location filename="../qt/offroad/settings.cc" line="58"/>
<source>Disengage On Accelerator Pedal</source>
<translation> openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="65"/>
<location filename="../qt/offroad/settings.cc" line="59"/>
<source>When enabled, pressing the accelerator pedal will disengage openpilot.</source>
<translation> openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="71"/>
<location filename="../qt/offroad/settings.cc" line="65"/>
<source>Show ETA in 24h format</source>
<translation>24</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="72"/>
<location filename="../qt/offroad/settings.cc" line="66"/>
<source>Use 24h format instead of am/pm</source>
<translation>AM/PM 24使</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="77"/>
<location filename="../qt/offroad/settings.cc" line="71"/>
<source>Show Map on Left Side of UI</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="78"/>
<location filename="../qt/offroad/settings.cc" line="72"/>
<source>Show map on left side when in split screen view.</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="90"/>
<location filename="../qt/offroad/settings.cc" line="84"/>
<source>openpilot Longitudinal Control</source>
<translation>openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="91"/>
<location filename="../qt/offroad/settings.cc" line="85"/>
<source>openpilot will disable the car&apos;s radar and will take over control of gas and brakes. Warning: this disables AEB!</source>
<translation>openpilot AEB </translation>
</message>

@ -306,10 +306,16 @@
<source>Cancel</source>
<translation></translation>
</message>
<message>
<message numerus="yes">
<location filename="../qt/widgets/input.cc" line="168"/>
<source>Need at least %n character(s)!</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Need at least %1 characters!</source>
<translation> %1 !</translation>
<translation type="vanished"> %1 !</translation>
</message>
</context>
<context>
@ -635,20 +641,38 @@ location set</source>
<source>openpilot</source>
<translation>openpilot</translation>
</message>
<message>
<message numerus="yes">
<location filename="../qt/util.cc" line="82"/>
<source>%n minute(s) ago</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../qt/util.cc" line="85"/>
<source>%n hour(s) ago</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../qt/util.cc" line="88"/>
<source>%n day(s) ago</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>%1 minute%2 ago</source>
<translation>%1 </translation>
<translation type="vanished">%1 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="85"/>
<source>%1 hour%2 ago</source>
<translation>%1 </translation>
<translation type="vanished">%1 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="88"/>
<source>%1 day%2 ago</source>
<translation>%1 </translation>
<translation type="vanished">%1 </translation>
</message>
</context>
<context>

@ -306,10 +306,16 @@
<source>Cancel</source>
<translation></translation>
</message>
<message>
<message numerus="yes">
<location filename="../qt/widgets/input.cc" line="168"/>
<source>Need at least %n character(s)!</source>
<translation>
<numerusform> %n </numerusform>
</translation>
</message>
<message>
<source>Need at least %1 characters!</source>
<translation> %1 </translation>
<translation type="vanished"> %1 </translation>
</message>
</context>
<context>
@ -633,20 +639,38 @@ location set</source>
<source>openpilot</source>
<translation>openpilot</translation>
</message>
<message>
<message numerus="yes">
<location filename="../qt/util.cc" line="82"/>
<source>%n minute(s) ago</source>
<translation>
<numerusform>%n </numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../qt/util.cc" line="85"/>
<source>%n hour(s) ago</source>
<translation>
<numerusform>%n </numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../qt/util.cc" line="88"/>
<source>%n day(s) ago</source>
<translation>
<numerusform>%n </numerusform>
</translation>
</message>
<message>
<source>%1 minute%2 ago</source>
<translation>%1 %2 </translation>
<translation type="vanished">%1 %2 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="85"/>
<source>%1 hour%2 ago</source>
<translation>%1 %2 </translation>
<translation type="vanished">%1 %2 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="88"/>
<source>%1 day%2 ago</source>
<translation>%1 %2 </translation>
<translation type="vanished">%1 %2 </translation>
</message>
</context>
<context>

@ -306,10 +306,16 @@
<source>Cancel</source>
<translation></translation>
</message>
<message>
<message numerus="yes">
<location filename="../qt/widgets/input.cc" line="168"/>
<source>Need at least %n character(s)!</source>
<translation>
<numerusform> %n </numerusform>
</translation>
</message>
<message>
<source>Need at least %1 characters!</source>
<translation> %1 </translation>
<translation type="vanished"> %1 </translation>
</message>
</context>
<context>
@ -635,23 +641,41 @@ location set</source>
<source>openpilot</source>
<translation>openpilot</translation>
</message>
<message>
<message numerus="yes">
<location filename="../qt/util.cc" line="82"/>
<source>%n minute(s) ago</source>
<translation>
<numerusform>%n </numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../qt/util.cc" line="85"/>
<source>%n hour(s) ago</source>
<translation>
<numerusform>%n </numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../qt/util.cc" line="88"/>
<source>%n day(s) ago</source>
<translation>
<numerusform>%n </numerusform>
</translation>
</message>
<message>
<source>%1 minute%2 ago</source>
<translatorcomment>we don&apos;t need %2</translatorcomment>
<translation>%1 </translation>
<translation type="vanished">%1 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="85"/>
<source>%1 hour%2 ago</source>
<translatorcomment>we don&apos;t need %2</translatorcomment>
<translation>%1 </translation>
<translation type="vanished">%1 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="88"/>
<source>%1 day%2 ago</source>
<translatorcomment>we don&apos;t need %2</translatorcomment>
<translation>%1 </translation>
<translation type="vanished">%1 </translation>
</message>
</context>
<context>

@ -10,7 +10,10 @@ TRANSLATIONS_DIR = os.path.join(UI_DIR, "translations")
LANGUAGES_FILE = os.path.join(TRANSLATIONS_DIR, "languages.json")
def update_translations(vanish=False, translations_dir=TRANSLATIONS_DIR):
def update_translations(vanish=False, plural_only=None, translations_dir=TRANSLATIONS_DIR):
if plural_only is None:
plural_only = []
with open(LANGUAGES_FILE, "r") as f:
translation_files = json.load(f)
@ -23,6 +26,8 @@ def update_translations(vanish=False, translations_dir=TRANSLATIONS_DIR):
args = f"lupdate -recursive {UI_DIR} -ts {tr_file}"
if vanish:
args += " -no-obsolete"
if file in plural_only:
args += " -pluralonly"
ret = os.system(args)
assert ret == 0
@ -31,6 +36,7 @@ if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Update translation files for UI",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--vanish", action="store_true", help="Remove translations with source text no longer found")
parser.add_argument("--plural-only", type=str, nargs="*", default=["main_en"], help="Translation codes to only create plural translations for (ie. the base language)")
args = parser.parse_args()
update_translations(args.vanish)
update_translations(args.vanish, args.plural_only)

Loading…
Cancel
Save