Jump to:

23459 Posts in 18906 Topics by 2877 members

General Questions

SilverStripe Forums » General Questions » Get url of homepage depending on language

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba, simon_w

Page: 1
Go to End
Author Topic: 2527 Views
  • spierala
    Avatar
    Community Member
    80 Posts

    Get url of homepage depending on language Link to this post

    Hello,

    I know there was a template code to get the correct url of the homepage depending on the current language. But I don´t find it anymore via google. Can somebody help me?

    many thx,
    florian

  • silverseba
    Avatar
    Community Member
    26 Posts

    Re: Get url of homepage depending on language Link to this post

    Maybe the answer comes a little late.

    Just put the following function in your Page Class:

    /**
    * Return the link to the homepage of the current language
    *
    * @return String
    */
    public function LinkHomepageCurrLang() {
       return self::get_homepage_link_by_locale(self::get_current_locale());
    }

    You can then call $LinkHomepageCurrLang in your Template, and it will give you the link to the homepage of the currently selected language.

  • fiord
    Avatar
    Community Member
    79 Posts

    Re: Get url of homepage depending on language Link to this post

    in my sites I use next functions

    public function PageByLang($url, $lang) {
    $SQL_url = Convert::raw2sql($url);
    $SQL_lang = Convert::raw2sql($lang);

    $page = Translatable::get_one_by_lang('SiteTree', $SQL_lang, "URLSegment = '$SQL_url'");

    if ($page->Locale != Translatable::get_current_locale()) {

    // Fallback to English
    if($page->hasTranslation(Translatable::get_current_locale())){
    $page = $page->getTranslation(Translatable::get_current_locale());
    }else{
    $page = $page->getTranslation('uk_UA');
    }

    }

    return $page;
    }

    and for lang switcher

    public function LangMenu() {
          if($this->URLSegment == "Security") return false;
          //$availTransl = Translatable::getTranslations();
          //if(count($availTransl) == 0) {return false;} // якщо не закоментувати не буде виводити флажків для сторінок в ких нема неодного перекладу

          $langs = Translatable::get_existing_content_languages();
          $data = new DataObjectSet();
          
          foreach(array_keys($langs) as $code) {
          
             $page = $this->getTranslation($code);
          
             if (isset($page)) {
                $lang = i18n::get_lang_from_locale($code);
                $data->push(new ArrayData(array(
                   'Name' => i18n::get_language_name($lang, true),
                   'Title' => $page->Title,
                   //'Link' => Director::baseURL() . $page->URLSegment,
                   'Link' => $page->Link(),// - правильна адресація яка враховує вкладені лінки
                   'Code' => $code
                )));
             }else{
             
                $lang = i18n::get_lang_from_locale($code);
                $data->push(new ArrayData(array(
                   'Name' => i18n::get_language_name($lang, true),
                   'Title' => i18n::get_language_name($lang, true),
                   //'Link' => . $page->URLSegment,
                   'Link' => Director::baseURL().'?locale='.$code, //if page not set for this locale, then goo to home page
                   'Code' => $code
                )));   

             }
          }
       return $data;
       }

    in template

    <% control PageByLang(regions,uk_UA) %>

    for lang switcher

    <% if LangMenu %><% control LangMenu %><a href="$Link" title="$Name.XML"><img src="themes/antisnid/images/lang/{$Code}.png" alt="$Name.XML" /></a><% end_control %><% end_if %>

  • stallain
    Avatar
    Community Member
    61 Posts

    Re: Get url of homepage depending on language Link to this post

    @silverseba Your solution works like a charm, it would deserve to be on the recipes page. Thanks !

  • Pipifix
    Avatar
    Community Member
    54 Posts

    Re: Get url of homepage depending on language Link to this post

    I'm trying to use silversebas code. But i get a Fatal error: Call to undefined method Page_Controller::get_homepage_link_by_locale() in /Applications/MAMP/htdocs/dev-boxen/mysite/code/Page.php on line 63? The whole translatable thingy on this project (SS2.4.5) works fine.

    For the template i'm using this code

          <div id="LogoRow" class="row">
              <h1 class="eightcol last"><a title="<% _t('stromimzoostyle.HEADERBACKTOHOMEPAGE','Zur&uuml;ck zur Startseite') %>" href="$LinkHomepageCurrLang">$SiteConfig.Title <span><% _t('stromimzoostyle.HEADERBACKTOHOMEPAGE','Zur&uuml;ck zur Startseite') %></span></a></h1>
             
             <% if Translations %>
             <div id="LangSwitcher" class="threecol last"><% _t('stromimzoostyle.HEADERLANGSHOWPAGEIN','Show page in: ') %>
                <% control Translations %>
                <a href="$Link" hreflang="$Locale.RFC1766" title="Change the language in...">$Locale.Nice</a> |
                <% end_control %>
                <span class="">$Locale.Nice</span>
              </div>
          <% end_if %>
          
          </div>

    It seems the self::get_current_locale() returns no values. I've tried to return only the current languange.
    Any tips on that?

    Thanks, Pipifix.

  • silverseba
    Avatar
    Community Member
    26 Posts

    Re: Get url of homepage depending on language Link to this post

    @Pipifix: My code (for the LinkHomepageCurrLang) must be placed in the Page class, not in the Page_Controller. Maybe that´s why its not working. If that doesn´t solve your problem try calling "Translatable::get_homepage_link_by_locale(Translatable::get_current_locale())".

    If you want to have a language switcher, try using this code in your Page_Controller class:

    /**
    * Function returns a DataObjectSet with all available languages
    * The current language is always returned as the first DataObject
    *
    * The DataobjectSet contains:
    * - Localised Language Name ($LangName)
    * - Link to homepage of the language ($Link)
    * - 2-digit Language code ($Code)
    * - Language Locale e.g. 'en_GB' ($Locale)
    *
    * Generate a Language selector (which always directs to the homepage of the language) in Template:
    * <% if LanguageSwitcher %>
    * <ul id="language-switcher">
    * <% control LanguageSwitcher %>
    * <li<% if First %> class="current"<% end_if %>><a href="$Link" title="" class="$Code">$LangName</a></li>
    * <% end_control %>
    * </ul>
    * <% end_if %>
    *
    * @return DataObjectSet
    */
    public function LanguageSwitcher() {
       $langs = Translatable::get_existing_content_languages();
       // stop if only one language is available
       if(count($langs) <= 1) return false;
       $data = new DataObjectSet();
       $currLocale = self::get_current_locale();
       // add current language first
       $data->push(new ArrayData(array(
          'LangName' => i18n::get_language_name(i18n::get_lang_from_locale($currLocale), true),
          'Link' => self::get_homepage_link_by_locale($currLocale),
          'Code' => i18n::get_lang_from_locale($currLocale),
          'Locale' => $currLocale
       )));

       // add all available translations
       foreach(array_keys($langs) as $locale) {
          if($locale == self::get_current_locale()) {
             continue;
          }
          $data->push(new ArrayData(array(
             'LangName' => i18n::get_language_name(i18n::get_lang_from_locale($locale), true),
             'Link' => Translatable::get_homepage_link_by_locale($locale),
             'Code' => i18n::get_lang_from_locale($locale),
             'locale' => $locale
          )));
       }
       return $data;
    }

    Then use the following code in your Template, to generate a list with links to the homepages of all available translations:

    <% if LanguageSwitcher %>
       <ul id="language-switcher">
       <% control LanguageSwitcher %>
          <li<% if First %> class="current"<% end_if %>><a href="$Link" title="" class="$Code">$LangName</a></li>
       <% end_control %>
       </ul>
    <% end_if %>

    I think this code should be on the "Translatable" doc page anyway...

    2527 Views
Page: 1
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.