-
Notifications
You must be signed in to change notification settings - Fork 665
Localization best practices for Dynamo developers
Making a project localizable includes the following steps:
- Adding
*.resxand*.en-US.resxfiles to project - Updating
AssemblyInfo.csof the project - Referencing the string resource in
*.csfiles - Referencing the string resource in
*.xamlfiles
These steps are detailed in the following sections.
Follow the following steps to add a new resource file:
- Select
Add>New Itemfrom a CSharp project forAdd New Itemdialog. - Select
Visual C# Itemson the tree to the left of the dialog. - Select
Resources Filefrom the list. - Rename it to
Resource.resx(instead ofResource1.resx). - Double-click on
Resource.resxfile to open the resource editor. - Change the
Access ModifierfromInternaltoPublic. - Duplicate the
Resource.resxasResource.en-US.resxin Explorer. - Select
Add>Existing Itemfrom the project and selectResource.en-US.resxto include it in the project.
Notice that Resource.en-US.resx does not come with Resource.Designer.cs like Resource.resx file does. This is because its Access Modifier is set to No code generation, and that is okay.
Note that both *.resx and *.en-US.resx files must always be kept completely in-sync. The process of updating these files typically includes adding the desirable strings into *.resx file, and then copy it to overwrite *.en-US.resx file. This way they are always 100% identical.
With *.resx and *.en-US.resx files added to the project, the AssemblyInfo.cs must be updated to specify a fallback assembly in the event that a desirable localized *.resources.dll cannot be found during runtime (typically the fallback is on en-US resources). This can be done in either of the following ways.
This is the preferred way for any development work under DynamoDS/Dynamo repository. Follow the following steps to add a link reference to AssemblySharedInfo.cs file:
- Select
Add>Existing Itemmenu to bring upAdd Existing Itemdialog. - Navigate to this folder:
Dynamo/src/AssemblySharedInfoGenerator. - Select
AssemblySharedInfo.csfile and selectAdd as Link(through drop down ofAddbutton).
Having this reference ensures that the version number always matches that of the main Dynamo build.
If for some reason Option 1 is not feasible, then the existing Properties/AssemblyInfo.cs can be updated by adding the following line:
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]To reference a string by its ID SettingsMigrationDialogTitle in a CSharp file, do this:
string dialogTitle = Properties.Resources.SettingsMigrationDialogTitle;To reference the same string in *.xaml file, do this:
<Window xmlns:p="clr-namespace:Dynamo.Wpf.Properties"
...
Title="{x:Static p:Resources.SettingsMigrationDialogTitle}"
...>
<Button Content="{x:Static p:Resources.MigrationAcceptButton}" ... />
</Window>Note that both *.resx and *.en-US.resx files must always be kept completely in-sync. The process of updating these files typically includes adding the desirable strings into *.resx file, and then copy it to overwrite *.en-US.resx file. This way they are always 100% identical.
- Move Get a color given a color range string into the corresponding
*.resxfile. - Give an Id of
ColorRangeDescriptionto the newly added string. - Copy the
*.resxfile to overwrite*.en-US.resxfile so they match up. - Add a
NodeDescriptionattribute toColorRangeclass like so:
[NodeDescription("ColorRangeDescription",
typeof(DSCoreNodesUI.Properties.Resources))]
public class ColorRange : NodeModel
{
// ...
}- Move colorrange;color;range; string into the corresponding
*.resxfile. - Give an Id of
ColorRangeSearchTagsto the newly added string. - Copy the
*.resxfile to overwrite*.en-US.resxfile so they match up. - Add a
NodeSearchTagsattribute toColorRangeclass like so:
[NodeSearchTags("ColorRangeSearchTags",
typeof(DSCoreNodesUI.Properties.Resources))]
public class ColorRange : NodeModel
{
// ...
}Search tags for a given NodeModel class is made up of multiple ; delimited substrings. In a localized language, it is up to the localizer to add additional search terms in local languages. For the colorrange;color;range example in French language, the search terms can be localized as colorrange;color;range;couleur (with one new entry added just for French language).
Similar to NodeSearchTags and NodeDescription attributes above, to display localized values for an enum value, a EnumDescription attribute is added right next to each enum value. For example:
public enum DayOfWeek
{
[EnumDescription("EnumDateOfWeekSunday", typeof(Properties.Resources))] Sunday,
[EnumDescription("EnumDateOfWeekMonday", typeof(Properties.Resources))] Monday,
[EnumDescription("EnumDateOfWeekTuesday", typeof(Properties.Resources))] Tuesday,
[EnumDescription("EnumDateOfWeekWednesday", typeof(Properties.Resources))] Wednesday,
[EnumDescription("EnumDateOfWeekThursday", typeof(Properties.Resources))] Thursday,
[EnumDescription("EnumDateOfWeekFriday", typeof(Properties.Resources))] Friday,
[EnumDescription("EnumDateOfWeekSaturday", typeof(Properties.Resources))] Saturday
}And in the corresponding *.resx file:
<data name="EnumDateOfWeekFriday" xml:space="preserve">
<value>Friday</value>
</data>
<data name="EnumDateOfWeekMonday" xml:space="preserve">
<value>Monday</value>
</data>
<data name="EnumDateOfWeekSaturday" xml:space="preserve">
<value>Saturday</value>
</data>
<data name="EnumDateOfWeekSunday" xml:space="preserve">
<value>Sunday</value>
</data>
<data name="EnumDateOfWeekThursday" xml:space="preserve">
<value>Thursday</value>
</data>
<data name="EnumDateOfWeekTuesday" xml:space="preserve">
<value>Tuesday</value>
</data>
<data name="EnumDateOfWeekWednesday" xml:space="preserve">
<value>Wednesday</value>
</data>Looking for help with using the Dynamo application? Try dynamobim.org.
- Dynamo 2.0 Language Changes Explained
- How Replication and Replication Guide work: Part 1
- How Replication and Replication Guide work: Part 2
- How Replication and Replication Guide work: Part 3