Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C#6.0 string interpolation localization

Tags:

c#

.net

c#-6.0

C#6.0 have a string interpolation - a nice feature to format strings like:

 var name = "John";  WriteLine($"My name is {name}"); 

The example is converted to

 var name = "John";  WriteLine(String.Format("My name is {0}", name)); 

From the localization point of view, it is much better to store strings like :

"My name is {name} {middlename} {surname}"  

than in String.Format notation:

"My name is {0} {1} {2}" 

How to use the string interpolation for .NET localization? Is there going to be a way to put $"..." to resource files? Or should strings be stored like "...{name}" and somehow interpolated on fly?

P.S. This question is NOT about "how to make string.FormatIt extension" (there are A LOT of such libraries, SO answers, etc.). This question is about something like Roslyn extension for "string interpolation" in "localization" context (both are terms in MS .NET vocabulary), or dynamic usage like Dylan proposed.

like image 622
MajesticRa Avatar asked Mar 16 '15 01:03

MajesticRa


1 Answers

An interpolated string evaluates the block between the curly braces as a C# expression (e.g. {expression}, {1 + 1}, {person.FirstName}).

This means that the expressions in an interpolated string must reference names in the current context.

For example this statement will not compile:

var nameFormat = $"My name is {name}"; // Cannot use *name*                                        // before it is declared var name = "Fred"; WriteLine(nameFormat); 

Similarly:

class Program {     const string interpolated = $"{firstName}"; // Name *firstName* does not exist                                                 // in the current context     static void Main(string[] args)     {         var firstName = "fred";         Console.WriteLine(interpolated);         Console.ReadKey();     } } 

To answer your question:

There is no current mechanism provided by the framework to evaluate interpolated strings at runtime. Therefore, you cannot store strings and interpolate on the fly out of the box.

There are libraries that exist that handle runtime interpolation of strings.

like image 191
Dustin Kingen Avatar answered Sep 28 '22 15:09

Dustin Kingen