
I like to think in terms of [serialized] objects and not strings. Besides having to internationalize images sometimes I need to do the same to arrays of strings or any type of object. In the use case of array of strings, I may in English have a selection or radii ["25 miles", "50 miles", "75 miles" "100 miles", "150 miles", "200 miles"]. However in a different language I may have ["50km", "100km", "150km", "250km"]. Because the unit is different I may more or fewer items in the array. The items in the array may not even be strings but a unit object that has both
runtime scaler and runtime unit.
There is a general approach to solve such issues, even if this is not supported by the library. You use following: double factor = atof(dgettext("Distance conversion factor for km","1.0").c_str()); int local_distance = static_cast<int>(metric_distance * factor); std::cout <<format(translate("{1,num} kms","{1,num} kms",local_distance)) % local_distance That's it. You just define some translation string and use it as localization reasource. And tanslator translates this factor to ~1.6 and kms to miles according to locale.
So using ICU how would I store and retrieve an array of objects using boost serialization into one field.
For serialization you should always use locale insensitive data. For example metric system. As for time we alawys use POSIX time wich always relates to UTC.
Does ICU support any kind of contenttype, metadata or filename extension that
could identify such items to tools? Will your Locale library have any add on or enhancement to simplify
this use-case;
perhaps translate<object type> versus translate?
This is done differently. Lets define following: class distance { int meters; }; std::ostream &operator<<(std::ostream &out,distance const &d) { // get stream specific locale std::locale l=out.getloc(); // get stream specific factor double factor = atof(dgettext("Distance conversion factor for km","1.0",l).c_str()); int local_distance = static_cast<int>(metric_distance * factor); // format the distance is stream specific units. out <<format(translate("{1,num} kms","{1,num} kms",local_distance)) % local_distance } Note: locaization is different for serialization and it is wrong way to look on them this way. Serialization is provided for computer-to-computer interface while localization is provided for computer-to-human interface and it is much more compilcated. For example, for serialization of time point it is enought to write it as number representing POSIX time to stream. time_t time_point=time(0); std::cout << time_point; // would be something like 32452345 For human you would write time_t time_point=time(0); std::cout << as::date_time << time_point; // may be something like 03/02/2010 12:30:02 Artyom