libintl-perl:基于 Perl 的国际化库项目

用户可借助该项目为 Perl 软件实现国际化功能,兼容 Uniforum 消息翻译系统及 GNU gettext 工具,提供纯 Perl 实现的核心模块,支持多字符集转换与跨 Perl 版本移植。【此简介由AI生成】

Branch1Tags0

libintl-perl 项目说明文档

libintl-perl 是一个面向 Perl 语言的国际化库,旨在兼容 Uniforum 消息翻译系统(例如 GNU gettext 的实现)。

[分发者注意:本文件及发布包中 "sample" 子目录应与库文件一同安装至对应文档目录!]

许可信息详见 COPYING.LESSER 文件及源代码。

更多扩展资料请访问 libintl-perl 官方网站:http://guido-flohr.net/projects/libintl-perl。

运行要求

本库完全采用 Perl 编写,可在任何搭载 Perl5 解释器的系统上运行。最低要求 Perl 版本为 5.004。

不同 Perl 版本下的表现差异:

  • Perl 5.8 及以上版本

推荐使用。Perl 5.8 提供最佳性能及多字节编码支持(安装 Encode::Han 后支持更全面)。输出字符集将根据 I18N::Langinfo 自动选择(注:Perl 5.7 虽已支持 I18N::Langinfo,但该开发版本现已较少使用)。

  • Perl 5.6 及以上版本

仍支持高性能 UTF-8 处理,但需安装 Encode 包方可支持其他多字节编码。

  • 更早的 Perl 版本

完整支持 UTF-8 但性能较低(所有转换例程均用 Perl 实现)。具体而言:8 位字符集到 UTF-8 的编码速度尚可,但 UTF-8 解码较慢。

注:上述要求针对的是使用 libintl-perl 进行国际化的软件终端用户。

若您作为维护者使用 libintl-perl 开发 Perl 包,则需安装新版 GNU gettext(参见源码包中 "sample/" 子目录的 README 文件)。翻译人员原则上可用任意文本编辑器工作,但安装 GNU gettext 会更高效。软件终端用户或安装国际化 Perl 包者无需安装,除非需为软件新增语言支持。

安装指南

若系统中未安装 libintl-perl,需从源码构建(操作比想象简单)。仅需 "make" 程序和命令行终端,无需 C 编译器。

解压至目标目录后执行:

perl Makefile.PL make

构建完成后可运行测试:

make test

安装命令:

make install

(通常需要管理员权限)

也可通过 CPAN 模块安装。

反馈渠道

欢迎发送正面/负面反馈至作者。错误报告可直接提交或通过 http://rt.cpan.org/ 的追踪系统提交。

无论您的项目是私有/公开、免费/商业,若使用了 libintl-perl 请告知作者,此类信息对项目很重要。

若您喜爱(或不满?)libintl-perl,可通过以下方式分享评价:

设计目标

核心目标是最大限度兼容其他编程语言的 gettext 函数。确保开发者、翻译者和终端用户能充分利用现有 i18n 工具链:xgettext 提取消息、msgfmt/msgmerge 操作目录、Emacs PO 模式(或 KBabel、PO-Edit 等)编辑目录等。

次要目标是极致可移植性。库应在不依赖额外软件的前提下适配各种 Perl 版本。在运行时环境中优先启用高级特性,同时确保基础功能全平台可用。

架构概述

核心模块 Locale::gettext_pp 是 CPAN 模块 Locale::gettext 的纯 Perl 重实现。相比 XS 版本,Locale::gettext_pp 额外支持复数处理和输出转换等功能。该模块提供的国际化函数与系统库(libc)或附加 C 库(如 GNU gettext 的 libintl)等效。

Locale::Messages 类作为抽象层,支持动态切换不同 gettext 实现(如 Locale::gettext_pp 与 Locale::gettext),提供与实现无关的统一接口。

实际开发中应使用 Locale::TextDomain 模块。该模块为特定文本域(软件包唯一标识符)提供消息翻译系统,利用 Locale::Messages 进行消息转换和目录定位,并包含实用功能:i18n 例程快捷别名、翻译数据库的哈希绑定访问,以及适配国际化消息的插值机制。

