<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Translating Excel Applications</title>
	<atom:link href="http://www.dailydoseofexcel.com/archives/2009/02/17/translating-excel-applications/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dailydoseofexcel.com/archives/2009/02/17/translating-excel-applications/</link>
	<description>Daily posts of Excel tips…and other stuff</description>
	<lastBuildDate>Thu, 09 Feb 2012 23:42:03 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>By: Robin Hammond</title>
		<link>http://www.dailydoseofexcel.com/archives/2009/02/17/translating-excel-applications/#comment-38081</link>
		<dc:creator>Robin Hammond</dc:creator>
		<pubDate>Fri, 20 Feb 2009 09:53:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.dailydoseofexcel.com/?p=2098#comment-38081</guid>
		<description>&lt;p&gt;We&#039;ve been working on totally multi-lingual interfaces for a while now. Language string for forms are in a sheet contained within an addin, strings for messages/progress bar captions etc. are in a sheet, with look ups based on language ids. Unfortunately it gets worse: form captions and message box captions cannot handle some of the international fonts, so we have a form handler that manages international captions, and a custom crafted message class. After that, it get&#039;s worse: any form contents also need translation. e.g. translating the contents of lists, whether it is simple - e.g. ones, thousands, millions, or complex - what&#039;s the name of this abstract thing in the user&#039;s language. A lot of that we handle through database translation tables. Then it get&#039;s worse. Because we&#039;re data driven, any form contents require translation back into english when passed to the db (for efficiency against indexes, and readability), and back into the user language for output. Output is complicated: what number formats exist in a given language, how are dates displayed, etc... On top of all this, we have to translate command bars, the dreaded ribbon, help files. GOOD LUCK.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>We&#8217;ve been working on totally multi-lingual interfaces for a while now. Language string for forms are in a sheet contained within an addin, strings for messages/progress bar captions etc. are in a sheet, with look ups based on language ids. Unfortunately it gets worse: form captions and message box captions cannot handle some of the international fonts, so we have a form handler that manages international captions, and a custom crafted message class. After that, it get&#8217;s worse: any form contents also need translation. e.g. translating the contents of lists, whether it is simple &#8211; e.g. ones, thousands, millions, or complex &#8211; what&#8217;s the name of this abstract thing in the user&#8217;s language. A lot of that we handle through database translation tables. Then it get&#8217;s worse. Because we&#8217;re data driven, any form contents require translation back into english when passed to the db (for efficiency against indexes, and readability), and back into the user language for output. Output is complicated: what number formats exist in a given language, how are dates displayed, etc&#8230; On top of all this, we have to translate command bars, the dreaded ribbon, help files. GOOD LUCK.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tushar Mehta</title>
		<link>http://www.dailydoseofexcel.com/archives/2009/02/17/translating-excel-applications/#comment-38077</link>
		<dc:creator>Tushar Mehta</dc:creator>
		<pubDate>Fri, 20 Feb 2009 05:41:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.dailydoseofexcel.com/?p=2098#comment-38077</guid>
		<description>&lt;p&gt;The big issue with multi-language support (MLS) is not the translation thing but the aesthetic thing.  That has been what has put me off &quot;automated MLS.&quot;&lt;/p&gt;
