<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Fabulous Adventures In Coding : localization</title><link>http://blogs.msdn.com/ericlippert/archive/tags/localization/default.aspx</link><description>Tags: localization</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Properties vs. Attributes</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/02/properties-vs-attributes.aspx</link><pubDate>Tue, 03 Feb 2009 00:02:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9391497</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/9391497.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=9391497</wfw:commentRss><description>&lt;div class="mine"&gt; &lt;p&gt;Here is yet another question I got from a C# user recently:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#000080"&gt;I have a class that represents a business rule. I want to add some rule metadata that could be used by consumers to retrieve a friendlier rule name, description, and anything else that makes sense. Should this information be exposed as an &lt;em&gt;attribute&lt;/em&gt; or &lt;em&gt;property&lt;/em&gt; on the class?&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I would say to absolutely go for a property in this case, for four reasons.  &lt;p&gt;First, properties are highly discoverable. Consumers of this class can use IntelliSense to see that there is a property on the class called "Description" much more easily than they can see that there is an attribute. &lt;p&gt;Second, properties are much easier to use than attributes. You don't want to muck around with the code to extract strings from metadata attributes unless you really have to.  &lt;p&gt;Third, data such as names and descriptions is highly likely to be localized in the future. Making it a property means that the property getter code can read the string out of a resource, a resource which you can hand off to your localization experts when it comes time to ship the Japanese version.  &lt;p&gt;And fourth, let's go back to basic object-oriented design principles. You are attempting to model something -- in this case, the class is modeling a "business rule".  &lt;p&gt;Note that &lt;em&gt;a business rule is not a class&lt;/em&gt;. Nor is a rule an interface. A rule is neither a property nor a method. A rule isn't &lt;em&gt;any&lt;/em&gt; programming language construct. A rule is a &lt;em&gt;rule&lt;/em&gt;; classes and structs and interfaces and whatnot are &lt;em&gt;mechanisms&lt;/em&gt; that we use to &lt;em&gt;implement&lt;/em&gt; model elements that &lt;em&gt;represent&lt;/em&gt; the desired semantics in a manner that we as software developers find &lt;em&gt;amenable to our tools&lt;/em&gt;.&amp;nbsp; &lt;strong&gt;But let's be careful to not confuse the thing being modeled with the mechanisms we use to model it.&lt;/strong&gt;  &lt;p&gt;Properties and fields and interfaces and classes and whatnot are part of the model; each one of those things should represent something in the model world. If a property of a "rule" is its "description" then there should be something &lt;em&gt;in the model&lt;/em&gt; that you're implementing which represents this. We have invented properties specifically to model the "an x has the property y" relationship, so use them.  &lt;p&gt;That's not at all what attributes are for. Think about a typical usage of attributes: &lt;span class="code"&gt; &lt;p&gt;[Obsolete]&lt;br&gt;[Serializable]&lt;br&gt;public class Giraffe : Animal &lt;br&gt;{ ... &lt;/span&gt; &lt;p&gt;Attributes typically do not have anything to do with the semantics of the thing being modeled. Attributes are &lt;strong&gt;facts about the mechanisms&lt;/strong&gt; - the classes and fields and formal parameters and whatnot. Clearly this does not mean "a giraffe &lt;em&gt;has an&lt;/em&gt; obsolete and a serializable." This also does not mean that giraffes are obsolete or serializable. That doesn't make any sense. This says that &lt;em&gt;the class&lt;/em&gt; named Giraffe is obsolete and &lt;em&gt;the class&lt;/em&gt; named Giraffe is serializable.  &lt;p&gt;In short: &lt;strong&gt;use attributes to describe your mechanisms, use properties to model the domain.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9391497" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Code+Quality/default.aspx">Code Quality</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/localization/default.aspx">localization</category></item><item><title>JScript, Localization and Those Wacky Newfoundlanders</title><link>http://blogs.msdn.com/ericlippert/archive/2004/05/18/jscript-localization-and-those-wacky-newfoundlanders.aspx</link><pubDate>Tue, 18 May 2004 19:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:134358</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/134358.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=134358</wfw:commentRss><description>&lt;div&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;I was talking about &lt;a href="http://blogs.msdn.com/ericlippert/archive/2004/05/10/129481.aspx"&gt;localization in general &lt;/a&gt;the other day.&amp;nbsp; Today, some brief notes on localization in JScript Classic. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;A while back, a coworker asked me: &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" color="blue" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="navy" size="2"&gt;&lt;span&gt;Does &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toLocaleString()&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="navy" size="2"&gt;&lt;span&gt; do anything different than &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toString()&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="navy" size="2"&gt;&lt;span&gt; when locale changes? &amp;nbsp;I am especially interested date formats when you run code in a place inside the United States that has weird Daylight Savings Time rules.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;That's actually quite a complicated question.&amp;nbsp; I'm going to break that down into many sub-questions. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="navy" size="3"&gt;&lt;span&gt;What locale does JScript Classic use when it needs to change its output based on locale? &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;It depends on the host&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;. &amp;nbsp;JScript and VBScript have their own locale settings which may be &lt;b&gt;&lt;span&gt;independent&lt;/span&gt;&lt;/b&gt; from the host, user and machine settings.&amp;nbsp; A web browser host could, for example, set the script engine to be French if it were displaying a French web page.&amp;nbsp; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;IE has changed their algorithm (both intentionally and accidentally) many times over the years.&amp;nbsp; Sometimes they used the locale of the user, sometimes they always defaulted to US-English.&amp;nbsp; I believe we are now in "always default to US-English" mode in IE.&amp;nbsp; It's confusing because the script engines have the ability to change the locale used for the &lt;b&gt;&lt;span&gt;error messages&lt;/span&gt;&lt;/b&gt; independent of the locale used to format dates, numbers, etc.&amp;nbsp; This allows for exotic scenarios like a VBScript host which displays French error messages while running scripts which use Japanese date formats. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;I am not aware of any hosts which actually use these features!&amp;nbsp; We added them when IE4 shipped, but it turned out that IE didn't need the feature after all. &amp;nbsp;However, in the interests of completeness, I'm going to document JScript's behaviour as though there actually were a host that exposed this feature. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="navy" size="3"&gt;&lt;span&gt;How many methods are there in JScript intended for localization, and what are they? &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;Nine.&amp;nbsp; On the &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;String&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; prototype there are three: &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toLocaleLowerCase&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;, &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toLocaleUpperCase&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; and &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;localeCompare&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;. The&amp;nbsp;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;Date&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; prototype has &lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toLocaleDateString&lt;font face="Lucida Sans Unicode" color="#800080"&gt;,&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toLocaleTimeString&lt;font face="Lucida Sans Unicode" color="#800080"&gt;, and&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toLocaleString&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span&gt;.&amp;nbsp; &lt;font size="2"&gt;&lt;span&gt;T&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;he &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;Array&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;, &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;Object&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;, and&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;Number&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;prototype objects each have an implementation of &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toLocaleString&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="navy" size="3"&gt;&lt;span&gt;Do any of these methods change their output when the script engine is in a different locale? &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;Yes, eight of them do.&amp;nbsp; Of course, they depend on the &lt;b&gt;&lt;span&gt;script engine locale&lt;/span&gt;&lt;/b&gt;, which as I noted above may different from the user locale, depending on the whim of the script host. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;Object.prototype.toLocaleString&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; simply calls &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toString&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;.&amp;nbsp; No localization behaviour here unless of course you have overridden the prototype. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;Array.prototype.toLocaleString&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; uses the operating system's localized list separator and recursively calls &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toLocaleString&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; on each of its members to generate a localized, comma-or-whatever-your-locale-prefers separated list. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;Number.prototype.toLocaleString&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; uses &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;GetNumberFormat&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; to get the number separator and decimal point.&amp;nbsp; If for any reason that fails, we fall back to OLE Automation's &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;VariantChangeTypeEx&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;, which is locale-sensitive. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;Date.prototype.&lt;span&gt;toLocaleDateString&lt;font face="Lucida Sans Unicode" color="#800080"&gt;,&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;span&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toLocaleTimeString&lt;font face="Lucida Sans Unicode" color="#800080"&gt;, and&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="#800080" size="2"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toLocaleString&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="#800080" size="2"&gt;&lt;span&gt;&amp;nbsp;are complicated by some bizarre weirdnesses in the Win32 NLS API.&amp;nbsp; To work around various problems, only dates between 1600 and 10000 AD are localized. Hebrew date formats for years after 2240 AD are also not supported.&amp;nbsp; Once we jump through those hurdles, the Win32 APIs &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;GetDateFormat&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; and &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;GetTimeFormat&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; are used to format the strings.&amp;nbsp; (I'm vaguely recalling that there was also a bug in there involving the Thai calendar but I don't remember the details.) &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;String.prototype.toLocaleLowerCase, toLocaleUppercase, toLowerCase &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;and &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;toUpperCase&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; are buggy -- they use the default user locale, not the script engine locale.&amp;nbsp; Looks like I was careless when I implemented the script engine locale feature.&amp;nbsp; I wouldn't expect those bugs to be fixed any time soon, since as far as I know, I'm the first person to find the bugs since I implemented them! &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;They just use &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;LCMapCase&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; to change the case of a string using the localized rules. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;String.prototype.localeCompare&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; uses the script engine locale to call &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console" color="navy" size="2"&gt;&lt;span&gt;CompareString&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt; on two Unicode strings. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="navy" size="3"&gt;&lt;span&gt;What about Daylight Savings Time? &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;The JScript runtime library always determines the local time zone offset by calling into various operating system APIs.&amp;nbsp; If the operating system gets the DST calculation right in whatever weird state you're in, JScript will also get it right.&amp;nbsp; If the operating system gets it wrong, complain to the Windows guys, not me. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="navy" size="3"&gt;&lt;span&gt;Speaking of that, exactly which of the United States have weird Daylight Savings Time rules? &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;They are Alabama, Alaska, Arkansas, California, Colorado, Connecticut, Delaware, Florida, Georgia, Idaho, Illinois, western and eastern portions of Indiana, Iowa, Kansas, Kentucky, Louisiana, Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana, Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina, North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina, South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia, Wisconsin and Wyoming.&amp;nbsp; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;These bizarre states actually &lt;i&gt;&lt;span&gt;legally mandate &lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span&gt;millions&lt;/span&gt;&lt;/b&gt; of people to change their clocks twice a year in a confusing, pointless and error-prone light-saving gimmick. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;Arizona, Hawaii and central portions of Indiana have a single, sensible, simple DST rule: "we do not observe Daylight Savings Time." &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;For what it's worth, My Home And Native Land doesn't fare much better.&amp;nbsp; All young Canadians grow up knowing the phrase "Coming up at &lt;b&gt;&lt;span&gt;two-o'clock-two-thirty-in-Newfoundland&lt;/span&gt;&lt;/b&gt;..."&amp;nbsp; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="navy" size="3"&gt;&lt;span&gt;A half-hour timezone?&amp;nbsp; What the heck? &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;Yep.&amp;nbsp; They're half an hour ahead of the rest of us in Newfoundland.&amp;nbsp; One year Newfoundland decided to try an experiment in "Double Daylight Savings Time" -- they sprang forward TWO hours.&amp;nbsp; Of course, they were already sprung forward half an hour as it was.&amp;nbsp; It didn't get dark until 11 PM. There was no end of problems. The failed experiment was described in the Newfoundland assembly a few years later like this: &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="navy" size="2"&gt;&lt;span&gt;We were up all night, all day; we could not get to sleep. You could not get a coffee in the morning at Tim Horton's because there was no coffee; there was no morning. It was just going around - the sun never set.&amp;nbsp; Newfoundland - the place where the sun never set. I think the Minister of Environment at that time was the honourable John Butt. &amp;nbsp;I believe he led the way in that great endeavour. He had Newfoundlanders going around - they did not know whether they were asleep, whether they should go to bed, whether they should get up. I think it was at 1:00 a.m. that we used to get a little bit of dusk, and before you knew it, it was daylight again. John even had the sun running the way he wanted it. He had the sun slowed down. That is how the Tories operated. He said he did that after consultation with the people. The only thing he consulted with must have been a crystal ball or something. He must have looked into a crystal ball, because before half the summer was out, the Premier of the day was trying to have the time switched back again.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;Somehow I managed to segue from localization rules to Newfie partisan politics; this would probably be a good time to stop. &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode" color="purple" size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=134358" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/JScript/default.aspx">JScript</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Scripting/default.aspx">Scripting</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/localization/default.aspx">localization</category></item><item><title>Some LΘ℃αℓization Questions</title><link>http://blogs.msdn.com/ericlippert/archive/2004/05/10/some-l-ization-questions.aspx</link><pubDate>Tue, 11 May 2004 01:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:129481</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>15</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/129481.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=129481</wfw:commentRss><description>&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;A reader asked me a few questions about localization the other day.&amp;nbsp; That's not a subject that I have a lot of experience on, but I can speak to it a bit.&amp;nbsp; (I know that I've seen a blog from a Microsoft localization PM &lt;I&gt;&lt;SPAN&gt;somewhere&lt;/SPAN&gt;&lt;/I&gt; in the last six months, but cannot for the life of me remember who, and my google-fu has failed me.&amp;nbsp; Anyone know about whom I'm thinking?)
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=#333399 size=2&gt;&lt;SPAN&gt;If your employer does not have a "current need" but maybe a "future need" for internationalization, how far do you go while coding?
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Hard question.&amp;nbsp; Accessibility and localization have a lot in common; both are about making software usable by people who may have quite different UI needs than the "typical" user.&amp;nbsp; My friend and world-famous accessibility guru &lt;A title=http://www.bestkungfu.com/ href="http://www.bestkungfu.com/"&gt;Matt&lt;/A&gt; has &lt;A title=http://www.bestkungfu.com/archive/?keyword=accessibility href="http://www.bestkungfu.com/archive/?keyword=accessibility"&gt;often&lt;/A&gt; made the point that accessibility is not a "feature" that can be added on post hoc, but rather something that has to be baked in.&amp;nbsp; Well, the same goes for localization.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;It's a hard question because it really depends a lot on what you're doing.&amp;nbsp; I mostly write dev tool back end systems -- compilers and code generators and whatnot. I leave the UI to other people.&amp;nbsp; Since my code mostly turns one kind of string (source code) into another kind of string (machine code), I do not require much localization support.&amp;nbsp; Some, yes.&amp;nbsp; I make sure that all the error strings are in resource files and all the string manipulation plays well with Unicode, and I'm pretty much done.&amp;nbsp; The people who write the tooltips and help system and all the other UI-heavy stuff have a lot more internationalization worries.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=#333399 size=2&gt;&lt;SPAN&gt;Do you hard code strings until the class unit tests OK, then go back and add them to a resource file?
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;I wouldn't.&amp;nbsp; Sounds like more work than doing it right in the first place.&amp;nbsp; 
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Something we did when we started our current project -- I mean, like, day one of coding -- was wrote up a dead simple class that was just a "string server".&amp;nbsp; We give it a magic constant, it gives us back a string.&amp;nbsp; That meant that we were then free to figure out later how the strings would actually be stored.&amp;nbsp; They started off as hard-coded in the string server class for the first couple days, and then we figured out how to get it all working in resource files.&amp;nbsp; Make it flexible enough and you'll be able to change the underlying storage without disturbing all the string consumers.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=#333399 size=2&gt;&lt;SPAN&gt;Do you always/sometimes/never calculate UI layout fields using MFC's GetTextExtent() or similar?
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;I haven't written an MFC app for a long, long time.&amp;nbsp; But how else would you do it?&amp;nbsp; What, just guess at how big it's going to be, and hope that you never change the text, font, size, layout, etc?&amp;nbsp; It seems fundamentally brittle, and hence more work, to make assumptions.&amp;nbsp; (&lt;A title=http://weblogs.asp.net/oldnewthing/ href="http://weblogs.asp.net/oldnewthing/"&gt;Raymond&lt;/A&gt; talked about a similar issue with &lt;A title=http://weblogs.asp.net/oldnewthing/archive/2004/02/17/74811.aspx href="http://weblogs.asp.net/oldnewthing/archive/2004/02/17/74811.aspx"&gt;determining rectangle extents&lt;/A&gt; a while back.)
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=#333399 size=2&gt;&lt;SPAN&gt;Do you think about right-to-left reading languages up front?
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Oh yeah -- any time there is the potential for bidirectional text, it pays to think about it early.&amp;nbsp; Something we did in the script engine syntax colouring code for instance was add a bit that basically meant "this chunk of text is probably a human-readable string, and therefore the dev environment needs to figure out whether it is an RTL or LTR string."&amp;nbsp; (I just got a bug on that code a couple weeks ago, actually, which is why it immediately comes to mind.)
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=#333399 size=2&gt;&lt;SPAN&gt;Is the UI abstracted to a resource DLL along with the string table?
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;We did in WSH.&amp;nbsp; I'm not sure that I could really speak to the pros and cons.&amp;nbsp; Like I said, user interfaces are not my strong suit.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=#333399 size=2&gt;&lt;SPAN&gt;Does the average programmer at Microsoft just do their thing and pass the code down to an internationalization expert who then adapts the code?
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;No, all the devs are responsible for writing the localization code.&amp;nbsp; The actual translation of the resources into foreign languages is done by experts of course.&amp;nbsp; Most teams have at least one "loc PM" and "loc tester" who are a good people to know when you have technical problems, need to track down bugs that only repro on the Korean build, etc.&amp;nbsp; 
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;We often do what we call "pseudolocalization" builds as easy sanity checks.&amp;nbsp; That is, we run the resources and whatnot through a pseudolocalizer, which replaces all the English text with stuff that is still readable, but is not normal English.&amp;nbsp; For instance, it might replace an instance of u0041 (LATIN CAPITAL LETTER A) with u24B6 (CIRCLED LATIN CAPITAL LETTER A).&amp;nbsp; It replaces every letter with a similar-looking letter in some random Unicode range, makes strings longer (to see if things fall off the ends of dialog boxes) by padding stuff out, bumps up font sizes in dialogs, etc.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Then we do a test run and see what breaks, what looks godawful, etc. But since it is only pseudo-localized, we can still read the dialog boxes and error messages and whatnot without running down the hall to find a colleague who speaks Bulgarian.&amp;nbsp; (Not that you'd have to go far; my team just hired our third Bulgarian speaker last week.)&amp;nbsp; Using pseudolocalization is way, way faster and easier than actually sending the bits to Ireland and Japan for localization and then testing the real-localized bits.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;And something you didn't mention, but I'll call out right now: it is much more expensive to localize bitmaps than text, and very hard to make them accessible.&amp;nbsp; If you care about localization, don't go putting words onto bitmaps.&amp;nbsp; For that matter, don't go putting any picture on there that only makes sense to North Americans (like, say, most traffic signs.)
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=#333399 size=2&gt;&lt;SPAN&gt;This is a topic that no green programmer is aware of (that I ever found), and many experienced developers don't even consider.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;One of the reasons that Microsoft has been successful is very straightforward: we look for things that make people NOT use our products, and try to eliminate them.&amp;nbsp; As I said in an &lt;A title=http://weblogs.asp.net/ericlippert/archive/2003/10/28/53298.aspx href="http://weblogs.asp.net/ericlippert/archive/2003/10/28/53298.aspx"&gt;earlier blog entry&lt;/A&gt;, we care about legally blind Catalan-speaking customers.&amp;nbsp; If we didn't, they wouldn't be customers.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;You are correct, and I would add security and accessibility to the list of things that some developers never think about, which is too bad. None of those things are easy to add post hoc, and all of them are barriers to entry.&amp;nbsp; We're trying to get security, accessibility and localizability baked into the framework itself -- nothing will make these things &lt;I&gt;&lt;SPAN&gt;easy&lt;/SPAN&gt;&lt;/I&gt;, but we can at least make it a little less mind-bogglingly difficult.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;But, like I said, I am far, far from an expert on localizability.&amp;nbsp; If you have questions for a real expert, go ask &lt;A title=http://www.microsoft.com/globaldev/DrIntl/default.mspx href="http://www.microsoft.com/globaldev/DrIntl/default.mspx"&gt;&lt;FONT title=http://www.microsoft.com/globaldev/DrIntl/default.mspx color=purple&gt;&lt;SPAN title=http://www.microsoft.com/globaldev/DrIntl/default.mspx&gt;Doctor International&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/A&gt;, or read the good doctor's &lt;A title=http://www.microsoft.com/MSPress/books/5717.asp href="http://www.microsoft.com/MSPress/books/5717.asp"&gt;&lt;FONT title=http://www.microsoft.com/MSPress/books/5717.asp color=purple&gt;&lt;SPAN title=http://www.microsoft.com/MSPress/books/5717.asp&gt;book&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/A&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=129481" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/COM+Programming/default.aspx">COM Programming</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/localization/default.aspx">localization</category></item></channel></rss>