1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-09-20 01:08:50 +02: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:
epriestley 2016-05-26 06:48:43 -07:00
parent a4e5780043
commit 10ffa42504

View file

@ -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;
}
}