diff --git a/htdocs/accountancy/class/accountancycategory.class.php b/htdocs/accountancy/class/accountancycategory.class.php
index e2a7b14033c..b70341e21f7 100644
--- a/htdocs/accountancy/class/accountancycategory.class.php
+++ b/htdocs/accountancy/class/accountancycategory.class.php
@@ -163,16 +163,17 @@ class AccountancyCategory // extends CommonObject
// Insert request
$sql = "INSERT INTO ".MAIN_DB_PREFIX."c_accounting_category(";
- if ($this->rowid > 0) $sql.= "rowid,";
- $sql.= "code,";
- $sql.= "label,";
- $sql.= "range_account,";
- $sql.= "sens,";
- $sql.= "category_type,";
- $sql.= "formula,";
- $sql.= "position,";
- $sql.= "fk_country,";
- $sql.= "active";
+ if ($this->rowid > 0) $sql.= "rowid, ";
+ $sql.= "code, ";
+ $sql.= "label, ";
+ $sql.= "range_account, ";
+ $sql.= "sens, ";
+ $sql.= "category_type, ";
+ $sql.= "formula, ";
+ $sql.= "position, ";
+ $sql.= "fk_country, ";
+ $sql.= "active, ";
+ $sql.= "entity";
$sql.= ") VALUES (";
if ($this->rowid > 0) $sql.= " ".$this->rowid.",";
$sql.= " ".(! isset($this->code)?'NULL':"'".$this->db->escape($this->code)."'").",";
@@ -184,6 +185,7 @@ class AccountancyCategory // extends CommonObject
$sql.= " ".(! isset($this->position)?'NULL':$this->db->escape($this->position)).",";
$sql.= " ".(! isset($this->fk_country)?'NULL':$this->db->escape($this->fk_country)).",";
$sql.= " ".(! isset($this->active)?'NULL':$this->db->escape($this->active));
+ $sql.= ", ".$conf->entity;
$sql.= ")";
$this->db->begin();
@@ -237,9 +239,8 @@ class AccountancyCategory // extends CommonObject
* @param string $label Label
* @return int <0 if KO, >0 if OK
*/
- function fetch($id,$code='',$label='')
+ function fetch($id, $code='', $label='')
{
- global $langs;
$sql = "SELECT";
$sql.= " t.rowid,";
$sql.= " t.code,";
@@ -253,8 +254,12 @@ class AccountancyCategory // extends CommonObject
$sql.= " t.active";
$sql.= " FROM ".MAIN_DB_PREFIX."c_accounting_category as t";
if ($id) $sql.= " WHERE t.rowid = ".$id;
- elseif ($code) $sql.= " WHERE t.code = '".$this->db->escape($code)."'";
- elseif ($label) $sql.= " WHERE t.label = '".$this->db->escape($label)."'";
+ else
+ {
+ $sql.= " WHERE t.entity IN (".getEntity('c_accounting_category').")"; // Dont't use entity if you use rowid
+ if ($code) $sql.= " AND t.code = '".$this->db->escape($code)."'";
+ elseif ($label) $sql.= " AND t.label = '".$this->db->escape($label)."'";
+ }
dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
$resql=$this->db->query($sql);
@@ -480,7 +485,7 @@ class AccountancyCategory // extends CommonObject
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . "accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version";
$sql .= " AND asy.rowid = " . $conf->global->CHARTOFACCOUNTS;
$sql .= " AND aa.active = 1";
- $sql .= " AND aa.entity = = " . $conf->entity . ")";
+ $sql .= " AND aa.entity = " . $conf->entity . ")";
$sql .= " GROUP BY t.numero_compte, t.label_operation, t.doc_ref";
$sql .= " ORDER BY t.numero_compte";
@@ -713,27 +718,32 @@ class AccountancyCategory // extends CommonObject
* Function to show result of an accounting account from the ledger with a direction and a period
*
* @param int $cpt Id accounting account
- * @param string $month Specifig month - Can be empty
* @param string $date_start Date start
* @param string $date_end Date end
* @param int $sens Sens of the account: 0: credit - debit, 1: debit - credit
* @param string $thirdparty_code Thirdparty code
+ * @param string $month Specifig month - Can be empty
+ * @param string $year Specifig year - Can be empty
* @return integer Result in table
*/
- public function getResult($cpt, $month, $date_start, $date_end, $sens, $thirdparty_code='nofilter')
+ public function getSumDebitCredit($cpt, $date_start, $date_end, $sens, $thirdparty_code='nofilter', $month=0, $year=0)
{
+ global $conf;
+
$sql = "SELECT SUM(t.debit) as debit, SUM(t.credit) as credit";
$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping as t";
- $sql .= " WHERE t.numero_compte = '" . $cpt."'";
- if (! empty($date_start) && ! empty($date_end))
- $sql.= " AND t.doc_date >= '".$this->db->idate($date_start)."' AND t.doc_date <= '".$this->db->idate($date_end)."'";
- if (! empty($month)) {
- $sql .= " AND MONTH(t.doc_date) = " . $month;
+ $sql .= " WHERE t.numero_compte = '" . $this->db->escape($cpt) . "'";
+ if (! empty($date_start) && ! empty($date_end) && (empty($month) || empty($year))) // If month/year provided, it is stronger than filter date_start/date_end
+ $sql .= " AND t.doc_date BETWEEN '".$this->db->idate($date_start)."' AND '".$this->db->idate($date_end)."'";
+ if (! empty($month) && ! empty($year)) {
+ $sql .= " AND t.doc_date BETWEEN '".$this->db->idate(dol_get_first_day($year, $month))."' AND '".$this->db->idate(dol_get_last_day($year, $month))."'";
}
if ($thirdparty_code != 'nofilter')
{
- $sql .= " AND thirdparty_code = '".$this->db->escape($thirdparty_code)."'";
+ $sql .= " AND t.thirdparty_code = '".$this->db->escape($thirdparty_code)."'";
}
+ $sql .= " AND t.entity = ".$conf->entity;
+ //print $sql;
dol_syslog(__METHOD__ . " sql=" . $sql, LOG_DEBUG);
$resql = $this->db->query($sql);
@@ -766,7 +776,7 @@ class AccountancyCategory // extends CommonObject
*/
public function getCats($categorytype=-1)
{
- global $db, $langs, $user, $mysoc, $conf;
+ global $conf, $mysoc;
if (empty($mysoc->country_id)) {
dol_print_error('', 'Call to select_accounting_account with mysoc country not yet defined');
@@ -775,7 +785,7 @@ class AccountancyCategory // extends CommonObject
$sql = "SELECT c.rowid, c.code, c.label, c.formula, c.position, c.category_type";
$sql .= " FROM " . MAIN_DB_PREFIX . "c_accounting_category as c";
- $sql .= " WHERE c.active = 1 ";
+ $sql .= " WHERE c.active = 1";
$sql .= " AND c.entity = " . $conf->entity;
if ($categorytype >= 0) $sql.=" AND c.category_type = 1";
$sql .= " AND (c.fk_country = ".$mysoc->country_id." OR c.fk_country = 0)";
@@ -823,7 +833,7 @@ class AccountancyCategory // extends CommonObject
*/
public function getCptsCat($cat_id, $predefinedgroupwhere='')
{
- global $mysoc;
+ global $conf, $mysoc;
$sql = '';
if (empty($mysoc->country_id) && empty($mysoc->country_code)) {
@@ -836,6 +846,7 @@ class AccountancyCategory // extends CommonObject
$sql = "SELECT t.rowid, t.account_number, t.label as account_label";
$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_account as t";
$sql .= " WHERE t.fk_accounting_category = ".$cat_id;
+ $sql .= " AND t.entity = " . $conf->entity;
$sql .= " ORDER BY t.account_number";
}
else
@@ -843,6 +854,7 @@ class AccountancyCategory // extends CommonObject
$sql = "SELECT t.rowid, t.account_number, t.label as account_label";
$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_account as t";
$sql .= " WHERE ".$predefinedgroupwhere;
+ $sql .= " AND t.entity = " . $conf->entity;
$sql .= " ORDER BY t.account_number";
}
//echo $sql;
@@ -856,13 +868,12 @@ class AccountancyCategory // extends CommonObject
if ($num) {
while ($obj = $this->db->fetch_object($resql))
{
- $name_cat = $obj->name_cat;
$data[] = array (
'id' => $obj->rowid,
'account_number' => $obj->account_number,
'account_label' => $obj->account_label,
);
- $i ++;
+ $i++;
}
}
return $data;
diff --git a/htdocs/admin/geoipmaxmind.php b/htdocs/admin/geoipmaxmind.php
index 9f154591f0f..47c51069299 100644
--- a/htdocs/admin/geoipmaxmind.php
+++ b/htdocs/admin/geoipmaxmind.php
@@ -24,6 +24,7 @@
require '../main.inc.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/dolgeoip.class.php';
// Security check
@@ -150,6 +151,25 @@ if ($geoip)
if ($result) print $result;
else print $langs->trans("Error");
*/
+ //var_dump($_SERVER);
+ $ip = getUserRemoteIP();
+ //$ip='91.161.249.43';
+ $isip=is_ip($ip);
+ if ($isip == 1)
+ {
+ print '
'.$ip.' -> ';
+ $result=dol_print_ip($ip,1);
+ if ($result) print $result;
+ else print $langs->trans("Error");
+ }
+ else
+ {
+ print '
'.$ip.' -> ';
+ $result=dol_print_ip($ip,1);
+ if ($result) print $result;
+ else print $langs->trans("NotAPublicIp");
+ }
+
$geoip->close();
}
diff --git a/htdocs/compta/resultat/clientfourn.php b/htdocs/compta/resultat/clientfourn.php
index e08ebb17ed1..ee94b4ab5fc 100644
--- a/htdocs/compta/resultat/clientfourn.php
+++ b/htdocs/compta/resultat/clientfourn.php
@@ -303,7 +303,7 @@ if ($modecompta == 'BOOKKEEPING')
foreach($cpts as $i => $cpt)
{
- $return = $AccCat->getResult($cpt['account_number'], 0, $date_start, $date_end, $cpt['dc']);
+ $return = $AccCat->getSumDebitCredit($cpt['account_number'], $date_start, $date_end, $cpt['dc']);
if ($return < 0) {
setEventMessages(null, $AccCat->errors, 'errors');
$resultN=0;
diff --git a/htdocs/compta/resultat/result.php b/htdocs/compta/resultat/result.php
index c4a6e2ec755..9e3c28f529d 100644
--- a/htdocs/compta/resultat/result.php
+++ b/htdocs/compta/resultat/result.php
@@ -78,7 +78,7 @@ if (empty($date_start) || empty($date_end)) // We define date_start and date_end
{
// We define date_start and date_end
$year_end=$year_start + ($nbofyear - 1);
- $month_start=GETPOST("month")?GETPOST("month"):($conf->global->SOCIETE_FISCAL_MONTH_START?($conf->global->SOCIETE_FISCAL_MONTH_START):1);
+ $month_start=GETPOST("month",'int')?GETPOST("month",'int'):($conf->global->SOCIETE_FISCAL_MONTH_START?($conf->global->SOCIETE_FISCAL_MONTH_START):1);
$date_startmonth = $month_start;
if (! GETPOST('month'))
{
@@ -108,8 +108,10 @@ if (($date_start < dol_time_plus_duree($date_end, -1, 'y')) || ($date_start > $d
// $date_start and $date_end are defined. We force $start_year and $nbofyear
$tmps=dol_getdate($date_start);
$start_year = $tmps['year'];
+$start_month = $tmps['mon'];
$tmpe=dol_getdate($date_end);
$year_end = $tmpe['year'];
+$month_end = $tmpe['mon'];
$nbofyear = ($year_end - $start_year) + 1;
$date_start_previous = dol_time_plus_duree($date_start, -1, 'y');
@@ -231,13 +233,13 @@ print '
'.$langs->trans("SelectedPeriod").'
foreach($months as $k => $v){
if (($k+1) >= $date_startmonth)
{
- print ' | '.$langs->trans($v).' | ';
+ print ''.$langs->trans('MonthShort'.sprintf("%02s",($k+1))).' | ';
}
}
foreach($months as $k => $v){
if (($k+1) < $date_startmonth)
{
- print ''.$langs->trans($v).' | ';
+ print ''.$langs->trans('MonthShort'.sprintf("%02s",($k+1))).' | ';
}
}
print '';
@@ -374,7 +376,6 @@ elseif ($modecompta=="BOOKKEEPING")
}
}
-
print "\n";
//var_dump($sommes);
@@ -390,7 +391,7 @@ elseif ($modecompta=="BOOKKEEPING")
$totCat['M'][$k] = 0;
}
- // Set $cpts of with array of accounts in the category/group
+ // Set $cpts with array of accounts in the category/group
$cpts = $AccCat->getCptsCat($cat['rowid']);
print "";
@@ -428,13 +429,15 @@ elseif ($modecompta=="BOOKKEEPING")
$code = $cat['code'];
- // Set value into column NPrevious, N and each month M ($totCat)
- // This make 14 calls for each detail of account (NP, N and month m)
- foreach($cpts as $i => $cpt)
+ // Set value into column N-1, N and each month M ($totCat)
+ // This make 14 calls for each detail of account (N-1, N and 12 monthes m)
+ foreach($cpts as $i => $cpt) // Loop on each account.
{
- // N-1
- $return = $AccCat->getResult($cpt['account_number'], 0, $date_start_previous, $date_end_previous, $cpt['dc']);
+ // We make 1 loop for each account because we may want detail.
+ // @TODO Optimize mode when $showaccountdetail == 'no'
+ // N-1
+ $return = $AccCat->getSumDebitCredit($cpt['account_number'], $date_start_previous, $date_end_previous, $cpt['dc']);
if ($return < 0) {
setEventMessages(null, $AccCat->errors, 'errors');
$resultNP=0;
@@ -442,8 +445,8 @@ elseif ($modecompta=="BOOKKEEPING")
$resultNP=$AccCat->sdc;
}
- //N
- $return = $AccCat->getResult($cpt['account_number'], 0, $date_start, $date_end, $cpt['dc']);
+ // N
+ $return = $AccCat->getSumDebitCredit($cpt['account_number'], $date_start, $date_end, $cpt['dc']);
if ($return < 0) {
setEventMessages(null, $AccCat->errors, 'errors');
$resultN=0;
@@ -458,9 +461,15 @@ elseif ($modecompta=="BOOKKEEPING")
$totPerAccount[$cpt['account_number']]['NP'] = $resultNP;
$totPerAccount[$cpt['account_number']]['N'] = $resultN;
+ // Each month
foreach($months as $k => $v)
{
- $return = $AccCat->getResult($cpt['account_number'], $k+1, $date_start, $date_end, $cpt['dc']);
+ $monthtoprocess = $k+1; // ($k+1) is month 1, 2, ..., 12
+ $yeartoprocess = $start_year;
+ if (($k+1) < $start_month) $yeartoprocess++;
+
+ //var_dump($monthtoprocess.'_'.$yeartoprocess);
+ $return = $AccCat->getSumDebitCredit($cpt['account_number'], $date_start, $date_end, $cpt['dc'], 'nofilter', $monthtoprocess, $yeartoprocess);
if ($return < 0) {
setEventMessages(null, $AccCat->errors, 'errors');
$resultM=0;
@@ -488,7 +497,7 @@ elseif ($modecompta=="BOOKKEEPING")
print "
\n";
// Loop on detail of all accounts
- // This make 14 calls for each detail of account (NP, N and month m)
+ // This make 14 calls for each detail of account (N-1, N and 12 monthes m)
if ($showaccountdetail != 'no')
{
foreach($cpts as $i => $cpt)
diff --git a/htdocs/core/class/events.class.php b/htdocs/core/class/events.class.php
index c4b726b19d1..78439af1134 100644
--- a/htdocs/core/class/events.class.php
+++ b/htdocs/core/class/events.class.php
@@ -137,6 +137,7 @@ class Events // extends CommonObject
// Clean parameters
$this->description=trim($this->description);
+ if (empty($this->user_agent) && !empty($_SERVER['HTTP_USER_AGENT'])) $this->user_agent=$_SERVER['HTTP_USER_AGENT'];
// Check parameters
if (empty($this->description)) { $this->error='ErrorBadValueForParameterCreateEventDesc'; return -1; }
@@ -153,8 +154,8 @@ class Events // extends CommonObject
$sql.= ") VALUES (";
$sql.= " '".$this->db->escape($this->type)."',";
$sql.= " ".$conf->entity.",";
- $sql.= " '".$this->db->escape($_SERVER['REMOTE_ADDR'])."',";
- $sql.= " ".($_SERVER['HTTP_USER_AGENT']?"'".$this->db->escape(dol_trunc($_SERVER['HTTP_USER_AGENT'],250))."'":'NULL').",";
+ $sql.= " '".$this->db->escape(getUserRemoteIP())."',";
+ $sql.= " ".($this->user_agent ? "'".$this->db->escape(dol_trunc($this->user_agent,250))."'" : 'NULL').",";
$sql.= " '".$this->db->idate($this->dateevent)."',";
$sql.= " ".($user->id?"'".$this->db->escape($user->id)."'":'NULL').",";
$sql.= " '".$this->db->escape(dol_trunc($this->description,250))."'";
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index 947b3800d60..d9d79994b65 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -2665,6 +2665,20 @@ function dol_print_ip($ip,$mode=0)
return $ret;
}
+/**
+ * Return the IP of remote user.
+ * Take HTTP_X_FORWARDED_FOR (defined when using proxy)
+ * Then HTTP_CLIENT_IP if defined (rare)
+ * Then REMOTE_ADDR (not way to be modified by user but may be wrong if using proxy)
+ *
+ * @return string Ip of remote user.
+ */
+function getUserRemoteIP()
+{
+ $ip = $_SERVER['HTTP_X_FORWARDED_FOR']?$_SERVER['HTTP_X_FORWARDED_FOR']:(($_SERVER['HTTP_CLIENT_IP']?$_SERVER['HTTP_CLIENT_IP']:$_SERVER['REMOTE_ADDR']));
+ return $ip;
+}
+
/**
* Return a country code from IP. Empty string if not found.
*
@@ -2708,7 +2722,7 @@ function dol_user_country()
$ret='';
if (! empty($conf->geoipmaxmind->enabled))
{
- $ip=$_SERVER["REMOTE_ADDR"];
+ $ip=getUserRemoteIP();
$datafile=$conf->global->GEOIPMAXMIND_COUNTRY_DATAFILE;
//$ip='24.24.24.24';
//$datafile='E:\Mes Sites\Web\Admin1\awstats\maxmind\GeoIP.dat';
@@ -5783,7 +5797,7 @@ function getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $ob
'__USER_FIRSTNAME__' => (string) $user->firstname,
'__USER_FULLNAME__' => (string) $user->getFullName($outputlangs),
'__USER_SUPERVISOR_ID__' => (string) ($user->fk_user ? $user->fk_user : '0'),
- '__USER_REMOTE_IP__' => (string) $_SERVER['REMOTE_ADDR']
+ '__USER_REMOTE_IP__' => (string) getUserRemoteIP()
)
);
}
@@ -6770,6 +6784,216 @@ function picto_from_langcode($codelang, $moreatt = '')
return img_picto_common($codelang, 'flags/'.strtolower($flagImage).'.png', $moreatt);
}
+/**
+ * Return default language from country code
+ *
+ * @param string $countrycode Country code like 'US', 'FR', 'CA', ...
+ * @return string Value of locale like 'en_US', 'fr_FR', ...
+ */
+function getLanguageCodeFromCountryCode($countrycode)
+{
+ global $mysoc;
+
+ if (strtoupper($countrycode) == 'MQ') return 'fr_CA';
+ if (strtoupper($countrycode) == 'SE') return 'sv_SE'; // se_SE is Sami/Sweden, and we want in priority sv_SE for SE country
+ if (strtoupper($countrycode) == 'CH')
+ {
+ if ($mysoc->country_code == 'FR') return 'fr_CH';
+ if ($mysoc->country_code == 'DE') return 'de_CH';
+ }
+
+ // Locale list taken from:
+ // http://stackoverflow.com/questions/3191664/
+ // list-of-all-locales-and-their-short-codes
+ $locales = array(
+ 'af-ZA',
+ 'am-ET',
+ 'ar-AE',
+ 'ar-BH',
+ 'ar-DZ',
+ 'ar-EG',
+ 'ar-IQ',
+ 'ar-JO',
+ 'ar-KW',
+ 'ar-LB',
+ 'ar-LY',
+ 'ar-MA',
+ 'ar-OM',
+ 'ar-QA',
+ 'ar-SA',
+ 'ar-SY',
+ 'ar-TN',
+ 'ar-YE',
+ 'as-IN',
+ 'ba-RU',
+ 'be-BY',
+ 'bg-BG',
+ 'bn-BD',
+ 'bn-IN',
+ 'bo-CN',
+ 'br-FR',
+ 'ca-ES',
+ 'co-FR',
+ 'cs-CZ',
+ 'cy-GB',
+ 'da-DK',
+ 'de-AT',
+ 'de-CH',
+ 'de-DE',
+ 'de-LI',
+ 'de-LU',
+ 'dv-MV',
+ 'el-GR',
+ 'en-AU',
+ 'en-BZ',
+ 'en-CA',
+ 'en-GB',
+ 'en-IE',
+ 'en-IN',
+ 'en-JM',
+ 'en-MY',
+ 'en-NZ',
+ 'en-PH',
+ 'en-SG',
+ 'en-TT',
+ 'en-US',
+ 'en-ZA',
+ 'en-ZW',
+ 'es-AR',
+ 'es-BO',
+ 'es-CL',
+ 'es-CO',
+ 'es-CR',
+ 'es-DO',
+ 'es-EC',
+ 'es-ES',
+ 'es-GT',
+ 'es-HN',
+ 'es-MX',
+ 'es-NI',
+ 'es-PA',
+ 'es-PE',
+ 'es-PR',
+ 'es-PY',
+ 'es-SV',
+ 'es-US',
+ 'es-UY',
+ 'es-VE',
+ 'et-EE',
+ 'eu-ES',
+ 'fa-IR',
+ 'fi-FI',
+ 'fo-FO',
+ 'fr-BE',
+ 'fr-CA',
+ 'fr-CH',
+ 'fr-FR',
+ 'fr-LU',
+ 'fr-MC',
+ 'fy-NL',
+ 'ga-IE',
+ 'gd-GB',
+ 'gl-ES',
+ 'gu-IN',
+ 'he-IL',
+ 'hi-IN',
+ 'hr-BA',
+ 'hr-HR',
+ 'hu-HU',
+ 'hy-AM',
+ 'id-ID',
+ 'ig-NG',
+ 'ii-CN',
+ 'is-IS',
+ 'it-CH',
+ 'it-IT',
+ 'ja-JP',
+ 'ka-GE',
+ 'kk-KZ',
+ 'kl-GL',
+ 'km-KH',
+ 'kn-IN',
+ 'ko-KR',
+ 'ky-KG',
+ 'lb-LU',
+ 'lo-LA',
+ 'lt-LT',
+ 'lv-LV',
+ 'mi-NZ',
+ 'mk-MK',
+ 'ml-IN',
+ 'mn-MN',
+ 'mr-IN',
+ 'ms-BN',
+ 'ms-MY',
+ 'mt-MT',
+ 'nb-NO',
+ 'ne-NP',
+ 'nl-BE',
+ 'nl-NL',
+ 'nn-NO',
+ 'oc-FR',
+ 'or-IN',
+ 'pa-IN',
+ 'pl-PL',
+ 'ps-AF',
+ 'pt-BR',
+ 'pt-PT',
+ 'rm-CH',
+ 'ro-RO',
+ 'ru-RU',
+ 'rw-RW',
+ 'sa-IN',
+ 'se-FI',
+ 'se-NO',
+ 'se-SE',
+ 'si-LK',
+ 'sk-SK',
+ 'sl-SI',
+ 'sq-AL',
+ 'sv-FI',
+ 'sv-SE',
+ 'sw-KE',
+ 'syr-SY',
+ 'ta-IN',
+ 'te-IN',
+ 'th-TH',
+ 'tk-TM',
+ 'tn-ZA',
+ 'tr-TR',
+ 'tt-RU',
+ 'ug-CN',
+ 'uk-UA',
+ 'ur-PK',
+ 'vi-VN',
+ 'wo-SN',
+ 'xh-ZA',
+ 'yo-NG',
+ 'zh-CN',
+ 'zh-HK',
+ 'zh-MO',
+ 'zh-SG',
+ 'zh-TW',
+ 'zu-ZA',
+ );
+
+ $buildprimarykeytotest = strtolower($countrycode).'-'.strtoupper($countrycode);
+ if (in_array($buildprimarykeytotest, $locales)) return strtolower($countrycode).'_'.strtoupper($countrycode);
+
+ foreach ($locales as $locale)
+ {
+ $locale_language = locale_get_primary_language($locale);
+ $locale_region = locale_get_region($locale);
+ if (strtoupper($countrycode) == $locale_region)
+ {
+ //var_dump($locale.'-'.$locale_language.'-'.$locale_region);
+ return strtolower($locale_language).'_'.strtoupper($locale_region);
+ }
+ }
+
+ return null;
+}
+
/**
* Complete or removed entries into a head array (used to build tabs).
* For example, with value added by external modules. Such values are declared into $conf->modules_parts['tab'].
diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php
index daaa0dda2f5..b693290b9c4 100644
--- a/test/phpunit/FunctionsLibTest.php
+++ b/test/phpunit/FunctionsLibTest.php
@@ -48,7 +48,7 @@ if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is
* @backupStaticAttributes enabled
* @remarks backupGlobals must be disabled to have db,conf,user and lang not erased.
*/
-class FunctionsLibTest extends PHPUnit_Framework_TestCase
+class FunctionsLibTest extends PHPUnit\Framework\TestCase
{
protected $savconf;
protected $savuser;
@@ -325,6 +325,57 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase
}
+ /**
+ * testGetLanguageCodeFromCountryCode
+ *
+ * @return void
+ */
+ public function testGetLanguageCodeFromCountryCode()
+ {
+ global $mysoc;
+
+ $language = getLanguageCodeFromCountryCode('US');
+ $this->assertEquals('en_US', $language, 'US');
+
+ $language = getLanguageCodeFromCountryCode('ES');
+ $this->assertEquals('es_ES', $language, 'ES');
+
+ $language = getLanguageCodeFromCountryCode('CL');
+ $this->assertEquals('es_CL', $language, 'CL');
+
+ $language = getLanguageCodeFromCountryCode('CA');
+ $this->assertEquals('en_CA', $language, 'CA');
+
+ $language = getLanguageCodeFromCountryCode('MQ');
+ $this->assertEquals('fr_CA', $language);
+
+ $language = getLanguageCodeFromCountryCode('FR');
+ $this->assertEquals('fr_FR', $language);
+
+ $language = getLanguageCodeFromCountryCode('BE');
+ $this->assertEquals('fr_BE', $language);
+
+ $mysoc->country_code = 'FR';
+ $language = getLanguageCodeFromCountryCode('CH');
+ $this->assertEquals('fr_CH', $language);
+
+ $mysoc->country_code = 'DE';
+ $language = getLanguageCodeFromCountryCode('CH');
+ $this->assertEquals('de_CH', $language);
+
+ $language = getLanguageCodeFromCountryCode('DE');
+ $this->assertEquals('de_DE', $language);
+
+ $language = getLanguageCodeFromCountryCode('SA');
+ $this->assertEquals('ar_SA', $language);
+
+ $language = getLanguageCodeFromCountryCode('SE');
+ $this->assertEquals('sv_SE', $language);
+
+ $language = getLanguageCodeFromCountryCode('DK');
+ $this->assertEquals('da_DK', $language);
+ }
+
/**
* testDolTextIsHtml
*