/** * Get a set of content languages (for quick language navigation) * @example * <code> * <!-- in your template --> * <ul class="langNav"> * <% loop Languages %> * <li><a href="$Link" class="$LinkingMode" title="$Title.ATT">$Language</a></li> * <% end_loop %> * </ul> * </code> * * @return ArrayList|null */ public function Languages() { $locales = TranslatableUtility::get_content_languages(); // there's no need to show a navigation when there's less than 2 languages. So return null if (count($locales) < 2) { return null; } $currentLocale = Translatable::get_current_locale(); $homeTranslated = null; if ($home = SiteTree::get_by_link('home')) { /** @var SiteTree $homeTranslated */ $homeTranslated = $home->getTranslation($currentLocale); } /** @var ArrayList $langSet */ $langSet = ArrayList::create(); foreach ($locales as $locale => $name) { Translatable::set_current_locale($locale); /** @var SiteTree $translation */ $translation = $this->owner->hasTranslation($locale) ? $this->owner->getTranslation($locale) : null; $langSet->push(new ArrayData(array('Locale' => $locale, 'RFC1766' => i18n::convert_rfc1766($locale), 'Language' => DBField::create_field('Varchar', strtoupper(i18n::get_lang_from_locale($locale))), 'Title' => DBField::create_field('Varchar', html_entity_decode(i18n::get_language_name(i18n::get_lang_from_locale($locale), true), ENT_NOQUOTES, 'UTF-8')), 'LinkingMode' => $currentLocale == $locale ? 'current' : 'link', 'Link' => $translation ? $translation->AbsoluteLink() : ($homeTranslated ? $homeTranslated->Link() : '')))); } Translatable::set_current_locale($currentLocale); i18n::set_locale($currentLocale); return $langSet; }
/** * Retrieves information about this object in the CURRENT locale * * @param string $locale The locale information to request, or null to use the default locale * @return ArrayData Mapped list of locale properties */ public function CurrentLocaleInformation() { $locale = Fluent::current_locale(); // Store basic locale information $data = array('Locale' => $locale, 'LocaleRFC1766' => i18n::convert_rfc1766($locale), 'Alias' => Fluent::alias($locale), 'Title' => i18n::get_locale_name($locale), 'LanguageNative' => i18n::get_language_name(i18n::get_lang_from_locale($locale), true)); return new ArrayData($data); }
public function RFC1766() { return i18n::convert_rfc1766($this->value); }
/** * Retrieves information about this object in the specified locale * * @param string $locale The locale information to request, or null to use the default locale * @return ArrayData Mapped list of locale properties */ public function LocaleInformation($locale = null) { // Check locale if (empty($locale)) { $locale = Fluent::default_locale(); } // Check linking mode $linkingMode = 'link'; if ($this->owner->hasMethod('canViewInLocale') && !$this->owner->canViewInLocale($locale)) { $linkingMode = 'invalid'; } elseif ($locale === Fluent::current_locale()) { $linkingMode = 'current'; } // Check link $link = $this->owner->LocaleLink($locale); // Store basic locale information $data = array('Locale' => $locale, 'LocaleRFC1766' => i18n::convert_rfc1766($locale), 'Alias' => Fluent::alias($locale), 'Title' => i18n::get_locale_name($locale), 'LanguageNative' => i18n::get_language_name(i18n::get_lang_from_locale($locale), true), 'Link' => $link, 'AbsoluteLink' => $link ? Director::absoluteURL($link) : null, 'LinkingMode' => $linkingMode); return new ArrayData($data); }
/** * Returns an RFC1766 compliant locale string, e.g. 'fr-CA'. * Inspects the associated {@link dataRecord} for a {@link SiteTree->Locale} value if present, * and falls back to {@link Translatable::get_current_locale()} or {@link i18n::default_locale()}, * depending if Translatable is enabled. * * Suitable for insertion into lang= and xml:lang= * attributes in HTML or XHTML output. * * @return string */ function ContentLocale() { if ($this->dataRecord && $this->dataRecord->hasExtension('Translatable')) { $locale = $this->dataRecord->Locale; } elseif (Object::has_extension('SiteTree', 'Translatable')) { $locale = Translatable::get_current_locale(); } else { $locale = i18n::get_locale(); } return i18n::convert_rfc1766($locale); }
/** * Returns <link rel="alternate"> markup for insertion into * a HTML4/XHTML compliant <head> section, listing all available translations * of a page. * * @see http://www.w3.org/TR/html4/struct/links.html#edef-LINK * @see http://www.w3.org/International/articles/language-tags/ * * @return string HTML */ function MetaTags(&$tags) { $template = '<link rel="alternate" type="text/html" title="%s" hreflang="%s" href="%s" />' . "\n"; $translations = $this->owner->getTranslations(); if ($translations) { foreach ($translations as $translation) { $tags .= sprintf($template, $translation->Title, i18n::convert_rfc1766($translation->Locale), $translation->Link()); } } }
/** * Returns <link rel="alternate"> markup for insertion into * a HTML4/XHTML compliant <head> section, listing all available translations * of a page. * * @see http://www.w3.org/TR/html4/struct/links.html#edef-LINK * @see http://www.w3.org/International/articles/language-tags/ * * @return string HTML */ public function MetaTags(&$tags) { $template = '<link rel="alternate" type="text/html" title="%s" hreflang="%s" href="%s" />' . "\n"; $translations = $this->owner->getTranslations(); if ($translations) { $translations = $translations->toArray(); $translations[] = $this->owner; foreach ($translations as $translation) { $tags .= sprintf($template, Convert::raw2xml($translation->Title), i18n::convert_rfc1766($translation->Locale), $translation->AbsoluteLink()); } } }
/** * Gets the RFC 1766 version of the input locale * @return {string} RFC 1766 version of the locale (i.e en-US) */ public function getRFC1766Locale() { return i18n::convert_rfc1766($this->owner->Locale); }
/** * Return the title, description, keywords and language metatags. * * @todo Move <title> tag in separate getter for easier customization and more obvious usage * * @param boolean|string $includeTitle Show default <title>-tag, set to false for custom templating * @param boolean $includeTitle Show default <title>-tag, set to false for * custom templating * @return string The XHTML metatags */ public function MetaTags($includeTitle = true) { $tags = ""; if ($includeTitle === true || $includeTitle == 'true') { $tags .= "<title>" . Convert::raw2xml($this->MetaTitle ? $this->MetaTitle : $this->Title) . "</title>\n"; } $version = new SapphireInfo(); $tags .= "<meta name=\"generator\" http-equiv=\"generator\" content=\"SilverStripe - http://www.silverstripe.com\" />\n"; $charset = ContentNegotiator::get_encoding(); $tags .= "<meta http-equiv=\"Content-type\" content=\"text/html; charset={$charset}\" />\n"; if ($this->MetaKeywords) { $tags .= "<meta name=\"keywords\" http-equiv=\"keywords\" content=\"" . Convert::raw2att($this->MetaKeywords) . "\" />\n"; } if ($this->MetaDescription) { $tags .= "<meta name=\"description\" http-equiv=\"description\" content=\"" . Convert::raw2att($this->MetaDescription) . "\" />\n"; } if ($this->ExtraMeta) { $tags .= $this->ExtraMeta . "\n"; } // get the "long" lang name suitable for the HTTP content-language flag (with hyphens instead of underscores) $currentLang = $this->hasExtension('Translatable') ? Translatable::get_current_locale() : i18n::get_locale(); $tags .= "<meta http-equiv=\"Content-Language\" content=\"" . i18n::convert_rfc1766($currentLang) . "\"/>\n"; // DEPRECATED 2.3: Use MetaTags $this->extend('updateMetaTags', $tags); $this->extend('MetaTags', $tags); return $tags; }
/** * Returns all translated locales as a special ArrayList * * @return ArrayList */ public function getAllTranslations() { $currentLocale = Translatable::get_current_locale(); $translations = $this->getTranslations(); $translationSource = new ArrayList(); if ($translations) { $translationSource->push(new DataObject(array('Name' => SilvercartLanguageHelper::getLanguageName($currentLocale, $currentLocale), 'NativeName' => SilvercartLanguageHelper::getLanguageName($currentLocale, $currentLocale), 'Code' => $this->getIso2($currentLocale), 'RFC1766' => i18n::convert_rfc1766($currentLocale), 'Link' => $this->Link()))); foreach ($translations as $translation) { $translationSource->push(new DataObject(array('Name' => SilvercartLanguageHelper::getLanguageName($translation->Locale, $currentLocale), 'NativeName' => SilvercartLanguageHelper::getLanguageName($translation->Locale, $translation->Locale), 'Code' => $this->getIso2($translation->Locale), 'RFC1766' => i18n::convert_rfc1766($translation->Locale), 'Link' => $translation->Link()))); } } return $translationSource; }