&lt;p&gt;I would suggest doing this as a two step process with a specific, and relatively simple, data structure: a table with columns: Control ID, Language ID, Text, Left, Width, Top, Height.&lt;/p&gt;
&lt;p&gt;Adding a new language would be something done at design time.  The first step is to add the text for the language.&lt;/p&gt;
&lt;p&gt;I haven&#039;t done much programming in the VBE environment.  So, I don&#039;t know how easy the following is.  At worst, one can always do what&#039;s needed &quot;by hand.&quot; {grin}&lt;/p&gt;
&lt;p&gt;Now, (use code to?) update the userform (or whatever UI you are using) with the new text.  With the new text in place, adjust the userform controls so that they are readable and aesthetically appealing.&lt;/p&gt;
&lt;p&gt;Now, update the table with the controls&#039; dimensions.&lt;/p&gt;
&lt;p&gt;The runtime MLS support code works with both the language text and control position/size.&lt;/p&gt;
&lt;p&gt;The task of handling error messages should be a lot simpler...I think...&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>The big issue with multi-language support (MLS) is not the translation thing but the aesthetic thing.  That has been what has put me off &#8220;automated MLS.&#8221;</p>
<p>I would suggest doing this as a two step process with a specific, and relatively simple, data structure: a table with columns: Control ID, Language ID, Text, Left, Width, Top, Height.</p>
<p>Adding a new language would be something done at design time.  The first step is to add the text for the language.</p>
<p>I haven&#8217;t done much programming in the VBE environment.  So, I don&#8217;t know how easy the following is.  At worst, one can always do what&#8217;s needed &#8220;by hand.&#8221; {grin}</p>
<p>Now, (use code to?) update the userform (or whatever UI you are using) with the new text.  With the new text in place, adjust the userform controls so that they are readable and aesthetically appealing.</p>
<p>Now, update the table with the controls&#8217; dimensions.</p>
<p>The runtime MLS support code works with both the language text and control position/size.</p>
<p>The task of handling error messages should be a lot simpler&#8230;I think&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Harald Staff</title>
		<link>http://www.dailydoseofexcel.com/archives/2009/02/17/translating-excel-applications/#comment-38027</link>
		<dc:creator>Harald Staff</dc:creator>
		<pubDate>Tue, 17 Feb 2009 19:16:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.dailydoseofexcel.com/?p=2098#comment-38027</guid>
		<description>&lt;p&gt;Without extensive experiences with this; any lookup table system will do. I feel the problem is length of text when changing language. How wide is a label; how high is a checkbox, to contain all versions, and how silly does it then look using the most effective language?&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Without extensive experiences with this; any lookup table system will do. I feel the problem is length of text when changing language. How wide is a label; how high is a checkbox, to contain all versions, and how silly does it then look using the most effective language?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Matt</title>
		<link>http://www.dailydoseofexcel.com/archives/2009/02/17/translating-excel-applications/#comment-38023</link>
		<dc:creator>Matt</dc:creator>
		<pubDate>Tue, 17 Feb 2009 17:20:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.dailydoseofexcel.com/?p=2098#comment-38023</guid>
		<description>&lt;p&gt;Looks like I do the same as a few people here.&lt;/p&gt;
&lt;p&gt;Separate sheet with the first column being the unique identifier, and then a column per language. Display text is generated by finding the unique id (say lanMailSignoff or lantbCustomerName) and then using the language offset to find the text.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Looks like I do the same as a few people here.</p>
<p>Separate sheet with the first column being the unique identifier, and then a column per language. Display text is generated by finding the unique id (say lanMailSignoff or lantbCustomerName) and then using the language offset to find the text.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Mike Woodhouse</title>
		<link>http://www.dailydoseofexcel.com/archives/2009/02/17/translating-excel-applications/#comment-38022</link>
		<dc:creator>Mike Woodhouse</dc:creator>
		<pubDate>Tue, 17 Feb 2009 16:34:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.dailydoseofexcel.com/?p=2098#comment-38022</guid>
		<description>&lt;p&gt;I&#039;m so lazy: more than half my colleagues are German but their English is so good (it&#039;s the &quot;global language&quot; of the company) I don&#039;t bother with translations. But never having done something seldom stops me from having an opinion!&lt;/p&gt;
