速查 › 文字表 .LOC

文字表 .LOC

版面檔不存文字,只存編號。真正的文字在 data\IGENG.LOCdata\FEENG.LOC 這兩個檔裡。 這頁把格式完整解開 —— 解開之後,你不用開遊戲就能看到每個介面元素寫什麼

先看規模

檔案剛安裝好的原版本站測試機字串數負責哪裡
IGENG.LOC59,432 bytes60,023 bytes1,584 IG = in-game,比賽進行中的畫面
FEENG.LOC415,528 bytes416,753 bytes6,352 FE = front-end,選單與所有比賽外的畫面
合計464 KB466 KB7,936

⚠️ 這一頁本來只寫了右邊那一欄

本站 2026-08-28 自我檢查時發現:原本那張表只列 60,023416,753, 而那是本站測試機那兩個被 2023 年名冊模組換過的檔(檔案日期是 2023 年,原版是 2005 年)。 頁面底下明明寫著「測試機那份 FEENG.LOC 被模組換過」,最上面的規模表卻沒有跟著標。

字串數兩邊一樣(索引段的宣告值逐位元組相同),所以這頁的結構結論完全不受影響 —— 但這正是本站自己訂的紀律:數字要寫清楚量的是哪一份。現在兩欄都列出來。

上面每個數字都是把這兩個檔現場打開數出來的,不是引用他人資料。 檔名裡的 ENG 是語言代號。社群的中文化模組是換掉這兩個檔的內容;但 EA 自己的繁體中文版不是這樣做的 —— 它另外放一對 JPN 檔,沒有覆蓋 ENG

三段式結構

LOCH  ← 檔頭,20 bytes
LOCI  ← 索引:每 4 bytes 一筆,把「字串編號」對到「第幾條」
LOCL  ← 文字:條數 + 位移表 + UTF-16 內容

索引那 4 個位元組是兩個數字疊在一起

一筆索引 = (第幾條 << 16) | 字串編號

例:0x003B0506
   高 16 位 0x003B = 59     ← 文字表的第 59 條
   低 16 位 0x0506 = 1286   ← 版面檔裡寫的編號

所以查一個編號要兩步:先在索引裡找到它,取出「第幾條」, 再去文字表拿那一條。

文字是 UTF-16,不是一般的文字檔

每個字佔兩個位元組。所以你用一般文字編輯器或 strings 這類工具打開, 會什麼都看不到 —— 本站第一次也是這樣,以為檔案是加密的。

實際上只是英文字母中間夾了一堆 00

這件事 2008 年就有人在論壇上想通了

本站在歷史資料裡翻到一篇 2008 年 9 月的貼文。作者一開始被人告知 中文要用 Big5 編碼,卡了一陣子, 後來是家裡的長輩點醒他:美國做的軟體要中文化,用的是萬國碼

他接著寫下一個具體的步驟:查到「美」這個字的編碼是 7F8E, 但寫進檔案要把高低位元互換,變成 8E7F

(本站不逐字引用當年的貼文,也不寫出作者的帳號。)

十八年後驗一次,他是對的

本站打開 EA 官方繁體中文版的兩個語系檔, 直接數「美」這個字的兩種位元組順序各出現幾次:

8E 7F7F 8E
FEJPN.LOC430
IGJPN.LOC70

50 次全部是互換過的順序,反過來一次都沒有。 其中一段的上下文是「美國職棒大聯盟2005」—— 那正是這款遊戲官方中文版的名字。

他當年說的「高低位元互換」,今天的說法叫 little-endian(小端序)他沒有這個詞,但他把規則講對了。

順帶一提,官方中文版的語系檔沿用了日文版的檔名FEJPNIGJPN)。 這件事在EA 自己的繁體中文版那頁有量。

驗證:編號對得起來嗎

光解出格式不夠,要證明對應是正確的。方法是拿版面檔裡已知用途的元素 去查,看查出來的文字合不合理:

