% -------------------------------------------------------------------------- % the TRANSLATIONS package % % a simple translator % % This package is part of the exsheets bundle % -------------------------------------------------------------------------- % Clemens Niederberger % Web: https://bitbucket.org/cgnieder/exsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2012 Clemens Niederberger % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is Clemens Niederberger. % -------------------------------------------------------------------------- % The translations package is part of the exsheets bundle. % -------------------------------------------------------------------------- % If you have any ideas, questions, suggestions or bugs to report, please % feel free to contact me. % -------------------------------------------------------------------------- \def\@trnslt@date{2013/04/08} \def\@trnslt@version{v0.9a} \ProvidesPackage{translations}[\@trnslt@date\space \@trnslt@version\space a simple translator] \RequirePackage{etoolbox} % -------------------------------------------------------------------------- % message handling \def\@trnslt@error@message{% For details have a look at the `exsheets' manual.} \def\@trnslt@create@message#1{% \ifstrequal{#1}{Error} {% \lowercase{\csdef{@trnslt@#1}}##1{% \csuse{Package#1}{translations}{##1}{\@trnslt@error@message}}% }{% \lowercase{\csdef{@trnslt@#1}}##1{% \csuse{Package#1}{translations}{##1}}% }} \@trnslt@create@message{Error} \@trnslt@create@message{Warning} \@trnslt@create@message{WarningNoLine} \@trnslt@create@message{Info} \def\@trnslt@err@unknown@lang#1{% \@trnslt@error{Unknown language `#1'}} \def\@trnslt@warn@unknown@lang#1{% \@trnslt@warning{Unknown language `#1'}} \def\@trnslt@err@already@defined#1#2{% \@trnslt@error{The #2 translation for `#1' is already defined.}} \def\@trnslt@err@not@defined#1#2{% \@trnslt@error{The \@trnslt@language{#2} translation for `#1' is not defined yet.}} % -------------------------------------------------------------------------- % check if babel or polyglossia is used \AtEndPreamble{ \@ifpackageloaded{babel}{}{ \@ifpackageloaded{polyglossia}{} {\@trnslt@warning{No language package found. I am going to use `english' as default language.}} } \ifdef\languagename{} {\def\languagename{english}} \def\@trnslt@current@language{\languagename} \ifdef\bbl@afterfi{} {\long\def\bbl@afterfi#1\fi{\fi#1}} } % -------------------------------------------------------------------------- % \DeclareLanguage and \DeclareLanguageAlias % #1: language \newrobustcmd*\DeclareLanguage[1]{% \@trnslt@declare@language{#1}} \@onlypreamble\DeclareLanguage \def\@trnslt@declare@language#1{% \csdef{@trnslt@language@#1}{#1}} % #1: alias % #2: language \newrobustcmd*\DeclareLanguageAlias[2]{% \@trnslt@declare@languagealias{#1}{#2}} \@onlypreamble\DeclareLanguageAlias \def\@trnslt@declare@languagealias#1#2{% \ifcsdef{@trnslt@language@#2} {}{% \@trnslt@warn@unknown@lang{#2}% \@trnslt@declare@language{#2}% }% \lowercase{\@trnslt@if@dialect{#2}}{#2} {% \csletcs {@trnslt@language@\@trnslt@language{#2}@dialect@#1} {@trnslt@language@\@trnslt@language{#2}@dialect@#2}% } {}% \csletcs{@trnslt@language@#1}{@trnslt@language@#2}} % #1: dialect % #2: language \newrobustcmd*\DeclareLanguageDialect[2]{% \@trnslt@declare@languagedialect{#1}{#2}} \@onlypreamble\DeclareLanguageDialect \def\@trnslt@declare@languagedialect#1#2{% \ifcsdef{@trnslt@language@#2} {}{% \@trnslt@warn@unknown@lang{#2}% \@trnslt@declare@language{#2}% }% \csdef{@trnslt@language@\@trnslt@language{#2}@dialect@#1}{}% \csletcs{@trnslt@language@#1}{@trnslt@language@#2}} \def\@trnslt@if@dialect#1#2{% \ifcsdef{@trnslt@language@\@trnslt@language{#2}@dialect@#1} {\expandafter\@firstoftwo} {\expandafter\@secondoftwo}} \def\@trnslt@language#1{% \csuse{@trnslt@language@#1}} % dummy language: `fallback': \DeclareLanguage{fallback} \DeclareLanguageAlias{Fallback}{fallback} % -------------------------------------------------------------------------- % \DeclareTranslation, \NewTranslation and \RenewTranslation % #1: language % #2: word % #3: replacement \newrobustcmd*\DeclareTranslation[3]{% \@trnslt@declare@translation{#2}{#1}{#3}} \@onlypreamble\DeclareTranslation \newrobustcmd*\DeclareTranslationFallback[2]{% \@trnslt@declare@translation{#1}{fallback}{#2}} \@onlypreamble\DeclareTranslationFallback \def\@trnslt@declare@translation#1#2#3{% \ifcsdef{@trnslt@language@#2} {% \csdef{@trnslt@word@#1@literal}{#1}% \lowercase{\@trnslt@if@dialect{#2}}{#2} {\csdef{@trnslt@word@#1@#2}{#3}} {}% \ifcsdef{@trnslt@word@#1@\@trnslt@language{#2}} {} {\csdef{@trnslt@word@#1@\@trnslt@language{#2}}{#3}}% } {\@trnslt@err@unknown@lang{#2}}} \def\@trnslt@if@translation#1#2{% \ifcsdef{@trnslt@word@#1@\@trnslt@language{#2}} {\expandafter\@firstoftwo} {\expandafter\@secondoftwo}} \newrobustcmd*\NewTranslation[3]{% \@trnslt@new@translation{#2}{#1}{#3}} \@onlypreamble\NewTranslation \def\@trnslt@new@translation#1#2#3{% \@trnslt@if@translation{#1}{#2} {\@trnslt@err@already@defined{#1}{#2}} {\@trnslt@declare@translation{#1}{#2}{#3}}} \newrobustcmd*\RenewTranslation[3]{% \@trnslt@renew@translation{#2}{#1}{#3}} \@onlypreamble\RenewTranslation \def\@trnslt@renew@translation#1#2#3{% \@trnslt@if@translation{#1}{#2} {\@trnslt@declare@translation{#1}{#2}{#3}} {\@trnslt@err@not@defined{#1}{#2}}} % -------------------------------------------------------------------------- % \GetTranslationFor and \GetTranslation % these need to be expandable! % #1: language % #2: word \newcommand*\GetTranslationFor[2]{% \@trnslt@get@translation@for{#2}{#1}} \newcommand*\GetTranslation[1]{% \@trnslt@get@translation@for{#1}{\@trnslt@current@language}} % #1: word #2: language \def\@trnslt@get@translation@for#1#2{% \@trnslt@if@translation{#1}{#2} {% \@trnslt@if@dialect{#2}{#2} {% \ifcsdef{@trnslt@word@#1@#2} {\csuse{@trnslt@word@#1@#2}} {\csuse{@trnslt@word@#1@\@trnslt@language{#2}}}% } {\csuse{@trnslt@word@#1@\@trnslt@language{#2}}}% } {% \@trnslt@warning{Translation for `#1' in #2 unknown. You may try to use \string\DeclareTranslation{#2}{#1}{ ... } in your preamble.}% \@trnslt@if@translation{#1}{fallback} {% \@trnslt@info{Using fallback translation for `#1'}% \csuse{@trnslt@word@#1@fallback} }% {\csuse{@trnslt@word@#1@literal}}% }} % -------------------------------------------------------------------------- % \SaveTranslationFor and \SaveTranslation \newrobustcmd*\SaveTranslationFor[3]{% \@trnslt@save@translation@for{#1}{#3}{#2}} \newrobustcmd*\SaveTranslation[2]{% \@trnslt@save@translation@for{#1}{#2}{\@trnslt@current@language}} \def\@trnslt@save@translation@for#1#2#3{% \edef#1{% \@trnslt@if@translation{#2}{#3} {\csuse{@trnslt@word@#2@\@trnslt@language{#3}}} {}% }} % -------------------------------------------------------------------------- % \LoadDictionary and \LoadDictionaryFor \newrobustcmd*\LoadDictionary[1]{% \@trnslt@load@dictionary@for{#1}{\@trnslt@current@language}} \@onlypreamble\LoadDictionary \newrobustcmd*\LoadDictionaryFor[2]{% \@trnslt@load@dictionary@for{#2}{#1}} \@onlypreamble\LoadDictionaryFor % #1: name % #2: lang \def\@trnslt@load@dictionary@for#1#2{% \AtBeginDocument{% \InputIfFileExists{#1-\@trnslt@language{#2}.trsl} {\@trnslt@info{loading dictionary `#1' for `#2'.}} {\@trnslt@warning{File `#1-\@trnslt@language{#2}.trsl' not found.}}% }} \newrobustcmd*\ProvideDictionaryFor[2]{% \@trnslt@provide@dictionary@for{#1}{#2}} \@onlypreamble\ProvideDictionaryFor \def\@trnslt@provide@dictionary@for#1#2{% \def\@trnslt@dictionary@name{#2}% \def\@trnslt@dictionary@lang{#1}% \@ifnextchar[ {\@trnslt@provide@dictionary@version} {\ProvidesFile{#2-#1.trsl}[(#1 translation file `#2')]}} \def\@trnslt@provide@dictionary@version[#1]{% \ProvidesFile {\@trnslt@dictionary@name-\@trnslt@dictionary@lang.trsl}% [(\@trnslt@dictionary@lang\space translation file `\@trnslt@dictionary@name') #1]} % \@trnslt@dictionary@language \newrobustcmd*\DeclareDictTranslation[2]{% \@trnslt@declare@translation{#1}{\@trnslt@dictionary@lang}{#2}} \@onlypreamble\DeclareDictTranslation % -------------------------------------------------------------------------- % predefined languages \DeclareLanguage{albanian} \DeclareLanguage{bulgarian} \DeclareLanguage{catalan} \DeclareLanguage{croatian} \DeclareLanguage{czech} \DeclareLanguage{danish} \DeclareLanguage{dutch} \DeclareLanguage{english} \DeclareLanguage{finnish} \DeclareLanguage{french} \DeclareLanguage{german} \DeclareLanguage{greek} \DeclareLanguage{hebrew} \DeclareLanguage{hungarian} \DeclareLanguage{icelandic} \DeclareLanguage{italian} \DeclareLanguage{norwegian} \DeclareLanguage{polish} \DeclareLanguage{portuges} \DeclareLanguage{romanian} \DeclareLanguage{russian} \DeclareLanguage{serbocroatian} \DeclareLanguage{slovak} \DeclareLanguage{slovenian} \DeclareLanguage{spanish} \DeclareLanguage{swedish} \DeclareLanguage{turkish} \DeclareLanguage{ukrainian} \DeclareLanguageAlias {Albanian}{albanian} \DeclareLanguageAlias {Bulgarian}{bulgarian} \DeclareLanguageAlias {Catalan}{catalan} \DeclareLanguageAlias {Croatian}{croatian} \DeclareLanguageAlias {Czech}{czech} \DeclareLanguageAlias {Danish}{danish} \DeclareLanguageAlias {Dutch}{dutch} \DeclareLanguageAlias {Finnish}{finnish} \DeclareLanguageAlias {francais}{french} \DeclareLanguageAlias {Francais}{francais} \DeclareLanguageDialect{canadien}{french} \DeclareLanguageAlias {Canadien}{canadien} \DeclareLanguageAlias {French}{french} \DeclareLanguageDialect{american}{english} \DeclareLanguageAlias {American}{american} \DeclareLanguageDialect{australian}{english} \DeclareLanguageAlias {Australian}{australian} \DeclareLanguageDialect{british}{english} \DeclareLanguageAlias {British}{british} \DeclareLanguageDialect{canadian}{english} \DeclareLanguageAlias {Canadian}{canadian} \DeclareLanguageAlias {English}{english} \DeclareLanguageDialect{UKenglish}{english} \DeclareLanguageDialect{USenglish}{english} \DeclareLanguageDialect{austrian}{german} \DeclareLanguageAlias {Austrian}{austrian} \DeclareLanguageAlias {German}{german} \DeclareLanguageAlias {germanb}{german} \DeclareLanguageDialect{naustrian}{austrian} \DeclareLanguageAlias {ngerman}{german} \DeclareLanguageAlias {Greek}{greek} \DeclareLanguageAlias {polutonikogreek}{greek} \DeclareLanguageAlias {Hebrew}{hebrew} \DeclareLanguageAlias {Hungarian}{hungarian} \DeclareLanguageDialect{magyar}{hungarian} \DeclareLanguageAlias {Magyar}{magyar} \DeclareLanguageAlias {Icelandic}{icelandic} \DeclareLanguageAlias {Italian}{italian} \DeclareLanguageAlias {norsk}{norwegian} \DeclareLanguageAlias {Norsk}{norsk} \DeclareLanguageAlias {Norwegian}{norwegian} \DeclareLanguageAlias {nynorsk}{norwegian} \DeclareLanguageAlias {Nynorsk}{nynorsk} \DeclareLanguageAlias {Polish}{polish} \DeclareLanguageDialect{brazil}{portuges} \DeclareLanguageAlias {Brazil}{brazil} \DeclareLanguageAlias {brazilian}{brazil} \DeclareLanguageAlias {Brazilian}{brazilian} \DeclareLanguageAlias {Portuges}{portuges} \DeclareLanguageAlias {portuguese}{portuges} \DeclareLanguageAlias {Portuguese}{portuguese} \DeclareLanguageAlias {Romanian}{romanian} \DeclareLanguageAlias {Russian}{russian} \DeclareLanguageAlias {Serbocroatian}{serbocroatian} \DeclareLanguageAlias {Slovak}{slovak} \DeclareLanguageAlias {Slovenian}{slovenian} \DeclareLanguageAlias {Spanish}{spanish} \DeclareLanguageAlias {Swedish}{swedish} \DeclareLanguageAlias {Turkish}{turkish} \DeclareLanguageAlias {Ukrainian}{ukrainian} \endinput % HISTORY: 2012/09/30 v0.2beta - first version (as part of the `exsheets' bundle) 2012/10/05 v0.2 - \LoadDictionary and \LoadDictionaryFor added and loads of languages defined. 2013/03/10 v0.8 - basic dictionaries for English, German, French and Spanish - new command \DeclareDictTranslation 2013/04/04 v0.8a - bug fix in \DeclareDictTranslation 2013/04/07 v0.9 - slightly improved messages 2013/04/08 v0.9a - changed fallback warning into info - synchronized version number with `exsheets' until now but won't any more