-
Notifications
You must be signed in to change notification settings - Fork 635
Localization best practices for Dynamo developers
Making a project localizable includes the following steps:
- Adding
*.resx
and*.en-US.resx
files to project - Updating
AssemblyInfo.cs
of the project - Referencing the string resource in
*.cs
files - Referencing the string resource in
*.xaml
files
These steps are detailed in the following sections.
Follow the following steps to add a new resource file:
- Select
Add
>New Item
from a CSharp project forAdd New Item
dialog. - Select
Visual C# Items
on the tree to the left of the dialog. - Select
Resources File
from the list. - Rename it to
Resource.resx
(instead ofResource1.resx
). - Double-click on
Resource.resx
file to open the resource editor. - Change the
Access Modifier
fromInternal
toPublic
. - Duplicate the
Resource.resx
asResource.en-US.resx
in Explorer. - Select
Add
>Existing Item
from the project and selectResource.en-US.resx
to 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 Item
menu to bring upAdd Existing Item
dialog. - Navigate to this folder:
Dynamo/src/AssemblySharedInfoGenerator
. - Select
AssemblySharedInfo.cs
file and selectAdd as Link
(through drop down ofAdd
button).
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
*.resx
file. - Give an Id of
ColorRangeDescription
to the newly added string. - Copy the
*.resx
file to overwrite*.en-US.resx
file so they match up. - Add a
NodeDescription
attribute toColorRange
class like so:
[NodeDescription("ColorRangeDescription",
typeof(DSCoreNodesUI.Properties.Resources))]
public class ColorRange : NodeModel
{
// ...
}
- Move colorrange;color;range; string into the corresponding
*.resx
file. - Give an Id of
ColorRangeSearchTags
to the newly added string. - Copy the
*.resx
file to overwrite*.en-US.resx
file so they match up. - Add a
NodeSearchTags
attribute toColorRange
class 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