游戏开发论坛

 找回密码
 立即注册
搜索
查看: 13449|回复: 3

游戏开发中的多语言文本管理

[复制链接]

8360

主题

9283

帖子

2万

积分

论坛元老

Rank: 8Rank: 8

积分
29940
发表于 2014-12-10 11:36:39 | 显示全部楼层 |阅读模式
  作者:AiurTemplar

  好久没写博客了,今天趁着还在排魔兽副本的功夫上来写一篇!

  由于之前没有经验,这个项目在做的时候,在多语言文本管理这方面做得很差,到了后期字符串基本成了一个无法管理的状态,随便要改点什么字都需要在一个存了所有游戏文本的5000多行的巨大txt中搜索,极其不便;而且有相当多的字符串是已经在游戏中删除掉的废字符串,但却依然停留在文本文档中。所以我想要总结一下经验,参考一些其他游戏的做法,看看能否用更好的方式来解决这个问题。

1.png

  首先第一个要解决的问题是,如何让程序自动对应不同版本的语言?在设计界面的时候一定要方方面面都把这个考虑进去,否则一定会出问题,比如显示中文刚刚好,显示英文却太长了。不过这不是本文的重点,更多的相关内容可以看游戏开发者本土化建议之文本翻译。我们需要用ID来管理所有文本,比如说我们有个英雄,英雄的ID是100,他的说明文字就可能是hero_100_description之类的。ID的这种命名方式对于程序来说没有意义,不管是hero_100_description还是GameStringS1293IU634EASD,对于程序都可以正常运行,但采用后者会让字符串的可读性相当差,因此最好由策划来手动为所有需要用到的文本ID进行命名——就像美术人员会为所有美术资产命名一样。这种命名的好处还能让你轻易地剔除掉已经不再使用的废字符串。

  ID可以按照统一的模块来起名(横向的),也可以按照实际的程序结构来起名(纵向的),个人建议采用后者的方式。假如按照前者的话,我们有可能将所有的UI使用到的文字都写作一样的内容,比如都叫UI_Title_XXX,但实际上游戏并不需要同时加载所有UI的文本,每个界面要用到的都很有限,因此按照程序结构来划分会更科学一些,这需要与游戏程序一同进行设计。不过由于纯文本文件往往都很小,不像美术资产一样会占用大量内存,因此在确保没问题的情况下偷懒一下,在任何地方都加载所有文本也可能可以,这还是需要看程序方面的意见。

  ID的名字在允许的情况下,为了可读性,可以起的尽量的长,这需要与程序一同设计。比如,UI_MainMenu_NewGameButton_Normal,就说明了这个文字是用于显示UI的,是在主菜单用到的,是“新游戏”按钮在默认情况下的文字,这种清晰易懂的名字无论是程序在代码中还是策划在文本管理中都会让工作轻松得多。

  如果需要制作新内容的时候,策划可以先添加所有需要的文本及其ID,再让程序制作,流程上也会更顺畅一些。如果某个字符串没有填写,则直接在游戏中显示其ID,这样能在游戏中轻易地发现是哪个字符串忘写了。

  当某些东西的结构固定时,甚至可以统一、批量地先由程序生成ID,再有策划进行填写——比如英雄有100个,每个英雄都有描述,程序就可以先把hero_001_description到hero_100_description直接做到游戏中——《星际争霸2》就是这么干的。

  如果字符串需要换行,建议使用在单个string中加入诸如\n的方法,而不是使用多个string,因为同一句话不同语言显示出来行数往往不一样,如果用多个string的话ID管理会变得相当混乱,很可能中文一共有5000个ID而英文却有5010个ID,具体多了哪10个就是个要命的事情。文本的样式管理应该和程序、美术一同进行设计,尽量把文本的样式也写进string中再由程序解析,比如:

  1. <string><c value = “FF0000″>我是一个红色的文本</c></string>
  2. <string><b><c value = “FF0000″>我是一个红色加粗的文本</c></b></string>
  3. <string><size = 24><b><c value = “FF0000″>我是一个红色加粗的24磅的文本</c></b></size></string>
