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

Zuletzt geändert: 29.01.2026. u 22:35