Whats New With 2.0.0
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.cfc
cbi18n = {
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.
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 = ...
}
Last modified 2yr ago