多国语⾔版本的编码要点
◆本地化产品的整体步骤
honeypot
1.在产品起始开发⽂档中要明确说明,产品本地化是开发周期中的⼀个重要环节,不应该把本地化放到开发完成时做,这样会带来本地化居多不便;
2.本地化测试应该在产品功能稳定时⽴即启动,这时候⽆需开发⼀个本地化版本,⽽通过伪本地化⽅⾯或Pilot-language 本地化⽅法来先⾏测试;
3. 在⽤户界⾯稳定后,其他版本的本地化⼯作需要马上启动;
4.在原始资源中避免表达错误,语法错误;
5. 本地化资源外包:本地化⼯具包有⼀套⼯具,资源⽂件,⼆进制⽂件,其他本地化信息,这些都提交给本地化外包公司;本地化外包公司与开发⼈员的联系;翻译的术语要跟软件的背景适宜yuli
◆关于资源本地化
1.关于字符串:
A.:避免运⾏后动态组合字符串
:变量⼀定要⽤时,⽤唯⼀名称
:⼀般⽤于多变量的警告或者消息语句中
:能够处理多个变量的现实
:不要将多种类型的变量混合
:⼀个句⼦需放到⼀个string⾥⾯表⽰
:考虑字符串的buffer⼤⼩
⽤例:A
char szString[] = "Are you sure you want to delete the ";
蓝莓之夜百度影音char szFinalString[cbMaxSz]= szString + szDelObject + "?";
其中,szDelObject在程序运⾏时,可能为:file、directory 或subdirectory
=>换成下⾯三个完整的句⼦,且针对不同的语⾔时翻译会更好理解:
"Are you sure you want to delete the file?";
"Are you sure you want to delete the directory?";
"Are you sure you want to delete the subdirectory?";
另外,对于单⼀字符串,最好针对特定的上下⽂环境,分别列出,如
Menu_open = "open"
Dialog_open = "open"
Button_open = "open"
因为,可能有复数,性别的不同,或者⽤于不同语⾔时单⼀字符会根据上下⽂转译。这样,对于可能存在这种境况的单⼀字符,最好做到每个上下⽂列举⼀个字串。
⽤例:B
⽤例A中的句⼦可以⽤下⾯的结构来代替
Del_File = "Are you sure you want to delete the %s ?";
并附⽂档说明:%s 可能为file、directory 或subdirectory
另外,有多个变量时,尽量能表明变量的顺序:如
Memory_Error = "Not enough memory to %s the file %s.";
该句中有两个%s,存在的问题:当有些动词和名词位置摆放位置不同的语⾔时,就会出现错位:
如芬兰语翻译后的句⼦为:jodie
"Liian vähän muistia tiedoston avaamien FileName1."
⽽,芬兰语正确的句⼦为:
"Liian vähän muistia tiedoston FileName1 avaamien."
解决⽅⾯是:将两个%s ⽤出现的次序分别标明,即
"Not enough memory to %1 the file %2."
这样芬兰语翻译后为:
sweet"Liian vähän muistia tiedoston %2 %1." 容易替换对应的字符
⽤例:C
采⽤了message table
//
LanguageNames=(German=2:msg00002)
MessageId=1 SymbolicName=IDS_NOFILE
Language=English
Cannot open file %1.
Language=Germanout from under>lo过去式
Die Datei %1 kann nicht geöffnet werden.
规章制度英文
MessageId=2 SymbolicName=IDS_OTHERIMAGE
Language=English
%1 is a %2 image.
Language=German
%2-Abbild ein %1 ist.
主程序⾥⾯调⽤情况:
// lpBuf must be large enough to hold the formatted message!
DWORD langID = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN); HMODULE hModule = LoadLibrary(...);
TCHAR lpBuf[60];
LPVOID lppArgs[10];
DWORD len = FormatMessage(
FORMAT_MESSAGE_FROM_HMODULE|FORMAT_MESSAGE_ARGUMENT_ARRAY, hModule, idMsg, langID, lpBuf, sizeof(lpBuf)/sizeof(TCHAR),
lppArgs);
⽤例:D
String.Format("Not enough memory to {0} the file {1}", sFunc, sFile);
⽤例:E
不知道何意:
提供翻译时,可以改为类似于:
"%d %1 has %2 internal %3."即每个参数唯⼀标⽰
当然更好的话,把每个参数做⼀些说明。
⽤例:F
下⾯语句不妥:
"When this box is checked, Windows NT does not" =〉词句没有结束于标点符号处
"automatically display the ur name of the last person"
"to log on in the Authentication dialog box."
应该改为:
"When this box is checked, " =〉(第⼀个句⼦)
"Windows NT does not automatically display the ur name of the last person
to log on in the Authentication dialog box." => (第⼆个句⼦)videoboy
⽤例: G
"Press Ctrl+Alt+ Del to restart."
翻译为德⽂的话:
"Drücken Sie Strg+Alt+Entf, um den Computer neu zu starten."
可见,buffer⼤⼩有了很⼤的改变。
在获取这个字符串的时候,最好⽤动态分配字符串⼤⼩,或者采⽤最⼤的缓冲区⼤⼩。
关于这⼀块,将在UI中介绍。
2. 关于UI
A::尽量减少UI界⾯上控件更换尺⼨⼤⼩
:界⾯控件本地化
:避免在图⽚上包含⽂本串
2.1
UI中的静态⽂本尽量留出来多些空间,这样多国语⾔版本翻译的时候,基本上不会出现再对各个空间的⼤⼩重新设置了。
图1.1
上图1.1中很好的将“Name:”,“Initials”, “Mailing Address”的空间位置调整到当前界⾯上合理的最⼤位置,基本上满⾜了其他版本就⽆需要调整了,有多⼤的位置基本上需要⼀个经验,当然,可以将此翻译的最⼤字数做⼀个限定;
⼜如下例:
图1.2中左边的静态⽂本框与右边的Edit框之间都留下了⼀定的空间,这样就能基本满⾜多国语⾔版本翻译的时候不⽤在重新调整尺⼨。
(图1.2)转到德⽂版本时
图1.3
另外,在设计和本地化对话框时,应该将软件测试于不同的显⽰屏幕上或不同的分辨率上,应该在这些情况下都显⽰正确;特别是那种运⾏⽤户更改界⾯字体或拉升界⾯⼤⼩的界⾯。
如,在xp系统下,允许⽤户更改系统字体的尺⼨,以及像标题⼯具条,菜单之类的系统可⾃画的控件字体;⽰例:
Resize对话框时保证各个控件位置协调:如果你需要使⽤系统对话框,如打开⽂件系统对话框,加⼊
到你的应⽤程序中,或者做⼀个类似的对话框,要考虑到这类对话框都有调整整体⼤⼩的功能;这类系统对话框尽量使⽤系统⾃带的对话框来代替,这样不同操作系统下⾯的本地化不需要再⾏考虑。
保证对话框中的各个控件Tab顺序正常 如果对话框中的控件⽀持Tab调换功能,最好是现各个控件的Tab顺序正常,⾃左到右,⾃上⽽下;
图1-5
能书写⽂本的控件设置多⾏属性:⼀般来说,各国语⾔的表达内容差异很⼤,包含字符数⽬差别有时还很⼤, 如果在空间上显⽰⽂本信息,⼀般需要设置控件属性MultiLine,如Edit控件,Check按钮,radio按钮等
⽰例:上图1-5中radio按钮内容没有允许多⾏,就出现⾃动超出对话框的横向空间。
可变长度的字符串要多出⼀⾏位置显⽰:因为是可变长度的,可能很长,如果留出位置能容纳特殊长度,
⽰例:
图1-6
其中第⼀⾏“Welcome to the %s Registration wizard”, 如果⼀个外国⼈名称很长的,如
A.B.C.D.E.F.G 这类,放上去的话,⽤⼀⾏显⽰就不够,留传位置,可以尽量避免以后修改界⾯控件的⼤⼩。默认多多字符串的空间需要留出空余的30%⼤⼩,来为多国语⾔准备, ⽽短的字符串,可能留出空余的位置需更多。
2.2
尽量避免使⽤句⼦不完整,要使⽤整句:当使⽤界⾯上句⼦不完整时,如果翻译成不同版本时,⼀个句⼦的表达顺序不同,造成了界⾯需要调整。
⽰例:
图2-1
图2-1 是英⽂版的⼀个表达⽅式,图2-2是另外法语版的同样意思表达,可以看出来表达的顺序有改动,这样在做下⾯的版本时,需要调
整edit框的位置,很⿇烦。
图2-2
图2-3
解决⽅法就是把话说完整,⽤图2-3设计⽅法可以解决上⾯的问题。
避免控件设计时位置重叠: 像按钮,下列列表框等控件不要放在其他控件上⾯,这样当需要翻译时,被隐藏的其他控件容易被漏掉。
⽰例:
焦虑怎么办图2-4
上图2-4中,Accept按钮的位置把Edit按钮覆盖了, Decline按钮的位置把Issuer Statement按钮位置覆盖了,在多国语⾔化时如果不重新排版按钮位置,按钮⼤⼩不能延伸到所需的长度;就是可以重排按钮位置的话,也没有办法来重排,因为没有空间了。
图2-5
上图2-5中,Edit Properties按钮应该是被Accept按钮完全遮住的,但由于前者翻译的字符较多,按钮位置需要拉伸来显⽰这个字符串,但为了要保证前者被后者覆盖的要求,仍然需要调整Accept按钮的位置。
避免按钮是⼀个变量⽂本:按钮上的⽂本不应该是⼀个动态加载的变量,⽽应该是在编辑的时候通过按钮属性值添加固定⽂本,并在此时将按钮⽂本和按钮⼤⼩调整适中位置。
图⽚和图标中避免加⼊特定⽂化内容:图⽚中尽量做到不要包含特定区域定义的内容背景, 或者⽂化,⽐如说,图标中包含国旗,包含具体的⼈种, 肤⾊等,这样本地化时,这些内容有时会遭到另外⼀些有差异背景的⽤户的抵触或反感。
⽰例:
下图2-6中,左边的图是美国本地表⽰邮箱的标记,但这个图标如果给⼀个欧洲⼈使⽤时,
图2-6
他们很难将这个⾯包盒加⼀个柱⼦的图标跟邮箱联系起来,虽然美国的有些产品和⽂化基本国际化程度很⾼。最好还是选择右边的那个带有信封的并有信纸的图标表⽰容易让⼈理解。
图2-7
上图2-7中,图表表⽰⼀个向导的概念,上述也是美国的⼀种⽼的⽂化积淀下来的⼀个体现,但对其他的地域⽂化来说,他也是⼀个外来物,理解有问题,也会被其他敌视国家所排斥的。
图2-8
图2-8中表⽰停⽌的⼀个⼿势,但左图⽤了⾝体的具体部位,并且带有具体肤⾊。⾸先,张开⼿在其他国家并⼀定具有表⽰停⽌的意思;另