Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

General Questions /

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

translatable partly working--questions on minor issues


Go to End
Reply


19 Posts   3959 Views

Avatar
theoldlr

Community Member, 103 Posts

9 December 2009 at 11:01am

I setup a few translation pages and it seems to work in part. Here are a few questions i have:

1a) What security settings does a group need in order to access the language drop down to go to a translated site tree? (access to site content and access to all cms interfaces is not sufficient privilege for me) 1b)Is there a way to allow them access to only the translated site trees?

2)For the homepage, example.com/?locale=de_DE works properly and goes to the translated homepage. Should this also work for other pages (i.e. example.com/pagename/?locale=de_DE should go the the translation of example.com/pagename)? (because it doesn't for me)

3)The language chooser widget is mentioned in the [url=http://doc.silverstripe.org/doku.php?id=multilingualcontent/]multilingualcontent documentation[/url], but installing it according to the included readme gives me site errors. Reading closer says that it is for the blog module only. Is this true? Am I missing something?

Thanks in advance!

Avatar
dendeffe

Community Member, 135 Posts

9 December 2009 at 11:19pm

2) On my installation pages created through the translation tab are linked (you can switch languages and arrive at the specific page). If I create the page in a new language through the Create button in the page list, they are not linked.

Avatar
theoldlr

Community Member, 103 Posts

10 December 2009 at 2:11am

Thanks for the reply, dendeffe. I deleted a page from the translated site tree and recreated it to be sure that I had made it via the translations tab, but it still did not work. They are linked (it shows there is a translation for this page in the primary site tree), but I cannot access it by adding /?locale=de_de to the end of the url. Any idea what might be wrong?

Avatar
dendeffe

Community Member, 135 Posts

10 December 2009 at 2:23am

I think you are using a different language switcher. I've built mine from bits and pieces on the forum :)

This is in my page.php

<?php

class Page extends SiteTree {
   
   public static $db = array(
   );
   
   public static $has_one = array(
   );
   

   
   /**
    * Returns a DataObjectSet with all available translations of the current page
    * @return DataObjectSet
    */
    function getTranslationsFunc() {
    if($this->URLSegment == "Security") return "";

    $langs = Translatable::get_existing_content_languages();
    $data = new DataObjectSet();

    // generate entry with only the default language if no translations of this page are available
    $availTransl = Translatable::getTranslations();
   

    foreach(array_keys($langs) as $code) {
    // get country code (e.g. "de")
    $lang = i18n::get_lang_from_locale($code);
    // current language?
    $current = ($code == Translatable::get_current_locale()) ? 'current': 'normal';
            
    $page = $this->getTranslation($code);
            //echo $page;exit();
            if(count($availTransl) == 0 && $current == "normal") {
       $data->push(new ArrayData(array(
       'name' => i18n::get_language_name($lang, true),
       'link' => "/?locale=" . $code,
       'urlSegment' => $page->URLSegment,
       'code' => $code,
       'shortCode' => substr($code, 0, 2),
       'current' => $current
       )));
            } else {
               $data->push(new ArrayData(array(
       'name' => i18n::get_language_name($lang, true),
       'link' => Director::baseURL() . $page->URLSegment,
       'urlSegment' => $page->URLSegment,
       'code' => $code,
       'shortCode' => substr($code, 0, 2),
       'current' => $current
       )));
            }
    }

    return $data;
    }
   
   
}

class Page_Controller extends ContentController {
   
   public function init() {
      parent::init();

      // Note: you should use SS template require tags inside your templates
      // instead of putting Requirements calls here. However these are
      // included so that our older themes still work
      Requirements::themedCSS("layout");
      Requirements::themedCSS("typography");
      Requirements::themedCSS("form");
      if($this->dataRecord->hasExtension('Translatable')) {
       i18n::set_locale($this->dataRecord->Locale);
      }
      
   }
   
   
   
   /**
    * Returns a DataObjectSet with all available translations of the current page
    * @return DataObjectSet
    */
    function getTranslations() {
      
    // call method of Page Object
    return $this->getTranslationsFunc();
    }
   
   

}

?>

and this is my language switcher in the template

         <% if getTranslations %>
         <ul class="language">
         <% control getTranslations %>
         <li class="$current"><a href="$link"><span>$shortCode</span></a></li>
         <% end_control %>
         </ul>
         <% end_if %>

Avatar
yurigoul

Community Member, 202 Posts

19 December 2009 at 4:13am

It works really nice, with links in the right language (Français instead of French), but only when all translations are there, otherwise it throws an error.

So I stayed with the traditional language switcher and added things like <% if Locale == fr_FR %>Français<% end_if %>

Avatar
theoldlr

Community Member, 103 Posts

6 January 2010 at 8:59am

Dendeffe,

I tried using your language switcher, but I get errors. Is there perhaps something I'm not including in my config.php?:

[Notice] Undefined index: pt_br
GET /?flush=1

Line 1506 in C:\website\sp\sapphire\core\i18n.php
Source

1497     *
1498     * @see get_locale_name()
1499     *
1500     * @param mixed $code Language code
1501     * @param boolean $native If true, the native name will be returned
1502     * @return Name of the language
1503     */
1504    static function get_language_name($code, $native = false) {
1505       $langs = self::$common_languages;
1506       return ($native ? $langs[$code][1] : $langs[$code][0]);
1507    }
1508    
1509    /**
1510     * Get a name from a locale code (xx_YY).
1511     *
1512     * @see get_language_name()

dendeffe, do you have a suggestion for this problem?

yurigoul,

Is this the same error you were referring to?

Thanks guys, I know I let this thread get a little old.

Avatar
yurigoul

Community Member, 202 Posts

6 January 2010 at 11:48am

I can not remember if this is the same error. The only thing I do know is that I had the following situation:

In my site I had 4 possible translations: french, spanish, german and english

Page X only has one translation, but is not translated in the other languages. And then an error is thrown if I use the function here. However if I do create the extra translations the error goes away.

This is in my config (maybe that has something to do with it):

Object::add_extension('SiteTree', 'Translatable');
Translatable::set_default_locale('de_DE'); // This defines Translatable::current_lang() in Page.php

// i18n
i18n::enable();
i18n::set_locale('de_DE');
i18n::set_locale('en_US');
i18n::set_locale('fr_FR');
i18n::set_locale('es_ES');
i18n::set_default_lang('de');

// Define allowed locales overriding those present in i18n::$common_locales
global $allowed_locales;
$allowed_locales = array(
'de_DE' => array('German', 'Deutsch'),
'en_US' => array('English', 'English'),
'fr_FR' => array('French', 'Français'),
'es_ES' => array('Spanish', 'Español')

);
i18n::$common_locales = $allowed_locales;

Avatar
Juanitou

Community Member, 323 Posts

6 January 2010 at 12:49pm

Edited: 06/01/2010 12:50pm

Hi all!

@yurigoul
I think your _config.php contains some lines you could remove:
– i18n::set_locale('es_ES') is overwriting the three before it, so they are useless.
– i18n::set_default_lang() is going to be deprecated in 2.4, you only need Translatable::set_default_locale().

@theoldlr
The error is pretty clear: you seem to not have defined 'pt_br' as a valid locale. By the way, it is not the valid format: pt_BR.

Hope it helps,
Juan

Go to Top