#localization #octobercms #translate
#локализация #octobercms #перевести
Вопрос:
Я ищу способ установить языковой стандарт по умолчанию для определенных хост-серверов.
Учитывая, что имя сервера — server-spain, например, я хотел бы перенаправить по умолчанию на испанский перевод, предпочтительно на любую страницу, на которую попадает пользователь, помимо настроек браузера. Таким образом, по умолчанию даже язык / язык приложения по умолчанию является английским, если доступ осуществляется через website.es (испанский домен) пользователь будет видеть испанский язык в качестве языка по умолчанию.
$this['servername'] = gethostname(); // host name
{% if servername is same as('server-in-spain') %}
// reload with spanish locale
{% endif %}
Кто-нибудь оказывался в такой ситуации? Кто-нибудь решил это?
Спасибо!
Ответ №1:
Вы можете добавить этот код к своему layout's code section
, и он должен выполнить эту работу.
use RainLabTranslateClassesTranslator;
public function onStart() {
$translator = Translator::instance();
$currentLocale = $translator->getLocale();
$newLocale = 'es';
$translatedRedirect = false;
$servername = gethostname(); // <- YOUR FUNCTION TO FIND HOST
// MAKE SURE IF YOU DO NOT HAVE GIVEN LOCAE IN Backend
// THNE IT WILL REDIRECT TO DEFAULT SET LOCALE
if($servername === 'server-in-spain') {
$newLocale = 'es';
}
if($servername === 'server-in-germany') {
$newLocale = 'de';
}
// we do not want to redirect if user have already perfect locale
if($currentLocale !== $newLocale) {
$translatedRedirect = true;
}
if($translatedRedirect) {
$translator->setLocale($newLocale);
$currentUrl = $this->currentPageUrl();
$parts = parse_url($currentUrl);
$path = array_get($parts, 'path');
$pageUrl = http_build_url($parts, [
'path' => '/' . $translator->getPathInLocale($path, $newLocale)
]);
return Redirect::to($pageUrl);
}
}
Он должен выполнить эту работу
если есть какие-либо сомнения, пожалуйста, прокомментируйте
Комментарии:
1. Большое спасибо, Хардик, работает как шарм! Последним пунктом теперь будет решение проблемы добавления /es после .es, который все еще отображается, даже если он настроен с расширенными настройками локали. Я думаю, это потому, что здесь это принудительно.
2. glade это сработало для вас, если вы поделитесь своей проблемой с каким-нибудь примером, я могу помочь вам решить 🙂
Ответ №2:
С ответом Хардика я мог бы решить эту проблему. Единственными проблемами, с которыми я столкнулся с этим решением, были :
- Я не смог выбрать другую локаль в данном домене. Это example.es , корректно отображающий / es locale, но не способный переключать локали (поскольку это было вызвано кодом)
Я решил это с помощью первого файла cookie:
function onStart() {
//Set the cookie for firt time visit
$first_visit = !isset( $_COOKIE["fist_locale"] );
// Set the cookie so that the message doesn't show again
setcookie( "first_locale", 1, strtotime( ' 1 week' ) );
if( $first_visit ){ // if user first time
$translator = Translator::instance();
$currentLocale = $translator->getLocale();
$newLocale = 'en';
$translatedRedirect = false;
$servername = gethostname(); // <- YOUR FUNCTION TO FIND HOST
// MAKE SURE IF YOU DO NOT HAVE GIVEN LOCAE IN Backend
// THNE IT WILL REDIRECT TO DEFAULT SET LOCALE
if($servername === 'example.es') {
$newLocale = 'es';
}
if($servername === 'example.de') {
$newLocale = 'de';
}
// we do not want to redirect if user have already perfect locale
if($currentLocale !== $newLocale) {
$translatedRedirect = true;
}
if($translatedRedirect) {
$translator->setLocale($newLocale);
$currentUrl = $this->currentPageUrl();
$parts = parse_url($currentUrl);
$path = array_get($parts, 'path');
$pageUrl = http_build_url($parts, [
'path' => '/' . $translator->getPathInLocale($path, $newLocale)
]);
return Redirect::to($pageUrl);
}
}//end of first time
}
- Язык, принудительно установленный функцией доменного имени, добавляет /(locale) после домена, как в example.de/de