Localization

Serve localized responses with PowerShell-style string tables resolved per request.

Full source

File: pwsh/tutorial/examples/21.1-Localization.ps1

<#!
    Sample: Localization (PowerShell string tables)
    File:   21.1-Localization.ps1
#>

param(
    [int]$Port = 5000,
    [IPAddress]$IPAddress = [IPAddress]::Loopback
)

Initialize-KrRoot -Path $PSScriptRoot

New-KrLogger |
    Set-KrLoggerLevel -Value Information |
    Add-KrSinkConsole |
    Register-KrLogger -Name 'console' -SetAsDefault

New-KrServer -Name 'Localization Demo'

Add-KrEndpoint -Port $Port -IPAddress $IPAddress

Add-KrLocalizationMiddleware -ResourcesBasePath './Assets/i18n' -EnableQuery -EnableCookie

Add-KrMapRoute -Verbs Get -Pattern '/hello' -ScriptBlock {
    Expand-KrObject -InputObject $Context.Culture -Label 'Current Culture'
    $culture = [System.Globalization.CultureInfo]::CurrentCulture
    $now = [DateTime]::ParseExact('20260829', 'yyyyMMdd', [System.Globalization.CultureInfo]::InvariantCulture)
    $payload = [ordered]@{
        culture = $Context.Culture
        hello = Get-KrLocalizedString -Key 'Hello' -Default 'Hello'
        save = Get-KrLocalizedString -Key 'Labels.Save' -Default 'Save'
        cancel = Get-KrLocalizedString -Key 'Labels.Cancel' -Default 'Cancel'
        dateSample = $now.ToString('D', $culture)
        currencySample = 1234.56.ToString('C', $culture)
        calendar = [System.Globalization.CultureInfo]::GetCultureInfo($Context.Culture).Calendar
        calendarName = [System.Globalization.CultureInfo]::GetCultureInfo($Context.Culture).Calendar.GetType().Name
    }

    Write-KrJsonResponse -InputObject $payload -StatusCode 200
}

Add-KrMapRoute -Verbs Get -Pattern '/cultures' -ScriptBlock {
    $cultures = Get-KrLocalizationCulture | Sort-Object Name | ForEach-Object { $_.Name }
    Write-KrJsonResponse -InputObject @{ cultures = $cultures } -StatusCode 200
}

Enable-KrConfiguration

Start-KrServer

Step-by-step

  1. Root: Initialize-KrRoot anchors relative paths for the localization folder.
  2. Logging: New-KrLogger configures console output.
  3. Server: New-KrServer creates the host and Add-KrEndpoint binds a listener.
  4. Localization: Add-KrLocalizationMiddleware loads string tables from Assets/i18n.
  5. Route: Add-KrMapRoute returns localized JSON using Get-KrLocalizedString.
  6. Route: Add-KrMapRoute exposes /cultures using Get-KrLocalizationCulture.
  7. Start: Enable-KrConfiguration and Start-KrServer apply and run.

Try it

# Default culture
curl -i http://127.0.0.1:5000/hello

# Query override (Italian)
curl -i "http://127.0.0.1:5000/hello?lang=it-IT"

# List available cultures
curl -i http://127.0.0.1:5000/cultures

Troubleshooting

  • If /hello always returns the default culture, verify the request includes ?lang=it-IT (or an Accept-Language header) and that Add-KrLocalizationMiddleware points at the correct Assets/i18n folder.
  • If /cultures is empty, check that culture folders exist (for example Assets/i18n/en-US/Messages.psd1) and that the server started without localization parsing errors.

References


Previous / Next

Previous: Tasks Next: Razor Localization