protected function getSelectOptionGroups()
 {
     $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();
         // Get the locale's localized name if it's available. For example,
         // "Deutsch" instead of "German". This helps users who do not speak the
         // current language to find the correct setting.
         $raw_scope = PhabricatorEnv::beginScopedLocale($code);
         $name = $locale->getLocaleName();
         unset($raw_scope);
         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;
     }
     $results = array();
     foreach ($groups as $key => $group) {
         $label = $group_labels[$key];
         if (!$group) {
             continue;
         }
         asort($group);
         $results[] = array('label' => $label, 'options' => $group);
     }
     return $results;
 }
 public function processRequest(AphrontRequest $request)
 {
     $viewer = $this->getViewer();
     $user = $this->getUser();
     $username = $user->getUsername();
     $errors = array();
     if ($request->isFormPost()) {
         $sex = $request->getStr('sex');
         $sexes = array(PhutilPerson::SEX_MALE, PhutilPerson::SEX_FEMALE);
         if (in_array($sex, $sexes)) {
             $user->setSex($sex);
         } else {
             $user->setSex(null);
         }
         // Checked in runtime.
         $user->setTranslation($request->getStr('translation'));
         if (!$errors) {
             $user->save();
             return id(new AphrontRedirectResponse())->setURI($this->getPanelURI('?saved=true'));
         }
     }
     $label_unknown = pht('%s updated their profile', $username);
     $label_her = pht('%s updated her profile', $username);
     $label_his = pht('%s updated his profile', $username);
     $sexes = array(PhutilPerson::SEX_UNKNOWN => $label_unknown, PhutilPerson::SEX_MALE => $label_his, 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;
     $form = new AphrontFormView();
     $form->setUser($viewer)->appendChild(id(new AphrontFormSelectControl())->setOptions($translations)->setLabel(pht('Translation'))->setName('translation')->setValue($user->getTranslation()))->appendRemarkupInstructions(pht('**Choose the pronoun you prefer:**'))->appendChild(id(new AphrontFormSelectControl())->setOptions($sexes)->setLabel(pht('Pronoun'))->setName('sex')->setValue($user->getSex()))->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Save Account Settings')));
     $form_box = id(new PHUIObjectBoxView())->setHeaderText(pht('Account Settings'))->setFormSaved($request->getStr('saved'))->setFormErrors($errors)->setForm($form);
     return array($form_box);
 }
 public function testLoadAllLocales()
 {
     PhutilLocale::loadAllLocales();
     $this->assertTrue(true);
 }