Hello everyone, i just want to ask if there is a way to make a dynamo script works in several language ? for example when i use a parameter name string in french and then i need yo use this script on an english version without changing the parameter name to english manually ! Thank you.
You could review your options after you get the Revit language as shown here:
That said if you’re doing a workflow which frequently works across languages within your office you may want to consider adding a UI element to allow the user to select the parameter they want to work with directly. That or make a list of what the parameter name should be in every language you use, and use that as a dictionary to get the right result.
I believe the Revit language packs may also allow you to resolve this in another way.
heres a code block example of how you could define a list of parameter strings in two languages then you could call these strings using the new definition
def params (num) {
Translated_Params = {
{“english0”,“french0”},
{“english1”,“french1”},
{“english2”,“french2”}
};
//change language index once
language = 1;
return = Translated_Params[num][language];
};
//call strings
params(0…2);
Why don’t you address parameters by their id?
Examples can be found @ buildingcoder
@jacob.small @adam_bear1 @Peter_Kompolschek thank all of you mates i will try those solutions and give you feedback.
If they are built in parameters with a consistent ID than the method @Peter_Kompolschek linked is likely best.
If the IDs change based on project workflow than the dictionary illustrated by @adam_bear1 is likely best.
If there are neither standard names nor standard IDs than go the UI route for now, and discuss standardizing the workflow long term.
slight improvement based on string rather than integer
def params (str) {
Translated_Params = {
{"english0","french0"},
{"english1","french1"},
{"english2","french2"}
};
//change language index once
language = 1;
//search for parameter
contains = List.ContainsItem(Translated_Params<1L>, str);
indices = List.AllIndicesOf(contains, true);
return = Translated_Params[indices][language];
};
//call strings
params({"english0","english1","english2"});
another slight improvement to run on partial strings
def params (str) {
Translated_Params = {
{"english0","french0"},
{"english1","french1"},
{"english2","french2"}};
//change language index once
language = 1;
//search for parameter
str_contains = String.Contains(Translated_Params, str, false);
index_str = List.AllIndicesOf(str_contains@-2<1>, true);
empty = List.IsEmpty(index_str<1L>);
index_false = List.AllIndicesOf(empty, false);
first = List.FirstItem(index_false);
return = Translated_Params[first][language];
};
//call strings
params({"ish","lish1","glish2"});