Three solutions:
-
Implement your object as a
Proxy
, which is designed to do exactly what you want.Yet, it is only a draft and currently only supported in Firefox’ Javascript 1.8.5It was standardised with ES6, but might not yet be available in all environments. -
Always fill your translation object with a complete set of messages. When creating that “dictionary” (serverside or clientside), always include all needed keys. If no translation exists, you can use a fallback language, the message’s name or the string representation of
undefined
– your choice.But a non-existing property should always mean “there is no such message” instead of “no translation available”.
-
Use a getter function with a string parameter instead of object properties. That function can look the messages up in an internal dictionary object, and handle misses programmatically.
I would recommend a map object which is different from the dictionary, to allow “get” and co as message names:
var translate = (function(){
var dict = {
something: "somethingelse",
...
};
return {
exists: function(name) { return name in dict; },
get: function(name) { return this.exists(name) ? dict[name] : "undefined"; },
set: function(name, msg) { dict[name] = msg; }
};
})();