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

Zuletzt geändert: dne 29.01.2026 ob 22:27