Skip to main content link. Accesskey S
  • Log In
  • Help
  • IBM Logo
  • IBM Notes and Domino wiki
  • All Wikis
  • All Forums
  • Home
  • Product Documentation
  • Community Articles
  • Learning Center
  • IBM Redbooks
  • API Documentation
Search
Community Articles > Lotus Domino > App dev > Best Practices for multi cultural templates
  • New Article
  • Share Show Menu▼
  • Subscribe Show Menu▼

About the Original Author

Click to view profileMike R O'Brien
Contribution Summary:
  • Articles authored: 1
  • Articles edited: 1
  • Comments Posted: 0

Recent articles by this author

Best Practices for multi cultural templates

Template Development guideline for localization consideration Avoid using concatenation string Issue: The full sentence will be tagged into the separated terms in the DGW glossary if it contains the concatenation strings. As a result, template engineers need to know the which and which strings ...
Community articleBest Practices for multi cultural templates
Added by Mike R O'Brien | Edited by IBM contributorAmy Smith on July 31, 2012 | Version 3
  • Edit
  • More Actions Show Menu▼
Rate this article 1 starsRate this article 2 starsRate this article 3 starsRate this article 4 starsRate this article 5 stars
expanded Abstract
collapsed Abstract
No abstract provided.
Tags: templates, globalization

Template Development guideline for localization consideration

Avoid using concatenation string

Issue:

The full sentence will be tagged into the separated terms in the DGW glossary if it contains the concatenation strings. As a result, template engineers need to know the which and which strings will be contatenated together and provide comments for translation vendors for reference.
Sometimes the concatenation strings have different combination, the verb use in this string may not use in another strings due to different language culture. The sentence order needs to be adjusted after translation.


There are several patterns that we can use to fix these.

1) First pattern is to create a string that simply includes other string defines.


Here is an example from the Current Design: Mail8.ntf->form->(Out Of Office Profile) | OutOfOfficeProfile ->Postrecalc


Current Code

FIELD DaysOutDisplay:=@If(FirstDayOut = "" | FirstDayBack = ""; ""; "I will be out of the office starting " + @Text(@Date(FirstDayOut)) + " and will not return until " + @Text(@Date(FirstDayBack)) + ".");


Could be changed to

dispFirstDayOut := @Text(@Date(FirstDayOut));
dispFirstDayBack := @text(@Date(FirstDayBack));

{REM TSC The Next 3 strings are for concatentation }
{REM TSC The following string is the variable %disOOOString1 }
dispOOOstring1 := "I will be out of the office";

{REM TSC The following string is the variable %disOOOString2 }
dispOOOstring2 := " and will not return until";

{REM TSC The following string is used in the Out Of Office feature.
The %dispFirstDayOut is the time when a person starts their OOO,
dispFirstDayBack is the first day they are back}

FullString := "%disOOOString1 %dispFirstDayOut %dispOOOString2 %dispFirstDayBack";

FIELD DaysOutDisplay:=@If(FirstDayOut = "" | FirstDayBack = "";""; FullString);



DGW will produce property file values that will look like this.

# The Next 3 strings are for concatentation
# The following string is the variable %disOOOString1
Form.OutOfOfficeProfile.PostRecalc.I_will_be_out_of_the_office=I will be out of the office
# The following string is the variable %disOOOString2
Form.OutOfOfficeProfile.PostRecalc.and_will_not_return_until=and will not return until
# The following string is used in the Out Of Office feature.
# The %dispFirstDayOut is the time when a person starts their Out of Office,
# dispFirstDayBack is the first day they are back
Form.OutOfOfficeProfile.PostRecalc=%disOOOString1 %dispFirstDayOut %dispOOOString2 %dispFirstDayBack



2) Use a variable that can be translated so that the code can check the value to display the correct order


{ REM TSC The text of the next string determines the order of desplay of the following strings "Hello" and "World" }
OrderOfStings := "HelloFirst";
Field1 := "Hello";
Field2 := "World";

{ REM Begin DNT }
FIELD Display:=@If(OrderOfStrings = "HelloFirst" ;Field1+Field2; Field2+Field1)
{ REM End DNT }


DGW will produce property file values that will look like this.

# The text of the next string determines the order of display of the following strings "Hello" and "World"
Form.Memo.Action_Label_Formula.HelloFirst=HelloFirst
Form.Memo.Action_Label_Formula.Hello=Hello
Form.Memo.Action_Label_Formula.Hello=World



Add Comments for DNT terms and Hidden terms




1. DNT Terms in the LotusScript

'Begin Do Not Translate or
'Begin DNT



'End Do Not Translate

2. DNT terms in the Formula

REM {Begin Do Not Translate};
or
REM {Begin DNT};



