====== Internacionalizacija (i18n) ======
Smernice za večjezičnost WvdS FPC RAD Suite.
===== Osnovno načelo =====
**Nobenih dobesednih nizov v Pascal kodi** (razen v blokih asm in tehničnih konstantah).
===== Podprti jeziki =====
^ Koda ^ Jezik ^ Status ^
| EN | Angleščina | Osnova (obvezno) |
| DE | Nemščina | Popolno |
| SL | Slovenščina | Popolno |
| HR | Hrvaščina | Popolno |
===== Resourcestrings =====
==== Struktura ====
sources/common/core/
├── WvdS.VSCode.Strings.pas # Angleščina (privzeto)
├── WvdS.VSCode.Strings.DE.pas # Nemščina
├── WvdS.VSCode.Strings.SL.pas # Slovenščina
└── WvdS.VSCode.Strings.HR.pas # Hrvaščina
==== Osnovna enota (angleščina) ====
unit WvdS.VSCode.Strings;
{$mode objfpc}{$H+}
interface
resourcestring
// === CORE ===
rsCoreActivated = 'WvdS Core extension activated';
rsCoreDeactivated = 'WvdS Core extension deactivated';
rsCoreError = 'Error: %s';
// === BUILD ===
rsBuildStarting = 'Build starting...';
rsBuildCompleted = 'Build completed successfully';
rsBuildFailed = 'Build failed: %s';
rsBuildCompilerNotFound = 'Compiler not found: %s';
// === PROJECTS ===
rsProjectCreating = 'Creating project...';
rsProjectCreated = 'Project ''%s'' created successfully';
rsProjectNameEmpty = 'Project name cannot be empty';
rsProjectNameTooLong = 'Project name cannot exceed %d characters';
rsProjectNameInvalidChar = 'Invalid character in project name: ''%s''';
// === TOOLCHAIN ===
rsToolNotFound = 'Tool not found: %s';
rsToolDetected = '%s detected at %s';
rsToolVersionMismatch = '%s version %s found, expected %s';
// === VALIDATION ===
rsValidationFailed = 'Validation failed: %s';
rsFileNotFound = 'File not found: %s';
rsAccessDenied = 'Access denied: %s';
rsUnexpectedError = 'Unexpected error (%s): %s';
implementation
end.
==== Slovenski prevod ====
unit WvdS.VSCode.Strings.SL;
{$mode objfpc}{$H+}
interface
resourcestring
// === CORE ===
rsCoreActivated = 'WvdS Core razširitev aktivirana';
rsCoreDeactivated = 'WvdS Core razširitev deaktivirana';
rsCoreError = 'Napaka: %s';
// === BUILD ===
rsBuildStarting = 'Gradnja se zaganja...';
rsBuildCompleted = 'Gradnja uspešno zaključena';
rsBuildFailed = 'Gradnja ni uspela: %s';
rsBuildCompilerNotFound = 'Prevajalnik ni najden: %s';
// === PROJECTS ===
rsProjectCreating = 'Ustvarjanje projekta...';
rsProjectCreated = 'Projekt ''%s'' uspešno ustvarjen';
rsProjectNameEmpty = 'Ime projekta ne sme biti prazno';
rsProjectNameTooLong = 'Ime projekta ne sme presegati %d znakov';
rsProjectNameInvalidChar = 'Neveljaven znak v imenu projekta: ''%s''';
// === TOOLCHAIN ===
rsToolNotFound = 'Orodje ni najdeno: %s';
rsToolDetected = '%s zaznano na %s';
rsToolVersionMismatch = '%s različica %s najdena, pričakovana %s';
// === VALIDATION ===
rsValidationFailed = 'Validacija ni uspela: %s';
rsFileNotFound = 'Datoteka ni najdena: %s';
rsAccessDenied = 'Dostop zavrnjen: %s';
rsUnexpectedError = 'Nepričakovana napaka (%s): %s';
implementation
end.
===== Uporaba v kodi =====
==== Preprosti nizi ====
uses
WvdS.VSCode.Strings;
// PRAVILNO
ShowInfoMessage(rsBuildStarting);
// PREPOVEDANO
ShowInfoMessage('Build starting...');
==== Nizi s parametri ====
// PRAVILNO - uporabite Format
ShowInfoMessage(Format(rsProjectCreated, [ProjectName]));
ShowErrorMessage(Format(rsBuildFailed, [ErrorMessage]));
// PREPOVEDANO
ShowInfoMessage('Project ''' + ProjectName + ''' created');
==== Množina ====
resourcestring
rsFilesFound_One = '%d datoteka najdena';
rsFilesFound_Many = '%d datotek najdenih';
function GetFilesFoundMessage(ACount: Integer): string;
begin
if ACount = 1 then
Result := Format(rsFilesFound_One, [ACount])
else
Result := Format(rsFilesFound_Many, [ACount]);
end;
===== Dovoljene izjeme =====
==== Tehnične konstante ====
const
// Tehnični ID-ji - ne prevajajte
COMMAND_ID = 'wvds.build.run';
FILE_EXTENSION = '.pas';
CONFIG_KEY = 'wvds.toolchain.fpcPath';
==== Formatni nizi ====
const
// JSON/XML predloge - ne prevajajte
JSON_TEMPLATE = '{"name": "%s", "version": "%s"}';
XML_TEMPLATE = '<%s>%s%s>';
==== Bloki asm ====
// JavaScript koda lahko vsebuje nize
asm
console.log('Debug message');
vscode.window.showInformationMessage('Hello');
end;
===== Potek dela: Dodajanje novega niza =====
==== Korak 1: Definirajte angleški niz ====
// WvdS.VSCode.Strings.pas
resourcestring
rsNewFeatureMessage = 'New feature activated';
==== Korak 2: Nemški prevod ====
// WvdS.VSCode.Strings.DE.pas
resourcestring
rsNewFeatureMessage = 'Neue Funktion aktiviert';
==== Korak 3: Slovenski prevod ====
// WvdS.VSCode.Strings.SL.pas
resourcestring
rsNewFeatureMessage = 'Nova funkcija aktivirana';
==== Korak 4: Hrvaški prevod ====
// WvdS.VSCode.Strings.HR.pas
resourcestring
rsNewFeatureMessage = 'Nova funkcija aktivirana';
==== Korak 5: Uporabite v kodi ====
ShowInfoMessage(rsNewFeatureMessage);
===== Izbira jezika med izvajanjem =====
Jezik se prebere iz nastavitev VS Code:
function GetCurrentLanguage: string;
begin
Result := GetVSCodeLanguage; // npr. 'de', 'en', 'sl', 'hr'
end;
procedure LoadLanguageStrings;
var
Lang: string;
begin
Lang := GetCurrentLanguage;
case Lang of
'de': LoadGermanStrings;
'sl': LoadSlovenianStrings;
'hr': LoadCroatianStrings;
else
// Angleščina kot nadomestek
LoadEnglishStrings;
end;
end;
===== Validacija =====
==== Preverjanje i18n z wvds-lint ====
wvds-lint i18n --path sources/
Preveri se:
* Zakodirani nizi v kodi
* Manjkajoči prevodi
* Neuporabljeni resourcestrings
* Doslednost formatnih nizov (enako število %s, %d)
==== Kontrolni seznam ====
[ ] Angleški niz definiran
[ ] Nemški prevod dodan
[ ] Slovenski prevod dodan
[ ] Hrvaški prevod dodan
[ ] Formatni parametri se ujemajo
[ ] V kodi uporabljeno (ni zakodirano)
[ ] wvds-lint i18n uspešen
===== Najboljše prakse =====
==== Jasni, od konteksta neodvisni nizi ====
// DOBRO - Samoopisujoče
rsFileNotFound = 'Datoteka ni najdena: %s';
// SLABO - Manjka kontekst
rsNotFound = 'Ni najdeno: %s'; // Kaj ni bilo najdeno?
==== Prednostno polni stavki ====
// DOBRO
rsProjectCreatedSuccessfully = 'Projekt ''%s'' je bil uspešno ustvarjen.';
// SLABO - Fragmenti
rsProject = 'Projekt';
rsCreated = 'ustvarjen';
rsSuccessfully = 'uspešno';
// UI: rsProject + ' ' + Name + ' ' + rsCreated + ' ' + rsSuccessfully
// Problem: Besedni red se razlikuje med jeziki!
==== Dosledna terminologija ====
| Pojem | Angleščina | Slovenščina |
| Build | Build | Gradnja |
| Compile | Compile | Prevajanje |
| Path | Path | Pot |
| Settings | Settings | Nastavitve |
===== Glejte tudi =====
* [[.:code-konventionen|Kodne konvencije]]
* [[.:extension-entwicklung|Razvoj razširitev]]