&lt;p&gt;I think I&#039;d be inclined to create some sort of enhanced Dictionary (there&#039;s a clue in the class name) that loads itself from some text resource, which could be a hidden worksheet, a module (ugh) or something external - text file, MDB, XML, whatever. Call it a Translator, perhaps.&lt;/p&gt;
&lt;p&gt;Beyond that, I think I&#039;d consider using some sort of magic to indicate the controls that needed to be considered: maybe use the Tag property, if it&#039;s free? Maybe put a &quot;C&quot; for caption needed, an &quot;A&quot; for accelerator and &quot;AC&quot; for both.&lt;/p&gt;
&lt;p&gt;Now my workflow can be something like this:&lt;br&gt;
1. Determine language and load my Translator&lt;br&gt;
2. Pass the form to the Translator, which works through the controls, setting properties as needed.&lt;/p&gt;
&lt;p&gt;I kinda hope that would work. I might even build a Collection or Translators (is there a collective noun? A Tower? As in Babel?) so that I could switch on demand, perhaps within a loaded form. It shouldn&#039;t take more than a few lines of code.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>I&#8217;m so lazy: more than half my colleagues are German but their English is so good (it&#8217;s the &#8220;global language&#8221; of the company) I don&#8217;t bother with translations. But never having done something seldom stops me from having an opinion!</p>
<p>I think I&#8217;d be inclined to create some sort of enhanced Dictionary (there&#8217;s a clue in the class name) that loads itself from some text resource, which could be a hidden worksheet, a module (ugh) or something external &#8211; text file, MDB, XML, whatever. Call it a Translator, perhaps.</p>
<p>Beyond that, I think I&#8217;d consider using some sort of magic to indicate the controls that needed to be considered: maybe use the Tag property, if it&#8217;s free? Maybe put a &#8220;C&#8221; for caption needed, an &#8220;A&#8221; for accelerator and &#8220;AC&#8221; for both.</p>
<p>Now my workflow can be something like this:<br />
1. Determine language and load my Translator<br />
2. Pass the form to the Translator, which works through the controls, setting properties as needed.</p>
<p>I kinda hope that would work. I might even build a Collection or Translators (is there a collective noun? A Tower? As in Babel?) so that I could switch on demand, perhaps within a loaded form. It shouldn&#8217;t take more than a few lines of code.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Nigel Heffernam</title>
		<link>http://www.dailydoseofexcel.com/archives/2009/02/17/translating-excel-applications/#comment-38020</link>
		<dc:creator>Nigel Heffernam</dc:creator>
		<pubDate>Tue, 17 Feb 2009 16:29:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.dailydoseofexcel.com/?p=2098#comment-38020</guid>
		<description>&lt;p&gt;Use tags, setting the tag string to be English-language caption. Or, better still, a name-caption pair delimited by a semicolon.&lt;/p&gt;
&lt;p&gt;This is less work than it sounds: after you&#039;ve written and tested the application, a short VBA subroutine can enumerate all the controls on each form and spreadsheet, and write a tag of ParentName;ControlName;EnglishCaption into each control&#039;s tag property AND to a hidden sheet, with the parent object name in column A, the control name on&#039;B&#039;,  and the English caption in &#039;C&#039; under the column heading &#039;English&#039;.&lt;/p&gt;
&lt;p&gt;Now  fill in the next column under the heading &#039;French&#039;, the next one in &#039;German&#039;, and so on. Advanced students may want to specify a code page, although this can be picked up from the registry too.&lt;/p&gt;
&lt;p&gt;On open, a subroutine queries the locale in the registry, then fills in all the captions. It is possible to fill in entries manually for chart captions and labels, a more difficult item to enumerate in code.&lt;/p&gt;
&lt;p&gt;It can be done without tags at all, but self-documenting controls are easier to debug!&lt;/p&gt;
&lt;p&gt;Apologies for not supplying the source code but I&#039;m away from my PC.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Use tags, setting the tag string to be English-language caption. Or, better still, a name-caption pair delimited by a semicolon.</p>
<p>This is less work than it sounds: after you&#8217;ve written and tested the application, a short VBA subroutine can enumerate all the controls on each form and spreadsheet, and write a tag of ParentName;ControlName;EnglishCaption into each control&#8217;s tag property AND to a hidden sheet, with the parent object name in column A, the control name on&#8217;B',  and the English caption in &#8216;C&#8217; under the column heading &#8216;English&#8217;.</p>
<p>Now  fill in the next column under the heading &#8216;French&#8217;, the next one in &#8216;German&#8217;, and so on. Advanced students may want to specify a code page, although this can be picked up from the registry too.</p>
<p>On open, a subroutine queries the locale in the registry, then fills in all the captions. It is possible to fill in entries manually for chart captions and labels, a more difficult item to enumerate in code.</p>
<p>It can be done without tags at all, but self-documenting controls are easier to debug!</p>
<p>Apologies for not supplying the source code but I&#8217;m away from my PC.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ross</title>
		<link>http://www.dailydoseofexcel.com/archives/2009/02/17/translating-excel-applications/#comment-38016</link>
		<dc:creator>Ross</dc:creator>
		<pubDate>Tue, 17 Feb 2009 16:09:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.dailydoseofexcel.com/?p=2098#comment-38016</guid>
		<description>&lt;p&gt;I don&#039;t do this, but I think that you would have to put them in a table, so you can load them dynamically at run time and switch the language during install/in options. I think would then bug them in to constants. &lt;/p&gt;
