This commit is contained in:
Your Name
2024-04-27 13:43:16 -05:00
parent 21363ce751
commit ea1aad5ed1
128 changed files with 3533 additions and 1918 deletions

View File

@@ -0,0 +1,71 @@
# Multilanguage
[![languages](https://raw.githubusercontent.com/commaai/openpilot/badges/translation_badge.svg)](#)
## Contributing
Before getting started, make sure you have set up the openpilot Ubuntu development environment by reading the [tools README.md](/tools/README.md).
### Policy
Most of the languages supported by openpilot come from and are maintained by the community via pull requests. A pull request likely to be merged is one that [fixes a translation or adds missing translations.](https://github.com/commaai/openpilot/blob/master/selfdrive/ui/translations/README.md#improving-an-existing-language)
We also generally merge pull requests adding support for a new language if there are community members willing to maintain it. Maintaining a language is ensuring quality and completion of translations before each openpilot release.
comma may remove or hide language support from releases depending on translation quality and completeness.
### Adding a New Language
openpilot provides a few tools to help contributors manage their translations and to ensure quality. To get started:
1. Add your new language to [languages.json](/selfdrive/ui/translations/languages.json) with the appropriate [language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) and the localized language name (Traditional Chinese is `中文(繁體)`).
2. Generate the XML translation file (`*.ts`):
```shell
selfdrive/ui/update_translations.py
```
3. Edit the translation file, marking each translation as completed:
```shell
linguist selfdrive/ui/translations/your_language_file.ts
```
4. View your finished translations by compiling and starting the UI, then find it in the language selector:
```shell
scons -j$(nproc) selfdrive/ui && selfdrive/ui/ui
```
5. Read [Checking the UI](#checking-the-ui) to double-check your translations fit in the UI.
### Improving an Existing Language
Follow step 3. above, you can review existing translations and add missing ones. Once you're done, just open a pull request to openpilot.
### Checking the UI
Different languages use varying space to convey the same message, so it's a good idea to double-check that your translations do not overlap and fit into each widget. Start the UI (step 4. above) and view each page, making adjustments to translations as needed.
#### To view offroad alerts:
With the UI started, you can view the offroad alerts with:
```shell
selfdrive/ui/tests/cycle_offroad_alerts.py
```
### Updating the UI
Any time you edit source code in the UI, you need to update the translations to ensure the line numbers and contexts are up to date (first step above).
### Testing
openpilot has a few unit tests to make sure all translations are up-to-date and that all strings are wrapped in a translation marker. They are run in CI, but you can also run them locally.
Tests translation files up to date:
```shell
selfdrive/ui/tests/test_translations.py
```
Tests all static source strings are wrapped:
```shell
selfdrive/ui/tests/create_test_translations.sh && selfdrive/ui/tests/test_translations
```
---
![multilanguage_onroad](https://user-images.githubusercontent.com/25857203/178912800-2c798af8-78e3-498e-9e19-35906e0bafff.png)

View File

@@ -0,0 +1,138 @@
#!/usr/bin/env python3
import argparse
import json
import os
import pathlib
import xml.etree.ElementTree as ET
from typing import cast
import requests
TRANSLATIONS_DIR = pathlib.Path(__file__).resolve().parent
TRANSLATIONS_LANGUAGES = TRANSLATIONS_DIR / "languages.json"
OPENAI_MODEL = "gpt-4"
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
OPENAI_PROMPT = "You are a professional translator from English to {language} (ISO 639 language code). " + \
"The following sentence or word is in the GUI of a software called openpilot, translate it accordingly."
def get_language_files(languages: list[str] = None) -> dict[str, pathlib.Path]:
files = {}
with open(TRANSLATIONS_LANGUAGES) as fp:
language_dict = json.load(fp)
for filename in language_dict.values():
path = TRANSLATIONS_DIR / f"{filename}.ts"
language = path.stem.split("main_")[1]
if languages is None or language in languages:
files[language] = path
return files
def translate_phrase(text: str, language: str) -> str:
response = requests.post(
"https://api.openai.com/v1/chat/completions",
json={
"model": OPENAI_MODEL,
"messages": [
{
"role": "system",
"content": OPENAI_PROMPT.format(language=language),
},
{
"role": "user",
"content": text,
},
],
"temperature": 0.8,
"max_tokens": 1024,
"top_p": 1,
},
headers={
"Authorization": f"Bearer {OPENAI_API_KEY}",
"Content-Type": "application/json",
},
)
if 400 <= response.status_code < 600:
raise requests.HTTPError(f'Error {response.status_code}: {response.json()}', response=response)
data = response.json()
return cast(str, data["choices"][0]["message"]["content"])
def translate_file(path: pathlib.Path, language: str, all_: bool) -> None:
tree = ET.parse(path)
root = tree.getroot()
for context in root.findall("./context"):
name = context.find("name")
if name is None:
raise ValueError("name not found")
print(f"Context: {name.text}")
for message in context.findall("./message"):
source = message.find("source")
translation = message.find("translation")
if source is None or translation is None:
raise ValueError("source or translation not found")
if not all_ and translation.attrib.get("type") != "unfinished":
continue
llm_translation = translate_phrase(cast(str, source.text), language)
print(f"Source: {source.text}\n" +
f"Current translation: {translation.text}\n" +
f"LLM translation: {llm_translation}")
translation.text = llm_translation
with path.open("w", encoding="utf-8") as fp:
fp.write('<?xml version="1.0" encoding="utf-8"?>\n' +
'<!DOCTYPE TS>\n' +
ET.tostring(root, encoding="utf-8").decode())
def main():
arg_parser = argparse.ArgumentParser("Auto translate")
group = arg_parser.add_mutually_exclusive_group(required=True)
group.add_argument("-a", "--all-files", action="store_true", help="Translate all files")
group.add_argument("-f", "--file", nargs="+", help="Translate the selected files. (Example: -f fr de)")
arg_parser.add_argument("-t", "--all-translations", action="store_true", default=False, help="Translate all sections. (Default: only unfinished)")
args = arg_parser.parse_args()
if OPENAI_API_KEY is None:
print("OpenAI API key is missing. (Hint: use `export OPENAI_API_KEY=YOUR-KEY` before you run the script).\n" +
"If you don't have one go to: https://beta.openai.com/account/api-keys.")
exit(1)
files = get_language_files(None if args.all_files else args.file)
if args.file:
missing_files = set(args.file) - set(files)
if len(missing_files):
print(f"No language files found: {missing_files}")
exit(1)
print(f"Translation mode: {'all' if args.all_translations else 'only unfinished'}. Files: {list(files)}")
for lang, path in files.items():
print(f"Translate {lang} ({path})")
translate_file(path, lang, args.all_translations)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,62 @@
#!/usr/bin/env python3
import json
import os
import requests
import xml.etree.ElementTree as ET
from openpilot.common.basedir import BASEDIR
from openpilot.selfdrive.ui.tests.test_translations import UNFINISHED_TRANSLATION_TAG
from openpilot.selfdrive.ui.update_translations import LANGUAGES_FILE, TRANSLATIONS_DIR
TRANSLATION_TAG = "<translation"
BADGE_HEIGHT = 20 + 8
SHIELDS_URL = "https://img.shields.io/badge"
if __name__ == "__main__":
with open(LANGUAGES_FILE) as f:
translation_files = json.load(f)
badge_svg = []
max_badge_width = 0 # keep track of max width to set parent element
for idx, (name, file) in enumerate(translation_files.items()):
with open(os.path.join(TRANSLATIONS_DIR, f"{file}.ts")) as tr_f:
tr_file = tr_f.read()
total_translations = 0
unfinished_translations = 0
for line in tr_file.splitlines():
if TRANSLATION_TAG in line:
total_translations += 1
if UNFINISHED_TRANSLATION_TAG in line:
unfinished_translations += 1
percent_finished = int(100 - (unfinished_translations / total_translations * 100.))
color = "green" if percent_finished == 100 else "orange" if percent_finished > 90 else "red"
# Download badge
badge_label = f"LANGUAGE {name}"
badge_message = f"{percent_finished}% complete"
if unfinished_translations != 0:
badge_message += f" ({unfinished_translations} unfinished)"
r = requests.get(f"{SHIELDS_URL}/{badge_label}-{badge_message}-{color}", timeout=10)
assert r.status_code == 200, "Error downloading badge"
content_svg = r.content.decode("utf-8")
xml = ET.fromstring(content_svg)
assert "width" in xml.attrib
max_badge_width = max(max_badge_width, int(xml.attrib["width"]))
# Make tag ids in each badge unique to combine them into one svg
for tag in ("r", "s"):
content_svg = content_svg.replace(f'id="{tag}"', f'id="{tag}{idx}"')
content_svg = content_svg.replace(f'"url(#{tag})"', f'"url(#{tag}{idx})"')
badge_svg.extend([f'<g transform="translate(0, {idx * BADGE_HEIGHT})">', content_svg, "</g>"])
badge_svg.insert(0, '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ' +
f'height="{len(translation_files) * BADGE_HEIGHT}" width="{max_badge_width}">')
badge_svg.append("</svg>")
with open(os.path.join(BASEDIR, "translation_badge.svg"), "w") as badge_f:
badge_f.write("\n".join(badge_svg))

0
selfdrive/ui/translations/languages.json Executable file → Normal file
View File

32
selfdrive/ui/translations/main_ar.ts Executable file → Normal file
View File

@@ -562,10 +562,6 @@
<source>Exit</source>
<translation>إغلاق</translation>
</message>
<message>
<source>dashcam</source>
<translation>dashcam</translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
@@ -652,14 +648,14 @@ This may take up to a minute.</source>
<translation>يتم إعادة ضبط الجهاز...
قد يستغرق الأمر حوالي الدقيقة.</translation>
</message>
<message>
<source>Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation>اضغط على تأكيد لمسح جميع المحتويات والإعدادات. اضغط على إلغاء لمتابعة التشغيل.</translation>
</message>
<message>
<source>Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device.</source>
<translation>غير قادر على تحميل جزء البيانات. قد يكون الجزء تالفاً. اضغط على تأكيد لمسح جهازك وإعادة ضبطه.</translation>
</message>
<message>
<source>System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -766,6 +762,18 @@ This may take up to a minute.</source>
<source>Select a language</source>
<translation>اختر لغة</translation>
</message>
<message>
<source>Choose Software to Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot</source>
<translation type="unfinished">openpilot</translation>
</message>
<message>
<source>Custom Software</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1095,10 +1103,6 @@ This may take up to a minute.</source>
<source>Driving Personality</source>
<translation>شخصية القيادة</translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars.</source>
<translation>يوصى بالوضع القياسي. في الوضع الهجومي، سيتبع openpilot السيارات الرائدة بشكل أقرب، ويصبح أكثر هجومية في دواسات الوقود والمكابح. في وضعية الراحة يبقى openplot بعيداً لمسافة جيدة عن السيارة الرائدة.</translation>
</message>
<message>
<source>openpilot defaults to driving in &lt;b&gt;chill mode&lt;/b&gt;. Experimental mode enables &lt;b&gt;alpha-level features&lt;/b&gt; that aren&apos;t ready for chill mode. Experimental features are listed below:</source>
<translation>يتم وضع openpilot بشكل قياسي في &lt;b&gt;وضعية الراحة&lt;/b&gt;. يمكن الوضع التجريبي &lt;b&gt;ميزات المستوى ألفا&lt;/b&gt; التي لا تكون جاهزة في وضع الراحة:</translation>
@@ -1143,6 +1147,10 @@ This may take up to a minute.</source>
<source>Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode.</source>
<translation>تمكين التحكم الطولي من openpilot (ألفا) للسماح بالوضع التجريبي.</translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

30
selfdrive/ui/translations/main_de.ts Executable file → Normal file
View File

@@ -557,10 +557,6 @@
<source>Exit</source>
<translation>Verlassen</translation>
</message>
<message>
<source>dashcam</source>
<translation>dashcam</translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
@@ -634,12 +630,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<source>Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<source>Resetting device...
This may take up to a minute.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Resetting device...
This may take up to a minute.</source>
<source>System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -748,6 +744,18 @@ This may take up to a minute.</source>
<source>Select a language</source>
<translation>Sprache wählen</translation>
</message>
<message>
<source>Choose Software to Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot</source>
<translation type="unfinished">openpilot</translation>
</message>
<message>
<source>Custom Software</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1097,10 +1105,6 @@ This may take up to a minute.</source>
<source>On this car, openpilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>End-to-End Longitudinal Control</source>
<translation type="unfinished"></translation>
@@ -1129,6 +1133,10 @@ This may take up to a minute.</source>
<source>Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

0
selfdrive/ui/translations/main_en.ts Executable file → Normal file
View File

42
selfdrive/ui/translations/main_fr.ts Executable file → Normal file
View File

@@ -68,23 +68,23 @@
</message>
<message>
<source>Hidden Network</source>
<translation type="unfinished"></translation>
<translation>Réseau Caché</translation>
</message>
<message>
<source>CONNECT</source>
<translation type="unfinished">CONNECTER</translation>
<translation>CONNECTER</translation>
</message>
<message>
<source>Enter SSID</source>
<translation type="unfinished">Entrer le SSID</translation>
<translation>Entrer le SSID</translation>
</message>
<message>
<source>Enter password</source>
<translation type="unfinished">Entrer le mot de passe</translation>
<translation>Entrer le mot de passe</translation>
</message>
<message>
<source>for &quot;%1&quot;</source>
<translation type="unfinished">pour &quot;%1&quot;</translation>
<translation>pour &quot;%1&quot;</translation>
</message>
</context>
<context>
@@ -558,10 +558,6 @@
<source>Exit</source>
<translation>Quitter</translation>
</message>
<message>
<source>dashcam</source>
<translation>dashcam</translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
@@ -624,10 +620,6 @@ Cela peut prendre jusqu&apos;à une minute.</translation>
<source>System Reset</source>
<translation>Réinitialisation du système</translation>
</message>
<message>
<source>Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation>Appuyez sur confirmer pour effacer tout le contenu et les paramètres. Appuyez sur annuler pour reprendre le démarrage.</translation>
</message>
<message>
<source>Cancel</source>
<translation>Annuler</translation>
@@ -644,6 +636,10 @@ Cela peut prendre jusqu&apos;à une minute.</translation>
<source>Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device.</source>
<translation>Impossible de monter la partition data. La partition peut être corrompue. Appuyez sur confirmer pour effacer et réinitialiser votre appareil.</translation>
</message>
<message>
<source>System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -750,6 +746,18 @@ Cela peut prendre jusqu&apos;à une minute.</translation>
<source>Select a language</source>
<translation>Choisir une langue</translation>
</message>
<message>
<source>Choose Software to Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot</source>
<translation type="unfinished">openpilot</translation>
</message>
<message>
<source>Custom Software</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1079,10 +1087,6 @@ Cela peut prendre jusqu&apos;à une minute.</translation>
<source>Driving Personality</source>
<translation>Personnalité de conduite</translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars.</source>
<translation>Le mode standard est recommandé. En mode agressif, openpilot suivra de plus près les voitures de tête et sera plus agressif avec l&apos;accélérateur et le frein. En mode détendu, openpilot restera plus éloigné des voitures de tête.</translation>
</message>
<message>
<source>openpilot defaults to driving in &lt;b&gt;chill mode&lt;/b&gt;. Experimental mode enables &lt;b&gt;alpha-level features&lt;/b&gt; that aren&apos;t ready for chill mode. Experimental features are listed below:</source>
<translation>Par défaut, openpilot conduit en &lt;b&gt;mode détente&lt;/b&gt;. Le mode expérimental permet d&apos;activer des &lt;b&gt;fonctionnalités alpha&lt;/b&gt; qui ne sont pas prêtes pour le mode détente. Les fonctionnalités expérimentales sont listées ci-dessous :</translation>
@@ -1127,6 +1131,10 @@ Cela peut prendre jusqu&apos;à une minute.</translation>
<source>Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode.</source>
<translation>Activer le contrôle longitudinal d&apos;openpilot (en alpha) pour autoriser le mode expérimental.</translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

30
selfdrive/ui/translations/main_ja.ts Executable file → Normal file
View File

@@ -556,10 +556,6 @@
<source>Exit</source>
<translation></translation>
</message>
<message>
<source>dashcam</source>
<translation></translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
@@ -630,12 +626,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<source>Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<source>Resetting device...
This may take up to a minute.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Resetting device...
This may take up to a minute.</source>
<source>System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -744,6 +740,18 @@ This may take up to a minute.</source>
<source>Select a language</source>
<translation></translation>
</message>
<message>
<source>Choose Software to Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot</source>
<translation type="unfinished">openpilot</translation>
</message>
<message>
<source>Custom Software</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1089,10 +1097,6 @@ This may take up to a minute.</source>
<source>On this car, openpilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>End-to-End Longitudinal Control</source>
<translation type="unfinished"></translation>
@@ -1121,6 +1125,10 @@ This may take up to a minute.</source>
<source>Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

42
selfdrive/ui/translations/main_ko.ts Executable file → Normal file
View File

@@ -68,23 +68,23 @@
</message>
<message>
<source>Hidden Network</source>
<translation type="unfinished"></translation>
<translation> </translation>
</message>
<message>
<source>CONNECT</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<source>Enter SSID</source>
<translation type="unfinished">SSID </translation>
<translation>SSID </translation>
</message>
<message>
<source>Enter password</source>
<translation type="unfinished"> </translation>
<translation> </translation>
</message>
<message>
<source>for &quot;%1&quot;</source>
<translation type="unfinished">&quot;%1&quot; </translation>
<translation>&quot;%1&quot; </translation>
</message>
</context>
<context>
@@ -557,10 +557,6 @@
<source>Exit</source>
<translation></translation>
</message>
<message>
<source>dashcam</source>
<translation></translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
@@ -630,16 +626,16 @@
<source>Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device.</source>
<translation> . . .</translation>
</message>
<message>
<source>Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation> . .</translation>
</message>
<message>
<source>Resetting device...
This may take up to a minute.</source>
<translation> ...
1 .</translation>
</message>
<message>
<source>System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation> . .</translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -746,6 +742,18 @@ This may take up to a minute.</source>
<source>Select a language</source>
<translation> </translation>
</message>
<message>
<source>Choose Software to Install</source>
<translation> </translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
</message>
<message>
<source>Custom Software</source>
<translation> </translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1095,10 +1103,6 @@ This may take up to a minute.</source>
<source>Driving Personality</source>
<translation> </translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars.</source>
<translation> . openpilot은 . openpilot은 .</translation>
</message>
<message>
<source>An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches.</source>
<translation>openpilot .</translation>
@@ -1123,6 +1127,10 @@ This may take up to a minute.</source>
<source>The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green.</source>
<translation> . . .</translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button.</source>
<translation> . openpilot은 . openpilot은 . .</translation>
</message>
</context>
<context>
<name>Updater</name>

0
selfdrive/ui/translations/main_nl.ts Executable file → Normal file
View File

0
selfdrive/ui/translations/main_pl.ts Executable file → Normal file
View File

42
selfdrive/ui/translations/main_pt-BR.ts Executable file → Normal file
View File

@@ -68,23 +68,23 @@
</message>
<message>
<source>Hidden Network</source>
<translation type="unfinished"></translation>
<translation>Rede Oculta</translation>
</message>
<message>
<source>CONNECT</source>
<translation type="unfinished">CONEXÃO</translation>
<translation>CONECTE</translation>
</message>
<message>
<source>Enter SSID</source>
<translation type="unfinished">Insira SSID</translation>
<translation>Digite o SSID</translation>
</message>
<message>
<source>Enter password</source>
<translation type="unfinished">Insira a senha</translation>
<translation>Insira a senha</translation>
</message>
<message>
<source>for &quot;%1&quot;</source>
<translation type="unfinished">para &quot;%1&quot;</translation>
<translation>para &quot;%1&quot;</translation>
</message>
</context>
<context>
@@ -558,10 +558,6 @@
<source>Exit</source>
<translation>Sair</translation>
</message>
<message>
<source>dashcam</source>
<translation>dashcam</translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
@@ -634,16 +630,16 @@
<source>Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device.</source>
<translation>Não é possível montar a partição de dados. Partição corrompida. Confirme para apagar e redefinir o dispositivo.</translation>
</message>
<message>
<source>Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation>Pressione confirmar para apagar todo o conteúdo e configurações. Pressione cancelar para voltar.</translation>
</message>
<message>
<source>Resetting device...
This may take up to a minute.</source>
<translation>Redefinindo o dispositivo
Isso pode levar até um minuto.</translation>
</message>
<message>
<source>System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation>Reinicialização do sistema acionada. Pressione confirmar para apagar todo o conteúdo e configurações. Pressione cancel para retomar a inicialização.</translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -750,6 +746,18 @@ Isso pode levar até um minuto.</translation>
<source>Select a language</source>
<translation>Selecione o Idioma</translation>
</message>
<message>
<source>Choose Software to Install</source>
<translation>Escolha o Software a ser Instalado</translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
</message>
<message>
<source>Custom Software</source>
<translation>Software Customizado</translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1099,10 +1107,6 @@ Isso pode levar até um minuto.</translation>
<source>Driving Personality</source>
<translation>Temperamento de Direção</translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars.</source>
<translation>Neutro é o recomendado. No modo disputa o openpilot seguirá o carro da frente mais de perto e será mais agressivo com a aceleração e frenagem. No modo calmo o openpilot se manterá mais longe do carro da frente.</translation>
</message>
<message>
<source>An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches.</source>
<translation>Uma versão embrionária do controle longitudinal openpilot pode ser testada em conjunto com o modo Experimental, em branches que não sejam de produção.</translation>
@@ -1127,6 +1131,10 @@ Isso pode levar até um minuto.</translation>
<source>The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green.</source>
<translation>A visualização de condução fará a transição para a câmera grande angular voltada para a estrada em baixas velocidades para mostrar melhor algumas curvas. O logotipo do modo Experimental também será mostrado no canto superior direito. Quando um destino de navegação é definido e o modelo de condução o utiliza como entrada o caminho de condução no mapa fica verde.</translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button.</source>
<translation>Neutro é o recomendado. No modo disputa o openpilot seguirá o carro da frente mais de perto e será mais agressivo com a aceleração e frenagem. No modo calmo o openpilot se manterá mais longe do carro da frente. Em carros compatíveis, você pode alternar esses temperamentos com o botão de distância do volante.</translation>
</message>
</context>
<context>
<name>Updater</name>

32
selfdrive/ui/translations/main_th.ts Executable file → Normal file
View File

@@ -557,10 +557,6 @@
<source>Exit</source>
<translation></translation>
</message>
<message>
<source>dashcam</source>
<translation></translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
@@ -632,14 +628,14 @@ This may take up to a minute.</source>
<translation>...
</translation>
</message>
<message>
<source>Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation> </translation>
</message>
<message>
<source>Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device.</source>
<translation> </translation>
</message>
<message>
<source>System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -746,6 +742,18 @@ This may take up to a minute.</source>
<source>Select a language</source>
<translation></translation>
</message>
<message>
<source>Choose Software to Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot</source>
<translation type="unfinished">openpilot</translation>
</message>
<message>
<source>Custom Software</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1095,10 +1103,6 @@ This may take up to a minute.</source>
<source>Driving Personality</source>
<translation></translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars.</source>
<translation> openpilot openpilot </translation>
</message>
<message>
<source>An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches.</source>
<translation>/ openpilot alpha branch </translation>
@@ -1123,6 +1127,10 @@ This may take up to a minute.</source>
<source>Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode.</source>
<translation>/ openpilot (alpha) </translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

28
selfdrive/ui/translations/main_tr.ts Executable file → Normal file
View File

@@ -556,10 +556,6 @@
<source>Exit</source>
<translation>Çık</translation>
</message>
<message>
<source>dashcam</source>
<translation>araç yol kamerası</translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
@@ -631,11 +627,11 @@ This may take up to a minute.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<source>Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device.</source>
<source>System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -744,6 +740,18 @@ This may take up to a minute.</source>
<source>Select a language</source>
<translation>Dil seçin</translation>
</message>
<message>
<source>Choose Software to Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot</source>
<translation type="unfinished">openpilot</translation>
</message>
<message>
<source>Custom Software</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1073,10 +1081,6 @@ This may take up to a minute.</source>
<source>On this car, openpilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot defaults to driving in &lt;b&gt;chill mode&lt;/b&gt;. Experimental mode enables &lt;b&gt;alpha-level features&lt;/b&gt; that aren&apos;t ready for chill mode. Experimental features are listed below:</source>
<translation type="unfinished"></translation>
@@ -1121,6 +1125,10 @@ This may take up to a minute.</source>
<source>Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

42
selfdrive/ui/translations/main_zh-CHS.ts Executable file → Normal file
View File

@@ -68,23 +68,23 @@
</message>
<message>
<source>Hidden Network</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<source>CONNECT</source>
<translation type="unfinished">CONNECT</translation>
<translation>线</translation>
</message>
<message>
<source>Enter SSID</source>
<translation type="unfinished">SSID</translation>
<translation> SSID</translation>
</message>
<message>
<source>Enter password</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<source>for &quot;%1&quot;</source>
<translation type="unfinished">&quot;%1&quot;</translation>
<translation>&quot;%1&quot;</translation>
</message>
</context>
<context>
@@ -557,10 +557,6 @@
<source>Exit</source>
<translation>退</translation>
</message>
<message>
<source>dashcam</source>
<translation></translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
@@ -630,16 +626,16 @@
<source>Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device.</source>
<translation></translation>
</message>
<message>
<source>Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation></translation>
</message>
<message>
<source>Resetting device...
This may take up to a minute.</source>
<translation>
</translation>
</message>
<message>
<source>System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -746,6 +742,18 @@ This may take up to a minute.</source>
<source>Select a language</source>
<translation></translation>
</message>
<message>
<source>Choose Software to Install</source>
<translation></translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
</message>
<message>
<source>Custom Software</source>
<translation></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1095,10 +1103,6 @@ This may take up to a minute.</source>
<source>Driving Personality</source>
<translation></translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars.</source>
<translation>使openpilot openpilot </translation>
</message>
<message>
<source>An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches.</source>
<translation>release openpilot Alpha </translation>
@@ -1123,6 +1127,10 @@ This may take up to a minute.</source>
<source>The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green.</source>
<translation>广使绿</translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

42
selfdrive/ui/translations/main_zh-CHT.ts Executable file → Normal file
View File

@@ -68,23 +68,23 @@
</message>
<message>
<source>Hidden Network</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<source>CONNECT</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<source>Enter SSID</source>
<translation type="unfinished"> SSID</translation>
<translation> SSID</translation>
</message>
<message>
<source>Enter password</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<source>for &quot;%1&quot;</source>
<translation type="unfinished"> &quot;%1&quot;</translation>
<translation> &quot;%1&quot;</translation>
</message>
</context>
<context>
@@ -557,10 +557,6 @@
<source>Exit</source>
<translation></translation>
</message>
<message>
<source>dashcam</source>
<translation></translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
@@ -630,16 +626,16 @@
<source>Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device.</source>
<translation></translation>
</message>
<message>
<source>Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation></translation>
</message>
<message>
<source>Resetting device...
This may take up to a minute.</source>
<translation>
</translation>
</message>
<message>
<source>System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot.</source>
<translation></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -746,6 +742,18 @@ This may take up to a minute.</source>
<source>Select a language</source>
<translation></translation>
</message>
<message>
<source>Choose Software to Install</source>
<translation></translation>
</message>
<message>
<source>openpilot</source>
<translation>openpilot</translation>
</message>
<message>
<source>Custom Software</source>
<translation></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1095,10 +1103,6 @@ This may take up to a minute.</source>
<source>Driving Personality</source>
<translation></translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars.</source>
<translation>使openpilot openpilot </translation>
</message>
<message>
<source>An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches.</source>
<translation> (release) openpilot Alpha </translation>
@@ -1123,6 +1127,10 @@ This may take up to a minute.</source>
<source>The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green.</source>
<translation></translation>
</message>
<message>
<source>Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>