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 = 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');
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,
]);
}
}