@@ -250,11 +250,27 @@ def get_string(self, language=None, **tokens):
250250 # Possibly raise an error silently here
251251 return ''
252252
253- # Update the stored tokens with the given ones
254- self .tokens .update (tokens )
253+ # Expose all TranslationStrings instances in self.tokens
254+ exposed_tokens = {}
255+
256+ # Pass additional kwargs - these will be used to format the string
257+ self ._update_exposed_tokens (
258+ exposed_tokens , language , self .tokens , ** tokens )
259+
260+ # Don't pass any additional kwargs, each token should either
261+ # be trivial or rely on itself (self.tokens)
262+ self ._update_exposed_tokens (exposed_tokens , language , tokens )
255263
256264 # Return the formatted message
257- return self [language ].format (** self .tokens )
265+ return self [language ].format (** exposed_tokens )
266+
267+ @staticmethod
268+ def _update_exposed_tokens (exposed_tokens , language , tokens , ** kwargs ):
269+ for token_name , token in tokens .items ():
270+ if isinstance (token , TranslationStrings ):
271+ token = token .get_string (language , ** kwargs )
272+
273+ exposed_tokens [token_name ] = token
258274
259275 def get_language (self , language ):
260276 """Return the language to be used."""
@@ -291,5 +307,19 @@ def get_language(self, language):
291307 # Return None as the language, as no language has been found
292308 return None
293309
310+ def tokenized (self , ** tokens ):
311+ """Create a new TranslationStrings instance and store tokens in it.
312+
313+ :param dict tokens: Tokens to store in the instance.
314+ :return: New TranslationStrings instance with tokens stored in it.
315+ :rtype: TranslationStrings
316+ """
317+ result = TranslationStrings ()
318+ result .tokens .update (tokens )
319+
320+ result .update (self )
321+
322+ return result
323+
294324# Get the translations language strings
295325_translation_strings = LangStrings ('_core/translations_strings' )
0 commit comments