public function setLocale(PhutilLocale $locale)
 {
     $this->locale = $locale;
     $this->localeCode = $locale->getLocaleCode();
     $this->shouldPostProcess = $locale->shouldPostProcessTranslations();
     return $this;
 }
 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 testPht()
 {
     PhutilTranslator::setInstance(new PhutilTranslator());
     $this->assertEqual('beer', pht('beer'));
     $this->assertEqual('1 beer(s)', pht('%d beer(s)', 1));
     $english_locale = PhutilLocale::loadLocale('en_US');
     PhutilTranslator::getInstance()->setLocale($english_locale);
     PhutilTranslator::getInstance()->setTranslations(array('%d beer(s)' => array('%d beer', '%d beers')));
     $this->assertEqual('1 beer', pht('%d beer(s)', 1));
     $czech_locale = PhutilLocale::loadLocale('cs_CZ');
     PhutilTranslator::getInstance()->setLocale($czech_locale);
     PhutilTranslator::getInstance()->setTranslations(array('%d beer(s)' => array('%d pivo', '%d piva', '%d piv')));
     $this->assertEqual('5 piv', pht('%d beer(s)', 5));
 }
 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);
 }
 /**
  * Load the complete translation map for a locale.
  *
  * This will compile primary and fallback translations into a single
  * translation map.
  *
  * @param string Locale code, like "en_US".
  * @return map<string, wild> Map of all avialable translations.
  */
 public static function getTranslationMapForLocale($locale_code)
 {
     $locale = PhutilLocale::loadLocale($locale_code);
     $translations = self::loadAllTranslations();
     $results = array();
     foreach ($translations as $translation) {
         if ($translation->getLocaleCode() == $locale_code) {
             $results += $translation->getFilteredTranslations();
         }
     }
     $fallback_code = $locale->getFallbackLocaleCode();
     if ($fallback_code !== null) {
         $results += self::getTranslationMapForLocale($fallback_code);
     }
     return $results;
 }
예제 #6
0
 /**
  * Recursively check locale fallbacks for cycles.
  *
  * @param map<string, PhutilLocale> Map of locales.
  * @param PhutilLocale Current locale.
  * @param map<string, string> Map of visited locales.
  * @return void
  */
 private static function checkLocaleFallback(array $map, PhutilLocale $locale, array $seen)
 {
     $fallback_code = $locale->getFallbackLocaleCode();
     if ($fallback_code === null) {
         return;
     }
     if (isset($seen[$fallback_code])) {
         $seen[] = get_class($locale);
         $seen[] = pht('...');
         throw new Exception(pht('Locale "%s" is part of a cycle of locales which fall back on ' . 'one another in a loop (%s). Locales which fall back on other ' . 'locales must not loop.', get_class($locale), implode(' -> ', $seen)));
     }
     $seen[$fallback_code] = get_class($locale);
     self::checkLocaleFallback($map, $map[$fallback_code], $seen);
 }
예제 #7
0
 public static function setLocaleCode($locale_code)
 {
     if (!$locale_code) {
         return;
     }
     if ($locale_code == self::$localeCode) {
         return;
     }
     try {
         $locale = PhutilLocale::loadLocale($locale_code);
         $translations = PhutilTranslation::getTranslationMapForLocale($locale_code);
         $override = self::getEnvConfig('translation.override');
         if (!is_array($override)) {
             $override = array();
         }
         PhutilTranslator::getInstance()->setLocale($locale)->setTranslations($override + $translations);
         self::$localeCode = $locale_code;
     } catch (Exception $ex) {
         // Just ignore this; the user likely has an out-of-date locale code.
     }
 }
 public function testLoadAllLocales()
 {
     PhutilLocale::loadAllLocales();
     $this->assertTrue(true);
 }
 private function newTranslator($locale_code)
 {
     $locale = PhutilLocale::loadLocale($locale_code);
     return id(new PhutilTranslator())->setLocale($locale);
 }
예제 #10
0
 *  - Next to 'arcanist/'.
 *  - Anywhere in the normal PHP 'include_path'.
 *  - Inside 'arcanist/externals/includes/'.
 *
 * When looking in these places, we expect to find a 'libphutil/' directory.
 */
function arcanist_adjust_php_include_path()
{
    // The 'arcanist/' directory.
    $arcanist_dir = dirname(dirname(__FILE__));
    // The parent directory of 'arcanist/'.
    $parent_dir = dirname($arcanist_dir);
    // The 'arcanist/externals/includes/' directory.
    $include_dir = implode(DIRECTORY_SEPARATOR, array($arcanist_dir, 'externals', 'includes'));
    $php_include_path = ini_get('include_path');
    $php_include_path = implode(PATH_SEPARATOR, array($parent_dir, $php_include_path, $include_dir));
    ini_set('include_path', $php_include_path);
}
arcanist_adjust_php_include_path();
if (getenv('ARC_PHUTIL_PATH')) {
    @(include_once getenv('ARC_PHUTIL_PATH') . '/scripts/__init_script__.php');
} else {
    @(include_once 'libphutil/scripts/__init_script__.php');
}
if (!@constant('__LIBPHUTIL__')) {
    echo "ERROR: Unable to load libphutil. Put libphutil/ next to arcanist/, or " . "update your PHP 'include_path' to include the parent directory of " . "libphutil/, or symlink libphutil/ into arcanist/externals/includes/.\n";
    exit(1);
}
phutil_load_library(dirname(dirname(__FILE__)) . '/src/');
PhutilTranslator::getInstance()->setLocale(PhutilLocale::loadLocale('en_US'))->setTranslations(PhutilTranslation::getTranslationMapForLocale('en_US'));