babel
我如何才能让我的包知道用或选择的语言polyglossia
,以便可以根据当前语言生成一些自动生成的字符串?
例如,我有一个宏\my@string
,它将扩展为英文文本中的“Caption”、德文文本中的“Überschrift”或法文中的“titre”。
答案1
有几种可能性。我将介绍四种不同的方法。前两种方法直接或间接使用由和提供的宏\captions<lang>
或。关于这两种方法,有以下说明:\extras<lang>
babel
polyglossia
babel
\captions<lang>
:宏\captions<lang>
定义保存文本的宏,以替换原有的硬连线文本。\extras<lang>
:宏\extras<lang>
包含特定语言所需的所有额外定义。此宏 [...] 是一个钩子 - 您可以向其中添加内容,但不能直接使用它。
本babel
手册使用\extras<lang>
来举例说明用户对语言的定义。从用户角度<lang>
来看,两者的主要区别在于 稍后设置。因此,如果两者都为一种语言定义相同的宏,则 »wins«中的定义优先。\captions<lang>
\extras<lang>
\extras<lang>
\addto\captions<...>
您可以检查babel
或是否polyglossia
已加载以及是否将翻译添加到\captions<lang>
或\extras<lang>
:
\newcommand*\mytitle{Title}
\@ifpackageloaded{babel}
{\addto\captionsngerman{\def\mytitle{Titel}}}
{
\@ifpackageloaded{polyglossia}
{\addto\captionsngerman{\def\mytitle{Titel}}}
{}
}
当然,为了不必重复代码,这可以包含在更方便的条件中。
这是一个可扩展的解决方案,这意味着它\mytitle
也可以用于 PDF 书签或其他有用的地方。
一个可能的缺点:使用此解决方案,您必须为每种“方言”提供翻译。例如,如果您设置了语言\addto\captionsngerman
,但用户选择了语言,german
他将看不到翻译。
\RequirePackage{filecontents}
\begin{filecontents*}{mypackage.sty}
\ProvidesPackage{mypackage}[2014/07/27 v0.0 my new package]
\newcommand*\iflanguagepackage[1]{%
\@ifpackageloaded{babel}
{#1}
{%
\@ifpackageloaded{polyglossia}
{#1}
{}%
}%
}
\newcommand*\mytitle{Title}
\iflanguagepackage{%
\addto\captionsenglish{\def\mytitle{Title}}%
\addto\captionsngerman{\def\mytitle{Titel}}%
\addto\captionsfrench{\def\mytitle{Titre}}%
}
\end{filecontents*}
\documentclass{article}
\usepackage[english,french,ngerman]{babel}
\usepackage{mypackage}
\begin{document}
\mytitle
\selectlanguage{french}
\mytitle
\selectlanguage{english}
\mytitle
\end{document}
scrbase
这KOMA 脚本类,或者更准确地说,KOMA-Script 支持包scrbase
提供了\providecaptionname
。使用此宏,您不必检查语言包。否则它几乎是相同的:
\newcommand*\mytitle{Title}
\providecaptionname{ngerman}\mytitle{Titel}
它具有与第一个解决方案相同的优点和缺点(可扩展性、方言......)。
\RequirePackage{filecontents}
\begin{filecontents*}{mypackage.sty}
\ProvidesPackage{mypackage}[2014/07/27 v0.0 my new package]
\RequirePackage{scrbase}
\newcommand*\mytitle{Title}
\providecaptionname{english}\mytitle{Title}
\providecaptionname{ngerman}\mytitle{Titel}
\providecaptionname{french}\mytitle{Titre}
\end{filecontents*}
\documentclass{article}
\usepackage[english,french,ngerman]{babel}
\usepackage{mypackage}
\begin{document}
\mytitle
\selectlanguage{french}
\mytitle
\selectlanguage{english}
\mytitle
\end{document}
不过,它比纯babel
/polyglossia
方式有优势:首先, 的第一个参数\providecaptionname
可以是逗号分隔的语言列表,因此更方便提供方言或语言别名的翻译。此外,还有许多相关命令允许更精细的控制:
\defcaptionname{<list of languages>}{<macro>}{<translation>}
:无论如何都要定义翻译。(例如\def
)\providecaptionname{<list of languages>}{<macro>}{<translation>}
<list of languages>
:如果尚未定义标题名称,则为语言定义一个标题名称。(例如\providecommand
)\newcaptionname{<list of languages>}{<macro>}{<translation>}
<list of languages>
:如果尚未定义某种语言的标题名称,则抛出错误。(例如\newcommand
)\renewcaptionname{<list of languages>}{<macro>}{<translation>}
:更新 中语言的现有标题名称<list of languages>
。如果尚无,则抛出错误。(如\renewcommand
)
这些命令会自行决定是否最好将翻译添加到\captions<lang>
或\extras<lang>
除非您使用其带星号的变体(这些变体将始终使用 )\extras<lang>
。在 v3.12 中,这些宏会推迟在文档开头的定义。
translator
该translator
包(部分beamer
) 是一个更通用的解决方案。
手册beamer
上是这么说的:
该
translator
软件包是一个 LaTeX 软件包,它提供了一种将单个单词翻译成不同语言的灵活机制。例如,它可用于将“figure”这样的单词翻译成德语单词“Abbildung”。当某些软件包的作者希望本地化该软件包,以便将文本正确地翻译成用户喜欢的语言时,这种翻译机制非常有用。该translator
软件包不适用于自动翻译多个单词。您可能想知道这个
translator
包是否真的有必要,因为已经有 (非常好的)babel
LaTeX 包可用了。这个包已经提供了像“figure”这样的单词的翻译。不幸的是,这个babel
包的架构设计使得无法将新单词的翻译添加到直接内置的 (非常短的) 翻译列表中babel
。
虽然我们现在知道这并不完全正确,但这个translator
包仍然是一个非常有用的概括。基本用法如下:
\newcommand*\mytitle{\translate{mypackage-title}}
\newtranslation[to=English]{mypackage-title}{Title}
\newtranslation[to=German]{mypackage-title}{Titel}
有了它,您也不必自己检查babel
。polyglossia
但是,为了使翻译正常工作,translator
包需要获取使用的语言作为包选项,这意味着用户应该使用该语言作为全局选项:
\documentclass[german]{article}
\usepackage{mypackage}
因此,使用它的包可能应该告诉用户这一点。优点:\newtranslation[to=German]
适用于german
和ngerman
自动。如果使用一种没有提供翻译的语言,则使用英语翻译作为后备。
缺点是:\translate
不可扩展,这可能会或可能不会引起麻烦(例如,当用于PDF 书签时)\section
。hyperref
另一个可能的优势是:它附带的词典已经提供了相当多的翻译。
此外还\newtranslation
translator
提供了许多类似的命令:
\deftranslation[to=<lang>]{<string>}{<translation>}
:无论如何,<string>
为语言提供新的翻译。(如)<lang>
\def
\newtranslation[to=<lang>]{<string>}{<translation>}
<string>
:为语言提供新的翻译<lang>
。如果已存在则抛出错误。(例如\newcommand
)\providetranslation[to=<lang>]{<string>}{<translation>}
<string>
:如果语言<lang>
尚不存在,则提供新的翻译。(例如\providecommand
)\renewtranslation[to=<lang>]{<string>}{<translation>}
<string>
:更新语言 的现有翻译<lang>
。如果尚不存在,则抛出错误。(例如\renewcommand
)
\RequirePackage{filecontents}
\begin{filecontents*}{mypackage.sty}
\ProvidesPackage{mypackage}[2014/07/27 v0.0 my new package]
\RequirePackage{translator}
\newcommand*\mytitle{\translate{mypackage-title}}
\newtranslation[to=English]{mypackage-title}{Title}
\newtranslation[to=German]{mypackage-title}{Titel}
\newtranslation[to=French]{mypackage-title}{Titre}
\end{filecontents*}
\documentclass[english,french,ngerman]{article}
\usepackage{babel}
\usepackage{mypackage}
\begin{document}
\mytitle
\selectlanguage{french}
\mytitle
\selectlanguage{english}
\mytitle
\end{document}
translations
你可能还想看看translations
包裹。
它的用法与 非常相似translator
。但它有几个优点:
- 它
\GetTranslation
是可扩展的 - 即使没有给出全局选项,所选语言也会被识别
- 它知道方言的概念
来自手册:
此软件包为软件包作者提供了一个简单的界面,用于国际化他们的软件包。此软件包的功能在很多方面也包含在软件包中
translator
(捆绑包的一部分beamer
)。国际化也可以通过babel
其\addto\captions<language>
机制或 KOMA-Script\providecaptionname
和类似命令来实现。但是,我认为这translations
比所有这些都更灵活。与此不同,translator
它检测所使用的(babel
或polyglossia
)语言本身并提供可扩展的翻译密钥检索。translations
还提供了对语言方言的支持,这意味着软件包作者可以区分英国、澳大利亚、加拿大和美国英语。
translations
提供了许多宏来定义和检索翻译的字符串。大多数时候
\DeclareTranslationFallback{<string>}{<translation>}
,\DeclareTranslation{<language>}{<string>}{<translation>}
和\GetTranslation{<string>}
就足够了。
还有
\NewTranslation{<language>}{<string>}{<translation>}
,\ProvideTranslation{<language>}{<string>}{<translation>}
和\RenewTranslation{<language>}{<string>}{<translation>}
scrbase
其后果与translator
和 的宏相同。
每个字符串至少应该有一个»后备翻译«,当没有语言包或用户选择了没有提供翻译的语言时使用。
就像该translator
包translations
也知道字典并且已经提供了许多翻译。
\RequirePackage{filecontents}
\begin{filecontents*}{mypackage.sty}
\ProvidesPackage{mypackage}[2014/07/27 v0.0 my new package]
\RequirePackage{translations}
\newcommand*\mytitle{\GetTranslation{mypackage-title}}
% translations for `mypackage-title':
\DeclareTranslationFallback {mypackage-title}{Title}
\DeclareTranslation{English}{mypackage-title}{Title}
\DeclareTranslation{French} {mypackage-title}{Titre}
\DeclareTranslation{German} {mypackage-title}{Titel}
\end{filecontents*}
\documentclass{article}
\usepackage[english,french,ngerman]{babel}
\usepackage{mypackage}
\begin{document}
\mytitle
\selectlanguage{french}
\mytitle
\selectlanguage{english}
\mytitle
\end{document}
所有完整的例子都给出