库内还包含字符集转换模块 Locale::Recode,被 Locale::gettext_pp 内部用于实现消息目录字符集与用户偏好字符集的实时转换。相比新版 Perl 的 Encode 模块,其优势在于可移植性——无需 Perl 5.6 引入的 Unicode 特性即可全版本支持 UTF-8 及多种 8 位编码。若需在旧版 Perl 中进行字符集转换,Locale::Recode 值得尝试(尽管它本质是辅助库,并非 Encode 的替代品)。

文档体系

入门学习请阅读 Locale::TextDomain 的 perldoc 文档。其他模块文档仅供库开发者参考。

实际应用还需 GNU gettext 工具链(http://savannah.gnu.org/projects/gettext/)。官方文档位于 http://www.gnu.org/manual/gettext/,包含 GNU gettext 国际化通用指南,其中 Perl 专项章节详细说明了从 Perl 源码提取可翻译消息的解析器机制。

快速入门

libintl-perl 源码发行版的 "sample" 子目录中包含一个完整的国际化 Perl 包示例,包括可用的 Makefile。该子目录中的 README 文件详细说明了所有必要步骤。

不过,如果您使用的是较新的 GNU/Linux 系统或类似环境(cygwin 应该也可以),您可能可以直接运行以下示例:

#! /usr/local/bin/perl -w

use strict;

# 这里假设您的系统上有文本域 'libc'。可以尝试执行 "locate libc.mo" 或 "locate libc.gmo"
# (如果系统没有 locate 命令,可以尝试 "find / -type f -name libc.mo")。
#
# 顺便说一句,"use Locale::TextDomain (TEXTDOMAIN)" 相当于
# C 或类似语言中的:
#
#      textdomain ("TEXTDOMAIN");
#
use Locale::TextDomain ('libc');

# 在较旧版本的 Perl 中,POSIX 模块不会导出 LC_MESSAGES 区域类别。
use Locale::Messages qw (LC_MESSAGES);

use POSIX ('setlocale');

# 根据环境变量设置区域。
setlocale (LC_MESSAGES, '');

# 这里假设您的系统 libc 定义了消息 "No such file or directory"。
# 您可以通过类似 "ls NON-EXISTANT" 的命令检查系统上的确切拼写。
# 注意字符串前的双下划线。这实际上是调用 __() 函数,
# 该函数由 Locale::TextDomain 自动导入到您的命名空间中。
# 它会查找字符串的翻译,并返回翻译结果,如果找不到则返回原字符串。
print __"No such file or directory", ".\n";

__END__

现在运行命令 "locale -a" 或 "nlsinfo" 获取系统上可用的区域列表。如果遇到问题,可以参考 "perldoc perllocale" 中的 "Finding locales" 部分。

例如,如果您的系统支持 "fr_FR" 区域,可以设置环境变量 LANG 为该值:

对于 POSIX shell: LANG=fr_FR export LANG

对于 C shell: setenv LANG fr_FR

然后运行您的 Perl 脚本。它应该会显示法语(或您选择的语言)的 "No such file or directory" 错误消息。这并不是一个真实的示例,因为我们"借用"了系统消息目录中的消息,但它能让您理解基本原理,特别是如果您已经熟悉 C 语言中的 gettext。

如果仍然看到英文消息,这不一定意味着失败,可能是因为该字符串在您的系统上未被翻译(可以尝试 "locate libc.mo" 查看可用的翻译列表)。即使列表中有翻译,该特定消息也可能缺失。可以尝试常见的区域设置,如 "de_DE" 或 "fr_FR",这些通常有完整的翻译。

接下来,您可以阅读 "perldoc Locale::TextDomain",然后学习本发行版 "sample" 子目录中的示例。

祝您使用 libintl-perl 愉快!

Guido Flohr

Introduction

用户可借助该项目为 Perl 软件实现国际化功能,兼容 Uniforum 消息翻译系统及 GNU gettext 工具,提供纯 Perl 实现的核心模块,支持多字符集转换与跨 Perl 版本移植。【此简介由AI生成】

Customize my domain