版面檔裡的元素編號查出來的文字合理嗎
TX:RATING(跑壘者速度)350199 合理 速度是兩位數
TTX:BALLS(好壞球數)30133 合理 壞球數是一位數
TX:PITCHSPEED1(球速)3500999 合理 球速是三位數
TX:PAUSE(暫停選單標題)15211Game Options 合理
TX:PRESS14275Press START button 合理

全檔驗證

ingame.big 全部 47 個版面檔裡的字串引用都拿去查: 2,719 處引用,2,719 處查得到文字,命中率 100%。

兩張表重疊的那 1,310 個編號

兩個檔加起來 7,936 條,但編號不是各自獨立的: 有 1,310 個編號兩張表都有

狀況剛安裝好的原版本站測試機
兩張表都有這個編號1,3101,310
 └ 文字完全一樣1,3101,295
 └ 文字不一樣015

共用的編號很好理解 —— 「確定」「取消」這種字兩邊都要用。 剛安裝好的原版,1,310 個共用編號兩張表寫的字完全一樣,一個例外都沒有; 本站測試機那 15 個不一樣的,全部是 2023 年名冊模組造成的這裡挑三個最說明問題的(下表兩欄都是本站測試機的值):

編號選單那張表比賽中那張表
18backBack
704Home Run DerbyHome Run Showdown
1540MVP Baseball 2023MVP Baseball™ 2005

第 1540 條說明了一件事:改一張表、不改另一張,遊戲就會前後不一致

編號 1540 是遊戲標題。本站測試機正在跑的那份, 選單那張表寫著 2023,比賽中那張表還是 2005。

改掉選單那張的是名冊模組 —— 它把隊名更新到 2023 年 (Devil Rays 改成 Rays、Indians 改成 Guardians、Anaheim Angels 改成 Los Angeles Angels), 順手把標題也改了。它其實兩個檔都動過, 漏掉的是 IGENG.LOC標題那一條兩張表都要改,不然遊戲會有一半是舊的。這是本站實際踩到的,不是推論。

⚠️ 2026-09-05 訂正:這一段原本寫「名冊模組……但沒動 IGENG.LOC」,是錯的。 把本站測試機的 IGENG.LOC 跟剛安裝好的原版逐條比:共同的 1,584 個編號裡 203 條文字不同Devil RaysRaysCleveland IndiansCleveland GuardiansAnaheim AngelsLos Angeles Angels, 還有一整批球場改名如 Bank One Ballpark™Chase Field), 檔案日期也是 2023 年。模組漏掉的只有標題那一條,不是整個檔沒碰。

⚠️ 2026-08-25 訂正:這一段原本寫成「中文化模組只換了一張表」,是錯的。 測試機正在用的這兩張表一個中文字都沒有(實測含漢字的字串各 0 條)。 機器上確實另外留著一份中文化的備份,而那一份兩張表都換了 (IGENG 992 條、FEENG 4,914 條含漢字)。 把「這台機器上看到的現象」寫成「別人的做法」,本站又犯了一次。

同一條在兩張表裡的 ™ 符號也不一樣 —— 模組那張的商標符號被編碼弄壞了。 這說明字型與編碼是中文化最容易出事的地方。

⚠️ 編號 704 那組,本站原本寫錯了

原本寫「Home Run DerbyHome Run Showdown 是 EA 原版就不一樣的,跟模組無關」。反了。

剛安裝好的原版查:FEENG.LOCIGENG.LOC 的第 704 條 都是 Home Run Showdown, 而 Home Run Derby 這個字串兩個檔加起來出現 0 次

本站測試機那份 FEENG.LOC 被 2023 年的名冊模組換過(md5 跟原版不同), 差異是模組造成的,不是 EA 原版就有的

這正是同一頁上面在講的那件事: 把這台機器上的現象寫成 EA 的做法。同一種錯,漏改了一處。

那些「不是給玩家看的」字串

翻文字表的時候會撞到一批明顯不是遊戲文案的東西。它們出現在正式出貨的遊戲裡

