PHP code example of wlib / i18n

1. Go to this page and download the library: Download wlib/i18n library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

wlib / i18n example snippets


use wlib\I18n\Translator;

// Création de l'instance
$translator = new Translator();

// Chargement des fichiers de traduction
$translator->addTranslationsFile('/chemin/vers/translations/fr_FR.po', 'default');
$translator->addTranslationsFile('/chemin/vers/translations/en_US.po', 'default');

use wlib\DiBox\DiBox;
use wlib\I18n\Translator;

// Enregistrement dans le conteneur DI
DiBox::getInstance()->register(Translator::class, function() {
    $translator = new Translator();
    $translator->addTranslationsFile(__DIR__.'/translations/fr_FR.po', 'default');
    return $translator;
});

use wlib\I18n\Translator;

// Initialisation
$translator = new Translator();
$translator->addTranslationsFile(__DIR__.'/locales/fr_FR.po');

// Utilisation des helpers
echo __('Bienvenue sur notre site');  // "Welcome to our site" en anglais
echo _n('1 résultat trouvé', '%d résultats trouvés', 5);  // "5 résultats trouvés"
echo _x('Mois', 'unité de temps', 'time');  // "Month" avec contexte
echo _s('Bonjour %s', 'Marie');  // "Bonjour Marie"

// ✅ Bon - Chaînes traduisibles extraites
echo __('Nom d\'utilisateur');
echo _n('1 élément', '%d éléments', $count);

// ❌ À éviter - Concénation avant traduction
echo __('Nom' . ' ' . 'd\'utilisateur');  // Ne sera pas traduit correctement

// ✅ Bon - Avec contexte pour les homonymes
echo _x('Post', 'article de blog', 'content');
echo _x('Post', 'méthode HTTP', 'http');

// Dans le code PHP
echo _s('Bonjour %1$s, vous avez %2$d nouveaux messages', 'Jean', 5);

// Dans le fichier .po
msgid "Hello %1$s, you have %2$d new messages"
msgstr "Bonjour %1$s, vous avez %2$d nouveaux messages"

use wlib\Application\Application;
use wlib\I18n\Translator;

$app = new Application(__DIR__.'/config');

// Le Translator est automatiquement disponible via DI
$translator = $app->getContainer()->get(Translator::class);
$translator->addTranslationsFile(__DIR__.'/locales/fr_FR.po');

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use wlib\I18n\Translator;

class LocaleMiddleware implements MiddlewareInterface
{
    public function __construct(
        private Translator $translator,
        private string $defaultLocale = 'fr_FR'
    ) {}

    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        // Détection de la langue depuis la requête
        $locale = $request->getHeaderLine('Accept-Language') ?: $this->defaultLocale;

        // Chargement du fichier de traduction correspondant
        $this->translator->addTranslationsFile(
            __DIR__."/locales/{$locale}/default.po",
            'default'
        );

        return $handler->handle($request);
    }
}

   $translator->addTranslationsFile('/chemin/correct/fr_FR.po', 'default');
   

$translator = new Translator();  // Cette ligne doit être exécutée avant
echo __('Ma traduction');  // Fonctionne

$translator = new Translator();

// Ajout de plusieurs fichiers pour le même domaine
// (les traductions sont fusionnées)
$translator->addTranslationsFile(__DIR__.'/locales/fr_FR/annulations.po', 'admin');
$translator->addTranslationsFile(__DIR__.'/locales/fr_FR/annulations-supplementaires.po', 'admin');

$translator = new Translator();
$translator->addTranslationsFile(__DIR__.'/locales/fr_FR.po');

// Traduction directe
$translated = $translator->translate('Hello world', 'default');

// Traduction plurielle directe
$translated = $translator->translatePlural(
    'One item',
    '%d items',
    5,
    'default'
);


return [
    'default_locale' => 'fr_FR',
    'fallback_locale' => 'en_US',
    'locales_dir' => __DIR__ . '/../locales',
    'domains' => [
        'default' => ['fr_FR', 'en_US'],
        'admin' => ['fr_FR'],
    ],
];


use wlib\DiBox\DiBox;
use wlib\I18n\Translator;

$config = e ($config) {
    $translator = new Translator();

    foreach ($config['domains'] as $domain => $locales) {
        foreach ($locales as $locale) {
            $file = sprintf(
                '%s/%s/%s.po',
                $config['locales_dir'],
                $locale,
                $domain
            );

            if (is_file($file)) {
                $translator->addTranslationsFile($file, $domain);
            }
        }
    }

    return $translator;
});


namespace App\Controllers;

use wlib\Application\Controllers\Controller;
use wlib\I18n\Translator;

class HomeController extends Controller
{
    public function __construct(private Translator $translator)
    {
        // Le Translator est injecté automatiquement par DI
    }

    public function index()
    {
        $title = __('Bienvenue sur notre application');
        $description = _s(
            'Il y a actuellement %d utilisateurs enregistrés.',
            $this->userRepository->count()
        );

        return $this->render('home.index', [
            'title' => $title,
            'description' => $description,
        ]);
    }
}

mon-application/
├── config/
│   └── translations.php
├── locales/
│   ├── fr_FR/
│   │   └── default.po
│   └── en_US/
│       └── default.po
├── src/
│   ├── Controllers/
│   │   └── HomeController.php
│   └── bootstrap.php
└── public/
    └── index.php