Compatibility with Adobe ColdFusion 11 and Lucee 4.5 have been dropped.
You will need to move the i18n
configuration structure in your config/ColdBox.cfc
to the moduleSettings
struct and rename it to cbi18n
to standardize it to module settings.
moduleSettings = {​cbi18n = {// The default resource to load and aliased as `default`"defaultResourceBundle" : "includes/i18n/main",// The locale to use when none defined"defaultLocale" : "en_US",// The default storage for the locale"localeStorage" : "[email protected]",// What to emit to via the resource methods if a translation is not found"unknownTranslation" : "**NOT FOUND**",// If true, we will log to LogBox the missing translations"logUnknownTranslation" : true,// A-la-carte resources to load by name"resourceBundles" : {},// Your own CFC instantiation path"customResourceService" : ""}};
Every ColdBox module has the i18n capabilities available to them as well. They can use it to register their own resource bundles. The previous version allowed for a setting called i18n
this is now called cbi18n
to comply with the same global naming convention. Just update your key root in your Moduleconfig.cfc
ModuleConfig.cfccbi18n = {defaultLocale = "es_SV",resourceBundles = {"[email protected]" = "#moduleMapping#/includes/module"}};
localeStorage
will use a cbstorages compatible service now. This means you have to specify the WireBox ID now, e.g [email protected]
, [email protected]
etc
cbi18n
v1 already had java resource bundles. v2 added support for JSON resource bundles. Both flat and nested JSON bundles are supported.
includes/i18n/jsontest_en_US.json{"sub.IntroMessage": "Normal JSON"}
includes/i18n/jsontest_es_SV.json{"sub.IntroMessage": "JSON Normal"}
includes/i18n/nested_en_US.json{"sub": {"IntroMessage": "Nested JSON"}}
includes/i18n/nested_es_SV.json{"sub": {"IntroMessage": "JSON Incrustado"}}
The locale storage has now moved to leveraging a cbStorages compliant driver. This way you can leverage any of the cbStorages drivers or anything custom you would like.
[email protected] (default)
In this version we introduced the concept of property inheritance. It means that key-values pairs included in less specific files are inherited by those which are higher in the inheritance tree. For example: Let's assume you are using a en_US locale. if you have key-values in a generic myResource.properties
file, you can override them in a myResource_en.properties
and an even more specific myResource_en_US.properties
file. This opens up the possibility to define a generic language resource and define country specific translations in a more specific resource file.
The order of lookup is:
myBundle_en_US_somevariant.(properties|json)
myBundle_en_US.(properties|json)
myBundle_en.(properties|json)
myBundle.(properties|json)
You get some brand new helpers in this release:
/*** Get i18n Model*/function i18n()​/*** Get the resource service model*/function resourceService()
The event onUnknownTranslation
is emitted via an interception when a translation is not found. You will receive the following interception data packet:
{resource = ...,locale = ... ,bundle = ...}