i18n(android): the interface speaks English, like the desktop app
It was in French because the conversation is, and I never asked. The desktop app the client mirrors says Add field, Attach file, Show previous versions - someone moving between the two would notice the seam. Every visible string moved: buttons, statuses, detail row captions, log lines and the biometric prompt, plus the messages the modules surface through LastStoreError and LastBiometricError. Code comments stay in French. They address the author, not the user, and that is already the language of CLAUDE.md and much of the repo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -104,12 +104,12 @@ begin
|
||||
try
|
||||
if not AcquireService(LSvc) then
|
||||
begin
|
||||
FLastError := 'service biometrique absent de la plateforme';
|
||||
FLastError := 'biometric service missing from the platform';
|
||||
Exit(False);
|
||||
end;
|
||||
Result := LSvc.CanAuthenticate;
|
||||
if not Result then
|
||||
FLastError := 'CanAuthenticate: aucune protection utilisable';
|
||||
FLastError := 'CanAuthenticate: no usable protection';
|
||||
except
|
||||
on E: Exception do
|
||||
begin
|
||||
@@ -136,7 +136,7 @@ begin
|
||||
FLastError := '';
|
||||
if not AcquireService(LSvc) then
|
||||
begin
|
||||
FLastError := 'service biometrique absent de la plateforme';
|
||||
FLastError := 'biometric service missing from the platform';
|
||||
AThen(boFailed); // pas boUnavailable : on ne sait rien de l'appareil
|
||||
Exit;
|
||||
end;
|
||||
@@ -144,7 +144,7 @@ begin
|
||||
if not LSvc.CanAuthenticate then
|
||||
begin
|
||||
// Reponse NETTE du systeme : l'appareil n'a rien pour authentifier.
|
||||
FLastError := 'CanAuthenticate: aucune protection utilisable';
|
||||
FLastError := 'CanAuthenticate: no usable protection';
|
||||
AThen(boUnavailable);
|
||||
Exit;
|
||||
end;
|
||||
@@ -158,9 +158,9 @@ begin
|
||||
end;
|
||||
|
||||
LProps := Default(TBiometricPromptProperties);
|
||||
LProps.Title := 'Deverrouiller le coffre';
|
||||
LProps.Title := 'Unlock the vault';
|
||||
LProps.Description := APrompt;
|
||||
LProps.CancelButtonText := 'Annuler';
|
||||
LProps.CancelButtonText := 'Cancel';
|
||||
LSvc.SetPromptProperties(LProps);
|
||||
|
||||
// Meme raison que plus haut : ce qui remonte de la couche Java doit
|
||||
|
||||
@@ -68,7 +68,7 @@ begin
|
||||
// contenu, seulement son origine.
|
||||
// Les DEUX arguments sont des CharSequence : passer un JString au premier
|
||||
// compile ailleurs mais pas ici.
|
||||
LClip := TJClipData.JavaClass.newPlainText(StrToJCharSequence('coffre'),
|
||||
LClip := TJClipData.JavaClass.newPlainText(StrToJCharSequence('vault'),
|
||||
StrToJCharSequence(AText));
|
||||
LExtras := TJPersistableBundle.JavaClass.init;
|
||||
LExtras.putBoolean(StringToJString(EXTRA_IS_SENSITIVE), True);
|
||||
|
||||
@@ -594,7 +594,7 @@ begin
|
||||
LStore := OpenKeyStore;
|
||||
LCert := LStore.getCertificate(StringToJString(KEY_ALIAS_WRAP));
|
||||
if LCert = nil then
|
||||
raise EPMAStore.Create('Cle publique introuvable dans le Keystore');
|
||||
raise EPMAStore.Create('Public key not found in the Keystore');
|
||||
LPub := LCert.getPublicKey;
|
||||
LFactory := TJKeyFactoryX.JavaClass.getInstance(LPub.getAlgorithm);
|
||||
Result := LFactory.generatePublic(
|
||||
@@ -804,7 +804,7 @@ begin
|
||||
end;
|
||||
{$ELSE}
|
||||
begin
|
||||
raise EPMAStore.Create('Le stockage Keystore est propre a Android');
|
||||
raise EPMAStore.Create('Keystore storage is Android-only');
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ begin
|
||||
Result := Title.Trim;
|
||||
if Result = '' then Result := Site.Trim;
|
||||
if Result = '' then Result := Username.Trim;
|
||||
if Result = '' then Result := '(sans nom)';
|
||||
if Result = '' then Result := '(no name)';
|
||||
end;
|
||||
|
||||
{ TVault }
|
||||
@@ -206,7 +206,7 @@ begin
|
||||
Clear;
|
||||
LRoot := TJSONObject.ParseJSONValue(APlainJson) as TJSONObject;
|
||||
if LRoot = nil then
|
||||
raise Exception.Create('Instantane illisible : ce n''est pas du JSON');
|
||||
raise Exception.Create('Snapshot unreadable: this is not JSON');
|
||||
try
|
||||
FUsername := LRoot.GetValue<string>('username', '');
|
||||
FExportedAt := LRoot.GetValue<string>('exported_at',
|
||||
@@ -228,7 +228,7 @@ begin
|
||||
end;
|
||||
|
||||
if not LRoot.TryGetValue<TJSONArray>('entries', LArr) then
|
||||
raise Exception.Create('Instantane sans tableau "entries"');
|
||||
raise Exception.Create('Snapshot has no "entries" array');
|
||||
|
||||
SetLength(FEntries, LArr.Count);
|
||||
N := 0;
|
||||
|
||||
Reference in New Issue
Block a user