Sorry folks- my SQL bug.
I was using a char column for the struct index string. Now I know that char columns 
always come back padded with spaces.
:-(
I will use varchar from now on! :-)

At 06:57 PM 8/7/00 -0400, Peter Theobald wrote:
>I have coded the translation algorithm mentioned in the earlier, included message. I 
>am getting an error.
>The line:
>
>        <cfset label = Application.langlabels[currentlanguage]> 
>
>Is getting the error:
>
>The expression specifying dimension 1 of the object Application.langlabels is not an 
>integer expression. Only integer expressions can be used to index objects.
>
>This is on a struct, so why would it not allow me to use a string value as an index?
>Can anyone see what I am doing wrong? Code below: (sorry if my email program ruins my 
>tabbing)
>I've tried it with and without the commented parts.
>
>The data structure should look like this:
>
>Application.langlabels.en[ labelname ] = "Englishvalue"
>Application.langlabels.fr[ labelname ] = "Frenchvalue"
>...and so on...
>
><!--- from Application.cfm --->
><!--- Load multilingual values ONCE ---> 
><cfif NOT IsDefined("Application.langlabels")> 
><cfquery name="dbLangLabels" datasource= #SCDSN#> 
>        select language, labelname, value from LangLabels 
></cfquery> 
><cflock scope="Application" type="Exclusive" timeout=60> 
>        <cfset Application.langlabels = StructNew()> 
>        <!--- Tried with & without this:
>        <cfset Application.langlabels['en'] = StructNew()>
>        <cfset Application.langlabels['fr'] = StructNew()>
>        --->
>        <cfloop query="dbLangLabels"> 
>                <!--- tried with and witthout this:
>                <cfif NOT StructKeyExists( Application.langlabels, 
>dbLangLabels.language)> 
>                        <cfset Application.langlabels[dbLangLabels.language] = 
>StructNew()> 
>                </cfif>
>                --->
>                <cfset 
>Application.langlabels[dbLangLabels.language][dbLangLabels.labelname] 
>                        = dbLangLabels.value> 
>        </cfloop> 
></cflock> 
></cfif>
>
><!--- for every page, load local variable with appropriate language values ---> 
><cflock scope='Session' timeout=30 type="Exclusive"> 
>        <cfparam name="Session.currentlanguage" default="en"> 
>        <cfset variables.currentlanguage = Session.currentlanguage> 
></cflock> 
><!--- <cfset label = StructNew()> ??? ---> 
><cflock scope='Application' timeout=30 type="ReadOnly"> 
>        <cfset label = Application.langlabels[currentlanguage]> 
>        <!--- ERROR OCCURS HERE ^^^^^ --->
></cflock>
>
><!--- throughout page access labels like this: #label.lblname# --->
>
>
>
>At 01:15 AM 8/5/00 -0400, Peter Theobald wrote:
>>Dan, I hope you dont mind I decided to share this with the list...
>>
>>Please tell me how you are currently doing it, as I'd like to hear everything on the 
>topic.
>>
>>We were originally just doing the site in English and French, and planned to have 
>two completely parallel versions of the site. UGH! What a pain to maintain. We were 
>spending all our time putting changes into both versions of the page. Now we are 
>doing English, French, German, Italian, and Spanish so it is out of the question to 
>maintain 5 parallel sites!
>>
>>We needed a way to efficiently substitute the appropriate text in whichever 
>language, and to maintain the lists of text.
>>We looked at XML/XSL (too complex), we looked at having database queries pull each 
>and every label out (too slow).
>>
>>We finally decided to put every single label and text in the entire site into 
>variables in a structure, and encase the entire page in one long <CFOUTPUT> do to the 
>substitution (instead of hundreds of little <CFOUTPUT>s).
>>Originally we were going to INCLUDE a file with:
>>
>><CFSCRIPT>
>>enlabel.welcome = "Welcome";
>>delabel.welcome = "Velkommen";
>>frlabel.welcome = "Bienvenue";
>>
>>and so on...
>>
>>But after the great help of people on the CFTALK list I learned a few things about 
>scoping variables. Now I can store all the values in the database for great 
>maintainability and put the values into an Application scoped variable that only gets 
>loaded once.
>>
>>table multilingual
>>        language char[2]
>>        labelname char[15]
>>        value varchar[1000]
>>
>>We will build appropriate admin pages, and an import facility from EXCEL files.
>>
>>Now, in the Application.cfm file we do ONE initial load into an Application scope 
>variable (or a Server scope variable - what is the difference??) that is only 
>executed ONCE like so:
>>
>>// Load all multilingual values ONCE
>>If (NOT IsDefined("Application.langlabels")) {
>>        query all rows from multilingual
>>        lock application
>>        application.langlabels = new array (two dimensional hash/struct)
>>        loop for all rows {
>>                application.langlabels[language][labelname] = value;
>>                application.langlabels['db'][labelname] = labelname; // for 
>debugging language 'db' will show labels on page
>>                }
>>        unlock application
>>        }
>>
>>// for every page, load local variable with appropriate language values (to avoid 
>locking every access)
>>readonly lock application
>> label = new array (one dimensional hash/struct)
>> label = langlabels[session.currentlanguage]
>>unlock
>>
>>---------------
>>Now in each page I put <CFOUTPUT> at the top and </CFOUTPUT> at the bottom.
>>I got rid of all my old plain <CFOUTPUT>s
>>I fixed all my db query <CFOUTPUT QUERY='queryname'> to </CFOUTPUT><CFOUTPUT 
>QUERY='queryname'>
>>        and </CFOUTPUT> to </CFOUTPUT><CFOUTPUT>
>>I did this because you can't nest CFOUTPUT blocks :-(
>>I fixed all # to ##
>>And I pulled out all English text and replaced it with #label.varname#
>>
>>Phwew....
>>Pulling out all the English text is a big job and we're not done yet. I'll let you 
>know how it works!
>>
>>                
>>
>>At 03:27 PM 8/4/00 -0700, Dan Haley wrote:
>>>I'd love to hear more on how you are doing translations . . . we are
>>>embarking on a rebuild of both the front-end and the back-end of our website
>>>and we need to come up with a better way of handling translations.  Let me
>>>know if you'd rather I call you and I can do that too.  I'm PST in the US.
>>>
>>>Thanks,
>>>Dan Haley
>>>Telect, Inc. 
>>
>>
>>---------------------------------------------------------------------------
>>Peter Theobald, Chief Technology Officer
>>LiquidStreaming http://www.liquidstreaming.com
>>[EMAIL PROTECTED]
>>Phone 1.212.545.1232 Fax 1.212.679.8032
>
>
>---------------------------------------------------------------------------
>Peter Theobald, Chief Technology Officer
>LiquidStreaming http://www.liquidstreaming.com
>[EMAIL PROTECTED]
>Phone 1.212.545.1232 Fax 1.212.679.8032
>
>------------------------------------------------------------------------------
>Archives: http://www.mail-archive.com/[email protected]/
>To Unsubscribe visit 
>http://www.houseoffusion.com/index.cfm?sidebar=lists&body=lists/cf_talk or send a 
>message to [EMAIL PROTECTED] with 'unsubscribe' in the body. 


---------------------------------------------------------------------------
Peter Theobald, Chief Technology Officer
LiquidStreaming http://www.liquidstreaming.com
[EMAIL PROTECTED]
Phone 1.212.545.1232 Fax 1.212.679.8032

------------------------------------------------------------------------------
Archives: http://www.mail-archive.com/[email protected]/
To Unsubscribe visit 
http://www.houseoffusion.com/index.cfm?sidebar=lists&body=lists/cf_talk or send a 
message to [EMAIL PROTECTED] with 'unsubscribe' in the body.

Reply via email to