I am trying to create a command \projlib_langauge_define_multilingual_text:Nn for creating multilingual text macros. Given a macro name \<name>, and a key-value configuration of texts (english = ..., french = ...), it should create sub-macros \<name>_projlib_language_text_<languagename>, and define the main macro \<name> to refer to them accordingly.
Below is my current attempt, which produces a few errors of Undefined control sequence.
Where does it go wrong?
\documentclass{article} \ExplSyntaxOn \cs_new:Nn \projlib_langauge_define_multilingual_text:Nn % #1 = command name % #2 = key-value name configuration { \keyval_parse:nnn {} { \__projlib_langauge_define_multilingual_text_do:nnn { \cs_to_str:N #1 } } { #2 } \tl_new:c { #1 } \tl_set:cn { #1 } { \tl_use:c { #1 _projlib_language_text_ \languagename } } } \cs_generate_variant:Nn \projlib_langauge_define_multilingual_text:Nn { cn } \cs_new:Nn \__projlib_langauge_define_multilingual_text_do:nnn % #1 = command name % #2 = language name % #3 = the text { \exp_args:Nx \tl_new:c { #1 _projlib_language_text_ \projlib_language_str_to_languagename:n { #2 } } \exp_args:Nx \tl_set:cn { #1 _projlib_language_text_ \projlib_language_str_to_languagename:n { #2 } } { #3 } } \cs_new:Nn \projlib_language_str_to_languagename:n { \str_case_e:nn { \str_foldcase:n { #1 } } { {en} {english} {english} {english} {fr} {french} {french} {french} } } \ExplSyntaxOff \usepackage[french,english]{babel} \begin{document} \ExplSyntaxOn \projlib_langauge_define_multilingual_text:Nn \test_text { EN = Some english text, FR = Quelques textes en français, } % Should produce \test_text_projlib_language_text_english and \test_text_projlib_language_text_french, and define \test_text to call them accordingly \selectlanguage{french} % Should be >> Quelques textes en français \test_text \selectlanguage{english} % Should be >> Some english text \test_text \ExplSyntaxOff \end{document} ADD: The accepted answer (alongside with his comments under the question) of David Carlisle kindly reminded the most dangerous syntax errors. The code above remains a few minor logical errors, for which the corrected version is posted below as an answer for your reference.
\tl_new:Nor\tl_new:cjust take the command name to be declared, not anargument with the value, did you intende\tl_const:cn? or\tl_newfollowed bytl_set?textdoc interface3then it is not defined by default.\cs_new:cn. But even if I change them to\tl_newfollowed by\tl_set, it still have several errors.! Undefined control sequence. l.60 \seleclanguageas you have not defined that. Is this a typo for selecTlanguage?! Package babel Error: You haven't defined the language 'language' yet.What did you expect\selectlanguage{language}to do?