Files
selima-perl/lib/perl5/Selima/LnInfo.pm
2026-03-10 21:31:43 +08:00

269 lines
7.3 KiB
Perl

# Selima Website Content Management System
# LnInfo.pm: The language information.
# Copyright (c) 2003-2018 imacat.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Author: imacat <imacat@mail.imacat.idv.tw>
# First written: 2003-03-23
package Selima::LnInfo;
use 5.008;
use strict;
use warnings;
use base qw(Exporter);
use vars qw(@EXPORT @EXPORT_OK);
BEGIN {
@EXPORT = qw(ln);
@EXPORT_OK = @EXPORT;
# Prototype declaration
sub init_lninfo();
sub ln($$);
sub name($);
sub charset($);
sub filename($);
sub locale($);
sub db($);
sub htmlid($);
sub space_break($);
sub country_first($);
sub desc($);
sub desc_curlc($);
sub desc_selflc($);
sub switch_title($);
}
use Selima::DataVars qw(:l10n :lninfo);
use Selima::GetLang;
use Selima::SetL10N;
use Selima::ShortCut;
use vars qw(%LANGS %DESC_SELFLC %SWITCH_TITLE);
%LANGS = (
"zh-tw" => {
"name" => "zh-tw",
"filename" => "zh-tw",
"charset" => "UTF-8",
"db" => "zhtw",
"htmlid" => "zhtw",
"locale" => "zh_TW",
"sp_break" => 0,
"ctfirst" => 1,
"longdesc" => N_("Traditional Chinese")},
"zh-cn" => {
"name" => "zh-cn",
"filename" => "zh-cn",
"charset" => "UTF-8",
"db" => "zhcn",
"htmlid" => "zhcn",
"locale" => "zh_CN",
"sp_break" => 0,
"ctfirst" => 1,
"longdesc" => N_("Simplified Chinese")},
"en" => {
"name" => "en-us",
"filename" => "en",
"charset" => "UTF-8",
"db" => "en",
"htmlid" => "en",
"locale" => "en_US",
"sp_break" => 1,
"ctfirst" => 0,
"longdesc" => N_("English")},
"ja" => {
"name" => "ja",
"filename" => "ja",
"charset" => "UTF-8",
"db" => "ja",
"htmlid" => "ja",
"locale" => "ja_JP",
"sp_break" => 0,
"ctfirst" => 1,
"longdesc" => N_("Japanese")},
"de" => {
"name" => "de",
"filename" => "de",
"charset" => "UTF-8",
"db" => "de",
"htmlid" => "de",
"locale" => "de_DE",
"sp_break" => 0,
"ctfirst" => 1,
"longdesc" => N_("German")});
# Subroutines
# ln: Uniformed wrapper for everything
sub ln($$) {
local ($_, %_);
my ($lang, $type);
($lang, $type) = @_;
if ($type == LN_NAME) {
return name($lang);
} elsif ($type == LN_CHARSET) {
return charset($lang);
} elsif ($type == LN_FILENAME) {
return filename($lang);
} elsif ($type == LN_LOCALE) {
return locale($lang);
} elsif ($type == LN_DATABASE) {
return db($lang);
} elsif ($type == LN_HTMLID) {
return htmlid($lang);
} elsif ($type == LN_SPACE_BREAK) {
return space_break($lang);
} elsif ($type == LN_COUNTRY_FIRST) {
return country_first($lang);
} elsif ($type == LN_DESC) {
return desc($lang);
} elsif ($type == LN_DESC_CURLC) {
return desc_curlc($lang);
} elsif ($type == LN_DESC_SELFLC) {
return desc_selflc($lang);
} elsif ($type == LN_SWITCH_TITLE) {
return switch_title($lang);
} else {
return $lang;
}
}
# name: Language complete name
# Return en-us for en, to be more specified
sub name($) {
return exists $LANGS{$_[0]} && ${$LANGS{$_[0]}}{"name"}?
${$LANGS{$_[0]}}{"name"}: $_[0];
}
# charset: File system name
sub charset($) {
return exists $LANGS{$_[0]} && ${$LANGS{$_[0]}}{"charset"}?
${$LANGS{$_[0]}}{"charset"}: $_[0];
}
# filename: Most common charset that is used with the specified language
sub filename($) {
return exists $LANGS{$_[0]} && ${$LANGS{$_[0]}}{"filename"}?
${$LANGS{$_[0]}}{"filename"}: $_[0];
}
# locale: Locale used by GNU glibc and gettext
# Replace hyphens with underscores, and upper-case the district divisions,
# as used in GNU glibc
sub locale($) {
local ($_, %_);
return ${$LANGS{$_[0]}}{"locale"}
if exists $LANGS{$_[0]} && ${$LANGS{$_[0]}}{"locale"};
$_ = $_[0];
s/-/_/;
s/_([a-z]+)/"_" . uc $1/e;
return $_;
}
# db: Database column name
# Hyphens are not allowed, to avoid confusion
# with the substraction operator "-"
sub db($) {
local ($_, %_);
return ${$LANGS{$_[0]}}{"db"}
if exists $LANGS{$_[0]} && ${$LANGS{$_[0]}}{"db"};
$_ = $_[0];
s/-//g;
return $_;
}
# htmlid: HTML id value
# Hyphens are not allowed, as specified in HTML 4.01 specification
sub htmlid($) {
local ($_, %_);
return ${$LANGS{$_[0]}}{"htmlid"}
if exists $LANGS{$_[0]} && ${$LANGS{$_[0]}}{"htmlid"};
$_ = $_[0];
s/-//g;
return $_;
}
# space_break: Whether words are seperated at spaces
sub space_break($) {
# Default to true, for alphabetic languages
return exists $LANGS{$_[0]} && ${$LANGS{$_[0]}}{"sp_break"}?
${$LANGS{$_[0]}}{"sp_break"}: 1;
}
# country_first: Whether country should be listed first in a mail address
sub country_first($) {
# Default to false, for European languages
return exists $LANGS{$_[0]} && ${$LANGS{$_[0]}}{"ctfirst"}?
${$LANGS{$_[0]}}{"ctfirst"}: 0;
}
# desc: Long description
sub desc($) {
return exists $LANGS{$_[0]} && ${$LANGS{$_[0]}}{"longdesc"}?
${$LANGS{$_[0]}}{"longdesc"}: $_[0];
}
# desc_curlc: Long description in the current locale
sub desc_curlc($) {
return C_(desc($_[0]));
}
# desc_selflc: Long description in its own locale
sub desc_selflc($) {
local ($_, %_);
my ($lang, $lh);
$lang = $_[0];
# Obtain the description list
if (scalar(keys %DESC_SELFLC) == 0) {
foreach my $ln (keys %LANGS) {
# Switch the locale
set_l10n $ln;
# Obtain the long description
$DESC_SELFLC{$ln} = C_(desc $ln);
}
# Switch back the locale
set_l10n;
}
# Return the proper description
return exists $DESC_SELFLC{$lang}? $DESC_SELFLC{$lang}: $lang;
}
# switch_title: Title of the language switch
sub switch_title($) {
my ($lang, $lh);
$lang = $_[0];
# Obtain the description list
if (scalar(keys %SWITCH_TITLE) == 0) {
# Find the descriptions in their own locale first
# Obtain the description list
foreach my $ln (keys %LANGS) {
# Switch the locale
set_l10n $ln;
# Obtain the long description
$SWITCH_TITLE{$ln} = C_("Switch to the %s version of this page.");
}
# Switch back the locale
set_l10n;
}
# Not found -- use description in its own locale instead
return desc_selflc($lang) if !exists $SWITCH_TITLE{$lang};
# Return the proper description
return sprintf $SWITCH_TITLE{$lang}, desc_selflc($lang);
}
return 1;