CRM-14232 add setting for default contact language.
authoreileenmcnaugton <eileen@fuzion.co.nz>
Fri, 11 Sep 2015 07:21:23 +0000 (19:21 +1200)
committereileenmcnaugton <eileen@fuzion.co.nz>
Wed, 16 Sep 2015 04:05:50 +0000 (16:05 +1200)
If a contact is created & the preferred_language is not set this
setting can be used to manipulate the default.

Tests!

Conflicts:
settings/Localization.setting.php

CRM-14232 adjust options for default contact language

To reflect bgm suggestions  - add current language & remove long-list of countries

CRM-14232 contact default language setting: don't use null as it has special handling

CRM/Admin/Form/Setting/Localization.php
CRM/Contact/BAO/Contact.php
CRM/Core/I18n.php
settings/Localization.setting.php
templates/CRM/Admin/Form/Setting/Localization.tpl
tests/phpunit/api/v3/ContactTest.php

index 5921e98275376c7f7dfde9918382825a9080c8fa..0d4f06e9e0f232335a483bf459c9d5c387b02820 100644 (file)
@@ -91,7 +91,11 @@ class CRM_Admin_Form_Setting_Localization extends CRM_Admin_Form_Setting {
         );
       }
     }
-
+    $this->addElement('select', 'contact_default_language', ts('Default Language for users'), array(
+      '*default*' => ts('Use default site language'),
+      'undefined' => ts('Leave undefined'),
+      'current_site_language' => ts('Use language in use at the time'),
+    ));
     $this->addElement('checkbox', 'inheritLocale', ts('Inherit CMS Language'));
     $this->addElement('text', 'monetaryThousandSeparator', ts('Thousands Separator'), array('size' => 2));
     $this->addElement('text', 'monetaryDecimalPoint', ts('Decimal Delimiter'), array('size' => 2));
index 40f59239c5970a4dab20330cc549b1f06a60f28c..d0c3863c1bb7b2ea5451e0d4a6b87517001c3702 100644 (file)
@@ -305,12 +305,13 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
     $config = CRM_Core_Config::singleton();
 
     // CRM-6942: set preferred language to the current language if it’s unset (and we’re creating a contact).
