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