Files
selima-perl/lib/php/monica/lninfo.inc.php
2026-03-10 21:31:43 +08:00

382 lines
11 KiB
PHP

<?php
// File name: lninfo.inc.php
// Description: PHP subroutines to return specific language information
// Date: 2002-07-29
// Author: imacat <imacat@pristine.com.tw>
// Copyright: Copyright (C) 2002-2018 Pristine Communications
// Set the include path
if (!defined("INCPATH_SET")) {
require_once dirname(__FILE__) . "/incpath.inc.php";
}
// Related subroutines
require_once "monica/getlang.inc.php";
require_once "monica/gettext.inc.php";
// Settings
$LNINFO = array(
"en" => array(
"name" => "en-us",
"filename" => "en",
"charset" => "UTF-8",
"db" => "en",
"htmlid" => "en",
"locale" => "en_US",
"sp_break" => true,
"icase" => true,
"ctfirst" => false,
"longdesc" => N_("English")),
"zh-tw" => array(
"name" => "zh-tw",
"filename" => "zh-tw",
"charset" => "UTF-8",
"db" => "zhtw",
"htmlid" => "zhtw",
"locale" => "zh_TW",
"sp_break" => false,
"icase" => false,
"ctfirst" => true,
"longdesc" => N_("Traditional Chinese")),
"zh-cn" => array(
"name" => "zh-cn",
"filename" => "zh-cn",
"charset" => "UTF-8",
"db" => "zhcn",
"htmlid" => "zhcn",
"locale" => "zh_CN",
"sp_break" => false,
"icase" => false,
"ctfirst" => true,
"longdesc" => N_("Simplified Chinese")),
"zh" => array(
"name" => "zh-tw",
"filename" => "zh",
"charset" => "UTF-8",
"db" => "zh",
"htmlid" => "zh",
"locale" => "zh_TW",
"sp_break" => false,
"icase" => false,
"ctfirst" => true,
"longdesc" => N_("Chinese")),
"ja" => array(
"name" => "ja",
"filename" => "ja",
"charset" => "UTF-8",
"db" => "ja",
"htmlid" => "ja",
"locale" => "ja_JP",
"sp_break" => false,
"icase" => false,
"ctfirst" => true,
"longdesc" => N_("Japanese")),
"ko" => array(
"name" => "ko",
"filename" => "ko",
"charset" => "UTF-8",
"db" => "ko",
"htmlid" => "ko",
"locale" => "ko_KR",
"sp_break" => false,
"icase" => false,
"ctfirst" => true,
"longdesc" => N_("Korean")),
"de" => array(
"name" => "de",
"filename" => "de",
"charset" => "UTF-8",
"db" => "de",
"htmlid" => "de",
"locale" => "de_DE",
"sp_break" => true,
"icase" => true,
"ctfirst" => false,
"longdesc" => N_("German")),
"es" => array(
"name" => "es",
"filename" => "es",
"charset" => "UTF-8",
"db" => "es",
"htmlid" => "es",
"locale" => "es_ES",
"sp_break" => true,
"icase" => true,
"ctfirst" => false,
"longdesc" => N_("Spanish"))
);
// Constant symbols
define("LN_NAME", 0);
define("LN_CHARSET", 1);
define("LN_FILENAME", 2);
define("LN_LOCALE", 3);
define("LN_DATABASE", 4);
define("LN_HTMLID", 5);
define("LN_SPACE_BREAK", 6);
define("LN_IGNORE_CASE", 7);
define("LN_COUNTRY_FIRST", 8);
define("LN_DESC", 9);
define("LN_DESC_CURLC", 10);
define("LN_DESC_SELFLC", 11);
define("LN_SWITCH_TITLE", 12);
// Subroutines
// ln: Uniformed wrapper for everything
function ln($lang, $type)
{
switch ($type) {
case LN_NAME:
return _lninfo_name($lang);
case LN_CHARSET:
return _lninfo_charset($lang);
case LN_FILENAME:
return _lninfo_filename($lang);
case LN_LOCALE:
return _lninfo_lc($lang);
case LN_DATABASE:
return _lninfo_db($lang);
case LN_HTMLID:
return _lninfo_htmlid($lang);
case LN_SPACE_BREAK:
return _lninfo_space_break($lang);
case LN_IGNORE_CASE:
return _lninfo_ignore_case($lang);
case LN_COUNTRY_FIRST:
return _lninfo_country_first($lang);
case LN_DESC:
return _lninfo_desc($lang);
case LN_DESC_CURLC:
return _lninfo_desc_curlc($lang);
case LN_DESC_SELFLC:
return _lninfo_desc_selflc($lang);
case LN_SWITCH_TITLE:
return _lninfo_switch_title($lang);
default:
return $lang;
}
}
// selflc: Return the text in its own locale
function selflc($text, $lang)
{
// Cache the result
static $cache = array();
// Obtain the language variants of that text
if (!array_key_exists($text, $cache)) {
global $LNINFO;
$curlc = getenv("LANG");
if ($curlc === false || $curlc == "") {
$curlc = getlang(LN_LOCALE);
}
$cache[$text] = array();
foreach (array_keys($LNINFO) as $l) {
// Switch the locale
$locale = _lninfo_lc($l);
$charset = _lninfo_charset($l);
putenv("LANG=$locale");
putenv("LANGUAGE=$locale");
setlocale(LC_ALL, "");
// Obtain the localed text
$cache[$text][$l] = _($text);
}
// Return the current locale
putenv("LANG=$curlc");
putenv("LANGUAGE=$curlc");
setlocale(LC_ALL, "");
}
// Not found -- return itself instead
if (!array_key_exists($lang, $cache[$text])) {
return $text;
}
// Return the localed text
return $cache[$text][$lang];
}
// _lninfo_name: Language complete name
function _lninfo_name($lang)
{
global $LNINFO;
return array_key_exists($lang, $LNINFO)
&& array_key_exists("name", $LNINFO[$lang])?
$LNINFO[$lang]["name"]: $lang;
}
// _lninfo_charset: Long description
// Most common charset that is used with the specified language
function _lninfo_charset($lang)
{
global $LNINFO;
return array_key_exists($lang, $LNINFO)
&& array_key_exists("charset", $LNINFO[$lang])?
$LNINFO[$lang]["charset"]: $lang;
}
// _lninfo_filename: File system name
function _lninfo_filename($lang)
{
global $LNINFO;
return array_key_exists($lang, $LNINFO)
&& array_key_exists("filename", $LNINFO[$lang])?
$LNINFO[$lang]["filename"]: $lang;
}
// _lninfo_lc: Locale used by GNU glibc and gettext
// Replace hyphens with underscores, and upper-case the district divisions,
// as used in GNU glibc
function _lninfo_lc($lang)
{
global $LNINFO;
if ( array_key_exists($lang, $LNINFO)
&& array_key_exists("locale", $LNINFO[$lang])) {
return $LNINFO[$lang]["locale"];
}
$pos = strpos($lang, "-");
if ($pos !== false) {
return substr($lang, 0, $pos) . "_"
. strtoupper(substr($lang, $pos + 1));
}
return $lang;
}
// _lninfo_db: Database column name
// Hyphens are not allowed, to avoid confusion
// with the substraction operator "-"
function _lninfo_db($lang)
{
global $LNINFO;
if ( array_key_exists($lang, $LNINFO)
&& array_key_exists("db", $LNINFO[$lang])) {
return $LNINFO[$lang]["db"];
}
return str_replace("-", "", $lang);
}
// _lninfo_htmlid: HTML id value
// Hyphens are not allowed, as specified in HTML 4.01 specification
function _lninfo_htmlid($lang)
{
global $LNINFO;
if ( array_key_exists($lang, $LNINFO)
&& array_key_exists("htmlid", $LNINFO[$lang])) {
return $LNINFO[$lang]["htmlid"];
}
return str_replace("-", "", $lang);
}
// _lninfo_space_break: Whether words are seperated at spaces
function _lninfo_space_break($lang)
{
global $LNINFO;
// Default to true, for alphabetic languages
return array_key_exists($lang, $LNINFO)
&& array_key_exists("sp_break", $LNINFO[$lang])?
$LNINFO[$lang]["sp_break"]: true;
}
// _lninfo_ignore_case: Whether case can be ignored
function _lninfo_ignore_case($lang)
{
global $LNINFO;
// Default to true, for European languages
return array_key_exists($lang, $LNINFO)
&& array_key_exists("icase", $LNINFO[$lang])?
$LNINFO[$lang]["icase"]: true;
}
// _lninfo_country_first: Whether country should be listed first in a mail address
function _lninfo_country_first($lang)
{
global $LNINFO;
// Default to false, for European languages
return array_key_exists($lang, $LNINFO)
&& array_key_exists("ctfirst", $LNINFO[$lang])?
$LNINFO[$lang]["ctfirst"]: false;
}
// _lninfo_desc: Long description
function _lninfo_desc($lang)
{
global $LNINFO;
return array_key_exists($lang, $LNINFO)
&& array_key_exists("longdesc", $LNINFO[$lang])?
$LNINFO[$lang]["longdesc"]: $lang;
}
// _lninfo_desc_curlc: Long description in the current locale
function _lninfo_desc_curlc($lang)
{
return C_(_lninfo_desc($lang));
}
// _lninfo_desc_selflc: Long description in its own locale
function _lninfo_desc_selflc($lang)
{
// Cache the result
static $desc;
// Obtain the description list
if (!isset($desc)) {
global $LNINFO;
$curlc = getenv("LANG");
if ($curlc === false || $curlc == "") {
$curlc = getlang(LN_LOCALE);
}
$desc = array();
foreach (array_keys($LNINFO) as $l) {
// Switch the locale
$locale = _lninfo_lc($l);
$charset = _lninfo_charset($l);
putenv("LANG=$locale");
putenv("LANGUAGE=$locale");
setlocale(LC_ALL, "");
// Obtain the long description
$desc[$l] = _lninfo_desc_curlc($l);
}
// Return the current locale
putenv("LANG=$curlc");
putenv("LANGUAGE=$curlc");
setlocale(LC_ALL, "");
}
// Return the proper description
return array_key_exists($lang, $desc)?
$desc[$lang]: $lang;
}
// _lninfo_switch_title: Title of the language switch
function _lninfo_switch_title($lang)
{
// Cache the result
static $title;
// Obtain the title list
if (!isset($title)) {
global $LNINFO;
$curlc = getenv("LANG");
if ($curlc === false || $curlc == "") {
$curlc = getlang(LN_LOCALE);
}
$title = array();
foreach (array_keys($LNINFO) as $l) {
// Switch the locale
$locale = _lninfo_lc($l);
$charset = _lninfo_charset($l);
putenv("LANG=$locale");
putenv("LANGUAGE=$locale");
setlocale(LC_ALL, "");
// Obtain the title
$title[$l] = C_("Switch to the %s version of this page.");
}
// Return the current locale
putenv("LANG=$curlc");
putenv("LANGUAGE=$curlc");
setlocale(LC_ALL, "");
}
// Not found -- use description in its own locale instead
if (!array_key_exists($lang, $title)) {
return _lninfo_desc_selflc($lang);
}
// Return the proper title
return sprintf($title[$lang], _lninfo_desc_selflc($lang));
}
?>