&lt;p&gt;I have seen them other programes that do this, I think it makes sense.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>I don&#8217;t do this, but I think that you would have to put them in a table, so you can load them dynamically at run time and switch the language during install/in options. I think would then bug them in to constants. </p>
<p>I have seen them other programes that do this, I think it makes sense.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: keepITcool</title>
		<link>http://www.dailydoseofexcel.com/archives/2009/02/17/translating-excel-applications/#comment-38014</link>
		<dc:creator>keepITcool</dc:creator>
		<pubDate>Tue, 17 Feb 2009 15:41:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.dailydoseofexcel.com/?p=2098#comment-38014</guid>
		<description>&lt;p&gt;I store all the translations in an excel file (easiest to edit for translators or finicky clients). I use 1 column for the (unique) ID, one column per language. &lt;/p&gt;
&lt;p&gt;On application load or language change I read the file and store the strings in a scripting dictionary. On form load I fill the needed captions, tooltips and messages from the dictionary. I prefer to use a function for all calls to the dictionary so I can trap missing ID&#039;s. .. &lt;/p&gt;
&lt;p&gt;You&#039;ll find that most languages require more space than English. Hungarian is even worse than German (or maybe it&#039;s my translator who needs more words?) Just keep plenty of space. I never use autosize and textwrap for my controls.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>I store all the translations in an excel file (easiest to edit for translators or finicky clients). I use 1 column for the (unique) ID, one column per language. </p>
<p>On application load or language change I read the file and store the strings in a scripting dictionary. On form load I fill the needed captions, tooltips and messages from the dictionary. I prefer to use a function for all calls to the dictionary so I can trap missing ID&#8217;s. .. </p>
<p>You&#8217;ll find that most languages require more space than English. Hungarian is even worse than German (or maybe it&#8217;s my translator who needs more words?) Just keep plenty of space. I never use autosize and textwrap for my controls.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jan Karel Pieterse</title>
		<link>http://www.dailydoseofexcel.com/archives/2009/02/17/translating-excel-applications/#comment-38013</link>
		<dc:creator>Jan Karel Pieterse</dc:creator>
		<pubDate>Tue, 17 Feb 2009 15:27:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.dailydoseofexcel.com/?p=2098#comment-38013</guid>
		<description>&lt;p&gt;I write my translations in a worksheet and use some code that reads he translations in arrays during init.&lt;/p&gt;
&lt;p&gt;See:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.jkp-ads.com/articles/distributemacro09.asp&quot; rel=&quot;nofollow&quot;&gt;http://www.jkp-ads.com/articles/distributemacro09.asp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The code for reading the strings is a bit clumsy, but it works fine.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>I write my translations in a worksheet and use some code that reads he translations in arrays during init.</p>
<p>See:</p>
<p><a href="http://www.jkp-ads.com/articles/distributemacro09.asp" rel="nofollow">http://www.jkp-ads.com/articles/distributemacro09.asp</a></p>
<p>The code for reading the strings is a bit clumsy, but it works fine.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

