开源软件名称(OpenSource Name):xfra35/f3-multilang开源软件地址(OpenSource Url):https://github.com/xfra35/f3-multilang开源编程语言(OpenSource Language):PHP 92.5%开源软件介绍(OpenSource Introduction):Multilang…for F3 polyglots! This plugin for Fat-Free Framework provides a URL-friendly mean to localize your web site/app. Demo: here.
Basic usageStep 1:Declare the languages of your app in the $f3->set('MULTILANG.languages',array(
'en' => 'en-GB,en-US,en',
'ja' => 'ja-JP,ja',
'es' => 'es-ES,es'
)); The same declaration can be achieved in a configuration file using the following syntax: [MULTILANG.languages]
en = en-GB, en-US, en
ja = ja-JP, ja
es = es-ES, es NB1: each entry maps a language identifier ( NB2: The first defined language is considered as the primary language, which means it is set as FALLBACK. In our example, on a japanese page, the locales and dictionaries would be searched in the following order: ja-JP, ja, en-GB, en, en-US. NB3: It is strongly advised to include a country-independant language code ( Step 2:Start the plugin by instantiating the class, just before the call to $f3->config('config.ini');
Multilang::instance();
$f3->run(); That's it!Now every existing URL has been duplicated into as many languages you've declared, using identifiers as prefixes:
Root URLBy default, the root URL autodetects the browser language and performs a redirection to its root page. In our example, a Spanish user would be redirected to You can override this default behaviour by setting the [MULTILANG]
root = App\MyRoot Use case: display a splash page with the list of available languages. Advanced usage(requires the usage of route aliases) Rewrite URLsEach translated URL consists of a language identifier followed by the original URL:
You can customize the second part by setting the $f3->set('MULTILANG.rules',array(
'es' => array(
'terms' => '/terminos-y-condiciones'
)
)); The same declaration can be achieved in a configuration file using the following syntax: [MULTILANG.rules.es]
terms = /terminos-y-condiciones Exclude a language from a routeWhen translating a website, you may need to perform a progressive translation, route by route. It could also occur that some parts won't be localized at all (for example a blog). For this purpose, you can remove a route for a specific language by setting it to [MULTILANG.rules.es]
blog = FALSE A request to Global routesSome routes have to stay language-independant, for example a captcha doesn't have to be localized. Also back offices often happen to be monolingual. Those global routes are not rewritten: they keep their original URL.
They are defined using the [MULTILANG]
global = captcha
;could also be an array:
global = alias1, alias2, alias3, /admin, /foo/bar Each entry can be a route alias or a URI prefix. NB: on a global route, the language is auto-detected by default. So in the case of a monolingual back office, you may need to force the language at the controller level. ReroutingIf you're using named routes...
$f3->reroute('@contact'); // OK => reroute to /xx/contact where xx is the current language If you're using unnamed routes...In that case, you have to provide a language-prefixed URL to $f3->reroute('/en/contact'); // OK
$f3->reroute('/contact'); // Error => 404 Not Found If you'd prefer to give the short URL to the framework and have it automatically prefix the URL with the current language,
use the $ml->reroute('/en/contact'); // OK
$ml->reroute('/contact'); // OK => reroute to /xx/contact where xx is the current language In the situation where you'd like to quickly localize an existing project with unnamed routes, and would prefer to avoid
having to rewrite every $f3->set('ONREROUTE',function($url,$permanent) use($f3,$ml){
$f3->clear('ONREROUTE');
$ml->reroute($url,$permanent);
});
// then in your controller, existing reroutes will keep on working:
$f3->reroute('/contact'); // OK => reroute to /xx/contact where xx is the current language Migration modeWhen translating an existing monolingual site, it is often interesting to redirect the old monolingual URIs to the new multilingual ones.
The plugin does it automatically for you if you set Example:
Strict modeWhen URLs are rewritten, an error is thrown if duplicate URLs are detected. E.g: [MULTILANG.rules.en]
contact = /contact
blog = /contact This behaviour is called "strict mode" and is enabled by default. You can disable it by setting Passthru modeWhen starting a new monolingual project, it may be interesting to keep the dependency to the Multilang plugin while not altering routes, just in case one day the project turns multilingual. The When the passthru mode is enabled, the plugin doesn't do much:
API$ml = Multilang::instance(); currentReturn the language detected for the current URL echo $ml->current;// ja primaryReturn the name of the primary language echo $ml->primary;// en autoTRUE if language has been auto-detected echo $ml->auto;//FALSE passthruTRUE if passthru mode is enabled echo $ml->passthru;//FALSE locale()Return the currently selected locale NB: the value returned by this function can be different from what you're expecting
if the locales configured in echo $ml->locale();// en_GB.UTF-8 displayLanguage( $iso )Return the language name corresponding to the given ISO code NB: the name is localized if the intl extension is installed, otherwise it is returned in English. // on a Danish route (with intl)
echo $ml->displayLanguage('fr');// fransk
// on a Russian route (with intl)
echo $ml->displayLanguage('fr');// французский
// on any route (without intl)
echo $ml->displayLanguage('fr');// French displayCountry( $iso )Return the country name corresponding to the given ISO code NB: the name is localized if the intl extension is installed, otherwise it is returned in English. // on a Danish route (with intl)
echo $ml->displayCountry('ru');// Rusland
// on a Russian route (with intl)
echo $ml->displayCountry('ru');// Россия
// on any route (without intl)
echo $ml->displayCountry('ru');// Russia display( $iso )Alias for displayLanguage( $iso ) [deprecated] languages()Return the list of available languages $ml->languages();// array('en','ja','es') locales()Return the list of available locales (indexed by languages) $ml->locales();
/* array(
'en' => 'en-GB,en-US,en',
'ja' => 'ja-JP,ja',
'es' => 'es-ES,es'
)*/ aliases()Return the list of all aliases (even those not available for the current language) $ml->aliases();// array('terms','blog','captcha') isLocalized( $name, $lang=NULL )Check if a route is localized in a given language (default=current) (localized = not global nor excluded) $ml->isLocalized('terms');// TRUE (current language)
$ml->isLocalized('terms','es');// TRUE
$ml->isLocalized('blog','es');// FALSE (excluded for Spanish)
$ml->isLocalized('captcha');// FALSE (global)
$ml->isLocalized('foo');// FALSE (non-existent route) isGlobal( $name )Check if a route is global $ml->isGlobal('captcha');// TRUE alias( $name, $params=NULL, $lang=NULL )Assemble url from alias name This function is a language-aware version of echo $ml->alias('terms',NULL,'es');// /es/terminos-y-condiciones [local route]
echo $ml->alias('captcha');// /captcha [global route] reroute( $url=NULL, $permanent=FALSE )Reroute to specified URI This function is a language-aware version of Use it if you want an automatic language prefix on unnamed routes. Cf. rerouting. $ml->reroute('/en/contact'); // OK
$ml->reroute('/contact'); // OK => reroute to /xx/contact where xx is the current language Potential improvements
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论