使用翻译包翻译多段落字符串

使用翻译包翻译多段落字符串

我正在尝试使用该包创建一个包含一些样板文本块的本地化文档模板translations。到目前为止,一切都运行良好,只是我无法声明跨多个段落的翻译。

每当翻译字符串包含段落分隔符时,编译就会中止并出现以下错误:

错误:段落在 \NewTranslation 完成之前结束

我尝试过将消息包装在内,但\mbox没有成功。有没有办法让翻译的消息跨越多个段落?

我并没有真正投入到翻译包中,所以如果有更好的方法来实现我的结果,请告诉我!:)

这是一个说明该问题的最小工作示例:

\documentclass{standalone}

\usepackage[ngerman]{babel}
\usepackage{translations}

\NewTranslation{ngerman}{template}{%
  Erster Absatz.

  Zweiter Absatz.
}

\begin{document}
\GetTranslation{template}
\end{document}

答案1

软件包中的所有宏translations都定义为短宏,不允许\par在宏内使用。我认为这是设计使然。(现在软件包作者已经在评论中回复了,看来这可以作为功能请求来解决。)

但是,该translator软件包似乎beamer允许在翻译定义中使用段落。也许这对您的任务有用:

\documentclass{article}

\usepackage[ngerman]{babel}
\usepackage{translator}

\newtranslation[to=German]{template}{%
  Erster Absatz.

  Zweiter Absatz.
}

\begin{document}
\translate[to=German]{template}
\end{document}

output of code

作为一种临时的解决方案,您可能能够在翻译中使用\endgraf而不是。\par

\documentclass{article}

\usepackage[ngerman]{babel}
\usepackage{translations}

\NewTranslation{ngerman}{template}{%
  Erster Absatz.\endgraf
  Zweiter Absatz.
}

\begin{document}
\GetTranslation{template}
\end{document}

但这也有其缺点,具体取决于上下文。请参阅以下问题的讨论。

答案2

修订

这将完全实现它,仅要求模板可扩展。

它接受(在重新定义的名称下\NewTranslation)包括段落的输入,并解析 s \par,将其转换为s。它使用包含代理项的输入版本\fauxpar调用原始的已保存版本。最后,可以像上面的原始答案一样调用。\NewTranslation\fauxpar\GetTranslation

\documentclass{article}

\usepackage[ngerman]{babel}
\usepackage{translations}

\let\fauxpar\par
\let\svNewTranslation\NewTranslation
\renewcommand\NewTranslation[3]{%
  \def\tmp{}%
  \MyNewTranslationAux#3\par\relax%
  \expandafter\xdef\csname#2Aux\endcsname{\tmp}%
  \svNewTranslation{#1}{#2}{\csname#2Aux\endcsname}
}
\makeatletter
\long\def\MyNewTranslationAux#1\par#2\relax{%
  \g@addto@macro{\tmp}{#1}%
  \if\relax#2\else\g@addto@macro{\tmp}{\fauxpar}\MyNewTranslationAux#2\par\relax\fi%
}
\makeatother

\NewTranslation{ngerman}{templateA}{%
  Erster Absatz.
}
\NewTranslation{ngerman}{templateB}{%
  Erster Absatz.

  Zweiter Absatz.
}
\NewTranslation{ngerman}{templateC}{%
  Erster Absatz.

  Zweiter Absatz.

  Third Absatz.
}
\begin{document}
\GetTranslation{templateA}\medskip

\GetTranslation{templateB}\medskip

\edef\foo{\GetTranslation{templateC}}
\foo
\end{document}

enter image description here

最初的简单方法

根据您的需要,这个答案可能完全不可接受,也可能让您摆脱困境。如果使用代理\fauxpar宏替换输入\par,它将起作用。

\documentclass{article}

\usepackage[ngerman]{babel}
\usepackage{translations}

\NewTranslation{ngerman}{template}{%
  Erster Absatz.
\fauxpar
  Zweiter Absatz.
}
\let\fauxpar\par
\begin{document}
\GetTranslation{template}
\end{document}

enter image description here

相关内容