diff --git a/src/Forms/HTMLEditor/TinyMCEConfig.php b/src/Forms/HTMLEditor/TinyMCEConfig.php
index a2f90546c..1c06c8a09 100644
--- a/src/Forms/HTMLEditor/TinyMCEConfig.php
+++ b/src/Forms/HTMLEditor/TinyMCEConfig.php
@@ -34,7 +34,7 @@ class TinyMCEConfig extends HTMLEditorConfig
'cy_GB' => 'cy',
'da_DK' => 'da',
'da_GL' => 'da',
- 'de_AT' => 'de',
+ 'de_AT' => 'de_AT',
'de_BE' => 'de',
'de_CH' => 'de',
'de_DE' => 'de',
@@ -56,7 +56,7 @@ class TinyMCEConfig extends HTMLEditorConfig
'es_GQ' => 'es',
'es_GT' => 'es',
'es_HN' => 'es',
- 'es_MX' => 'es',
+ 'es_MX' => 'es_MX',
'es_NI' => 'es',
'es_PA' => 'es',
'es_PE' => 'es',
@@ -69,11 +69,9 @@ class TinyMCEConfig extends HTMLEditorConfig
'es_AD' => 'es',
'es_BZ' => 'es',
'es_US' => 'es',
- 'fa_AF' => 'fa',
- 'fa_IR' => 'fa',
- 'fa_PK' => 'fa',
- 'fi_FI' => 'fi',
- 'fi_SE' => 'fi',
+ 'fa_AF' => 'fa_IR',
+ 'fa_IR' => 'fa_IR',
+ 'fa_PK' => 'fa_IR',
'fr_BE' => 'fr_FR',
'fr_BF' => 'fr_FR',
'fr_BI' => 'fr_FR',
@@ -117,12 +115,11 @@ class TinyMCEConfig extends HTMLEditorConfig
'fr_YT' => 'fr_FR',
'fr_GB' => 'fr_FR',
'fr_US' => 'fr_FR',
- 'he_IL' => 'he',
- 'hu_HU' => 'hu',
- 'hu_AT' => 'hu',
- 'hu_RO' => 'hu',
- 'hu_RS' => 'hu',
- 'is_IS' => 'is',
+ 'he_IL' => 'he_IL',
+ 'hu_HU' => 'hu_HU',
+ 'hu_AT' => 'hu_HU',
+ 'hu_RO' => 'hu_HU',
+ 'hu_RS' => 'hu_HU',
'it_CH' => 'it',
'it_IT' => 'it',
'it_SM' => 'it',
@@ -131,28 +128,26 @@ class TinyMCEConfig extends HTMLEditorConfig
'it_US' => 'it',
'it_VA' => 'it',
'ja_JP' => 'ja',
- 'ko_KP' => 'ko',
- 'ko_KR' => 'ko',
- 'ko_CN' => 'ko',
- 'mi_NZ' => 'mi_NZ',
- 'nb_NO' => 'nb',
- 'nb_SJ' => 'nb',
+ 'ko_KP' => 'ko_KR',
+ 'ko_KR' => 'ko_KR',
+ 'ko_CN' => 'ko_KR',
+ 'nb_NO' => 'nb_NO',
+ 'nb_SJ' => 'nb_NO',
'nl_AN' => 'nl',
'nl_AW' => 'nl',
'nl_BE' => 'nl',
'nl_NL' => 'nl',
'nl_SR' => 'nl',
- 'nn_NO' => 'nn',
'pl_PL' => 'pl',
'pl_UA' => 'pl',
- 'pt_AO' => 'pt',
- 'pt_BR' => 'pt',
- 'pt_CV' => 'pt',
- 'pt_GW' => 'pt',
- 'pt_MZ' => 'pt',
- 'pt_PT' => 'pt',
- 'pt_ST' => 'pt',
- 'pt_TL' => 'pt',
+ 'pt_AO' => 'pt_PT',
+ 'pt_BR' => 'pt_BR',
+ 'pt_CV' => 'pt_PT',
+ 'pt_GW' => 'pt_PT',
+ 'pt_MZ' => 'pt_PT',
+ 'pt_PT' => 'pt_PT',
+ 'pt_ST' => 'pt_PT',
+ 'pt_TL' => 'pt_PT',
'ro_MD' => 'ro',
'ro_RO' => 'ro',
'ro_RS' => 'ro',
@@ -162,31 +157,26 @@ class TinyMCEConfig extends HTMLEditorConfig
'ru_RU' => 'ru',
'ru_SJ' => 'ru',
'ru_UA' => 'ru',
- 'si_LK' => 'si',
'sk_SK' => 'sk',
'sk_RS' => 'sk',
- 'sq_AL' => 'sq',
- 'sr_BA' => 'sr',
- 'sr_ME' => 'sr',
- 'sr_RS' => 'sr',
- 'sv_FI' => 'sv',
- 'sv_SE' => 'sv',
+ 'sv_FI' => 'sv_SE',
+ 'sv_SE' => 'sv_SE',
'tr_CY' => 'tr',
- 'tr_TR' => 'tr',
+ 'tr_TR' => 'tr_TR',
'tr_DE' => 'tr',
'tr_MK' => 'tr',
- 'uk_UA' => 'uk',
- 'vi_VN' => 'vi',
- 'vi_US' => 'vi',
- 'zh_CN' => 'zh-cn',
- 'zh_HK' => 'zh-cn',
- 'zh_MO' => 'zh-cn',
- 'zh_SG' => 'zh-cn',
- 'zh_TW' => 'zh-tw',
- 'zh_ID' => 'zh-cn',
- 'zh_MY' => 'zh-cn',
- 'zh_TH' => 'zh-cn',
- 'zh_US' => 'zn-cn',
+ 'uk_UA' => 'uk_UA',
+ 'vi_VN' => 'vi_VN',
+ 'vi_US' => 'vi_VN',
+ 'zh_CN' => 'zh_CN',
+ 'zh_HK' => 'zh_CN',
+ 'zh_MO' => 'zh_CN',
+ 'zh_SG' => 'zh_CN',
+ 'zh_TW' => 'zh_TW',
+ 'zh_ID' => 'zh_CN',
+ 'zh_MY' => 'zh_CN',
+ 'zh_TH' => 'zh_CN',
+ 'zh_US' => 'zh_CN',
];
/**
diff --git a/tests/php/Forms/HTMLEditor/TinyMCEConfigTest.php b/tests/php/Forms/HTMLEditor/TinyMCEConfigTest.php
new file mode 100644
index 000000000..7178945a3
--- /dev/null
+++ b/tests/php/Forms/HTMLEditor/TinyMCEConfigTest.php
@@ -0,0 +1,40 @@
+get('base_dir');
+ if (!$configDir) {
+ $this->markTestSkipped("Test skipped without TinyMCE resources folder being installed");
+ }
+
+ $langs = Director::baseFolder().'/'.ModuleResourceLoader::resourcePath($configDir).'/langs';
+
+ // Test all langs exist as real files
+ foreach (TinyMCEConfig::config()->get('tinymce_lang') as $locale => $resource) {
+ // Check valid
+ $this->assertFileExists(
+ "{$langs}/{$resource}.js",
+ "Locale code {$locale} maps to {$resource}.js which exists"
+ );
+ // Check we don't simplify to locale when a specific version exists
+ if (strpos($resource, '_') === false) {
+ $this->assertFileNotExists(
+ "{$langs}/{$locale}.js",
+ "Locale code {$locale} doesn't map to simple {$resource}.js when a better {$locale}.js is available"
+ );
+ }
+ }
+ }
+}