From f76167483469f5f5c374c82f7cafad0de6800bce Mon Sep 17 00:00:00 2001 From: Robbie Averill Date: Tue, 23 Jul 2019 15:38:42 +0200 Subject: [PATCH] Merge branch '2.3' into 2.4 --- .travis.yml | 29 ++-- README.md | 5 +- code/forms/LanguageDropdownField.php | 2 +- code/model/Translatable.php | 172 +++++++++++----------- composer.json | 6 +- lang/ar.yml | 2 +- lang/bs.yml | 4 +- lang/cs.yml | 4 +- lang/cs_CZ.yml | 4 +- lang/de.yml | 4 +- lang/eo.yml | 4 +- lang/et_EE.yml | 4 +- lang/fa_IR.yml | 6 +- lang/fi_FI.yml | 4 +- lang/hr.yml | 24 +++ lang/it.yml | 1 + lang/ja.yml | 12 +- lang/mi.yml | 2 +- lang/nl_NL.yml | 20 +++ lang/ru.yml | 24 +++ lang/sk.yml | 4 +- lang/sk_SK.yml | 4 +- lang/sv.yml | 2 + lang/tr.yml | 4 +- lang/vi_VN.yml | 4 +- lang/zh.yml | 12 +- tests/unit/TranslatableSiteConfigTest.php | 3 + tests/unit/TranslatableTest.php | 27 +++- 28 files changed, 245 insertions(+), 148 deletions(-) create mode 100644 lang/hr.yml create mode 100644 lang/nl_NL.yml create mode 100644 lang/ru.yml diff --git a/.travis.yml b/.travis.yml index bb1aba1..c528f9d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,29 +1,26 @@ -# See https://github.com/silverstripe-labs/silverstripe-travis-support for setup details +# See https://github.com/silverstripe/silverstripe-travis-support for setup details language: php -php: - - 5.3 - -env: - - DB=MYSQL CORE_RELEASE=3 +dist: trusty matrix: include: - - php: 5.4 - env: DB=PGSQL CORE_RELEASE=3 - - php: 5.5 - env: DB=MYSQL CORE_RELEASE=3.2 - - php: 5.6 - env: DB=MYSQL CORE_RELEASE=3.2 + - php: '7.1' + env: DB=PGSQL CORE_RELEASE=3.7 + - php: '7.1' + env: DB=MYSQL CORE_RELEASE=3.7 + - php: '7.2' + env: DB=MYSQL CORE_RELEASE=3.7 + - php: '7.3' + env: DB=MYSQL CORE_RELEASE=3.7 before_script: - - pear -q install --onlyreqdeps pear/PHP_CodeSniffer - phpenv rehash - - git clone git://github.com/silverstripe-labs/silverstripe-travis-support.git ~/travis-support + - git clone git://github.com/silverstripe/silverstripe-travis-support.git ~/travis-support - php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss - cd ~/builds/ss script: - - vendor/bin/phpunit translatable/tests/ - - phpcs --encoding=utf-8 --tab-width=4 --standard=translatable/tests/phpcs -np translatable + - vendor/bin/phpunit translatable/tests + - vendor/bin/phpcs --encoding=utf-8 --tab-width=4 --standard=translatable/tests/phpcs -np translatable diff --git a/README.md b/README.md index eae8037..01bf372 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Translatable module for SilverStripe CMS # [![Build Status](https://secure.travis-ci.org/silverstripe/silverstripe-translatable.png?branch=2.1)](http://travis-ci.org/silverstripe/silverstripe-translatable) +[![SilverStripe supported module](https://img.shields.io/badge/silverstripe-supported-0071C4.svg)](https://www.silverstripe.org/software/addons/silverstripe-commercially-supported-module-list/) ## Introduction ## @@ -27,7 +28,7 @@ third party translation interface, transifex.com. Newly added strings will be periodically uploaded there for translation, and any new translations will be merged back to the project source code. -Please use [https://www.transifex.com/projects/p/silverstripe-translatable/](https://www.transifex.com/projects/p/silverstripe-translatable/) to contribute translations, +Please use [https://www.transifex.com/silverstripe/silverstripe-translatable/](https://www.transifex.com/projects/p/silverstripe-translatable/) to contribute translations, rather than sending pull requests with YAML files. -See the ["i18n" topic](http://doc.silverstripe.org/framework/en/trunk/topics/i18n) on doc.silverstripe.org for more details. +See the ["i18n" topic](https://docs.silverstripe.org/en/3/developer_guides/i18n/) on doc.silverstripe.org for more details. diff --git a/code/forms/LanguageDropdownField.php b/code/forms/LanguageDropdownField.php index d81a1b8..a385fd8 100755 --- a/code/forms/LanguageDropdownField.php +++ b/code/forms/LanguageDropdownField.php @@ -21,7 +21,7 @@ class LanguageDropdownField extends GroupedDropdownField { * @param string $list Indicates the source language list. * Can be either Common-English, Common-Native, Locale-English, Locale-Native */ - function __construct($name, $title, $excludeLocales = array(), + public function __construct($name, $title = null, $excludeLocales = array(), $translatingClass = 'SiteTree', $list = 'Common-English', $instance = null ) { $usedLocalesWithTitle = Translatable::get_existing_content_languages($translatingClass); diff --git a/code/model/Translatable.php b/code/model/Translatable.php index 0a4456c..25f7e6d 100755 --- a/code/model/Translatable.php +++ b/code/model/Translatable.php @@ -743,7 +743,12 @@ class Translatable extends DataExtension implements PermissionProvider { if(!$obj || $obj->ObsoleteClassName) continue; $obj->Locale = Translatable::default_locale(); - $obj->writeToStage($stage); + + $oldMode = Versioned::get_reading_mode(); + Versioned::reading_stage($stage); + $obj->writeWithoutVersion(); + Versioned::set_reading_mode($oldMode); + $obj->addTranslationGroup($obj->ID); $obj->destroy(); unset($obj); @@ -928,13 +933,7 @@ class Translatable extends DataExtension implements PermissionProvider { // This is to prevent the overhead of writing all translations when // the class didn't actually change. $baseDataClass = ClassInfo::baseDataClass($this->owner->class); - $currentStage = Versioned::current_stage(); - $fresh = Versioned::get_one_by_stage( - $baseDataClass, - Versioned::current_stage(), - '"ID" = ' . $this->owner->ID, - null - ); + $fresh = DataObject::get($baseDataClass)->byId($this->owner->ID); if ($fresh) { $changed = $changedFields['ClassName']['after'] != $fresh->ClassName; } @@ -1065,72 +1064,74 @@ class Translatable extends DataExtension implements PermissionProvider { $alreadyTranslatedLocales[$this->owner->Locale] = $this->owner->Locale; $alreadyTranslatedLocales = array_combine($alreadyTranslatedLocales, $alreadyTranslatedLocales); - // Check if fields exist already to avoid adding them twice on repeat invocations - $tab = $fields->findOrMakeTab('Root.Translations', _t('Translatable.TRANSLATIONS', 'Translations')); - if(!$tab->fieldByName('CreateTransHeader')) { - $tab->push(new HeaderField( - 'CreateTransHeader', - _t('Translatable.CREATE', 'Create new translation'), - 2 - )); - } - if(!$tab->fieldByName('NewTransLang') && !$tab->fieldByName('AllTransCreated')) { - $langDropdown = LanguageDropdownField::create( - "NewTransLang", - _t('Translatable.NEWLANGUAGE', 'New language'), - $alreadyTranslatedLocales, - 'SiteTree', - 'Locale-English', - $this->owner - )->addExtraClass('languageDropdown no-change-track'); - $tab->push($langDropdown); - $canAddLocale = (count($langDropdown->getSource()) > 0); - - if($canAddLocale) { - // Only add create button if new languages are available - $tab->push( - $createButton = InlineFormAction::create( - 'createtranslation', - _t('Translatable.CREATEBUTTON', 'Create') - )->addExtraClass('createTranslationButton') - ); - $createButton->includeDefaultJS(false); // not fluent API... - } else { - $tab->removeByName('NewTransLang'); - $tab->push(new LiteralField( - 'AllTransCreated', - _t('Translatable.ALLCREATED', 'All allowed translations have been created.') + if ($fields->hasTabSet()) { + // Check if fields exist already to avoid adding them twice on repeat invocations + $tab = $fields->findOrMakeTab('Root.Translations', _t('Translatable.TRANSLATIONS', 'Translations')); + if(!$tab->fieldByName('CreateTransHeader')) { + $tab->push(new HeaderField( + 'CreateTransHeader', + _t('Translatable.CREATE', 'Create new translation'), + 2 )); } - } - if($alreadyTranslatedLocales) { - if(!$tab->fieldByName('ExistingTransHeader')) { - $tab->push(new HeaderField( - 'ExistingTransHeader', - _t('Translatable.EXISTING', 'Existing translations'), - 3 - )); - if (!$tab->fieldByName('existingtrans')) { - $existingTransHTML = ''; - $tab->push(new LiteralField('existingtrans', $existingTransHTML)); + if(!$tab->fieldByName('NewTransLang') && !$tab->fieldByName('AllTransCreated')) { + $langDropdown = LanguageDropdownField::create( + "NewTransLang", + _t('Translatable.NEWLANGUAGE', 'New language'), + $alreadyTranslatedLocales, + 'SiteTree', + 'Locale-English', + $this->owner + )->addExtraClass('languageDropdown no-change-track'); + $tab->push($langDropdown); + $canAddLocale = (count($langDropdown->getSource()) > 0); + + if($canAddLocale) { + // Only add create button if new languages are available + $tab->push( + $createButton = InlineFormAction::create( + 'createtranslation', + _t('Translatable.CREATEBUTTON', 'Create') + )->addExtraClass('createTranslationButton') + ); + $createButton->includeDefaultJS(false); // not fluent API... + } else { + $tab->removeByName('NewTransLang'); + $tab->push(new LiteralField( + 'AllTransCreated', + _t('Translatable.ALLCREATED', 'All allowed translations have been created.') + )); } } - } + if($alreadyTranslatedLocales) { + if(!$tab->fieldByName('ExistingTransHeader')) { + $tab->push(new HeaderField( + 'ExistingTransHeader', + _t('Translatable.EXISTING', 'Existing translations'), + 3 + )); + if (!$tab->fieldByName('existingtrans')) { + $existingTransHTML = ''; + $tab->push(new LiteralField('existingtrans', $existingTransHTML)); + } + } + } + } } function updateSettingsFields(&$fields) { @@ -1293,20 +1294,16 @@ class Translatable extends DataExtension implements PermissionProvider { // exclude the language of the current owner $filter .= sprintf(' AND "%s"."Locale" != \'%s\'', $baseDataClass, $this->owner->Locale); } - $currentStage = Versioned::current_stage(); $joinOnClause = sprintf('"%s_translationgroups"."OriginalID" = "%s"."ID"', $baseDataClass, $baseDataClass); - if($this->owner->hasExtension("Versioned")) { - if($stage) Versioned::reading_stage($stage); + if($this->owner->hasExtension("Versioned") && $stage) { $translations = Versioned::get_by_stage( $baseDataClass, - Versioned::current_stage(), + $stage, $filter, null )->leftJoin("{$baseDataClass}_translationgroups", $joinOnClause); - if($stage) Versioned::reading_stage($currentStage); } else { - $class = $this->owner->class; - $translations = $baseDataClass::get() + $translations = DataObject::get($baseDataClass) ->where($filter) ->leftJoin("{$baseDataClass}_translationgroups", $joinOnClause); } @@ -1476,6 +1473,11 @@ class Translatable extends DataExtension implements PermissionProvider { $urlSegment = $newTranslation->URLSegment; } + if (URLSegmentFilter::singleton()->getAllowMultibyte()) { + // Decode the URL segment, it will be re-encoded again on write + $urlSegment = rawurldecode($urlSegment); + } + // Only make segment unique if it should be enforced if(Config::inst()->get('Translatable', 'enforce_global_unique_urls')) { $newTranslation->URLSegment = $urlSegment . '-' . i18n::convert_rfc1766($locale); @@ -1572,15 +1574,15 @@ class Translatable extends DataExtension implements PermissionProvider { function MetaTags(&$tags) { $template = '' . "\n"; $translations = $this->owner->getTranslations(); - if($translations) { + if($translations->count()) { $translations = $translations->toArray(); $translations[] = $this->owner; - - foreach($translations as $translation) { - $tags .= sprintf($template, - Convert::raw2xml($translation->Title), - i18n::convert_rfc1766($translation->Locale), - $translation->AbsoluteLink() + + foreach($translations as $translation) { + $tags .= sprintf($template, + Convert::raw2xml($translation->Title), + i18n::convert_rfc1766($translation->Locale), + $translation->AbsoluteLink() ); } } @@ -1766,7 +1768,7 @@ class Translatable extends DataExtension implements PermissionProvider { * @deprecated 2.4 Use get_reading_locale() */ static function get_reading_lang() { - return i18n::get_lang_from_locale(self::get_reading_locale()); + return i18n::get_lang_from_locale(self::get_current_locale()); } /** diff --git a/composer.json b/composer.json index 9fbf259..4ae1bb3 100644 --- a/composer.json +++ b/composer.json @@ -24,10 +24,8 @@ "silverstripe/cms": "~3.2" }, "require-dev": { - "silverstripe/postgresql": "*", - "silverstripe/sqlite3": "*", - "silverstripe/mssql": "*", - "phpunit/PHPUnit": "~3.7@stable" + "phpunit/phpunit": "^5.7", + "squizlabs/php_codesniffer": "^3.0" }, "extra": { "screenshots": [ diff --git a/lang/ar.yml b/lang/ar.yml index 0005f3b..3c3dc5e 100644 --- a/lang/ar.yml +++ b/lang/ar.yml @@ -16,7 +16,7 @@ ar: TRANSLATEALLPERMISSION: 'ترجم إلى جميع اللغات المتاحة' TRANSLATEPERMISSION: 'ترجم %s' TRANSLATEVIEWLANGS: 'أعرض قائمة اللغات' - TRANSLATIONS: تراجم + TRANSLATIONS: 'تراجم' Translatable_Transform: OriginalCheckboxLabel: 'الأصلية: {قيمة}' OriginalFieldLabel: 'الأصلي {عنوان}' diff --git a/lang/bs.yml b/lang/bs.yml index 39c0fcf..0e36847 100644 --- a/lang/bs.yml +++ b/lang/bs.yml @@ -18,7 +18,7 @@ bs: TRANSLATEVIEWLANGS: 'Padajući meni jezika' TRANSLATIONS: Prevodi Translatable_Transform: - CheckboxValueNo: 'Ne' - CheckboxValueYes: 'Da' + CheckboxValueNo: Ne + CheckboxValueYes: Da OriginalCheckboxLabel: 'Original: {value}' OriginalFieldLabel: 'Original: {title}' diff --git a/lang/cs.yml b/lang/cs.yml index 2a58ad6..7729b97 100644 --- a/lang/cs.yml +++ b/lang/cs.yml @@ -18,7 +18,7 @@ cs: TRANSLATEVIEWLANGS: 'Zobrazit seznam jazyků' TRANSLATIONS: Překlady Translatable_Transform: - CheckboxValueNo: 'Ne' - CheckboxValueYes: 'Ano' + CheckboxValueNo: Ne + CheckboxValueYes: Ano OriginalCheckboxLabel: 'Původní: {value}' OriginalFieldLabel: 'Původní {title}' diff --git a/lang/cs_CZ.yml b/lang/cs_CZ.yml index 97edfe2..e297b3f 100644 --- a/lang/cs_CZ.yml +++ b/lang/cs_CZ.yml @@ -18,7 +18,7 @@ cs_CZ: TRANSLATEVIEWLANGS: 'Zobrazit jazykový rozbalovací seznam' TRANSLATIONS: Překlady Translatable_Transform: - CheckboxValueNo: 'Ne' - CheckboxValueYes: 'Ano' + CheckboxValueNo: Ne + CheckboxValueYes: Ano OriginalCheckboxLabel: 'Původní: {value}' OriginalFieldLabel: 'Původní {title}' diff --git a/lang/de.yml b/lang/de.yml index 5893e5b..5b9c6fe 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -18,7 +18,7 @@ de: TRANSLATEVIEWLANGS: 'Kann die verfügbaren Sprachen sehen' TRANSLATIONS: Übersetzungen Translatable_Transform: - CheckboxValueNo: 'Nein' - CheckboxValueYes: 'Ja' + CheckboxValueNo: Nein + CheckboxValueYes: Ja OriginalCheckboxLabel: 'Original: {value}' OriginalFieldLabel: 'Original {title}' diff --git a/lang/eo.yml b/lang/eo.yml index c5e586f..bde9c5d 100644 --- a/lang/eo.yml +++ b/lang/eo.yml @@ -18,7 +18,7 @@ eo: TRANSLATEVIEWLANGS: 'Vidigi lingvan falliston' TRANSLATIONS: Tradukoj Translatable_Transform: - CheckboxValueNo: 'Ne' - CheckboxValueYes: 'Jes' + CheckboxValueNo: Ne + CheckboxValueYes: Jes OriginalCheckboxLabel: 'Origina: {value}' OriginalFieldLabel: 'Origina: {title}' diff --git a/lang/et_EE.yml b/lang/et_EE.yml index 78429e1..ccfcbd5 100644 --- a/lang/et_EE.yml +++ b/lang/et_EE.yml @@ -16,5 +16,5 @@ et_EE: TRANSLATEPERMISSION: 'Tõlgi: %s' TRANSLATIONS: Tõlked Translatable_Transform: - CheckboxValueNo: 'Ei' - CheckboxValueYes: 'Jah' + CheckboxValueNo: Ei + CheckboxValueYes: Jah diff --git a/lang/fa_IR.yml b/lang/fa_IR.yml index cff7845..fe26b0a 100644 --- a/lang/fa_IR.yml +++ b/lang/fa_IR.yml @@ -16,9 +16,9 @@ fa_IR: TRANSLATEALLPERMISSION: 'ترجمه به تمام زبان های موجود' TRANSLATEPERMISSION: 'ترجمه %s' TRANSLATEVIEWLANGS: 'نمایش منوی زبان' - TRANSLATIONS: ترجمه + TRANSLATIONS: 'ترجمه' Translatable_Transform: - CheckboxValueNo: 'خیر' - CheckboxValueYes: 'بله' + CheckboxValueNo: خیر + CheckboxValueYes: بله OriginalCheckboxLabel: 'اصل: {value}' OriginalFieldLabel: 'اصل {title}' diff --git a/lang/fi_FI.yml b/lang/fi_FI.yml index 66dc4e3..ec9df01 100644 --- a/lang/fi_FI.yml +++ b/lang/fi_FI.yml @@ -18,7 +18,7 @@ fi_FI: TRANSLATEVIEWLANGS: 'Näytä kielet' TRANSLATIONS: Käännökset Translatable_Transform: - CheckboxValueNo: 'Ei' - CheckboxValueYes: 'Kyllä' + CheckboxValueNo: Ei + CheckboxValueYes: Kyllä OriginalCheckboxLabel: 'Alkuperäinen: {value}' OriginalFieldLabel: 'Alkuperäinen {title}' diff --git a/lang/hr.yml b/lang/hr.yml new file mode 100644 index 0000000..3a9a8ea --- /dev/null +++ b/lang/hr.yml @@ -0,0 +1,24 @@ +hr: + CMSMain: + LANGUAGEDROPDOWNLABEL: Jezik + CMSMain_left: + GO: Kreni + Form: + LANGAOTHER: 'Ostali jezici' + LANGAVAIL: 'Dostupni jezici' + Translatable: + ALLCREATED: 'Svi dozvoljeni prijevodi su kreirani.' + CREATE: 'Kreiraj novi prijevod' + CREATEBUTTON: Kreiraj + EXISTING: 'Postojeći prijevodi' + NEWLANGUAGE: 'Novi jezik' + NOTICENEWPAGE: 'Molimo spremite ovu stranicu prije kreiranja prijevoda' + TRANSLATEALLPERMISSION: 'Prevedi u sve dostupne jezike' + TRANSLATEPERMISSION: 'Prevedi %s' + TRANSLATEVIEWLANGS: 'Pogledaj padajući izbornik jezika' + TRANSLATIONS: Prijevodi + Translatable_Transform: + CheckboxValueNo: Ne + CheckboxValueYes: Da + OriginalCheckboxLabel: 'Original: {value}' + OriginalFieldLabel: 'Original {title}' diff --git a/lang/it.yml b/lang/it.yml index 80d985d..741665a 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -19,5 +19,6 @@ it: TRANSLATIONS: Traduzioni Translatable_Transform: CheckboxValueNo: 'No' + CheckboxValueYes: Si OriginalCheckboxLabel: 'Originale: {value}' OriginalFieldLabel: 'Originale {title}' diff --git a/lang/ja.yml b/lang/ja.yml index e779c8b..b6fa8a4 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -4,18 +4,18 @@ ja: CMSMain_left: GO: 実行 Form: - LANGAOTHER: '他の言語' - LANGAVAIL: '利用可能な言語' + LANGAOTHER: 他の言語 + LANGAVAIL: 利用可能な言語 Translatable: ALLCREATED: '許可された翻訳全てが作成されました。' - CREATE: '新しい翻訳を行う' + CREATE: 新しい翻訳を行う CREATEBUTTON: 作成 - EXISTING: '現存中の翻訳' - NEWLANGUAGE: '新しい言語' + EXISTING: 現存中の翻訳 + NEWLANGUAGE: 新しい言語 NOTICENEWPAGE: '翻訳を作成する前にこのページを保存してください' TRANSLATEALLPERMISSION: '全ての利用可能言語に翻訳' TRANSLATEPERMISSION: '%sを翻訳' - TRANSLATEVIEWLANGS: '言語ドロップダウンを表示' + TRANSLATEVIEWLANGS: 言語ドロップダウンを表示 TRANSLATIONS: 翻訳 Translatable_Transform: OriginalCheckboxLabel: 'オリジナル: {value}' diff --git a/lang/mi.yml b/lang/mi.yml index 534309c..c1cb57a 100644 --- a/lang/mi.yml +++ b/lang/mi.yml @@ -16,7 +16,7 @@ mi: TRANSLATEALLPERMISSION: 'Whakamāoritia ki ngā reo katoa e wātea ana' TRANSLATEPERMISSION: 'Whakamāoritia a %s' TRANSLATEVIEWLANGS: 'Tirohia te takaiho reo' - TRANSLATIONS: Ngā whakamāoritanga + TRANSLATIONS: 'Ngā whakamāoritanga' Translatable_Transform: OriginalCheckboxLabel: 'Taketake: {value}' OriginalFieldLabel: '{title} taketake' diff --git a/lang/nl_NL.yml b/lang/nl_NL.yml new file mode 100644 index 0000000..9a39393 --- /dev/null +++ b/lang/nl_NL.yml @@ -0,0 +1,20 @@ +nl_NL: + CMSMain: + LANGUAGEDROPDOWNLABEL: Taal + CMSMain_left: + GO: Gaan + Form: + LANGAOTHER: 'Andere talen' + LANGAVAIL: 'Beschikbare talen' + Translatable: + ALLCREATED: 'Alle toegestane vertalingen werden gecreëerd.' + CREATE: 'Nieuwe vertaling creëren' + CREATEBUTTON: Creëren + EXISTING: 'Bestaande vertalingen' + NEWLANGUAGE: 'Nieuwe taal' + TRANSLATEALLPERMISSION: 'Vertaal in alle beschikbare talen' + TRANSLATEPERMISSION: 'Vertaal %s' + TRANSLATIONS: Vertalingen + Translatable_Transform: + CheckboxValueNo: Neen + CheckboxValueYes: Ja diff --git a/lang/ru.yml b/lang/ru.yml new file mode 100644 index 0000000..064bfbb --- /dev/null +++ b/lang/ru.yml @@ -0,0 +1,24 @@ +ru: + CMSMain: + LANGUAGEDROPDOWNLABEL: Язык + CMSMain_left: + GO: Выполн. + Form: + LANGAOTHER: 'Другие языки' + LANGAVAIL: 'Доступные языки' + Translatable: + ALLCREATED: 'Все переводы на доступные языки созданы.' + CREATE: 'Создать новый перевод' + CREATEBUTTON: Создать + EXISTING: 'Существующие переводы' + NEWLANGUAGE: 'Добавить язык' + NOTICENEWPAGE: 'Пожалуйста, сохраните данную страницу прежде чем создавать перевод' + TRANSLATEALLPERMISSION: 'Перевести на все доступные языки' + TRANSLATEPERMISSION: 'Перевести %s' + TRANSLATEVIEWLANGS: 'Отобразить языковое выпадающее меню' + TRANSLATIONS: Переводы + Translatable_Transform: + CheckboxValueNo: Нет + CheckboxValueYes: Да + OriginalCheckboxLabel: 'Оригинальное значение: {value}' + OriginalFieldLabel: 'Оригинальное {title}' diff --git a/lang/sk.yml b/lang/sk.yml index ad8edd3..0b12b58 100644 --- a/lang/sk.yml +++ b/lang/sk.yml @@ -18,7 +18,7 @@ sk: TRANSLATEVIEWLANGS: 'Zobraziť zoznam jazykov' TRANSLATIONS: Preklady Translatable_Transform: - CheckboxValueNo: 'Nie' - CheckboxValueYes: 'Áno' + CheckboxValueNo: Nie + CheckboxValueYes: Áno OriginalCheckboxLabel: 'Pôvodné: {value}' OriginalFieldLabel: 'Pôvodné {title}' diff --git a/lang/sk_SK.yml b/lang/sk_SK.yml index 2933547..51b4a51 100644 --- a/lang/sk_SK.yml +++ b/lang/sk_SK.yml @@ -18,7 +18,7 @@ sk_SK: TRANSLATEVIEWLANGS: 'Zobraziť jazykový rozbaľovací zoznam' TRANSLATIONS: Preklady Translatable_Transform: - CheckboxValueNo: 'Nie' - CheckboxValueYes: 'Áno' + CheckboxValueNo: Nie + CheckboxValueYes: Áno OriginalCheckboxLabel: 'Pôvodné: {value}' OriginalFieldLabel: 'Pôvodné {title}' diff --git a/lang/sv.yml b/lang/sv.yml index 6abef66..98424ef 100644 --- a/lang/sv.yml +++ b/lang/sv.yml @@ -18,5 +18,7 @@ sv: TRANSLATEVIEWLANGS: 'Visa språk listan' TRANSLATIONS: Översättningar Translatable_Transform: + CheckboxValueNo: Nej + CheckboxValueYes: Ja OriginalCheckboxLabel: 'Original: {value}' OriginalFieldLabel: 'Original {title}' diff --git a/lang/tr.yml b/lang/tr.yml index 8404e72..8003114 100644 --- a/lang/tr.yml +++ b/lang/tr.yml @@ -18,7 +18,7 @@ tr: TRANSLATEVIEWLANGS: 'Mevcut dilleri görebilir' TRANSLATIONS: Çeviriler Translatable_Transform: - CheckboxValueNo: 'Hayır' - CheckboxValueYes: 'Evet' + CheckboxValueNo: Hayır + CheckboxValueYes: Evet OriginalCheckboxLabel: 'Orijinal: {value}' OriginalFieldLabel: 'Orijinal {title}' diff --git a/lang/vi_VN.yml b/lang/vi_VN.yml index 3d518ea..3cd443f 100644 --- a/lang/vi_VN.yml +++ b/lang/vi_VN.yml @@ -1,6 +1,6 @@ vi_VN: CMSMain: - LANGUAGEDROPDOWNLABEL: Ngôn ngữ + LANGUAGEDROPDOWNLABEL: 'Ngôn ngữ' CMSMain_left: GO: Đi Form: @@ -16,7 +16,7 @@ vi_VN: TRANSLATEALLPERMISSION: 'Dịch sang mọi ngôn gữ có th' TRANSLATEPERMISSION: 'Dịch %s' TRANSLATEVIEWLANGS: 'Xem danh sách ngôn ng' - TRANSLATIONS: Dịch thuật + TRANSLATIONS: 'Dịch thuật' Translatable_Transform: OriginalCheckboxLabel: 'Mặc định :{value}' OriginalFieldLabel: 'Mặc định:{title}' diff --git a/lang/zh.yml b/lang/zh.yml index e1bd4c5..f28a37e 100644 --- a/lang/zh.yml +++ b/lang/zh.yml @@ -5,17 +5,17 @@ zh: GO: 前往 Form: LANGAOTHER: '其它语言' - LANGAVAIL: '可用的语言' + LANGAVAIL: 可用的语言 Translatable: ALLCREATED: '所有允许的翻译均已创建。' - CREATE: '创建新的翻译' + CREATE: 创建新的翻译 CREATEBUTTON: 创建 - EXISTING: '现存的翻译' - NEWLANGUAGE: '新语言' + EXISTING: 现存的翻译 + NEWLANGUAGE: 新语言 NOTICENEWPAGE: '创建翻译前,请先保存本页面。' - TRANSLATEALLPERMISSION: '翻译成所有可用语言' + TRANSLATEALLPERMISSION: 翻译成所有可用语言 TRANSLATEPERMISSION: '翻译 %s' - TRANSLATEVIEWLANGS: '查看语言下拉菜单' + TRANSLATEVIEWLANGS: 查看语言下拉菜单 TRANSLATIONS: 翻译 Translatable_Transform: OriginalCheckboxLabel: '原文:{value}' diff --git a/tests/unit/TranslatableSiteConfigTest.php b/tests/unit/TranslatableSiteConfigTest.php index 3476613..fd6081d 100644 --- a/tests/unit/TranslatableSiteConfigTest.php +++ b/tests/unit/TranslatableSiteConfigTest.php @@ -22,6 +22,9 @@ class TranslatableSiteConfigTest extends SapphireTest { $this->origLocale = Translatable::default_locale(); Translatable::set_default_locale("en_US"); + + // Delete any default records created outside of fixtures + SiteConfig::get()->exclude('ID', $this->allFixtureIDs('SiteConfig'))->removeAll(); } function tearDown() { diff --git a/tests/unit/TranslatableTest.php b/tests/unit/TranslatableTest.php index 5f990de..e72ee31 100755 --- a/tests/unit/TranslatableTest.php +++ b/tests/unit/TranslatableTest.php @@ -459,7 +459,32 @@ class TranslatableTest extends FunctionalTest { Config::inst()->update('Translatable', 'enforce_global_unique_urls', true); Translatable::set_current_locale('en_US'); } - + + public function testMultibyteUrlsWorkWhenTranslated() + { + Config::inst()->update('URLSegmentFilter', 'default_allow_multibyte', true); + + $page = new Page(); + $page->URLSegment = 'schön-döner'; + $page->Content = 'Kebabs in Berlin are amazing.'; + $page->write(); + $page->doPublish(); + + $translatedPage = $page->createTranslation('de_DE'); + $translatedPage->Content = 'Döner in Berlin sind unglaublich'; + $translatedPage->doPublish(); + $this->assertSame('schön-döner-de-de', rawurldecode($translatedPage->URLSegment)); + + // Test pinging the page on the frontend + $pageResult = $this->get('schön-döner'); + $this->assertEquals(200, $pageResult->getStatusCode()); + $this->assertContains('Kebabs in Berlin', (string) $pageResult->getBody()); + + $translatedPageResult = $this->get('schön-döner-de-de'); + $this->assertEquals(200, $translatedPageResult->getStatusCode()); + $this->assertContains('Döner in Berlin', (string) $translatedPageResult->getBody()); + } + function testUpdateCMSFieldsOnSiteTree() { $pageOrigLang = new TranslatableTest_Page(); $pageOrigLang->write();