REM {End Do Not Translate};


3. Always hidden terms

'Begin Always Hidden terms



'End Always Hidden terms

At least assign an alias for the forms and views. And the alias doesn't include space.



The form name and view name should be translated because they can be displayed on UI. So the design alias is necessary for programming consideration.
One more, we suggest the alias doesn't include space since it may be used on web.

Here is an example below,
In design: Mail8.ntf->Folder-> (Group Calendars)

Found NT title:

This folder's name "(Group Calendars)" should be translated because they will be displayed on UI, but it will cause function bug after translation.


Avoid using translatable string as programming condition



Example:
Current Design: Mail7ex.ntf->Form->CalendarProfile->"Change Access" button

Set item = note.getfirstitem("dspIndividualAccess")
strIndividualAccess = item.Text
lposition = Instr( strIndividualAccess, "Calendar notices are automatically forwarded to this person")

Field "dspIndividualAccess"



Issue:

Above code identity whether "Calendar notices are automatically forwarded to this person" is included into the field "dspIndividualAccess". 2 separated terms will be created into the DGW glossary. Template engineers need to add comments on them for translation vendors. This is an effort for Localization team.
The first sentence can not be translated as a sub-sentence of the second sentence on some international languages



Increase the default length of hotpot picture, or use the Notes button instead of it



Example:

Truncation:


Issue: If you want to use hotpot picture, please increase the default length of it to let the picture accommodate full international translation. Perhaps we should use the Notes button instead of the hotpot picture.


Use table column rather than the "tab" key to separate the static text from the field



Example:



Issue: this is an alignment problem. You can use table column rather than "tab" key to separate the static text from the field.

Define translatable strings as variables; put all translatable variables into one section.

Example:
mail7ex: CSCalendarEntry_zh-TW(Script Library): (Declarations)

If ( DurNDTend.TimeDifference( tmpNDT ) / 60) > 0 Then
Msgbox "Your start and end times result in a duration that is greater than 24 hours." + Chr(13) _
+ "Please check end date and time or Time Zone information." , MB_OK + MB_ICONSTOP, "Duration error"
CheckDuration = False
Exit Function
End If
If lDuration <= 0 Then ' I am not sure if this should be done here - within this function
Msgbox "Your start and end times result in a duration that is less than 1 minute." + Chr(13) _
+ "Please check end date and time or Time Zone information." + Chr(13) + "(Duration result is: " + Cstr(lDuration) + " )", MB_ICONSTOP ,"Duration error"
CheckDuration = False

Issue:

The translatable strings appear near the end of file, pls define them as some varialbles in the front of code and put them into one paragraph. Below is a good example:


Const ACCEPT_ERR_TITLE = "Calendar Conflict"
Const ACCEPT_ERR_DECLINE = "Part or all of this meeting is already on your calendar. You must decline those entries first before processing this notice."
Const ACCEPT_ERR_DELETE = "Part or all of this meeting is already in your mailfile. Would you like Notes to delete those entries and accept this instead?"


Example of strings in a column formula

Bad practice

@If(TargetObjectSubTypeProperty="1""Keywords";TargetObjectSubTypeProperty="2""Formula""");
@If(TargetObjectName="" & TargetObjectType = "1";" [Shared Actions]";TargetObjectType = "7";"[Database]";TargetObjectSubName !="" & TargetObjectSubTypeProperty != ""; TargetObjectName + "."+TargetObjectSubName+"."+Property;TargetObjectName+"."+TargetObjectSubNameTargetObjectSubName !="";TargetObjectName+"."+TargetObjectSubName;TargetObjectName)



The translator in this example will see the text strings "1" and think they have to translate it. The modified formula below shows a good practice.


Good practice

SharedActions :=" [Shared Actions]";
Database := "[Database]";
Keywords := "Keywords";
Formula := "Formula";

"REM Begin DNT";

@If(TargetObjectSubTypeProperty="1";Keywords;TargetObjectSubTypeProperty="2";Formula;"");
@If(TargetObjectName="" & TargetObjectType = "1";SharedActions;TargetObjectType = "7";Database;TargetObjectSubName !="" & TargetObjectSubTypeProperty != ""; TargetObjectName + "."+TargetObjectSubName+"."+Property;TargetObjectName+"."+TargetObjectSubNameTargetObjectSubName !="";TargetObjectName+"."+TargetObjectSubName;TargetObjectName)


Avoid showing filed name or form name on UI console directly



Example:


