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; }
/** * 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); }
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); }
* - 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'));