Bug #3646 and Issue #306 - Internationalization library: Adding posibility to set sorting persons' full names independently for the name order convention, people's preferencies might differ. So, a new function api_sort_by_first_name() has been added. The table in the file name_order_conventions.php has been reworked to maintain the new name-sorting option for every language.

skala
Ivan Tcholakov 16 years ago
parent 07973b277f
commit 7a02b21ed9
  1. 95
      main/inc/lib/internationalization.lib.php
  2. 122
      main/inc/lib/internationalization_database/name_order_conventions.php
  3. 32
      main/inc/lib/internationalization_internal.lib.php

@ -310,32 +310,6 @@ function api_get_months_long($language = null) {
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------
*/ */
/**
* Checks whether a given format represents prson name in Western order (for which first name is first).
* @param int/string $format (optional) The person name format. It may be a pattern-string (for example '%t. %l, %f') or some of the constants PERSON_NAME_COMMON_CONVENTION (default), PERSON_NAME_WESTERN_ORDER, PERSON_NAME_EASTERN_ORDER, PERSON_NAME_LIBRARY_ORDER.
* @param string $language (optional) The language indentificator. If it is omited, the current interface language is assumed. This parameter has meaning with the format PERSON_NAME_COMMON_CONVENTION only.
* @return bool The result TRUE means that the order is first_name last_name, FALSE means last_name first_name.
* Note: You may use this function:
* 1. for determing the order of the fields or columns "First name" and "Last name" in forms and tables;
* 2. for constructing the ORDER clause of SQL queries, related to first name and last name;
* 3. for adjusting php-implemented sorting by names in tables and reports.
* @author Ivan Tcholakov
*/
function api_is_western_name_order($format = null, $language = null) {
static $order = array();
if (empty($format)) {
$format = PERSON_NAME_COMMON_CONVENTION;
}
if (empty($language)) {
$language = api_get_interface_language();
}
if (!isset($order[$format][$language])) {
$test_name = api_get_person_name('%f', '%l', '%t', $format, $language);
$order[$format][$language] = strpos($test_name, '%f') <= strpos($test_name, '%l');
}
return $order[$format][$language];
}
/** /**
* Builds a person (full) name depending on the convention for a given language. * Builds a person (full) name depending on the convention for a given language.
* @param string $first_name The first name of the preson. * @param string $first_name The first name of the preson.
@ -353,7 +327,6 @@ function api_is_western_name_order($format = null, $language = null) {
* @author Ivan Tcholakov * @author Ivan Tcholakov
*/ */
function api_get_person_name($first_name, $last_name, $title = null, $format = null, $language = null) { function api_get_person_name($first_name, $last_name, $title = null, $format = null, $language = null) {
static $conventions;
static $valid = array(); static $valid = array();
if (empty($format)) { if (empty($format)) {
$format = PERSON_NAME_COMMON_CONVENTION; $format = PERSON_NAME_COMMON_CONVENTION;
@ -365,30 +338,7 @@ function api_get_person_name($first_name, $last_name, $title = null, $format = n
if (is_int($format)) { if (is_int($format)) {
switch ($format) { switch ($format) {
case PERSON_NAME_COMMON_CONVENTION: case PERSON_NAME_COMMON_CONVENTION:
if (!isset($conventions)) { $valid[$format][$language] = _api_get_person_name_convention($language, 'format');
$file = dirname(__FILE__) . '/internationalization_database/name_order_conventions.php';
if (file_exists($file)) {
$conventions = include ($file);
} else {
$conventions = array('english' => 'title first_name last_name');
}
$search = array('first_name', 'last_name', 'title');
$replacement = array('%f', '%l', '%t');
foreach ($conventions as $key => &$pattern) {
// Creation of patterns using the configuration options in the internationalization "database".
$pattern = str_ireplace($search, $replacement, $pattern);
// Ensuring separation between the parts of every pattern.
$pattern = str_replace('%', ' %', $pattern);
// Cleaning the patterns.
$pattern = _api_clean_person_name($pattern);
// Validating the patterns.
$pattern = _api_validate_person_name_format($pattern);
}
if (empty($conventions[api_refine_language_id($language)])) {
$conventions[api_refine_language_id($language)] = '%t %f %l';
}
}
$valid[$format][$language] = $conventions[api_refine_language_id($language)];
break; break;
case PERSON_NAME_WESTERN_ORDER: case PERSON_NAME_WESTERN_ORDER:
$valid[$format][$language] = '%t %f %l'; $valid[$format][$language] = '%t %f %l';
@ -409,6 +359,49 @@ function api_get_person_name($first_name, $last_name, $title = null, $format = n
return _api_clean_person_name(str_replace(array('%f', '%l', '%t'), array($first_name, $last_name, $title), $valid[$format][$language])); return _api_clean_person_name(str_replace(array('%f', '%l', '%t'), array($first_name, $last_name, $title), $valid[$format][$language]));
} }
/**
* Checks whether a given format represents person name in Western order (for which first name is first).
* @param int/string $format (optional) The person name format. It may be a pattern-string (for example '%t. %l, %f') or some of the constants PERSON_NAME_COMMON_CONVENTION (default), PERSON_NAME_WESTERN_ORDER, PERSON_NAME_EASTERN_ORDER, PERSON_NAME_LIBRARY_ORDER.
* @param string $language (optional) The language indentificator. If it is omited, the current interface language is assumed. This parameter has meaning with the format PERSON_NAME_COMMON_CONVENTION only.
* @return bool The result TRUE means that the order is first_name last_name, FALSE means last_name first_name.
* Note: You may use this function for determing the order of the fields or columns "First name" and "Last name" in forms, tables and reports.
* @author Ivan Tcholakov
*/
function api_is_western_name_order($format = null, $language = null) {
static $order = array();
if (empty($format)) {
$format = PERSON_NAME_COMMON_CONVENTION;
}
if (empty($language)) {
$language = api_get_interface_language();
}
if (!isset($order[$format][$language])) {
$test_name = api_get_person_name('%f', '%l', '%t', $format, $language);
$order[$format][$language] = strpos($test_name, '%f') <= strpos($test_name, '%l');
}
return $order[$format][$language];
}
/**
* Returns a directive for sorting person names depending on a given language and based on the options in the internationalization "database".
* @param string $language (optional) The input language. If it is omited, the current interface language is assumed.
* @return bool Returns boolean value. TRUE means ORDER BY first_name, last_name; FALSE means ORDER BY last_name, first_name.
* Note: You may use this function:
* 2. for constructing the ORDER clause of SQL queries, related to first_name and last_name;
* 3. for adjusting php-implemented sorting in tables and reports.
* @author Ivan Tcholakov
*/
function api_sort_by_first_name($language = null) {
static $sort_by_first_name = array();
if (empty($language)) {
$language = api_get_interface_language();
}
if (!isset($sort_by_first_name[$language])) {
$sort_by_first_name[$language] = _api_get_person_name_convention($language, 'sort_by');
}
return $sort_by_first_name[$language];
}
/** /**
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------

@ -1,66 +1,74 @@
<?php <?php
/** /**
* @link http://en.wikipedia.org/wiki/Personal_name#Naming_convention * The following table contains two types of conventions concerning person names:
*
* "format" - determines how a full person name to be formatted, i.e. in what order the title, the first_name and the last_name to be placed.
* You maight need to correct the value for your language. The possible values are: * You maight need to correct the value for your language. The possible values are:
* title first_name last_name - Western order * title first_name last_name - Western order;
* title last_name first_name - Eastern order * title last_name first_name - Eastern order;
* title last_name, first_name - Western libraries order * title last_name, first_name - Western libraries order.
* Placing the title (Dr, Mr, Miss, etc) depends on the tradition in you country. * Placing the title (Dr, Mr, Miss, etc) depends on the tradition in you country.
* @link http://en.wikipedia.org/wiki/Personal_name#Naming_convention
*
* "sort_by" - determines you preferable way of sorting person names. The possible values are:
* first_name - sorting names with priority for the first name;
* last_name - sorting names with priority for the last name.
*
* For licensing terms, see dokeos_license.txt. * For licensing terms, see dokeos_license.txt.
*/ */
return array( return array(
'arabic' => 'title first_name last_name', 'arabic' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'asturian' => 'title first_name last_name', 'asturian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'bosnian' => 'title first_name last_name', 'bosnian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'brazilian' => 'title first_name last_name', 'brazilian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'bulgarian' => 'title first_name last_name', 'bulgarian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'catalan' => 'title first_name last_name', 'catalan' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'croatian' => 'title first_name last_name', 'croatian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'czech' => 'title first_name last_name', 'czech' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'danish' => 'title first_name last_name', 'danish' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'dari' => 'title first_name last_name', 'dari' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'dutch' => 'title first_name last_name', 'dutch' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'english' => 'title first_name last_name', 'english' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'euskera' => 'title first_name last_name', 'euskera' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'esperanto' => 'title first_name last_name', 'esperanto' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'finnish' => 'title first_name last_name', 'finnish' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'french' => 'title first_name last_name', 'french' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'friulian' => 'title first_name last_name', 'friulian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'galician' => 'title first_name last_name', 'galician' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'georgian' => 'title first_name last_name', 'georgian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'german' => 'title first_name last_name', 'german' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'greek' => 'title first_name last_name', 'greek' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'hebrew' => 'title first_name last_name', 'hebrew' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'hungarian' => 'title last_name first_name', // Eastern order 'hungarian' => array( 'format' => 'title last_name first_name', 'sort_by' => 'last_name' ), // Eastern order
'indonesian' => 'title first_name last_name', 'indonesian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'italian' => 'title first_name last_name', 'italian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'japanese' => 'title last_name first_name', // Eastern order 'japanese' => array( 'format' => 'title last_name first_name', 'sort_by' => 'last_name' ), // Eastern order
'korean' => 'title last_name first_name', // Eastern order 'korean' => array( 'format' => 'title last_name first_name', 'sort_by' => 'last_name' ), // Eastern order
'latvian' => 'title first_name last_name', 'latvian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'lithuanian' => 'title first_name last_name', 'lithuanian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'macedonian' => 'title first_name last_name', 'macedonian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'malay' => 'title last_name first_name', // Eastern order 'malay' => array( 'format' => 'title last_name first_name', 'sort_by' => 'last_name' ), // Eastern order
'norwegian' => 'title first_name last_name', 'norwegian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'occitan' => 'title first_name last_name', 'occitan' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'pashto' => 'title first_name last_name', 'pashto' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'persian' => 'title first_name last_name', 'persian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'polish' => 'title first_name last_name', 'polish' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'portuguese' => 'title first_name last_name', 'portuguese' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'quechua_cusco' => 'title first_name last_name', 'quechua_cusco' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'romanian' => 'title first_name last_name', 'romanian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'russian' => 'title first_name last_name', 'russian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'serbian' => 'title first_name last_name', 'serbian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'simpl_chinese' => 'title last_name first_name', // Eastern order 'simpl_chinese' => array( 'format' => 'title last_name first_name', 'sort_by' => 'last_name' ), // Eastern order
'slovak' => 'title first_name last_name', 'slovak' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'slovenian' => 'title first_name last_name', 'slovenian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'spanish' => 'title first_name last_name', 'spanish' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'swahili' => 'title first_name last_name', 'swahili' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'swedish' => 'title first_name last_name', 'swedish' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'thai' => 'title first_name last_name', 'thai' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'trad_chinese' => 'title last_name first_name', // Eastern order 'trad_chinese' => array( 'format' => 'title last_name first_name', 'sort_by' => 'last_name' ), // Eastern order
'turkce' => 'title first_name last_name', 'turkce' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'ukrainian' => 'title first_name last_name', 'ukrainian' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' ),
'vietnamese' => 'title last_name first_name', // Eastern order 'vietnamese' => array( 'format' => 'title last_name first_name', 'sort_by' => 'last_name' ), // Eastern order
'yoruba' => 'title first_name last_name' 'yoruba' => array( 'format' => 'title first_name last_name', 'sort_by' => 'first_name' )
); );

@ -85,6 +85,38 @@ function &_api_get_day_month_names($language = null) {
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------
*/ */
/**
* Returns returns person name convention for a given language.
* @param string $language The input language.
* @param string $type The type of the requested convention. It may be 'format' for name order convention or 'sort_by' for name sorting convention.
* @return mixed Depending of the requested type, the returned result may be string or boolean; null is returned on error;
*/
function _api_get_person_name_convention($language, $type) {
static $conventions;
$language = api_refine_language_id($language);
if (!isset($conventions)) {
$file = dirname(__FILE__) . '/internationalization_database/name_order_conventions.php';
if (file_exists($file)) {
$conventions = include ($file);
} else {
$conventions = array('english' => array('format' => 'title first_name last_name', 'sort_by' => 'first_name'));
}
$search = array('first_name', 'last_name', 'title');
$replacement = array('%f', '%l', '%t');
foreach (array_keys($conventions) as $key) {
$conventions[$key]['format'] = _api_validate_person_name_format(_api_clean_person_name(str_replace('%', ' %', str_ireplace($search, $replacement, $conventions[$key]['format']))));
$conventions[$key]['sort_by'] = strtolower($conventions[$key]['sort_by']) != 'last_name' ? true : false;
}
}
switch ($type) {
case 'format':
return is_string($conventions[$language]['format']) ? $conventions[$language]['format'] : '%t %f %l';
case 'sort_by':
return is_bool($conventions[$language]['sort_by']) ? $conventions[$language]['sort_by'] : true;
}
return null;
}
/** /**
* Replaces non-valid formats for person names with the default (English) format. * Replaces non-valid formats for person names with the default (English) format.
* @param string $format The input format to be verified. * @param string $format The input format to be verified.

Loading…
Cancel
Save