014年6月27日,東風本田新CIVIC(思域)在廣東肇慶上市第九代中期改款車型,作為一款緊湊級家用中級車,CIVIC(思域)所面臨的市場競爭日趨激烈。為了能在新CIVIC(思域)上市前及上市時制造聲量,提升產品關注度,創意服務提供商新意互動推出微信H5互動mini-site,并配合多位一體的組合傳播,形成大范圍覆蓋和轉發,該創意形態開創了汽車品牌傳播造勢先河,憑借創意傳播和效果一舉摘得第七屆廣告主金遠獎網絡類銀獎。
創意策略先行,創新傳播形式
整體策略方面,新意互動采用全方位的創新傳播形式進行呈現。主要涵蓋:創新的形象化手繪風格、生動有趣的動畫效果、趣味化的內容包裝、HTML5技術手機端滑動體驗。在策略傳播方面,配合“多位一體”的傳播組合,為新思域上市預熱并提升新思域的品牌特性。
創意方面,采用眾所周知的典故作為內容包裝,并以創新的形象化手繪風格配合生動有趣的動畫效果,趣味化呈現給用戶方可吸引眼球,并形成大范圍轉發。
具體內容設計如下——
第一屏:4S店經銷商形象的動畫小人,拉開卷軸,提示用戶:向上滑動,此時背景音樂響起。第二屏:出現盤古開天辟地的形象,在人們印象匯中盤古實乃能力者的代言,在動畫中出現文字:開天辟地,我能力至此,卻無緣結識CIVIC。第三屏:出現大禹治水的畫面,大禹治水三過家門而不入,實乃敬業的大無畏之人,在動畫中出現文字:治水三過家門而不入,我敬業至此,卻無緣結識CIVIC。第四屏:出現曹植七步成詩的畫面,曹植七步成詩,其才氣廣為流傳,在動畫中出現文字:七步成詩,我才情至此,卻無緣結識CIVIC。第五屏:出現劉備三顧茅廬諸葛亮的典故,劉備三顧茅廬,可見諸葛亮面子之大,在動畫中出現文字:劉備三顧茅廬,我面子至此,卻無緣結識CIVIC。第六屏:出現潘安的形象,潘安美男子的形象眾所周知,以致后人均已貌若潘安來夸贊男子的美貌。在動畫中出現文字:都說“貌若潘安”,我帥氣至此,卻無緣結識CIVIC。最后一屏:出現思域上市信息:時間及地點。因為如上故事人物均為古人,所以他們無緣結識CIVIC。
通過如上烘托,營造出神秘而趣味的氣氛, 并表達了思域誠摯邀請用戶參加上市會的本意,古人與“活在當下”正好形成對比,也表達了思域年輕化的心態。
技術與創意雙管齊下
在上述策略和創意的指導下,新CIVIC上市預熱活動圍繞以下三個步驟展開:首先,利用媒體推送、網絡紅人推送、官方微信推送等“三位一體”的創新傳播組合,確保達成人群廣泛覆蓋和精準投放。
其次,采用HTML5技術在手機端對產品信息進行完美呈現,用戶只需通過滑屏的簡單操作即可完成順暢的體驗。
最后,通過刻畫古人現代化的活潑獨特形象,搭配名人“發自肺腑”的逗趣文字,以及前后呼應的CIVIC壓軸出場,讓內容充滿趣味性,充分調動用戶自主轉發積極性。
經過上述活動和傳播執行,本次CIVIC(思域)在手機端建立的mini-site實現了1,117,428人群覆蓋數, 瀏覽量為327,653次, 分享量高達78,055次。
本次傳播活動亮點有以下三個方面:
第一,新傳播:通過點對點的推送給參加上市會的媒體,確保全部精準有效。配合選擇微信大號合作,大號選擇基于汽車類專業訂閱號,粉絲量大且專注于汽車,確保投放的精準性和廣覆蓋;并以官方微信推送的形式進行推廣,這種三位一體的傳播組合,確保達成人群廣泛覆蓋和精準投放;
第二,新形式:利用「手機MINISITE」創新的溝通形式(此形式在6月份前尚未被廣泛應用),提供最便捷、豐富的用戶體驗。提供用戶便捷順暢的互動體驗、生動有趣的動畫效果,并搭配完美貼合的聲效,提供用戶簡便的操作,豐富的體驗;
第三,新內容“網絡化趣味包裝”傳播內容,迎合目標人群興趣點,形成社會化擴散效應。通過刻畫古人現代化的活潑獨特形象,搭配名人“發自肺腑”的逗趣文字,以及前后呼應的CIVIC壓軸出場,讓內容充滿趣味性,充分調動用戶自主轉發積極性。
此輪mini-site互動傳播不僅是對業界傳播手段的創新,其傳播內容也廣受好評,在傳播周期內形成大范圍自主轉發性的擴散效應,為新CIVIC(思域)上市營造了關注度,在傳播廣度、傳播有效性、傳播性價比上均獲得理想效果。
【關于新意互動】
成立于2003年1月,是美國紐約交易所上市公司易車集團的全資子公司,擁有員工近500人。憑借10余年豐富的網絡營銷全案代理經驗,已成功為50余家企業提供過極具創意的數字整合營銷服務。
始終專注汽車行業,使新意互動成為國內最大的汽車行業數字營銷解決方案提供商,并擁有互聯網廣告、互聯網公關、受眾營銷、搜索引擎營銷、社會化媒體營銷、移動營銷、網站建設與維護、客戶關系營銷、視頻營銷、電商、輿情監測系統、虛擬影像及體驗等十二大業務模塊。
此外,新意互動還贏得了眾多客戶的信任及廣告營銷行業多項專業獎項與榮譽。2015年憑借汽車數字營銷領域10余年的專注,榮獲“”自2012年起,新意互動連續3年榮膺“中國網絡廣告公司綜合服務排名”第二名,是大數據時代不可或缺的優質“智慧汽車營銷價值伙伴”。
軟件要分發給使用不同語言和處于不同地區的人員,需要從多個方面處理從而使這些人能以自己文化背景下熟知的方式來使用。這包括了最基本的文本的翻譯,也有一些通用習俗和約定的問題(如不同國家和地區的日期時間的表示等)。而本地化(L10N)和國際化(I18N)就是專門來解決這些問題的。
要很好的解決這一問題,往往需要多方面的人員參與,既有軟件設計者,有程序開發人員,也需要翻譯人員甚至翻譯測試人員,而要把這些人組織起來完成工作,需要的不是只面向一兩方的 API 和代碼,良好的本地化團隊往往需要面面俱到。
傳統的解決方案
最知名的解決這些問題的一套系統,是 GNU Gettext。這是一套上世紀九十年提出的用以解決自由軟件的國際化和本地化問題的工具套件。在 gettext 里,制定了翻譯文本的組織方式(po/pot),提供了從程序源碼提取字符串并生成翻譯模板的工具(xgettext)。在這些之外,gettext 和其社區也發展出了面向翻譯人員的翻譯內容管理系統(Weblate),以及有用于完成翻譯工作的專門軟件(Poedit)。Gettext 也提供 DIff/Merge 工具來解決翻譯內容的漸進式更新的需求。
游戲具有其特殊性
游戲作為最特殊的軟件之一,對于本地化和國際化也有著屬于它的苛刻要求:
游戲往往會引入其他類型的需要多語言處理的資源而非只是文本,比如圖片,語音,乃至口型文件。
因為上一條的緣故,導致游戲本地化團隊往往會引入更多不同工種的人員,從而增加了人員管理和協調的負擔。
傳統方案在游戲開發上的擱淺
GNU Gettext 天生不適合游戲開發中的多語言問題,它只處理文本資源,原版的 gettext 甚至只能從源碼中收集多語言數據,這顯然只適合普通軟件的需求,卻很難滿足游戲開發的需要。
對于游戲而言,只有處于 UI 界面里的數據,會比較切近 Gettext 的需求場景,然而在很多成熟引擎下,這些數據也往往位于特定的 UI 聲明文件內(在 Unity 里這些數據處于 scene
/prefab
文件中)而不是源代碼中。至于占游戲內比重更大的其他需要多語言的數據,更是會分散在各種特定格式的數據之中。在 Unity 下,關卡數據可能存放在 prefab 中,角色/物品這類的設定性的文檔數據可能處于ScriptableObject
,甚至這些數據都保存在別的序列化文件內(諸如最常見的csv
/xls
或者xml
/json
,再或者自定義的二進制數據文件)。
一點牢騷
誠然,游戲的多語言問題在如今看起來似乎并不算多么麻煩的事情,即使是考慮多語言輸入的問題等,在游戲編程精粹系列中,很早就有論證這些問題的文章[1]。而如今面臨的問題似乎同前輩們沒什么兩樣。相比游戲開發中的其他領域(尤其是圖形學),這個話題好像沒什么可談的。即使我在文章開頭的前幾段論述了這個問題多么棘手,但貌似現成的解決方案存在著一大堆。而在之前,我在一個游戲開發的群里提到這個話題時,被人指出是在浪費時間,對方建議我應該多研究研究圖像學之類的如何讓游戲畫面看起來漂亮的技術或者去鉆研鉆研游戲敘事來讓游戲內容變得好玩。:-)
但事實真的如此了嗎?
實現一個簡單的多語言系統是十分容易。一個最小可用的多語言系統大體需要如下的部分:
字典表,記錄了所有需要多語言處理的字符串,key 往往是對應內容的英文,而 value 則是對應語言的翻譯內容。這些內容在文件系統里通常以 json
/csv
/xml
這樣的形式存在。
一個形似 Localization.Get(key, lang)
的函數,用來在 Runtime 返回指定 key 和語言所對應的翻譯內容
一套加載機制,用來在對應語言環境下加載對應的多語言文件
一套通知機制,使得系統能得知語言被切換過。這個系統往往是通過訂閱對應的事件來完成通知。
實現這些東西的代碼花費不了幾個小時就能完成。然而仔細思考就會發現要拿這套系統來用的舒爽,就十分的困難了。
一些待解決的問題:
字體
缺乏對其他多媒體資源的支持
少數語言對文字排版的需求
翻譯人員對接
就字體問題而言,對于歐美不少語言,一個字體文件往往很容易就能解決大部分語言的字體問題,但是一旦遇到中日韓,就會變的十分頭疼。所幸很多系統和引擎都提供字體的 fallback 機制,只要合理利用這套機制,使得字體問題也能輕松得以解決。再或者干脆再弄個字體文件的字典表,替換文本的同時也替換對應的字體。
其他媒體資源的支持問題,在別的本地化系統里出場率遠遠低于游戲。這是因為游戲里很容易產生那些需要多語言處理的多媒體資源。一個藝術字標題或者一個圖片按鈕,亦或是人物對話的配音。不過我們照貓畫虎,按照如何處理文本,也同樣來處理多媒體資源就行。這里比較棘手的問題是,相比文本這種往往一個語言的所有多語言資源都塞到一個文件內就能解決,多媒體資源在文件系統方面就會變得十分復雜。而一旦這些問題和引擎的資源打包系統耦合在一起,要設計出一套好用又節省內存的方案并不簡單。
少數語言文字排版需求通常是指阿拉伯文字這種特有的從右往左排版的情況。相關資料十分豐富,我也不再贅述。不過要注意的是如果涉及到多語言混排,基本很難做對。如果需要相關信息, W3C i18n 小組下的內容對此會十分有幫助[2]。
和翻譯人員對接部分,目前來看,業界主要以通過翻譯外包的形式將本地化任務托管給其他公司。這些公司往往要求提供 key-value 形式的多語言數據文件(如 xml
/csv
/xls
)給他們。如果你在第一步的時候就已經決定用這樣的方式來組織你的多語言文本,正好可以一勞永逸。但第一步選擇了別的方案可能就需要提供導入導出功能。
Unity 下有現成的處理好這些問題的框架嗎?當然,小節標題后邊的部分說的就是它 —— I2 Localization,Unity 資源商店里頂頂有名的國際化插件。
關于它的介紹我不打算多花筆墨,讀者可以直接閱讀它的文檔來一窺究竟。I2 Localization 基本上很好的解決了上邊提到的問題。而且他還有不少十分有用的特性。
如果你覺得你的問題已經解決了,那么你可以停止閱讀趕緊去購買插件/自己實現類似系統了。但是,假如你仍然抱有困惑,或者好奇多語言系統還有哪些問題和改進的地方,那么我將在下邊兩個小節內盡力給你一個滿意的答案。
雖然上一節提到的 I2 Localization 十分優秀,但是依然有不少問題有待解決:
key-value 形式的多語言系統天然違反游戲開發的流程和直覺
繁雜而未經設計的翻譯文本組織文件進一步導致了功能上的缺失和解決這一問題的困難
對于漸進式開發和需更新維護的游戲缺乏合適的 Merge 機制
和翻譯人員對接的部分過于的粗暴反而埋下多語言問題的禍根
在 key-value 模式下,你需要為每一個多語言文本分配一個 key,這個 key 往往是一個英文單詞或者短語。這對于通常的軟件來說十分夠用。本來大部分需要多語言處理的文本都是按鈕上的文本或者窗體的標題。但是對于游戲來說,這類的數據占比十分低,而更多的多語言文本是游戲內各種物品技能裝備等的說明和關卡里的人物對白。這些文字全都篇幅不短。如果你的游戲內有書籍系統,那么更是意味著對應的是一篇短文。這時候為這些數量眾多的大段文字去分配一個個不會沖突的 key 是十分頭痛而又麻煩的。可能最后這些 key 變成了一個個奇怪的縮寫標記(比如一個 l10e2s2
這樣的神秘字符串代表著關卡十中第二個事件上的第二段對話)。而開發人員在瀏覽游戲工程文件時,看著充滿神秘字符串的界面,還要去回頭查找對應的是什么文本。
你可能會說,既然如此我干脆用需要翻譯的文本本身來作為 key 好了。噔噔噔!恭喜你,想出了幾十年前那些自由軟件黑客們就已經構思并實現了的點子—— GNU Gettext。GNU Gettext 的一大特點就是用文本本身做為 key。整個軟件選取一個開發語言,開發時所有的文本均按該語言撰寫。然后這些文本數據通過特定的標記(往往是通過 Gettext 的獲取多語言文本的函數),在軟件編寫完成后,通過特定的程序掃描整個軟件的代碼,從中將這些被標記的靜態文本挨個收集起來。
除此之外,GNU Gettext 所定義的用于組織多語言文本的特定文件格式 po/pot
(po
文件用來組織翻譯文本,而pot
文件則是翻譯文本模板文件),也解決了上邊的問題二。相比大部分情況下使用某種現成的序列化文本格式來組織多語言文本,po/pot
文件考慮了更多多語言工作中需要解決的問題,比如pot
文件里支持針對單個文本片段的多種形式的注釋:
1). #后緊接著空格符的注釋內容,是翻譯者添加的注釋;
2). #后緊接著.的注釋內容,是 xgettext 從源代碼中提取出的注釋內容(通過 xgettext --add-comments 選項);
3). #后緊接著:的注釋是待翻譯語句在源代碼中的位置信息;
4). #后緊接著,的注釋是 msgfmt 程序專用的 flag;
5). #后緊接著|的注釋是這條待翻譯語句之前的相關翻譯信息;
而大部分使用通用序列化文本格式的本地化系統,基本不會去考慮這些情況。更何況這些部分還需要各種軟件和工具的支持,而繁雜的翻譯文本組織方式更是讓想支持這些也變得困難,除此之外,對于問題三,大部分使用通用的序列化文本格式的系統也幾乎不曾考慮,而 po/pot 文件很早就開始考慮這些問題并提供支持。GNU Gettext 作為一個存在幾十年的系統,期間積攢了數量眾多的處理這些問題的工具和軟件。
問題四要指出的是,目前的外包形式的解決辦法,游戲開發商難以較為積極的參與到多語言工作中,其次對于游戲來說往往存在著大量需要多語言處理的多媒體資源,這些資源通常還涉及到美術和配音人員。最后的結果就是要么把這些也一同丟給本地化外包公司,要么就組織兩套系統然后花費額外精力來維護兩個系統間的周轉。其次完全交給外包公司也讓游戲本地化工作問題的反饋難以及時跟進(實際上大部分游戲根本不會提供多語言測試版或者雇傭多語言測試人員)。這一結果使得游戲開發和多語言工作過分割裂,最后很容易產生各種翻譯問題并很難解決(比如被游戲視頻 UP 主神奇陸夫人常常念叨的 Artifex 公司作品的翻譯迫擊炮問題)。
我個人認為解決這一問題的辦法是游戲開發公司應該把多語言工作的主動性掌握在自己手里,通過自己部署翻譯管理系統,將多語言工作涉及到的人員全部聚集在一起。同時游戲應該提供多語言測試工具并提供多語言測試版本,然后讓多語言測試人員(可以是公司招聘的人員,也可以是通過發布測試版來讓對應語言的玩家充當)將多語言問題通過這個系統提交到翻譯內容管理系統上。在這一體制下,翻譯人員不再是外包給翻譯公司,由公司內部分配然后運作在其內部系統上,而是翻譯公司外派人員在游戲開發公司的系統上來工作。這樣一來無論是監管還是進度追蹤抑或是翻譯問題的追蹤和處理都會變得簡單而透明。同時也可以將配音和美術人員也統一在這一框架下。而且如果是大公司的話,這里邊的翻譯工作人員也可以是公司自己內部的員工。當然,這些構思只是出于一個技術人員在軟件開發角度的考量。可能涉及到商業和管理方面的問題并不一定會達成(比如翻譯公司拒絕外派人員而堅持使用自己的內部系統)。另外不少獨立游戲公司的本地化工作都是通過 Mod 系統然后讓對應語言的玩家社區來完成。如果有這樣的工具來提供給玩家社區也是很不錯的。
從上邊討論可知, GNU Gettext 的解決方法優于 key-value 方案,并且 gettext 還有配套的開源的翻譯內容管理系統(比如 Weblate),這意味著問題四也可以方便的解決。
然而原本的 GNU Gettext 并不十分符合游戲開發。比如游戲的多語言數據基本上不會存在于源代碼中。其次游戲存在眾多的需要多語言處理的多媒體資源,而那些配合 gettext 的 TMS 往往只支持文本內容的處理,前略里已經完整的講過這個問題了。如此一來,直接把 GNU Gettext 搬過來只會水土不服。我們需要一個適用于 Unity 和游戲開發的使用和 GNU Gettext 類似理念的全新的本地化框架。
簡單來說,我們需要:
設計良好的組織多語言數據的文件格式
通過簡單標記就可以自動化收集多語言資源的工具
一個運行時的加載這些多語言數據文件,并在恰當的時機將資源替換成對應語言的內容的系統
對翻譯人員提供符合他們工作習慣的工具來完成翻譯工作
這一想法最后誕生的結果就是 Rosetta。
Rosetta 采取了和 GNU Gettext 相同的組織翻譯文本的方式。這意味著我們可以在文本資源上充分利用 GNU Gettext 現成的工具鏈。除此之外還處理了多媒體資源的多語言問題。
而在問題二上 Rosetta 充分利用了 C# 的 attribute 和 reference 這兩個語言特性,通過 i18nAttribute 來標記需要多語言處理的資源,然后通過反射來搜集這些數據并生成對應的多語言模板文件。
對于問題四 來說,Rosetta 暫時只能依托于 GNU Gettext 現有的工具來解決。目前我正計劃在 Rosetta 1.0.0 版本的時候,提供一個和 Rosetta 搭配的適用于游戲開發的翻譯內容管理系統:RosettaServer。
在游戲本地化問題上,是否還有其他前瞻性的東西,我想很多人和我一樣好奇。而思考這些問題則花去了我十分多的時間(實際上這些問題在一年多以前就以各種片段的形式存在于我腦海而直到最近 Rosetta 的第一個可運行版本完成開發,我才開始著筆寫下這篇文章)。有幸于我對小眾游戲的關注和經常看到好玩的但沒有中文的游戲/軟件會動漢化他的念頭的緣故。我得以見到很多游戲提供的翻譯系統,也接觸到了一些處于這個領域十分前沿的問題。
AVG.js 和 huozi.js
AVG.js 是我的一位朋友 Icemic 在 HTML5 平臺上實現的 galgame 開發套件。這套工具里最讓我印象深刻的是專為游戲內中日韓文字排版而實現的排版引擎 huozi.js。
實際上游戲開發對文本顯示的要求僅僅處于能看這一階段。而去思考并實現對應語言的規范排版需求的系統的情況基本不存在。雖然 W3C 的 i18n 小組一直在做這方面的工作(huozi.js 的開發也有參考他們的中文排版需求),但是游戲行業對這些毫無興趣。這一方面是因為這個問題本身十分復雜且和多個系統耦合(排版系統和 I18N),另一方面游戲內往往并不會出現大篇幅的密集文本。然而隨著游戲的發展,我相信以后不少游戲都會遇到類似的需求(如上古卷軸5 里的書籍系統)。
Wayward : 從語義到語法
大部分情況下,我們漢化一段文本的時候,只是在理解它的語義,然后用另一種語言來表達它。但在一些特殊情況下,翻譯工作會涉及到把一門語言的語法翻譯到另一門語言上的問題。
最簡單的情況是單復數的處理。在中文中單復數很少會導致一個名詞發生變化,然而在英語等語言里,單復數往往會導致名詞發生變動,而在一些語言里甚至一個兩個三個和復數個都對應著不同的形式(在 I2 Localization 里有處理這個情況,并且支持最多為七的情況)。
然而名詞的單復數只是這個問題下最簡單的一種情況。在 Wayward 中,翻譯需要處理更為復雜的語法問題,除了名詞單復數外,還有代詞和介詞等。整個游戲翻譯模板里有一個很復雜的表格來表述這種轉換:
之所以會存在這種情況是因為,Wayward 是一個 RougeLike 類游戲,而游戲內有不少文本來自程序生成。在這時候就自然而然的涉及到語法的問題。翻譯工作也不僅僅是翻譯語義,而要考慮對應語言的語法。
而可以遇見的未來是,由于過程生成技術在游戲里越來越廣泛的使用,游戲文本的過程生成也必然會越來越盛行。以后涉及到語法的本地化工作的情況也會越來越常見。
配音和口型生成
幾乎所有的 3A 游戲都提供配音,而這時候又涉及到 3D 游戲使用對應語言的配音時人物模型口型的問題。很早以前游戲可能會考慮采取捕捉或者人工調整來生成口型數據,而如今更多的是使用算法通過文本來生成對應的口型數據。這樣一來又引入了一種全新的需要多語言處理的數據。
以上提到的諸多問題,很多都處于多個領域交叉的情況,甚至你很難界定某些具體問題屬于那個領域。但是你要完成一個游戲的多語言工作,往往必然會遇到他們。
另一方面,從最早的普通軟件到如今的 3A 游戲,隨著游戲技術不停的發展,也會引入越來越多的問題。最早我們可能只需要翻譯文本,之后引入了圖像文件,再后來游戲配音又引入新的問題(配音和口型)。而可以預見的未來是,隨著過程生成技術流行,很多傳統的對多語言資源的處理也會面臨著翻譯內容變為翻譯規則。而只要游戲技術不停的發展,游戲本地化工作也會出現新的待解決的問題,這是本地化和國際化做為一個同游戲內多個方面耦合的系統的必然結局。
游戲編程精粹3 - 1.12 1.13
《阿拉伯文字文本布局需求》- w3c 國際化興趣組 阿拉伯文布局特別任務組
* 本文源自作者的知乎專欄投稿。
于React生態系統的一系列令人敬畏的事情。
React
用于構建用戶界面的JavaScript庫
React測試
React庫
使用React構建本機應用程序的框架
React用于增強和虛擬現實的用法
ReactJS的原因綁定
用于構建用戶界面的應用程序架構
JavaScript應用程序的可預測狀態容器
JavaScript應用程序的簡單,可擴展狀態管理
查詢語言
數據驅動的React應用程序
基于GraphQL的數據堆棧
*請認真填寫需求信息,我們會在24小時內與您取得聯系。