BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//pretalx//pretalx.coscup.org//coscup-2026//speaker//7QZY9Y
BEGIN:VTIMEZONE
TZID:CST
BEGIN:STANDARD
DTSTART:20000101T000000
RRULE:FREQ=YEARLY;BYMONTH=1
TZNAME:CST
TZOFFSETFROM:+0800
TZOFFSETTO:+0800
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
UID:pretalx-coscup-2026-WRT7WL@pretalx.coscup.org
DTSTART;TZID=CST:20260808T111000
DTEND;TZID=CST:20260808T114000
DESCRIPTION:我和北科程式設計研究社的伙伴利用課餘（以及
 偶爾的上課時間）維護一款 GPLv3 授權的校園軟體 Tattoo，
 協助北科大學生查課表、看成績、處理校務系統。專案
 從 zh-TW 與 en-US 雙語起步，英文由社團成員人工翻譯；後
 來為了服務校內多數來自非英語系國家的外籍生，又逐
 步擴充到我們自己不熟的語言\,採用「LLM 出初稿、再透
 過翻譯平臺交給該語系學生修正」的流程。半年下來繞
 了不少遠路，這場分享想把走過的路攤開，給做小型自
 由軟體本地化的開發者一份參考。\n\n一開始談**翻譯協
 作平臺**。為了上述的多語流程，我先後試過 Weblate 和 Cr
 owdin，最後兩個都關掉了。一方面是同步機制本身彆扭：
 譯者在平臺上的修改會被 bot 一筆筆推回 GitHub，被「New t
 ranslations zh-tw.i18n.yaml」這類 commit 淹沒主線。另一方面是
 兩個平臺接 GitHub 的權限模型：為了一個專案的翻譯，卻
 得授權整個組織的管理權限，這個取捨很難說服自己。
 最後我們只能暫時關閉同步，並重新思考要怎麼讓非開
 發者的譯者貢獻。\n\n我們還會介紹 **Flutter 上的選擇**。
 Flutter 生態有幾套常見的 i18n 套件，我們最後選了對譯者
 與審查者格式友善的 slang。框架本身不是這場的重點，
 只會用幾分鐘帶過技術選型的過程。\n\n接下來我們會討
 論**翻譯檔的儲存格式**。從 ARB (JSON-based) 看到 JSON、YAML
 ，討論為什麼落腳在 YAML：人類可讀、可註解、多行字串
 友善、不被尾逗號搞死。當然 YAML 並非完美方案：行尾
 多餘空格、長字串折行語意、保留字與特殊字元的 escapin
 g 都會偶爾造成問題，這些經驗一併分享。\n\n最後是**漢
 英對譯實戰陷阱**：以漢語為母語的開發者很容易忘了其
 他語系有單複數、時態等語法分支——當你直覺地把字
 串寫好後，等到 en-US 要區分 `one`/`other` 時，就得回頭重
 寫整個結構，整個 App 一起改。我會以「密碼將於 N 天後
 過期」為例，示範從第一天就該怎麼設計翻譯鍵。同場
 加映 CJK 與英數字之間的空格該不該寫進原始字串、教室
 名稱與專有名詞的雙語對應策略，以及校務系統回傳混
 雜中英資料時，如何用一個小小的 `localized(zh\, en)` helper 
 處理。\n\n希望這 30 分鐘能讓做 Flutter App 或其他軟體的
 朋友，少踩幾個我們踩過的坑。
DTSTAMP:20260713T132623Z
LOCATION:TR409-2
SUMMARY:用社群的力量打造服務所有人的 App：翻譯平台整合撞牆談 - Riley\, Bradly
URL:https://pretalx.coscup.org/coscup-2026/talk/WRT7WL/
END:VEVENT
END:VCALENDAR
