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.

We're retiring the forums!

The SilverStripe forums have passed their heyday. They'll stick around, but will be read only. We'd encourage you to get involved in the community via the following channels instead:

General Questions /

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

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

translatable partly working--questions on minor issues

Go to End

19 Posts   5345 Views


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, works properly and goes to the translated homepage. Should this also work for other pages (i.e. should go the the translation of (because it doesn't for me)

3)The language chooser widget is mentioned in the multilingualcontent documentation, 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!


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.


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?


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


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() {

		// 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
		if($this->dataRecord->hasExtension('Translatable')) {
	    * 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 %>
			<% end_if %>


Community Member, 203 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 %>


Community Member, 103 Posts

6 January 2010 at 8:59am


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

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 }
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?


Is this the same error you were referring to?

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


Community Member, 203 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

// 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;


Community Member, 323 Posts

6 January 2010 at 12:49pm

Edited: 06/01/2010 12:50pm

Hi all!

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().

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,

Go to Top