tobento / app-language
应用语言支持。
1.0.5
2024-09-07 13:43 UTC
Requires
- php: >=8.0
- tobento/app: ^1.0
- tobento/app-database: ^1.0
- tobento/app-http: ^1.0.6
- tobento/app-migration: ^1.0
- tobento/service-dater: ^1.0.2
- tobento/service-language: ^1.0.4
- tobento/service-repository: ^1.0
- tobento/service-repository-storage: ^1.0
- tobento/service-requester: ^1.0.2
- tobento/service-routing: ^1.0.8
- tobento/service-support: ^1.0
Requires (Dev)
- nyholm/psr7: ^1.4
- phpunit/phpunit: ^9.5
- tobento/app-translation: ^1.0
- vimeo/psalm: ^4.0
README
应用的语言支持。
目录
入门
使用以下命令添加正在运行的应用语言项目的最新版本。
composer require tobento/app-language
要求
- PHP 8.0 或更高版本
文档
应用
如果您使用的是骨架,请查看 应用骨架。
如果您想了解有关应用的更多信息,请查看 应用。
语言启动
语言启动执行以下操作
- 安装和加载语言配置文件
- 根据配置实现语言接口
- 确定当前语言
- 在 日期格式化器 上设置当前语言
use Tobento\App\AppFactory; // Create the app $app = (new AppFactory())->createApp(); // Add directories: $app->dirs() ->dir(realpath(__DIR__.'/../'), 'root') ->dir(realpath(__DIR__.'/../app/'), 'app') ->dir($app->dir('app').'config', 'config', group: 'config') ->dir($app->dir('root').'public', 'public') ->dir($app->dir('root').'vendor', 'vendor'); // Adding boots: $app->boot(\Tobento\App\Language\Boot\Language::class); // Run the app: $app->run();
语言配置
语言的配置位于默认应用骨架配置位置下的 app/config/language.php
文件中。
应用语言
use Tobento\App\AppFactory; use Tobento\Service\Language\LanguagesInterface; $app = (new AppFactory())->createApp(); // Add directories: $app->dirs() ->dir(realpath(__DIR__.'/../'), 'root') ->dir(realpath(__DIR__.'/../app/'), 'app') ->dir($app->dir('app').'config', 'config', group: 'config') ->dir($app->dir('root').'public', 'public') ->dir($app->dir('root').'vendor', 'vendor'); // Adding boots: $app->boot(\Tobento\App\Language\Boot\Language::class); $app->booting(); // Gets the app languages: $languages = $app->get(LanguagesInterface::class); // Run the app: $app->run();
您可以查看 语言服务 来了解更多信息。
当前和默认应用语言
use Tobento\App\AppFactory; use Tobento\Service\Language\LanguagesInterface; use Tobento\Service\Language\LanguageInterface; $app = (new AppFactory())->createApp(); // Add directories: $app->dirs() ->dir(realpath(__DIR__.'/../'), 'root') ->dir(realpath(__DIR__.'/../app/'), 'app') ->dir($app->dir('app').'config', 'config', group: 'config') ->dir($app->dir('root').'public', 'public') ->dir($app->dir('root').'vendor', 'vendor'); // Adding boots: $app->boot(\Tobento\App\Language\Boot\Language::class); $app->booting(); // Gets the app languages: $languages = $app->get(LanguagesInterface::class); // Current language: $currentLanguage = $languages->current(); // var_dump($currentLanguage instanceof LanguageInterface); // bool(true) // Default language: $defaultLanguage = $languages->default(); // var_dump($defaultLanguage instanceof LanguageInterface); // bool(true) // Run the app: $app->run();
您可以查看 语言服务 来了解更多信息。
解决当前语言
默认情况下,当前语言通过 Tobento\App\Language\CurrentLanguageRouterResolver::class
解决。您可以在语言配置中更改实现。
本地化路由
您可以通过以下方式本地化路由
use Tobento\App\AppFactory; use Tobento\App\Language\RouteLocalizerInterface; use Tobento\Service\Language\LanguagesInterface; $app = (new AppFactory())->createApp(); // Add directories: $app->dirs() ->dir(realpath(__DIR__.'/../'), 'root') ->dir(realpath(__DIR__.'/../app/'), 'app') ->dir($app->dir('app').'config', 'config', group: 'config') ->dir($app->dir('root').'public', 'public') ->dir($app->dir('root').'vendor', 'vendor'); // Adding boots: $app->boot(\Tobento\App\Language\Boot\Language::class); $app->booting(); // Localize Routes: $routeLocalizer = $app->get(RouteLocalizerInterface::class); $route = $app->route('GET', '{?locale}/team', function(LanguagesInterface $languages): array { return ['page' => 'team', 'locale' => $languages->current()->locale()]; })->name('team'); $routeLocalizer->localizeRoute($route); /* print_r($app->routeUrl('team')->translated()); Array ( [de] => https://example.com/de/team [en] => https://example.com/team ) */ // Run the app: $app->run();
翻译路由
简单地说,安装 应用翻译 包并启动 \Tobento\App\Translation\Boot\Translation::class
composer require tobento/app-translation
use Tobento\App\AppFactory; use Tobento\App\Language\RouteLocalizerInterface; use Tobento\Service\Language\LanguagesInterface; use Tobento\Service\Translation\TranslatorInterface; use Tobento\Service\Translation\Resource; $app = (new AppFactory())->createApp(); // Add directories: $app->dirs() ->dir(realpath(__DIR__.'/../'), 'root') ->dir(realpath(__DIR__.'/../app/'), 'app') ->dir($app->dir('app').'config', 'config', group: 'config') ->dir($app->dir('root').'public', 'public') ->dir($app->dir('root').'vendor', 'vendor'); // Adding boots: $app->boot(\Tobento\App\Language\Boot\Language::class); $app->boot(\Tobento\App\Translation\Boot\Translation::class); $app->booting(); // Add routes translations: $app->on(TranslatorInterface::class, function(TranslatorInterface $translator) { $translator->resources()->add(new Resource( name: 'routes', locale: 'en', translations: [ 'checkout' => 'checkout', 'payment' => 'payment', 'products' => 'products', 'edit' => 'edit' ], )); $translator->resources()->add(new Resource( name: 'routes', locale: 'de', translations: [ 'checkout' => 'kasse', 'payment' => 'zahlung', 'products' => 'produkte', 'edit' => 'bearbeiten', ], )); }); // Localize Routes: $routeLocalizer = $app->get(RouteLocalizerInterface::class); $route = $app->route('GET', '{?locale}/{checkout}/{payment}', function(LanguagesInterface $languages) { return ['page' => 'checkout', 'locale' => $languages->current()->locale()]; })->name('checkout.payment'); // checkout and payment will be translated // by the TranslatorInterface::class if implemented, otherwise // checkout and payment is used: $routeLocalizer->localizeRoute($route, 'checkout', 'payment'); /* print_r($app->routeUrl('checkout.payment')->translated()); Array ( [de] => https://example.com/de/kasse/zahlung [en] => https://example.com/checkout/payment ) */ // Resource example: $routeResource = $app->routeResource('{?locale}/{products}', ResourceController::class)->name('products'); $routeLocalizer->localizeRoute($routeResource, 'products', 'edit.edit'); // define resource verbs with a dot if you want to translate them too! // e.g. 'create.create' or 'edit.edit' /* print_r($app->routeUrl('products.edit', ['id' => 5])->translated()); Array ( [de] => https://example.com/de/produkte/5/bearbeiten [en] => https://example.com/products/5/edit ) */ // Run the app: $app->run();
默认情况下,翻译从 routes
命名资源 加载。
您可以通过更改语言配置文件中的 RouteLocalizerInterface::class
实现来更改本地化策略。
使用域名本地化路由
您需要在 app/config/language.php
文件中指定语言及其域名
// ... $storage = new InMemoryStorage([ 'languages' => [ 1 => [ 'id' => 1, 'locale' => 'de-DE', // The key is used for translations and storing resources! 'key' => 'de', 'domain' => 'example.de', 'default' => true, ], 2 => [ 'id' => 2, 'locale' => 'de-CH', // The key is used for translations and storing resources! 'key' => 'de', // or if specific translations and storing resources! //'key' => 'de-CH', 'slug' => 'de', 'domain' => 'example.ch', 'fallback' => 'de-DE', 'default' => true, ], 3 => [ 'id' => 3, 'locale' => 'fr-CH', 'slug' => 'fr', 'domain' => 'example.ch', 'fallback' => 'de-DE', ], ], ]); // ...
应用示例
use Tobento\App\AppFactory; use Tobento\App\Language\RouteLocalizerInterface; use Tobento\Service\Translation\TranslatorInterface; $app = (new AppFactory())->createApp(); // Add directories: $app->dirs() ->dir(realpath(__DIR__.'/../'), 'root') ->dir(realpath(__DIR__.'/../app/'), 'app') ->dir($app->dir('app').'config', 'config', group: 'config') ->dir($app->dir('root').'public', 'public') ->dir($app->dir('root').'vendor', 'vendor'); // Adding boots: $app->boot(\Tobento\App\Language\Boot\Language::class); $app->booting(); // Localize Routes: $routeLocalizer = $app->get(RouteLocalizerInterface::class); $route = $app->route('GET', '{?locale}/team', function(null|string $locale): array { return ['page' => 'team', 'locale' => $locale]; })->name('team'); $routeLocalizer->localizeRoute($route); /* print_r($app->routeUrl('team')->domained()); Array ( [example.ch] => http://example.ch/team [example.de] => http://example.de/team ) print_r($app->routeUrl('team')->domain('example.ch')->translated()); Array ( [de] => http://example.ch/team [fr] => http://example.ch/fr/team ) print_r($app->routeUrl('team')->domain('example.de')->translated()); Array ( [de-de] => http://example.de/team ) */ // Run the app: $app->run();
区域语言
use Tobento\App\AppFactory; use Tobento\Service\Language\AreaLanguagesInterface; use Tobento\Service\Language\LanguagesInterface; $app = (new AppFactory())->createApp(); // Add directories: $app->dirs() ->dir(realpath(__DIR__.'/../'), 'root') ->dir(realpath(__DIR__.'/../app/'), 'app') ->dir($app->dir('app').'config', 'config', group: 'config') ->dir($app->dir('root').'public', 'public') ->dir($app->dir('root').'vendor', 'vendor'); // Adding boots: $app->boot(\Tobento\App\Language\Boot\Language::class); $app->booting(); // Gets the area languages: $areaLanguages = $app->get(AreaLanguagesInterface::class); // Run the app: $app->run();
您可以查看 区域语言 来了解更多信息。