Changeset View
Changeset View
Standalone View
Standalone View
src/applications/settings/panel/PhabricatorAccountSettingsPanel.php
| Show First 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | public function processRequest(AphrontRequest $request) { | ||||
| $label_his = pht('%s updated his profile', $username); | $label_his = pht('%s updated his profile', $username); | ||||
| $sexes = array( | $sexes = array( | ||||
| PhutilPerson::SEX_UNKNOWN => $label_unknown, | PhutilPerson::SEX_UNKNOWN => $label_unknown, | ||||
| PhutilPerson::SEX_MALE => $label_his, | PhutilPerson::SEX_MALE => $label_his, | ||||
| PhutilPerson::SEX_FEMALE => $label_her, | PhutilPerson::SEX_FEMALE => $label_her, | ||||
| ); | ); | ||||
| $locales = PhutilLocale::loadAllLocales(); | $translations = $this->getTranslationOptions(); | ||||
| $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; | |||||
| $form = new AphrontFormView(); | $form = new AphrontFormView(); | ||||
| $form | $form | ||||
| ->setUser($viewer) | ->setUser($viewer) | ||||
| ->appendChild( | ->appendChild( | ||||
| id(new AphrontFormSelectControl()) | id(new AphrontFormSelectControl()) | ||||
| ->setOptions($translations) | ->setOptions($translations) | ||||
| ->setLabel(pht('Translation')) | ->setLabel(pht('Translation')) | ||||
| Show All 15 Lines | $form_box = id(new PHUIObjectBoxView()) | ||||
| ->setFormSaved($request->getStr('saved')) | ->setFormSaved($request->getStr('saved')) | ||||
| ->setFormErrors($errors) | ->setFormErrors($errors) | ||||
| ->setForm($form); | ->setForm($form); | ||||
| return array( | return array( | ||||
| $form_box, | $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; | |||||
| } | |||||
| } | } | ||||