Translate the remaining French and Turkish

mise.toml, the comments in app/build.gradle (corrected where they no
longer described the build: the car build is signed by build-car, and
the updater reads the version from build-car's file name), OTA.md's
message table (now the updater's current English messages), the Turkish
messages quoted in CHANGELOG.md and OTA.md (glossed in English), two
test assertion messages, an icon comment, and the ignition-state comment
in EVHardware.kt. The vendored EVHardware library still has about 120
half-French comment lines; noted in SPECS.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLJfZQZeAKAwSqViTmLzki
This commit is contained in:
2026-10-18 17:45:56 +02:00
co-authored by Claude Opus 5.5
parent 5e2e354bdd
commit 29064cf8db
8 changed files with 116 additions and 117 deletions
+18 -17
View File
@@ -10,14 +10,14 @@ android {
}
}
// Signature de l'APK — rien à voir avec la clé d'API ABRP de l'utilisateur.
// Ces valeurs servent UNIQUEMENT au build : elles prouvent que l'APK vient bien de
// nous et n'entrent jamais dans l'application. La clé d'API et le token ABRP, eux,
// sont saisis dans l'app et stockés chiffrés sur l'appareil (voir SecurePrefs).
// APK signing — nothing to do with the user's ABRP credentials. These values are ONLY for
// the build: they prove the APK comes from us and never enter the app. The ABRP API key and
// token are entered in the app and stored encrypted on the device (see SecurePrefs).
// The car build is signed by build-car (flake.nix) with the AOSP platform key instead.
//
// Un keystore contient plusieurs clés : SIGNING_STORE_PASSWORD ouvre le conteneur,
// SIGNING_KEY_ALIAS choisit la clé, SIGNING_KEY_PASSWORD ouvre cette clé-là.
// Lues depuis l'environnement (CI) ou gradle.properties local — JAMAIS commitées.
// A keystore holds several keys: SIGNING_STORE_PASSWORD opens the container,
// SIGNING_KEY_ALIAS picks the key, SIGNING_KEY_PASSWORD opens that key.
// Read from the environment (CI) or a local gradle.properties — NEVER committed.
def keystorePath = System.getenv("SIGNING_KEYSTORE") ?: project.findProperty("signing.keystore")
signingConfigs {
if (keystorePath != null && file(keystorePath).exists()) {
@@ -43,15 +43,15 @@ android {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
// null quand aucun keystore n'est configuré : le build reste possible sur une
// machine sans secrets (APK non signé), au lieu d'échouer.
// null when no keystore is configured: the build still works on a machine without
// secrets (unsigned APK) instead of failing.
def platformSigning = signingConfigs.findByName("platform")
// Deux canaux de distribution :
// - stable : diffusé en release taguée, AUCUN auto-update. L'utilisateur installe
// lui-même ; rien dans l'app ne va chercher un APK.
// - unstable : pré-releases publiées à chaque push sur master, avec OTA pour que les testeurs
// soient à jour sans manipulation. Installable à côté du stable.
// Two distribution channels:
// - stable: no self-update at all. The user installs it; nothing in the app fetches an
// APK (the updater is not even in this APK).
// - unstable: the car build (system UID, platform-signed), with the OTA updater, so the
// car can update itself from published pre-releases. Installs next to stable.
flavorDimensions += "channel"
productFlavors {
stable {
@@ -111,13 +111,14 @@ tasks.register('printUnstableVersion') {
}
}
// Nomme les APK par canal pour que les artefacts de release soient lisibles.
// Names the APKs by channel so the build outputs are readable.
androidComponents {
onVariants(selector().all()) { variant ->
variant.outputs.each { output ->
if (variant.buildType == "release") {
// Le canal unstable garde un nom de fichier stable : l'updater identifie
// la version par le tag de la pré-release, jamais par le nom d'APK.
// A fixed name for the unstable release output. What is published for the car
// comes from build-car, named NilsMG4-unstable-<version>.apk: that file name is
// where the updater reads a release's version from.
output.outputFileName.set(variant.flavorName == "unstable"
? "NilsMG4-unstable.apk"
: "NilsMG4-${variant.flavorName}-${output.versionName.get()}.apk")
+1 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Terminal : onglet Log. Teinté par @color/nav_tab_foreground. -->
<!-- Terminal: the Logs tab. Tinted by @color/nav_tab_foreground. -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
@@ -50,7 +50,7 @@ public class TelemetryPayloadTest {
"batt_temp", "capacity", "odometer", "hvac_setpoint",
"tire_pressure_fl", "tire_pressure_fr",
"tire_pressure_rl", "tire_pressure_rr"}) {
assertFalse("le champ " + field + " aurait dû être omis", json.contains(field));
assertFalse("field " + field + " should have been omitted", json.contains(field));
}
}
@@ -60,7 +60,7 @@ public class TelemetryPayloadTest {
TelemetryPayload t = new TelemetryPayload(1L);
t.speedKmh = 48.4f;
JSONObject json = new JSONObject(t.build());
assertFalse("soc illisible aurait dû être omis", json.has("soc"));
assertFalse("an unreadable soc should have been omitted", json.has("soc"));
assertEquals(48, json.getInt("speed"));
}