</dd>
</dl>
+ <dl{if $errorField == 'locale'} class="formError"{/if}>
+ <dt><label for="locale">{lang}wcf.acp.language.locale{/lang}</label></dt>
+ <dd>
+ <select id="locale" name="locale" class="medium" required>
+ <option value="">{lang}wcf.global.noSelection{/lang}</option>
+ {foreach from=$locales key='identifier' item='displayName'}
+ <option value="{$identifier}"{if $identifier === $locale} selected{/if}>{$displayName}</option>
+ {/foreach}
+ </select>
+ {if $errorField == 'locale'}
+ <small class="innerError">
+ {if $errorType == 'empty'}
+ {lang}wcf.global.form.error.empty{/lang}
+ {else}
+ {lang}wcf.acp.language.add.locale.error.{@$errorType}{/lang}
+ {/if}
+ </small>
+ {/if}
+ <small>{lang}wcf.acp.language.locale.description{/lang}</small>
+ </dd>
+ </dl>
+
{if $action == 'add'}
<dl{if $errorField == 'sourceLanguageID'} class="formError"{/if}>
<dt><label for="sourceLanguageID">{lang}wcf.acp.language.add.source{/lang}</label></dt>
*/
public $sourceLanguageID = 0;
+ /**
+ * @var string[]
+ */
+ public array $locales;
+
+ public string $locale = '';
+
+ /**
+ * @inheritDoc
+ */
+ public function readParameters()
+ {
+ parent::readParameters();
+
+ $locales = \ResourceBundle::getLocales('');
+ if ($locales === false) {
+ throw new \RuntimeException('Unable to query the ICU database to retrieve the available locales.');
+ }
+
+ $displayLocale = WCF::getLanguage()->getLocale();
+ foreach ($locales as $locale) {
+ $this->locales[$locale] = \Locale::getDisplayName($locale, $displayLocale);
+ }
+
+ $collator = new \Collator($displayLocale);
+ $collator->asort($this->locales, \Collator::SORT_STRING);
+ }
+
/**
* @inheritDoc
*/
if (isset($_POST['sourceLanguageID'])) {
$this->sourceLanguageID = \intval($_POST['sourceLanguageID']);
}
+ if (isset($_POST['locale'])) {
+ $this->locale = $_POST['locale'];
+ }
}
/**
// source language id
$this->validateSource();
+
+ if (!isset($this->locales[$this->locale])) {
+ throw new UserInputException('locale');
+ }
}
/**
'countryCode' => \mb_strtolower($this->countryCode),
'languageName' => $this->languageName,
'languageCode' => \mb_strtolower($this->languageCode),
+ 'locale' => $this->locale,
]));
$languageEditor = new LanguageEditor($this->sourceLanguage);
$languageEditor->copy($this->language);
]);
// reset values
- $this->countryCode = $this->languageCode = $this->languageName = '';
+ $this->countryCode = $this->languageCode = $this->languageName = $this->locale = '';
$this->sourceLanguageID = 0;
}
'languageCode' => $this->languageCode,
'sourceLanguageID' => $this->sourceLanguageID,
'languages' => $this->languages,
+ 'locale' => $this->locale,
+ 'locales' => $this->locales,
'action' => 'add',
]);
}
'countryCode' => \mb_strtolower($this->countryCode),
'languageName' => $this->languageName,
'languageCode' => \mb_strtolower($this->languageCode),
+ 'locale' => $this->locale,
]));
LanguageFactory::getInstance()->clearCache();
$this->saved();
$this->countryCode = $this->language->countryCode;
$this->languageName = $this->language->languageName;
$this->languageCode = $this->language->languageCode;
+ $this->locale = $this->language->locale;
}
}
* @property-read int $isDefault is `1` if the language is the default language, otherwise `0`
* @property-read int $hasContent is `1` if the language can be selected when creating language-specific content, otherwise `0`
* @property-read int $isDisabled is `1` if the language is disabled and thus not selectable, otherwise `0`
+ * @property-read string $locale IETF language tag (BCP 47)
*/
class Language extends DatabaseObject
{
{
return !$this->isDefault && $this->languageCode !== 'de' && $this->languageCode !== 'en';
}
+
+ /**
+ * Returns the selected locale or if empty the set language code.
+ */
+ public function getLocale(): string
+ {
+ return $this->locale ?: $this->languageCode;
+ }
}
<item name="wcf.acp.language.item.languageCategoryID.mode.new"><![CDATA[Neue Sprachvariablen-Kategorie]]></item>
<item name="wcf.acp.language.add.package"><![CDATA[Paket]]></item>
<item name="wcf.acp.language.add.package.description"><![CDATA[Die importierten Texte werden dem ausgewählten Paket zugeordnet.]]></item>
+ <item name="wcf.acp.language.locale"><![CDATA[Region]]></item>
+ <item name="wcf.acp.language.locale.description"><![CDATA[Die ausgewählte Region beeinflusst Datumsangaben und die Formatierung von Zahlen.]]></item>
</category>
<category name="wcf.acp.menu">
<item name="wcf.acp.menu.link.management"><![CDATA[Verwaltung]]></item>
<item name="wcf.acp.language.item.languageCategory.error.tooFewSegments"><![CDATA[The entered category contains {#$segmentCount} segment{if $segmentCount > 1}s{/if}.]]></item>
<item name="wcf.acp.language.add.package"><![CDATA[Package]]></item>
<item name="wcf.acp.language.add.package.description"><![CDATA[The imported phrases will be assigned to the selected package.]]></item>
+ <item name="wcf.acp.language.locale"><![CDATA[Region]]></item>
+ <item name="wcf.acp.language.locale.description"><![CDATA[The selected region affects dates and the formatting of numbers.]]></item>
</category>
<category name="wcf.acp.menu">
<item name="wcf.acp.menu.link.management"><![CDATA[Management]]></item>
isDefault TINYINT(1) NOT NULL DEFAULT 0,
hasContent TINYINT(1) NOT NULL DEFAULT 0,
isDisabled TINYINT(1) NOT NULL DEFAULT 0,
+ locale VARCHAR(50) NOT NULL DEFAULT '',
UNIQUE KEY languageCode (languageCode)
);