====== Internacionalizacija (i18n) ======
Smjernice za višejezičnost WvdS FPC RAD Suite.
===== Temeljno načelo =====
**Bez literalnih stringova u Pascal-kodu** (osim u asm-blokovima i tehničkim konstantama).
===== Podržani jezici =====
^ Kod ^ Jezik ^ Status ^
| EN | Engleski | Baza (Obavezno) |
| DE | Njemački | Potpuno |
| SL | Slovenski | Potpuno |
| HR | Hrvatski | Potpuno |
===== Resourcestrings =====
==== Struktura ====
sources/common/core/
├── WvdS.VSCode.Strings.pas # Engleski (Default)
├── WvdS.VSCode.Strings.DE.pas # Njemački
├── WvdS.VSCode.Strings.SL.pas # Slovenski
└── WvdS.VSCode.Strings.HR.pas # Hrvatski
==== Bazna Unit (Engleski) ====
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.
==== Hrvatski prijevod ====
unit WvdS.VSCode.Strings.HR;
{$mode objfpc}{$H+}
interface
resourcestring
// === CORE ===
rsCoreActivated = 'WvdS Core extension aktiviran';
rsCoreDeactivated = 'WvdS Core extension deaktiviran';
rsCoreError = 'Greška: %s';
// === BUILD ===
rsBuildStarting = 'Build se pokreće...';
rsBuildCompleted = 'Build uspješno završen';
rsBuildFailed = 'Build neuspješan: %s';
rsBuildCompilerNotFound = 'Compiler nije pronađen: %s';
// === PROJECTS ===
rsProjectCreating = 'Kreiranje projekta...';
rsProjectCreated = 'Projekt ''%s'' uspješno kreiran';
rsProjectNameEmpty = 'Naziv projekta ne smije biti prazan';
rsProjectNameTooLong = 'Naziv projekta ne smije imati više od %d znakova';
rsProjectNameInvalidChar = 'Nevaljani znak u nazivu projekta: ''%s''';
// === TOOLCHAIN ===
rsToolNotFound = 'Alat nije pronađen: %s';
rsToolDetected = '%s pronađen na %s';
rsToolVersionMismatch = '%s verzija %s pronađena, očekivana %s';
// === VALIDATION ===
rsValidationFailed = 'Validacija neuspješna: %s';
rsFileNotFound = 'Datoteka nije pronađena: %s';
rsAccessDenied = 'Pristup odbijen: %s';
rsUnexpectedError = 'Neočekivana greška (%s): %s';
implementation
end.
===== Korištenje u kodu =====
==== Jednostavni stringovi ====
uses
WvdS.VSCode.Strings;
// ISPRAVNO
ShowInfoMessage(rsBuildStarting);
// ZABRANJENO
ShowInfoMessage('Build starting...');
==== Stringovi s parametrima ====
// ISPRAVNO - Koristiti Format
ShowInfoMessage(Format(rsProjectCreated, [ProjectName]));
ShowErrorMessage(Format(rsBuildFailed, [ErrorMessage]));
// ZABRANJENO
ShowInfoMessage('Project ''' + ProjectName + ''' created');
==== Pluralizacija ====
resourcestring
rsFilesFound_One = '%d file found';
rsFilesFound_Many = '%d files found';
function GetFilesFoundMessage(ACount: Integer): string;
begin
if ACount = 1 then
Result := Format(rsFilesFound_One, [ACount])
else
Result := Format(rsFilesFound_Many, [ACount]);
end;
===== Dozvoljene iznimke =====
==== Tehničke konstante ====
const
// Tehnički ID-evi - ne prevoditi
COMMAND_ID = 'wvds.build.run';
FILE_EXTENSION = '.pas';
CONFIG_KEY = 'wvds.toolchain.fpcPath';
==== Format-Stringovi ====
const
// JSON/XML Templates - ne prevoditi
JSON_TEMPLATE = '{"name": "%s", "version": "%s"}';
XML_TEMPLATE = '<%s>%s%s>';
==== asm-blokovi ====
// JavaScript-kod smije sadržavati stringove
asm
console.log('Debug message');
vscode.window.showInformationMessage('Hello');
end;
===== Workflow: Dodavanje novog stringa =====
==== Korak 1: Definirati engleski string ====
// WvdS.VSCode.Strings.pas
resourcestring
rsNewFeatureMessage = 'New feature activated';
==== Korak 2: Njemački prijevod ====
// WvdS.VSCode.Strings.DE.pas
resourcestring
rsNewFeatureMessage = 'Neue Funktion aktiviert';
==== Korak 3: Slovenski prijevod ====
// WvdS.VSCode.Strings.SL.pas
resourcestring
rsNewFeatureMessage = 'Nova funkcija aktivirana';
==== Korak 4: Hrvatski prijevod ====
// WvdS.VSCode.Strings.HR.pas
resourcestring
rsNewFeatureMessage = 'Nova funkcija aktivirana';
==== Korak 5: Koristiti u kodu ====
ShowInfoMessage(rsNewFeatureMessage);
===== Odabir jezika za vrijeme izvršavanja =====
Jezik se čita iz VS Code postavki:
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
// Engleski kao Fallback
LoadEnglishStrings;
end;
end;
===== Validacija =====
==== wvds-lint i18n-Check ====
wvds-lint i18n --path sources/
Provjerava se:
* Hardkodirani stringovi u kodu
* Nedostajući prijevodi
* Nekorišteni Resourcestrings
* Konzistentnost Format-Stringova (jednak broj %s, %d)
==== Checklista ====
[ ] Engleski string definiran
[ ] Njemački prijevod dodan
[ ] Slovenski prijevod dodan
[ ] Hrvatski prijevod dodan
[ ] Format-parametri se podudaraju
[ ] Korišteno u kodu (nije hardkodirano)
[ ] wvds-lint i18n uspješan
===== Best Practices =====
==== Jasni, kontekst-neovisni stringovi ====
// DOBRO - Samoobjašnjavajuće
rsFileNotFound = 'File not found: %s';
// LOŠE - Nedostaje kontekst
rsNotFound = 'Not found: %s'; // Što nije pronađeno?
==== Preferirati pune rečenice ====
// DOBRO
rsProjectCreatedSuccessfully = 'Project ''%s'' was created successfully.';
// LOŠE - Fragmenti
rsProject = 'Project';
rsCreated = 'created';
rsSuccessfully = 'successfully';
// UI: rsProject + ' ' + Name + ' ' + rsCreated + ' ' + rsSuccessfully
// Problem: Redoslijed riječi varira između jezika!
==== Konzistentna terminologija ====
| Pojam | Engleski | Njemački | Hrvatski |
| Build | Build | Build (ne "Erstellung") | Build |
| Compile | Compile | Kompilieren | Kompiliranje |
| Path | Path | Pfad | Putanja |
| Settings | Settings | Einstellungen | Postavke |
===== Vidi također =====
* [[.:code-konventionen|Konvencije koda]]
* [[.:extension-entwicklung|Razvoj Extensiona]]