mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 00:42:41 +01:00
Separate locales into more usable groups in the translation menu
Summary: Ref T5267. Ref T4103. Currently, adding new locale support to the upstream fills this menu with confusing options which don't do anything. Separate it into four groups: - Translations: these have a "reasonable number" of strings and you'll probably see some obvious effect if you switch to the translation. - Limited Translations: these have very few or no strings, and include locales which we've added but don't ship translations for. - Silly Translations: Pirate english, etc. - Test Translations: ALLCAPS, raw strings, etc. Czech is currently in "test" instead of "limited" for historical reasons; I'll remedy this in the next change. Test Plan: {F1661523} Reviewers: chad Reviewed By: chad Maniphest Tasks: T4103, T5267 Differential Revision: https://secure.phabricator.com/D15978
This commit is contained in:
parent
a4e5780043
commit
10ffa42504
1 changed files with 78 additions and 23 deletions
|
@ -53,29 +53,7 @@ final class PhabricatorAccountSettingsPanel extends PhabricatorSettingsPanel {
|
|||
PhutilPerson::SEX_FEMALE => $label_her,
|
||||
);
|
||||
|
||||
$locales = PhutilLocale::loadAllLocales();
|
||||
$is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
|
||||
$is_dev = PhabricatorEnv::getEnvConfig('phabricator.developer-mode');
|
||||
|
||||
$translations = array();
|
||||
foreach ($locales as $locale) {
|
||||
if ($is_serious && $locale->isSillyLocale()) {
|
||||
// Omit silly locales on serious business installs.
|
||||
continue;
|
||||
}
|
||||
if (!$is_dev && $locale->isTestLocale()) {
|
||||
// Omit test locales on installs which aren't in development mode.
|
||||
continue;
|
||||
}
|
||||
$translations[$locale->getLocaleCode()] = $locale->getLocaleName();
|
||||
}
|
||||
|
||||
asort($translations);
|
||||
// TODO: Implement "locale.default" and use it here.
|
||||
$default = 'en_US';
|
||||
$translations = array(
|
||||
'' => pht('Server Default: %s', $locales[$default]->getLocaleName()),
|
||||
) + $translations;
|
||||
$translations = $this->getTranslationOptions();
|
||||
|
||||
$form = new AphrontFormView();
|
||||
$form
|
||||
|
@ -107,4 +85,81 @@ final class PhabricatorAccountSettingsPanel extends PhabricatorSettingsPanel {
|
|||
$form_box,
|
||||
);
|
||||
}
|
||||
|
||||
private function getTranslationOptions() {
|
||||
$is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
|
||||
$locales = PhutilLocale::loadAllLocales();
|
||||
|
||||
$group_labels = array(
|
||||
'normal' => pht('Translations'),
|
||||
'limited' => pht('Limited Translations'),
|
||||
'silly' => pht('Silly Translations'),
|
||||
'test' => pht('Developer/Test Translations'),
|
||||
);
|
||||
|
||||
$groups = array_fill_keys(array_keys($group_labels), array());
|
||||
|
||||
$translations = array();
|
||||
foreach ($locales as $locale) {
|
||||
$code = $locale->getLocaleCode();
|
||||
$name = $locale->getLocaleName();
|
||||
|
||||
if ($locale->isSillyLocale()) {
|
||||
if ($is_serious) {
|
||||
// Omit silly locales on serious business installs.
|
||||
continue;
|
||||
}
|
||||
$groups['silly'][$code] = $name;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($locale->isTestLocale()) {
|
||||
$groups['test'][$code] = $name;
|
||||
continue;
|
||||
}
|
||||
|
||||
$strings = PhutilTranslation::getTranslationMapForLocale($code);
|
||||
$size = count($strings);
|
||||
|
||||
// If a translation is English, assume it can fall back to the default
|
||||
// strings and don't caveat its completeness.
|
||||
$is_english = (substr($code, 0, 3) == 'en_');
|
||||
|
||||
// Arbitrarily pick some number of available strings to promote a
|
||||
// translation out of the "limited" group. The major goal is just to
|
||||
// keep locales with very few strings out of the main group, so users
|
||||
// aren't surprised if a locale has no upstream translations available.
|
||||
if ($size > 512 || $is_english) {
|
||||
$type = 'normal';
|
||||
} else {
|
||||
$type = 'limited';
|
||||
}
|
||||
|
||||
$groups[$type][$code] = $name;
|
||||
}
|
||||
|
||||
// TODO: Select a default properly.
|
||||
$default = 'en_US';
|
||||
|
||||
$results = array();
|
||||
foreach ($groups as $key => $group) {
|
||||
$label = $group_labels[$key];
|
||||
if (!$group) {
|
||||
continue;
|
||||
}
|
||||
|
||||
asort($group);
|
||||
|
||||
if ($key == 'normal') {
|
||||
$group = array(
|
||||
'' => pht('Server Default: %s', $locales[$default]->getLocaleName()),
|
||||
) + $group;
|
||||
}
|
||||
|
||||
$results[$label] = $group;
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue