CRM_Utils_System::setTitle(ts('Settings - Localization'));
$warningTitle = json_encode(ts("Warning"));
- $lcMessages = CRM_Admin_Form_Setting_Localization::getDefaultLocaleOptions();
+ $defaultLocaleOptions = CRM_Admin_Form_Setting_Localization::getDefaultLocaleOptions();
$domain = new CRM_Core_DAO_Domain();
$domain->find(TRUE);
if ($domain->locales) {
// add language limiter and language adder
- $this->addCheckBox('languageLimit', ts('Available Languages'), array_flip($lcMessages), NULL, NULL, NULL, NULL, ' ');
- $this->addElement('select', 'addLanguage', ts('Add Language'), array_merge(array('' => ts('- select -')), array_diff(CRM_Core_I18n::languages(), $lcMessages)));
+ $this->addCheckBox('languageLimit', ts('Available Languages'), array_flip($defaultLocaleOptions), NULL, NULL, NULL, NULL, ' ');
+ $this->addElement('select', 'addLanguage', ts('Add Language'), array_merge(array('' => ts('- select -')), array_diff(CRM_Core_I18n::languages(), $defaultLocaleOptions)));
// add the ability to return to single language
$warning = ts('This will make your CiviCRM installation a single-language one again. THIS WILL DELETE ALL DATA RELATED TO LANGUAGES OTHER THAN THE DEFAULT ONE SELECTED ABOVE (and only that language will be preserved).');
// retrieve default values for currencyLimit
$this->_defaults['currencyLimit'] = array_keys(CRM_Core_OptionGroup::values('currencies_enabled'));
+ $this->_defaults['languageLimit'] = Civi::settings()->get('languageLimit');
+
// CRM-5111: unset these two unconditionally, we don’t want them to stick – ever
unset($this->_defaults['makeMultilingual']);
unset($this->_defaults['makeSinglelingual']);
// if we manipulated the language list, return to the localization admin screen
$return = (bool) (CRM_Utils_Array::value('makeMultilingual', $values) or CRM_Utils_Array::value('addLanguage', $values));
+ $filteredValues = $values;
+ unset($filteredValues['makeMultilingual']);
+ unset($filteredValues['makeSinglelingual']);
+ unset($filteredValues['addLanguage']);
+ unset($filteredValues['languageLimit']);
+
+ Civi::settings()->set('languageLimit', CRM_Utils_Array::value('languageLimit', $values));
+
// save all the settings
- parent::commonProcess($values);
+ parent::commonProcess($filteredValues);
if ($return) {
CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/admin/setting/localization', 'reset=1'));
$locales = CRM_Core_I18n::languages();
if ($domain->locales) {
// for multi-lingual sites, populate default language drop-down with available languages
- $lcMessages = array();
+ $defaultLocaleOptions = array();
foreach ($locales as $loc => $lang) {
if (substr_count($domain->locales, $loc)) {
- $lcMessages[$loc] = $lang;
+ $defaultLocaleOptions[$loc] = $lang;
}
}
}
else {
- $lcMessages = $locales;
+ $defaultLocaleOptions = $locales;
}
- return $lcMessages;
+ return $defaultLocaleOptions;
}
/**
return $_currencySymbols;
}
+ public static function onChangeLcMessages($oldLocale, $newLocale, $metadata, $domainID) {
+ if ($oldLocale == $newLocale) {
+ return;
+ }
+
+ $session = CRM_Core_Session::singleton();
+ if ($newLocale && $session->get('userID')) {
+ $ufm = new CRM_Core_DAO_UFMatch();
+ $ufm->contact_id = $session->get('userID');
+ if ($newLocale && $ufm->find(TRUE)) {
+ $ufm->language = $newLocale;
+ $ufm->save();
+ $session->set('lcMessages', $newLocale);
+ }
+ }
+ }
+
}
}
}
- //keep user preferred language up to date, CRM-7746
- $session = CRM_Core_Session::singleton();
- $lcMessages = CRM_Utils_Array::value('lcMessages', $params);
- if ($lcMessages && $session->get('userID')) {
- $languageLimit = CRM_Utils_Array::value('languageLimit', $params);
- if (is_array($languageLimit) &&
- !in_array($lcMessages, array_keys($languageLimit))
- ) {
- $lcMessages = $session->get('lcMessages');
- }
-
- $ufm = new CRM_Core_DAO_UFMatch();
- $ufm->contact_id = $session->get('userID');
- if ($lcMessages && $ufm->find(TRUE)) {
- $ufm->language = $lcMessages;
- $ufm->save();
- $session->set('lcMessages', $lcMessages);
- $params['lcMessages'] = $lcMessages;
- }
- }
-
$domain->config_backend = serialize($params);
$domain->save();
}
}
}
- // are we in a multi-language setup?
- $multiLang = $domain->locales ? TRUE : FALSE;
+ CRM_Core_BAO_ConfigSetting::applyLocale(Civi::settings($domain->id), $domain->locales);
+ }
+ }
- // set the current language
- $lcMessages = NULL;
+ /**
+ * Evaluate locale preferences and activate a chosen locale by
+ * updating session+global variables.
+ *
+ * @param \Civi\Core\SettingsBag $settings
+ * @param string $activatedLocales
+ * Imploded list of locales which are supported in the DB.
+ * @return array
+ */
+ public static function applyLocale($settings, $activatedLocales) {
+ // are we in a multi-language setup?
+ $multiLang = $activatedLocales ? TRUE : FALSE;
- $session = CRM_Core_Session::singleton();
+ // set the current language
+ $chosenLocale = NULL;
- // on multi-lang sites based on request and civicrm_uf_match
- if ($multiLang) {
- $lcMessagesRequest = CRM_Utils_Request::retrieve('lcMessages', 'String', $this);
- $languageLimit = array();
- if (array_key_exists('languageLimit', $defaults) && is_array($defaults['languageLimit'])) {
- $languageLimit = $defaults['languageLimit'];
- }
+ $session = CRM_Core_Session::singleton();
- if (in_array($lcMessagesRequest, array_keys($languageLimit))) {
- $lcMessages = $lcMessagesRequest;
+ // on multi-lang sites based on request and civicrm_uf_match
+ if ($multiLang) {
+ $languageLimit = array();
+ if (is_array($settings->get('languageLimit'))) {
+ $languageLimit = $settings->get('languageLimit');
+ }
- //CRM-8559, cache navigation do not respect locale if it is changed, so reseting cache.
- CRM_Core_BAO_Cache::deleteGroup('navigation');
- }
- else {
- $lcMessagesRequest = NULL;
- }
+ $requestLocale = CRM_Utils_Request::retrieve('lcMessages', 'String');
+ if (in_array($requestLocale, array_keys($languageLimit))) {
+ $chosenLocale = $requestLocale;
- if (!$lcMessagesRequest) {
- $lcMessagesSession = $session->get('lcMessages');
- if (in_array($lcMessagesSession, array_keys($languageLimit))) {
- $lcMessages = $lcMessagesSession;
- }
- else {
- $lcMessagesSession = NULL;
- }
- }
+ //CRM-8559, cache navigation do not respect locale if it is changed, so reseting cache.
+ // Ed: This doesn't sound good.
+ CRM_Core_BAO_Cache::deleteGroup('navigation');
+ }
+ else {
+ $requestLocale = NULL;
+ }
- if ($lcMessagesRequest) {
- $ufm = new CRM_Core_DAO_UFMatch();
- $ufm->contact_id = $session->get('userID');
- if ($ufm->find(TRUE)) {
- $ufm->language = $lcMessages;
- $ufm->save();
- }
- $session->set('lcMessages', $lcMessages);
+ if (!$requestLocale) {
+ $sessionLocale = $session->get('lcMessages');
+ if (in_array($sessionLocale, array_keys($languageLimit))) {
+ $chosenLocale = $sessionLocale;
+ }
+ else {
+ $sessionLocale = NULL;
}
+ }
- if (!$lcMessages and $session->get('userID')) {
- $ufm = new CRM_Core_DAO_UFMatch();
- $ufm->contact_id = $session->get('userID');
- if ($ufm->find(TRUE) &&
- in_array($ufm->language, array_keys($languageLimit))
- ) {
- $lcMessages = $ufm->language;
- }
- $session->set('lcMessages', $lcMessages);
+ if ($requestLocale) {
+ $ufm = new CRM_Core_DAO_UFMatch();
+ $ufm->contact_id = $session->get('userID');
+ if ($ufm->find(TRUE)) {
+ $ufm->language = $chosenLocale;
+ $ufm->save();
}
+ $session->set('lcMessages', $chosenLocale);
}
- global $dbLocale;
-
- // try to inherit the language from the hosting CMS
- if (!empty($defaults['inheritLocale'])) {
- // FIXME: On multilanguage installs, CRM_Utils_System::getUFLocale() in many cases returns nothing if $dbLocale is not set
- $dbLocale = $multiLang ? "_{$defaults['lcMessages']}" : '';
- $lcMessages = CRM_Utils_System::getUFLocale();
- if ($domain->locales and !in_array($lcMessages, explode(CRM_Core_DAO::VALUE_SEPARATOR,
- $domain->locales
- ))
+
+ if (!$chosenLocale and $session->get('userID')) {
+ $ufm = new CRM_Core_DAO_UFMatch();
+ $ufm->contact_id = $session->get('userID');
+ if ($ufm->find(TRUE) &&
+ in_array($ufm->language, array_keys($languageLimit))
) {
- $lcMessages = NULL;
+ $chosenLocale = $ufm->language;
}
+ $session->set('lcMessages', $chosenLocale);
}
-
- if (empty($lcMessages)) {
- //CRM-11993 - if a single-lang site, use default
- $lcMessages = CRM_Utils_Array::value('lcMessages', $defaults);
+ }
+ global $dbLocale;
+
+ // try to inherit the language from the hosting CMS
+ if ($settings->get('inheritLocale')) {
+ // FIXME: On multilanguage installs, CRM_Utils_System::getUFLocale() in many cases returns nothing if $dbLocale is not set
+ $dbLocale = $multiLang ? ("_" . $settings->get('lcMessages')) : '';
+ $chosenLocale = CRM_Utils_System::getUFLocale();
+ if ($activatedLocales and !in_array($chosenLocale, explode(CRM_Core_DAO::VALUE_SEPARATOR, $activatedLocales))) {
+ $chosenLocale = NULL;
}
+ }
+
+ if (empty($chosenLocale)) {
+ //CRM-11993 - if a single-lang site, use default
+ $chosenLocale = $settings->get('lcMessages');
+ }
- // set suffix for table names - use views if more than one language
- $dbLocale = $multiLang ? "_{$lcMessages}" : '';
+ // set suffix for table names - use views if more than one language
+ $dbLocale = $multiLang ? "_{$chosenLocale}" : '';
- // FIXME: an ugly hack to fix CRM-4041
- global $tsLocale;
- $tsLocale = $lcMessages;
+ // FIXME: an ugly hack to fix CRM-4041
+ global $tsLocale;
+ $tsLocale = $chosenLocale;
- // FIXME: as bad aplace as any to fix CRM-5428
- // (to be moved to a sane location along with the above)
- if (function_exists('mb_internal_encoding')) {
- mb_internal_encoding('UTF-8');
- }
+ // FIXME: as bad aplace as any to fix CRM-5428
+ // (to be moved to a sane location along with the above)
+ if (function_exists('mb_internal_encoding')) {
+ mb_internal_encoding('UTF-8');
}
}
'multiple' => 1,
'class' => 'crm-select2',
),
- 'default' => 'null',
+ 'default' => NULL,
'add' => '4.3',
'title' => 'Available Countries',
'is_domain' => 1,
'multiple' => 1,
'class' => 'crm-select2',
),
- 'default' => 'null',
+ 'default' => NULL,
'add' => '4.3',
'title' => 'Available States and Provinces',
'is_domain' => 1,
'title' => 'Fiscal Year Start',
'description' => '',
),
+ 'languageLimit' => array(
+ 'group_name' => 'Localization Preferences',
+ 'group' => 'localization',
+ 'name' => 'languageLimit',
+ 'type' => 'Array',
+ 'quick_form_type' => 'Select',
+ 'html_type' => 'Select',
+ 'html_attributes' => array(
+ 'multiple' => 1,
+ 'class' => 'crm-select2',
+ ),
+ 'default' => NULL,
+ 'add' => '4.3',
+ 'title' => 'Available Languages (Multi-lingual)',
+ 'is_domain' => 1,
+ 'is_contact' => 0,
+ 'description' => '',
+ 'help_text' => NULL,
+ 'pseudoconstant' => array(
+ 'callback' => 'CRM_Core_I18n::languages',
+ ),
+ ),
'lcMessages' => array(
'group_name' => 'Localization Preferences',
'group' => 'localization',
'name' => 'lcMessages',
'prefetch' => 1,
// prefetch causes it to be cached in config settings. Usually this is a transitional setting. Some things like urls are permanent. Remove this comment if you have assessed & it should be permanent
- //'config_only' => 1,
- //@todo - see https://wiki.civicrm.org/confluence/display/CRMDOC/Settings+Reference#SettingsReference-Convertingaconfigobjecttoasetting on removing this deprecated value
'type' => 'String',
'quick_form_type' => 'Select',
'html_type' => 'Select',
'pseudoconstant' => array(
'callback' => 'CRM_Admin_Form_Setting_Localization::getDefaultLocaleOptions',
),
+ 'on_change' => array(
+ 'CRM_Admin_Form_Setting_Localization::onChangeLcMessages',
+ ),
),
'legacyEncoding' => array(
'add' => '4.7',