Issue: you should avoid showing field name and form name on UI console directly. now Localization team has below workround, it is a manual work.
Mail7ex.ntf->Form->Notice
1.In "(Declarations)" of "(Globals) Notice" Objects, 10th line add 2 lines code and translate marked by RED:
SUBJECT_TITLE = "Subject"
LOCATION_TITLE = "Location"
2.In "RaiseConflictDialog" of "(Globals) Notice" Objects, 29th line add 2 lines code:
cLst(x) = Replace (cLst(x),"Subject",SUBJECT_TITLE)
cLst(x) = Replace (cLst(x),"Location",LOCATION_TITLE)


Uncheck "No Wrap" option for the Notes button



Example:



Issue: It is a wrap up problem, you need to uncheck "no wrap" option for the Notes button.



URLDecode the strings that are displayed on web UI



Example:



Issue: The window title is HTML encode. Please don't forget to decode it.
Workround: PartialName := Right(@URLDecode("Domino";Query_String);"&Title=")


Create alias for the keyword of option field(e.g. Listbox, Checkbox, etc)




It is necessary to create an alias for every keyword for programing consideration.


2) Use prefixed aliases when calling design elements.

Instead of: @command([Compose];"Memo")
Try to use: @command([Compose];"fa-Memo")

Instead of: @command([Compose];"Memo")
Try to use: @command([Compose];"fa-Memo")


Do not use normal legible words when using internal variables (for instance stored in always hidden fields).


Instead of: @if(xxdocname = "Interest Profile";"Interest Profile";"Standard Document")
Try to use: @if(xxdocname = "InterestProfile";"Interest Profile";"Standard Document")

Put some of the information between parentheses

Instead of: "Created by " & doc.username(0) & " on " & doc.date(0) & " at " & doc.time(0)
Try to use: "Created by " & doc.username(0) & "("doc.date(0) & " - " & doc.time(0)")

"Instead of: "Retrieved " & RetrievedDocs & " documents. Updated " & UpdatedDocs & " documents. Saved " & SavedDocs & " documents."
Try to use: "Retrieved documents: " & RetrievedDocs & " Updated documents:" & UpdatedDocs & " Saved documents: " & SavedDocs

To avoid concatenation problem with bitmap in the strings, put link and bitmaps in the end of the sentence


Avoid given the same alias for the same kind of design elements

Avoid using the same alias name for the same type design elements whose main names are translatable, here is an example below,
in Design:
Mail8.ntf->Form-> Reply with History & Attachments
Mail8.ntf->Form-> Reply

These two forms have the same alias, but their main names are translatable. After two form names are translated in our localized language templates, if the "Reply with History & Attachments" form is in front of the "Reply" form in the designer(the sequence of the forms are opposite with the US template after DGW update sometimes), it will cause the functional bugs.

Before translate these form's main names

After translate form's main names


Suppose other programs will call the form'alias name directly, but it will confused which form will be called if they have the same alias. Here are some NLV SPRs about this issue.

SPR#
Tot
QA
Dev
Description
Notes Link
JLWN74HBTV
Jian Lin Wan
Xue Feng Jia
Mail8.ntf -> unexcepted dialog appears when open replay mail
Notes Link
JTSG744FY5
Eason YH Lin
Eric HY Chang
Mail8.ntf: Error message while open a reply message.
Notes Link
PDCW73FFMQ
Peter DC Wang
Xiao Feng Ji
[0502_Pseudo] Pop up an error message while opening a replied mail.




Avoid using @uppercase and @lowercase in formula to uppercase or lowercase translatable strings

Avoid using @uppercase and @lowercase formual to uppercase or lowercase translatable strings.

Here is an example:
Current design: Mail8.ntf -> form ->appointment -> tmpRepeatsText field


































  • Edit
  • More Actions Show Menu▼


expanded Attachments (0)
collapsed Attachments (0)
Edit the article to add or modify attachments.
expanded Versions (3)
collapsed Versions (3)
Version Comparison     
VersionDateChanged by              Summary of changes
This version (3)Jul 31, 2012, 2:16:38 PMAmy Smith  IBM contributor
2Sep 30, 2008, 1:28:11 PMKendra Bowker  IBM contributor
1Sep 30, 2008, 10:32:59 AMMike R O'Brien  IBM contributor
expanded Comments (0)
collapsed Comments (0)
Copy and paste this wiki markup to link to this article from another article in this wiki.
Go ElsewhereStay ConnectedHelpAbout
  • IBM Collaboration Solutions wikis
  • IBM developerWorks
  • IBM Software support
  • Twitter LinkIBMSocialBizUX on Twitter
  • FacebookIBMSocialBizUX on Facebook
  • ForumsLotus product forums
  • BlogsIBM Social Business UX blog
  • Community LinkThe Social Lounge
  • Wiki Help
  • Forgot user name/password
  • Wiki design feedback
  • Content feedback
  • About the wiki
  • About IBM
  • Privacy
  • Accessibility
  • IBM Terms of use
  • Wiki terms of use