Översättning
Introduktion
Horizon har inbyggt stöd för gettext-baserade översättningar för PHP, Blade och TypeScript/JavaScript. gettext använder .pot, .po och .mo filer för att definiera översättningsbara strängar.
Standardspråk i Horizon är svenska, men samtliga strängar går att översätta genom denna process.
.pot
.pot filer är huvudfiler som alla översättningar utgår från.
Dessa filer kommer skrivas över när man lägger till fler strängar som går att översätta och bör ej innehålla översättningar.
.po
.po filer är filerna som innehåller översättningar och baseras på .pot filer.
För att gå från en översättning i en .po fil behövs den kompileras till en .mo fil.
.mo
.mo filer är de kompilerade filerna som gettext läser översättningar från. Bör aldrig ändras manuellt.
Översättningsprocessen
Ifall du använder ett program som Poedit kan du skapa och uppdatera en .po fil direkt från .pot filen och behöver inte manuellt skapa/uppdatera en .mo eftersom programmet kan skapa det åt dig.
Flödet för översättningar
- Skapa eller ändra översättningsbara strängar i koden.
- En "översättningsbar sträng" innebär en sträng som använder en av översättningsfunktionerna.
- Kör kommandot
pnpm translate. - Skapa eller uppdatera
.pofiler för varje språk baserat på.potfilen- Om du inte använder ett översättningsprogram kan du kopiera
.potfilen och döpa om kopian till.po. - Exempelvis
horizon.pot->en_US.poför "English (United States)". - Synkande av
.pooch.potfiler är enklast att göra med ett översättningsprogram som Poedit eller ett plugin som Loco Translate.
- Om du inte använder ett översättningsprogram kan du kopiera
- Skapa eller uppdatera översättningarna i språkets
.pofil.- Använd gärna ex. Poedit eller Loco Translate för detta.
- Kör kommandot
wp i18n make-mo <din-po-fil>för att återskapa.mofilen.- Exempelvis
wp i18n make-mo en_US.po.
- Exempelvis
Viktigt
Filnamn för språk ska endast vara själva språkkoden, t.ex. en_US.mo och fr_FR.mo. Tidigare versioner av dokumentationen skrev att det skulle vara horizon-<språk>.mo, men det är fel. Temaöversättningar som ligger i temamappen ska inte innehålla textdomänen i filnamnet.
PHP
För att skapa översättningsbara strängar används funktioner som __.
Se WordPress dokumentation för översättningsfunktioner.
Exempel
echo __('Inställningar', 'horizon');Blade
Översättningar av Blade filer använder samma mekanismer som i PHP sektionen ovan, men översättningarna baseras inte på själva Blade filerna, utan de baseras på de kompilerade vyerna som finns i storage/framework/views mappen.
Detta sker eftersom WP-CLI inte förstår Blade filer, men eftersom Blade vyer alltid kompileras till vanliga PHP filer för prestanda funkar det utan större problem.
Det finns två nackdelar med detta:
- Översättningskommentarerna pekar inte till rätt original filnamn, de pekar till kompilerade filernas namn, och de är inte konsekventa.
- Ifall man glömmer att uppdaterade de kompilerade filerna kommer inte de översättningsbara strängarna tas med.
För att underlätta den andra nackdelen används ett översättningsskript.
TypeScript/JavaScript
För TypeScript/JavaScript används biblioteket @wordpress/i18n, som innehåller funktioner som sprintf och __. Se i18n paketets dokumentation för mer information.
De relevanta funktionerna är:
__sprintf_n_nx_x
INFO
JavaScript stöds som standard, medan TypeScript har inget inbyggt stöd. För att ge stöd till TypeScript används ett översättningsskript.
Exempel
import { __ } from '@wordpress/i18n';
console.log(__('Inställningar', 'horizon'));Översättningsskriptet
För att kunna stödja TypeScript och se till att Blade filer alltid är uppdaterade används ett litet översättningsskript som heter translate.mjs.
Detta skript använder esbuild för att temporärt konvertera samtliga TypeScript filer till JavaScript. (esbuild används av Vite för dev och minification syften)
Sen kör den kommandot wp dusk view:cache för att se till att samtliga Blade filer är kompilerade.
Efter det kör den kommandot wp i18n make-pot . ./resources/lang/horizon.pot --domain=horizon för att skapa .pot filen.
Till slut tar den bort de konverterade JavaScript filerna.