-    if (empty($params['contact_id']) && empty($params['preferred_language'])) {
-      $params['preferred_language'] = $config->lcMessages;
-    }
-
-    // CRM-9739: set greeting & addressee if unset and we’re creating a contact.
     if (empty($params['contact_id'])) {
+      // A case could be made for checking isset rather than empty but this is more consistent with previous behaviour.
+      if (empty($params['preferred_language']) && ($language = CRM_Core_I18n::getContactDefaultLanguage()) != FALSE) {
+        $params['preferred_language'] = $language;
+      }
+
+      // CRM-9739: set greeting & addressee if unset and we’re creating a contact.
       foreach (self::$_greetingTypes as $greeting) {
         if (empty($params[$greeting . '_id'])) {
           if ($defaultGreetingTypeId
index 75ef9b1c454e587acf0063dff3567c7625d8fa1b..9ef3892de452f8a5babd7b5500dcf7e78200cda5 100644 (file)
@@ -548,6 +548,34 @@ class CRM_Core_I18n {
     return $locales[$tsLocale];
   }
 
+  /**
+   * Get the default language for contacts where no language is provided.
+   *
+   * Note that NULL is a valid option so be careful with checking for empty etc.
+   *
+   * NULL would mean 'we don't know & we don't want to hazard a guess'.
+   *
+   * @return string
+   */
+  public static  function getContactDefaultLanguage() {
+    $language = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::LOCALIZATION_PREFERENCES_NAME, 'contact_default_language');
+    if ($language == 'undefined') {
+      return NULL;
+    }
+    if (empty($language) || $language === '*default*') {
+      $language = civicrm_api3('setting', 'getvalue', array(
+        'name' => 'lcMessages',
+        'group' => CRM_Core_BAO_Setting::LOCALIZATION_PREFERENCES_NAME,
+      ));
+    }
+    elseif ($language == 'current_site_language') {
+      global $tsLocale;
+      return $tsLocale;
+    }
+
+    return $language;
+  }
+
 }
 
 /**
index d7775c5602f222ebf6e78d5ad3a7a81eba165852..bd8f4322fd73c364c9292c747a800c363aef347c 100644 (file)
@@ -179,7 +179,6 @@ return array(
     'pseudoconstant' => array(
       'callback' => 'CRM_Core_PseudoConstant::stateProvince',
     ),
-    'html_attributes',
     'default' => '',
     'title' => 'Default State/Province',
     'description' => 'This value is selected by default when adding a new contact address.',
@@ -477,4 +476,18 @@ return array(
     'description' => "",
     'help_text' => NULL,
   ),
+  'contact_default_language' => array(
+    'group_name' => 'Localization Preferences',
+    'group' => 'localization',
+    'name' => 'contact_default_language',
+    'type' => 'String',
+    'default' => '*default*',
+    'add' => '4.7',
+    'title' => 'Default Language for contacts',
+    'is_domain' => 1,
+    'is_contact' => 0,
+    'description' => 'Default language (if any) for contact records',
+    'help_text' => 'If a contact is created with no language this setting will determine the language data (if any) to save.'
+    . 'You may or may not wish to make an assumption here about whether it matches the site language',
+  ),
 );
index a4f63cf947d066706d8316058adb2b1e3bf2ccde..b715a3a0322cd98562e02093ccc6b08604f307fd 100644 (file)
                 <td class="label">{$form.inheritLocale.label} {help id='inheritLocale' title=$form.inheritLocale.label}</td>
                 <td>{$form.inheritLocale.html}</td>
             </tr>
+          <tr class="crm-localization-form-contact_default_language">
+            <td class="label">{$form.contact_default_language.label}</td>
+            <td>{$form.contact_default_language.html}<br />
+              <span class="description">{ts}Default language (if any) for contact records.{/ts}</span></td>
+          </tr>
             <tr class="crm-localization-form-block-defaultCurrency">
                 <td class="label">{$form.defaultCurrency.label} {help id='defaultCurrency' title=$form.defaultCurrency.label}</td>
                 <td>{$form.defaultCurrency.html}</td>
index 3759909cf880a17f701c70fb0a2f99fa30ea5d8d..a8f632f9e50fbb774f61231e3a5b1ef201d0131e 100644 (file)
@@ -373,6 +373,63 @@ class api_v3_ContactTest extends CiviUnitTestCase {
     $this->customGroupDelete($ids['custom_group_id']);
   }
 
+  /**
+   * CRM-14232 test preferred language set to site default if not passed.
+   */
+  public function testCreatePreferredLanguageUnset() {
+    $this->callAPISuccess('Contact', 'create', array(
+      'first_name' => 'Snoop',
+      'last_name' => 'Dog',
+      'contact_type' => 'Individual')
+    );
+    $result = $this->callAPISuccessGetSingle('Contact', array('last_name' => 'Dog'));
+    $this->assertEquals('en_US', $result['preferred_language']);
+  }
+
+  /**
+   * CRM-14232 test preferred language returns setting if not passed.
+   */
+  public function testCreatePreferredLanguageSet() {
+    $this->callAPISuccess('Setting', 'create', array('contact_default_language' => 'fr_FR'));
+    $this->callAPISuccess('Contact', 'create', array(
+      'first_name' => 'Snoop',
+      'last_name' => 'Dog',
+      'contact_type' => 'Individual',
+    ));
+    $result = $this->callAPISuccessGetSingle('Contact', array('last_name' => 'Dog'));
+    $this->assertEquals('fr_FR', $result['preferred_language']);
+  }
+
+  /**
+   * CRM-14232 test preferred language returns setting if not passed where setting is NULL.
+   */
+  public function testCreatePreferredLanguageNull() {
+    $this->callAPISuccess('Setting', 'create', array('contact_default_language' => 'null'));
+    $this->callAPISuccess('Contact', 'create', array(
+        'first_name' => 'Snoop',
+        'last_name' => 'Dog',
+        'contact_type' => 'Individual',
+        )
+    );
+    $result = $this->callAPISuccessGetSingle('Contact', array('last_name' => 'Dog'));
+    $this->assertEquals(NULL, $result['preferred_language']);
+  }
+
+  /**
+   * CRM-14232 test preferred language returns setting if not passed where setting is NULL.
+   */
+  public function testCreatePreferredLanguagePassed() {
+    $this->callAPISuccess('Setting', 'create', array('contact_default_language' => 'null'));
+    $this->callAPISuccess('Contact', 'create', array(
+      'first_name' => 'Snoop',
+      'last_name' => 'Dog',
+      'contact_type' => 'Individual',
+      'preferred_language' => 'en_AU',
+    ));
+    $result = $this->callAPISuccessGetSingle('Contact', array('last_name' => 'Dog'));
+    $this->assertEquals('en_AU', $result['preferred_language']);
+  }
+
   /**
    * CRM-15792 - create/update datetime field for contact.
    */