====== 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'; ==== 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]]