OctoberCMS — Rainlab translate

#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:

С ответом Хардика я мог бы решить эту проблему. Единственными проблемами, с которыми я столкнулся с этим решением, были :

  1. Я не смог выбрать другую локаль в данном домене. Это 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
}
  
  1. Язык, принудительно установленный функцией доменного имени, добавляет /(locale) после домена, как в example.de/de