位置內容看起來是什麼
兩個檔的第 0 條<some text>佔位字串
兩個檔的第 1 條Hello, world! 程式設計的第一課,就這樣留在出貨版裡
IG 287–293
FE 594–603
WWW / WWWW / …
最長 32 個 W
見下方說明
IG 284–285999 / 99數字欄位的佔位
FE 4791–4793<Required>
<********>
註冊表單的欄位提示(還有一條是信箱格式範例)

一整排 W 是有用途的

W 在大多數字型裡是最寬的字母。 想確認「這個欄位能不能塞得下 8 個字」,最保險的做法就是塞 8 個 W 進去看看。

所以那些 WWWW 不是打錯字,是版面寬度的測試字串。 翻譯成別的語言時,這種欄位最容易爆版。

其實還有第三套文字表

上面講的兩個 .LOC 是遊戲本體的。 但遊戲裡那個內建網站自己的一套, 而且做法完全相反 —— 它是純文字的 XML,記事本直接打得開

<Row>
    <Id>BTN_OK</Id>
    <en>OK</en>
</Row>
量到的結果
檔案data\easo\mvp\main\MVP_lt_en.xml
大小142,317 bytes / 6,227 行
條目數1,556
語言只有英文(標籤是 <en>,看得出本來設計成可以多語)

它的編號不是數字,是看得懂的名字

前綴幾條是什麼
UC_201照名字分類:按鈕、警告、訊息、說明、錯誤、頁籤…
ALERT_79
BTN_77
MSG_72
SUBS_58
DESC_51
ERR_45
TAB_41

同一款遊戲,兩種完全相反的做法

遊戲本體內建網站
格式二進位(要寫程式才讀得出來) 純文字 XML(記事本就行)
編號數字(3501名字(BTN_OK
條數7,9361,556

網頁那一套是用網頁技術做的,所以跟著網頁的慣例走。 同一片光碟裡,兩個團隊各做各的。

這份表裡有 32 個伺服器錯誤代號, 但那個故事頁講的 SERVER_ERROR_10016 不在裡面 —— 本站重驗過,確實查不到。

做成中文版要動的就是這兩個檔

版面檔只存編號,所以中文化不是改版面檔,是改 .LOC。 本站測試機的這兩個檔都還是英文;動過它們的是 2023 年的名冊模組,不是中文化模組。

本站教的中文化,是「搬」不是「從零做」

格式解開了。要「從零做一套中文」還缺兩塊,但要「把官方現成的中文搬到英文版」不缺:

一、寫回 .LOC 的工具後來做了 —— 在中文版配大球場就跳出那一課(mvp_fix_loc.py:照原結構寫回、索引偏移跟著更新、--apply 才真的寫、有 --restore)。本節原本寫「本站沒做,只做了讀」,那句已經過期。
二、字型檔的字圖集與字元表讀得出來(見那一頁 2026-09-05 的訂正), 但本站沒有從零產生一份、再寫回去的辦法 —— 中文字要顯示得出來,字型裡得先有那些字。

可繞過 第一塊後來做了;第二塊(從零造一套字型)確實還沒解 —— 讀得出來、寫不回去 —— 但不必解它:官方繁中版的中文字型是現成的,搬過去就好。所以本站中文化教學,教的是把官方中文搬進英文版,不是教你從零刻一套中文字型。

另外拆解 EA 官方繁中版(兩份官方發行版的格式比對,不是教人做東西)見官方中文版拆給你看;官方那三個更新檔改了什麼見更新檔說明

怎麼自己查

介面萬用工具內建了這個功能:

python mvp_fel_toolkit.py "你的遊戲資料夾" --strings fes_ingameoverlay.fel
你會看到
版面檔                       行號 元素            編號 文字
------------------------------------------------------------------
fes_ingameoverlay.fel         38 TEXT          23505 Argument Intensity
fes_ingameoverlay.fel         43 TEXT           1286 To Charge Mound Press
fes_ingameoverlay.fel         53 PRESS         14275 Press START button
fes_ingameoverlay.fel        126 PITCHSPEED1    3500 999

不加檔名就掃封裝檔裡的每一個版面檔(ingame.big 在本站測試機是 47 個,剛安裝好的原版是 44 個)。全程唯讀。

📌 重點整理

接下來