复制代码

  这样做法的好处是在保留一定可读性的前提下,修改文本样式不再需要程序的协助,能够大大降低开发过程中的沟通成本。实际上这也是《星际争霸2》的做法。

  不过笔者认为,《星际争霸2》也有不值得学习的地方,就是其不同语言文本的文件结构。由于该游戏支持相当多的语言,因此他们的做法是把不同的语言文本完全分离在不同的文件中,比如中文文本都存在zhCN中,英文文本都存在enUS中等等,这样的问题就是在两个文件中,我们都要以“ID+String”的方式进行管理,无法确保ID的唯一性。因此相比之下我更倾向于《魔兽世界》插件或者《炉石传说》的结构,将不同语言的文本全都放在同一个文件中,这对于策划以及游戏翻译外包来说是都是相当舒服的事情,下面是例子:

  《魔兽世界》插件的多语言(以Decursive为例子):

  1. ## Title: Decursive |cffff00ff -Ace3-|r
  2. ## Notes: Afflictions display and cleaning for solo, group and raid with advanced filtering and priority system.
  3. ## Notes-frFR: Affichage et guérison des affections avec un système évolué de filtrage et de priorité.
  4. ## Notes-deDE: Anzeige und Reinigung von Gebrechen für Solo, Gruppe und Schlachtzug mit erweitertem Filter- und Prioritäten-System.
  5. ## Notes-esES: Afflictions display and cleaning for solo, group and raid with advanced filtering and priority system.
  6. ## Notes-esMX: Afflictions display and cleaning for solo, group and raid with advanced filtering and priority system.
  7. ## Notes-koKR: 쏠로, 파티, 공격대를 위한 고급화된 필터링과 시스템 우선권으로 고통들의 표시와 제거를 합니다.
  8. ## Notes-ruRU: Отображение и инструменты для развеивания дебаффов для одиночной игры, игры в группе и рейде, с развитой системой фильтрации и приоритетов.
  9. ## Notes-zhCN: 当单独、小队和团队时清除有害状态,并可使用高级过滤和优先等级系统。
  10. ## Notes-zhTW: 當單獨、小隊和團隊時清除有害狀態,並可使用高級過濾和優先等級系統。
  11. ## Notes-ptBR: Afflictions display and cleaning for solo, group and raid with advanced filtering and priority system.
  12. ## Notes-itIT: Afflictions display and cleaning for solo, group and raid with advanced filtering and priority system.
复制代码

  炉石传说的例子:

  1. <Tag name=”FlavorText” enumID=”351″ type=”String”>
  2. <enUS>Hogger is super powerful. If you kill him, it’s because he <i>let</i> you.</enUS>
  3. <zhTW>霍格非常強。如果你殺死他,那是因為他<i>讓</i>你殺他。</zhTW>
  4. <zhCN>霍格可是超级厉害的。如果你杀了他,只是因为他让你这么做的。</zhCN>
  5. <ruRU>Дробитель ужасно сильный. Если вы убьете его, то это значит, что он вам <i>поддался</i>.</ruRU>
  6. <ptBR>Hogger é superpoderoso. Se conseguir matá-lo, foi porque ele <i>deixou</i>.</ptBR>
  7. <plPL>Wyżer jest supermocny. Jeśli go zabijesz, to tylko dlatego, że ci na to <i>pozwolił</i>.</plPL>
  8. <koKR>들창코는 정말 강력합니다. 만약 처치했다면, 그가 <i>봐줬기</i> 때문입니다.</koKR>
  9. <itIT>Boccalarga è potentissimo. Se lo uccidi è solo perché lui te lo ha permesso.</itIT>
  10. <frFR>Lardeur est super fort. Si vous réussissez à le tuer, c’est uniquement parce qu’il vous aura <i>laissé</i> faire.</frFR>
  11. <esMX>Hogger es muy poderoso. Si lo matas, es porque <i>él</i> así lo quiso.</esMX>
  12. <esES>Hogger ya se ha cobrado más víctimas que el Cataclismo.</esES>
  13. <deDE>Hogger ist so mächtig, dass Ihr ihn nur töten könnt, wenn er Euch <i>lässt</i>.</deDE>
  14. </Tag>
复制代码

  不过这种做法也有一个难题,就是如果新加一个语种的话会影响到之前的所有结构,所以无论采取哪种结构,最好都有文本管理工具,而不是直接手写txt。但比起传统而常见的每个语言一个文件其中把所有系统需要的文本都丢进去,我更倾向于按照系统划分文本文件,然后把所有语言的丢进同一个文本中。当然了,这还是要看程序是如何设计的,以及游戏的过程中是否支持切换语言。

  如果你有更好的做法,欢迎和我交流经验。

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2016-6-12 14:33:51 | 显示全部楼层
第二种放在一个文件中如何协同开发

1

主题

4

帖子

13

积分

禁止发言

积分
13
发表于 2016-6-13 16:54:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

1

主题

4

帖子

13

积分

禁止发言

积分
13
发表于 2016-6-14 10:15:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-5-20 01:19

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表