免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Flutter鴻蒙化遷移實(shí)戰(zhàn):gettext PO/MO資產(chǎn)適配與轉(zhuǎn)換

Flutter鴻蒙化遷移實(shí)戰(zhàn):gettext PO/MO資產(chǎn)適配與轉(zhuǎn)換 前陣子把團(tuán)隊(duì)維護(hù)了多年的 Flutter 應(yīng)用遷到 HarmonyOS 平臺(tái)功能代碼倒沒折騰太久真正卡住我的反而是本地化這套東西。項(xiàng)目長(zhǎng)期用 gettext 體系管理翻譯PO 文件累積了上萬條文案后端、運(yùn)營(yíng)和外包翻譯全都圍著這套資產(chǎn)轉(zhuǎn)。我的目標(biāo)很明確讓鴻蒙版直接消費(fèi)現(xiàn)有 PO/MO 文件而不是另起爐灶維護(hù)一套新資源。于是我把 Flutter 三方庫(kù) gettext_parser 引到鴻蒙工程里做驗(yàn)證結(jié)果一個(gè)問題接一個(gè)問題冒出來文件讀取層要適配、編碼差異要處理、大 PO 文件解析性能不夠、復(fù)數(shù)規(guī)則跟兩側(cè)平臺(tái)對(duì)不齊。這篇文章就完整記錄這次的適配過程從 PO/MO 格式原理講起到鴻蒙化改造的具體步驟再到高性能多語(yǔ)言資源轉(zhuǎn)換管線的設(shè)計(jì)最后附上問題排查速查表。如果你也在做 Flutter 鴻蒙化遷移或者打算在 Flutter 工程里接入 gettext 翻譯生態(tài)這些經(jīng)驗(yàn)應(yīng)該能幫你省下不少試錯(cuò)時(shí)間。1. 項(xiàng)目背景為什么鴻蒙應(yīng)用還要接 gettext 生態(tài)1.1 存量翻譯資產(chǎn)的價(jià)值先說個(gè)容易被忽略的事實(shí)很多中大型應(yīng)用的多語(yǔ)言資產(chǎn)并不是 Flutter 默認(rèn)的 ARB 文件而是 gettext 體系的 PO/MO 文件。POPortable Object是給人讀、給版本控制工具 diff 的純文本格式每條翻譯由msgid原文和msgstr譯文組成MOMachine Object則是 PO 編譯后的二進(jìn)制形態(tài)體積小、讀取快適合丟進(jìn)生產(chǎn)環(huán)境。這類資產(chǎn)值錢在于幾個(gè)特性一是可讀性好翻譯人員用普通文本編輯器就能改git 里哪行文案變了清清楚楚二是工具鏈成熟各類翻譯管理平臺(tái)都能直接導(dǎo)入導(dǎo)出 PO三是帶上下文和標(biāo)記能力msgctxt、fuzzy、obsolete這些標(biāo)記讓翻譯質(zhì)量管控有據(jù)可查。我接手這個(gè)項(xiàng)目時(shí)PO 文件已經(jīng)沉淀了四五年里面還有大量經(jīng)過市場(chǎng)驗(yàn)證的術(shù)語(yǔ)和句式這筆資產(chǎn)遷移到鴻蒙上要是不能用等于從零再來一遍。所以鴻蒙化的第一個(gè)結(jié)論就是解析器必須在 Dart 側(cè)實(shí)現(xiàn)運(yùn)行在 Flutter 應(yīng)用的進(jìn)程內(nèi)而不是依賴系統(tǒng)級(jí) gettext 庫(kù)——HarmonyOS 上沒有現(xiàn)成的 gettext 運(yùn)行時(shí)。gettext_parser 這個(gè)純 Dart 包正好是干這個(gè)的。1.2 gettext_parser 的能力邊界與適配難點(diǎn)在動(dòng)手前我把 gettext_parser 的能力邊界摸了一遍。它的核心是解析 PO 文本逐條吐出翻譯條目支持多行字符串拼接、轉(zhuǎn)義序列處理、上下文和復(fù)數(shù)原文。這對(duì)文本格式覆蓋得不錯(cuò)但有三件事它不管文件從哪讀、MO 二進(jìn)制怎么解、解析出來的數(shù)據(jù)怎么變成 Flutter 或鴻蒙的資源格式。這三點(diǎn)恰好是鴻蒙化適配的難點(diǎn)。文件讀取這層最麻煩。gettext_parser 本身不碰dart:io但常規(guī)用法都在外面套一層File(path).readAsString()。PC 上沒問題進(jìn)了鴻蒙沙箱就有講究應(yīng)用只能訪問自己的filesDir、cacheDir等目錄資產(chǎn)文件要走rootBundle下載的翻譯包要先進(jìn)沙箱再讀。路徑語(yǔ)義全變了。MO 二進(jìn)制解析是我后補(bǔ)的。gettext 的 PO 適合人維護(hù)但 App 啟動(dòng)時(shí)逐行解析有明顯開銷MO 作為編譯產(chǎn)物在二進(jìn)制層面更省資源。不過 MO 有端序問題、字符串表偏移問題直接按字節(jié)硬讀很容易踩坑。至于資源轉(zhuǎn)換那更是八仙過海Flutter 用 ARBHarmonyOS 用string.json兩邊對(duì)復(fù)數(shù)分類的口徑還不一樣。gettext 的復(fù)數(shù)規(guī)則是數(shù)學(xué)表達(dá)式CLDR 的復(fù)數(shù)類別是語(yǔ)義分類兩邊需要專門做一層映射。這塊我后面會(huì)細(xì)講。1.3 整體改造思路純 Dart 核心 可插拔 IO我最終采用的架構(gòu)是三層分離解析核心層、數(shù)據(jù)源抽象層、資源轉(zhuǎn)換層。解析核心層保持純 Dart不 import 任何dart:io這樣它在構(gòu)建腳本、桌面工具、鴻蒙運(yùn)行環(huán)境里都能跑。數(shù)據(jù)源抽象層定義一個(gè)GetTextSource接口按場(chǎng)景提供不同實(shí)現(xiàn)構(gòu)建期用文件系統(tǒng)實(shí)現(xiàn)讀磁盤 PO運(yùn)行期用資產(chǎn)實(shí)現(xiàn)走rootBundle單元測(cè)試用內(nèi)存實(shí)現(xiàn)喂字符串。資源轉(zhuǎn)換層把解析出的條目統(tǒng)一成中間模型再分別輸出 ARB 和 HarmonyOS 的string.json。這樣設(shè)計(jì)的好處很明顯構(gòu)建工具和 App 運(yùn)行時(shí)共享同一套解析邏輯不用維護(hù)兩份單元測(cè)試可以脫離文件系統(tǒng)跑回歸成本低將來如果還要支持 Android 的strings.xml或者 iOS 的strings只需要在轉(zhuǎn)換層加一個(gè)輸出器核心代碼一行都不用動(dòng)。2. 解析器核心邏輯拆解PO/MO 文件到底怎么讀2.1 PO 文本格式與狀態(tài)機(jī)解析PO 文件看起來就是一組以msgid開頭的塊中間用空行分隔。實(shí)際結(jié)構(gòu)比表面復(fù)雜一段典型的 PO 條目長(zhǎng)這樣# 翻譯者注釋 #. 提取的注釋 #: src/page.dart:120 #, fuzzy msgctxt menu_title msgid Open msgid_plural Open items msgstr[0] 打開 msgstr[1] 打開項(xiàng)目#開頭的行是注釋其中#, fuzzy表示這條翻譯還沒確認(rèn)#~前綴表示條目已廢棄。msgctxt是上下文msgid是單數(shù)原文msgid_plural是復(fù)數(shù)原文msgstr[N]是對(duì)應(yīng)的第 N 個(gè)譯文。文件頭還有一個(gè)msgid 的特殊條目里面存放的是元數(shù)據(jù)包括字符集聲明和Plural-Forms表達(dá)式。解析時(shí)我用的狀態(tài)機(jī)思路逐行掃描維護(hù)一個(gè)“當(dāng)前條目”和“當(dāng)前字段”的狀態(tài)??吹絤sgid、msgctxt、msgstr[N]就切換字段看到以引號(hào)開頭的行說明是上一個(gè)字段的多行續(xù)接拼到當(dāng)前字段末尾遇到空行就把當(dāng)前條目封口并加入結(jié)果列表。字符串還要做反轉(zhuǎn)義\n、\t、\、\\這些都要還原成真實(shí)字符。這里有個(gè)容易忽略的細(xì)節(jié)續(xù)接行不能簡(jiǎn)單trim()掉內(nèi)部空格。PO 規(guī)范里字符串內(nèi)部的空格是有意義的只有行首行尾的空白是格式噪音。處理時(shí)我會(huì)先去掉整行的trim()再用引號(hào)配對(duì)截出字符串體最后統(tǒng)一反轉(zhuǎn)義。實(shí)測(cè)不少第三方 PO 文件就是因?yàn)槟骋恍卸嗔藗€(gè)尾部空格導(dǎo)致譯文拼接錯(cuò)位。2.2 MO 二進(jìn)制格式與端序識(shí)別MO 是二進(jìn)制格式結(jié)構(gòu)比 PO 緊湊得多。文件頭的固定 28 個(gè)字節(jié)里最關(guān)鍵的是前 4 個(gè)字節(jié)的魔數(shù)小端序是0x950412de大端序是0xde120495。讀到魔數(shù)后要先判斷端序再用對(duì)應(yīng)端序去讀后面的字段否則條目數(shù)量會(huì)變成天文數(shù)字偏移量也全錯(cuò)。MO 文件頭字段如下偏移長(zhǎng)度字段說明04magic魔數(shù)用于識(shí)別文件和端序44revision版本號(hào)常見為 084N條目總數(shù)124O原文字符串表的偏移164T譯文字符串表的偏移204S哈希表?xiàng)l目數(shù)0 表示沒有哈希表244H哈希表偏移字符串表是一連串(長(zhǎng)度, 偏移)對(duì)每對(duì)占 8 字節(jié)。注意這里的偏移是相對(duì)于整個(gè)文件頭的不是相對(duì)于字符串表的我第一次實(shí)現(xiàn)時(shí)就在這栽了跟頭。解析完所有條目后再把偏移和長(zhǎng)度指向的字節(jié)用 UTF-8 解碼成字符串。我在 Dart 側(cè)的實(shí)現(xiàn)大致長(zhǎng)這樣ListMoEntry parseMoBytes(Uint8List data) { final bd ByteData.sublistView(data); final magic bd.getUint32(0, Endian.little); final isBigEndian magic 0x950412de; final isLittleEndian magic 0xde120495; if (!isBigEndian !isLittleEndian) { throw FormatException(無效的 MO 文件魔數(shù)不匹配); } final endian isBigEndian ? Endian.big : Endian.little; final count bd.getUint32(8, endian); final origTable bd.getUint32(12, endian); final transTable bd.getUint32(16, endian); final entries MoEntry[]; for (var i 0; i count; i) { final oLen bd.getUint32(origTable i * 8, endian); final oPtr bd.getUint32(origTable i * 8 4, endian); final tLen bd.getUint32(transTable i * 8, endian); final tPtr bd.getUint32(transTable i * 8 4, endian); if (oPtr oLen data.length || tPtr tLen data.length) { throw FormatException(MO 字符串表越界); } entries.add(MoEntry( utf8.decode(data.sublist(oPtr, oPtr oLen)), utf8.decode(data.sublist(tPtr, tPtr tLen)), )); } return entries; }這里我加了兩個(gè)防御一是魔數(shù)不匹配直接拋異常二是讀取字符串前校驗(yàn)偏移和長(zhǎng)度是否越界。MO 文件被截?cái)嗷蛘弑诲e(cuò)誤編譯時(shí)沒有這兩個(gè)檢查會(huì)直接拋一個(gè)很難看的RangeError有了解讀性更好的異常排查問題能少花一半時(shí)間。2.3 復(fù)數(shù)規(guī)則類別的語(yǔ)義映射PO 文件頭的Plural-Forms是一個(gè)數(shù)學(xué)表達(dá)式例如英文是nplurals2; plural(n ! 1);俄文是nplurals3; plural(n%101 n%100!11 ? 0 : n%102 n%104 (n%10010 || n%10020) ? 1 : 2);。而 Flutter 的 ARB 和 HarmonyOS 的資源文件用的是 CLDR 復(fù)數(shù)類別zero、one、two、few、many、other。這兩者不是一回事gettext 返回的是一個(gè)整數(shù)索引第幾個(gè)譯文CLDR 返回的是一個(gè)語(yǔ)義類別。直接硬映射容易出錯(cuò)比如俄文的 gettext 索引 0 對(duì)應(yīng)one索引 1 對(duì)應(yīng)few索引 2 對(duì)應(yīng)many但不同語(yǔ)言、不同公式這種對(duì)應(yīng)關(guān)系完全不同。我的做法是采樣映射對(duì)每個(gè)語(yǔ)言取一組有代表性的 n 值0、1、2、3、5、10、21、100 等代入 gettext 的plural表達(dá)式得到索引再用intl包判斷同樣的 n 在 CLDR 下屬于哪個(gè)類別最后統(tǒng)計(jì)出“索引到類別”的映射關(guān)系并緩存。這樣不需要為每種語(yǔ)言硬編碼規(guī)則公式變了也能自動(dòng)適配。語(yǔ)言族PO 中 nplurals 數(shù)量對(duì)應(yīng) CLDR 復(fù)數(shù)類別中文、日文、韓文1other英文、德文、西班牙文2one / other俄文、烏克蘭文3one / few / many / other阿拉伯文6zero / one / two / few / many / other這張表是概念示意實(shí)際轉(zhuǎn)換時(shí)請(qǐng)務(wù)必用采樣法動(dòng)態(tài)生成映射別偷懶寫死。3. 鴻蒙化改造實(shí)操?gòu)囊蕾囈氲綐?gòu)建通過3.1 環(huán)境準(zhǔn)備與依賴引入策略鴻蒙化第一步不是寫代碼而是確認(rèn)你的 Flutter 工程確實(shí)能構(gòu)建出ohos平臺(tái)目錄。我在現(xiàn)有工程里補(bǔ)建了ohos/平臺(tái)工程flutter 側(cè)環(huán)境變量指向?qū)?yīng)的鴻蒙 SDK然后跑一次構(gòu)建讓腳手架生成平臺(tái)目錄。接下來是關(guān)鍵判斷gettext_parser 是純 Dart 包沒有 Android 的 Kotlin 代碼、沒有 iOS 的 Swift 代碼、沒有 method channel所以它不需要像插件那樣做原生適配。理論上在pubspec.yaml里加一行依賴就能編譯過dependencies: gettext_parser: ^2.0.0但實(shí)際我遇到了 SDK 約束問題。這個(gè)包的environment聲明要求某個(gè) Dart SDK 版本范圍而鴻蒙側(cè)的 Flutter 版本自帶的 Dart SDK 可能落在范圍之外。遇到這種情況不要急著硬改pubspec.lock更穩(wěn)妥的辦法是把它 fork 一份放到工程的packages/gettext_parser_ohos目錄通過dependency_overrides指向本地路徑順便改掉那些依賴特定 Dart 版本特性的代碼。這樣以后鴻蒙 SDK 升級(jí)了你也能控制包的版本行為。3.2 文件讀取適配層設(shè)計(jì)純 Dart 包能編譯過只是第一步真正常踩坑的是數(shù)據(jù)從哪來。我在GetTextSource接口上做了三個(gè)實(shí)現(xiàn)讓解析層完全感知不到平臺(tái)差異abstract class GetTextSource { FutureString readPo(String locale); FutureUint8List readMo(String locale); } // 構(gòu)建期/桌面工具用直接讀磁盤 class FileSource implements GetTextSource { final String baseDir; FileSource(this.baseDir); override FutureString readPo(String locale) async { final file File($baseDir/$locale.po); return file.readAsString(); } override FutureUint8List readMo(String locale) async { final file File($baseDir/$locale.mo); return file.readAsBytes(); } } // App 運(yùn)行期用走 Flutter 資產(chǎn) class AssetSource implements GetTextSource { override FutureString readPo(String locale) async { return rootBundle.loadString(assets/l10n/$locale.po); } override FutureUint8List readMo(String locale) async { final data await rootBundle.load(assets/l10n/$locale.mo); return data.buffer.asUint8List(); } }這個(gè)改動(dòng)打掉了 90% 的鴻蒙適配問題。因?yàn)?gettext_parser 本身不讀文件只要外面喂字節(jié)給它它在哪個(gè)平臺(tái)跑都是一樣的。我的經(jīng)驗(yàn)是凡是能定義抽象接口的 IO 操作一定要定義接口別讓解析庫(kù)直接碰dart:io。這條原則對(duì)鴻蒙化尤其重要因?yàn)槠脚_(tái)差異幾乎全部集中在 IO 邊界上。3.3 沙箱路徑與資源預(yù)加載的處理如果把 PO/MO 文件打進(jìn)安裝包那運(yùn)行期直接用AssetSource就好assets/l10n/目錄下的文件在鴻蒙上會(huì)隨 FLutter 資產(chǎn)一起打包。但有些場(chǎng)景需要?jiǎng)討B(tài)更新翻譯例如從服務(wù)端拉取最新的 PO 文件。這時(shí)候問題來了下載文件寫到哪里鴻蒙應(yīng)用沙箱里可以寫入的目錄是有限的。我們一般用路徑提供器拿到filesDir或cacheDir然后把下載的 PO 文件寫到那里。注意cacheDir里的文件隨時(shí)可能被系統(tǒng)清理適合放臨時(shí)緩存要長(zhǎng)期保留的翻譯文件放filesDir更穩(wěn)。千萬別嘗試往安裝目錄或者外部公共目錄寫權(quán)限和路徑都存在不確定性。文件寫好后還要考慮加載時(shí)機(jī)。幾千條文案的 PO 文件解析耗時(shí)在百毫秒級(jí)如果 APP 啟動(dòng)第一幀就同步解析用戶會(huì)明顯感覺到卡頓。我做了兩級(jí)緩解啟動(dòng)時(shí)用Isolate.run丟到后臺(tái) isolate 解析解析結(jié)果緩存到內(nèi)存如果文件太大、啟動(dòng)階段實(shí)在來不及就先只解析當(dāng)前語(yǔ)言其余語(yǔ)言等用戶切換時(shí)再懶加載。3.4 構(gòu)建配置與平臺(tái)工程注冊(cè)關(guān)于ohos/平臺(tái)的構(gòu)建配置有三個(gè)點(diǎn)值得單獨(dú)說。第一確保pubspec.yaml的 assets 聲明里包含了 PO/MO 文件路徑。只在目錄里放了文件但沒有聲明構(gòu)建時(shí)會(huì)被靜默丟棄。第二純 Dart 包不需要在 ohos 平臺(tái)目錄里注冊(cè)任何東西但如果你的工程里還有其他依賴是帶原生代碼的 flutter 插件它們必須有對(duì)應(yīng)的 ohos 適配版本否則整條構(gòu)建鏈會(huì)掛在依賴解析上。第三HarmonyOS 側(cè)的網(wǎng)絡(luò)權(quán)限默認(rèn)不開如果運(yùn)行期要拉取翻譯文件記得在ohos工程相應(yīng)的配置文件里聲明網(wǎng)絡(luò)權(quán)限只在本地解析則無需任何額外權(quán)限。構(gòu)建跑通以后我的運(yùn)行期代碼路徑是這樣的優(yōu)先嘗試讀取 MO二進(jìn)制的加載和解析都更快文件不存在再退回讀 PO——完全沿用 gettext 生態(tài)的慣例把 MO 當(dāng)生產(chǎn)格式PO 當(dāng)維護(hù)格式。4. 高性能多語(yǔ)言資源轉(zhuǎn)換管線4.1 轉(zhuǎn)換鏈路PO/MO → 中間模型 → ARB / string.json轉(zhuǎn)換管線是我這套方案里最實(shí)用的部分。它的目標(biāo)是一份 PO/MO 資產(chǎn)自動(dòng)產(chǎn)出 Flutter 工程用的 ARB 和鴻蒙工程用的string.json。鏈路分三段。第一段是輸入規(guī)范化PO 文本或 MO 字節(jié)統(tǒng)一解析成PoEntry列表。第二段是中間模型把條目去重、過濾掉fuzzy和obsolete并解析出復(fù)數(shù)類別映射得到干凈的“key 到譯文”數(shù)據(jù)。第三段是輸出按目標(biāo)平臺(tái)的格式序列化。過濾邏輯很關(guān)鍵我單獨(dú)摘出來MapString, String toSimpleMap(ListPoEntry entries) { final map String, String{}; for (final entry in entries) { if (entry.obsolete) continue; // 廢棄條目不要 if (entry.fuzzy) continue; // 未確認(rèn)翻譯不要 if (entry.msgid.isEmpty) continue; // 跳過頭部元數(shù)據(jù) final value entry.msgstr.isNotEmpty ? entry.msgstr.first : entry.msgid; map[entry.msgid] value.isEmpty ? entry.msgid : value; } return map; }譯文為空時(shí)回退到原文保證 UI 上不會(huì)出現(xiàn)空白標(biāo)簽。輸出 ARB 時(shí)把開頭的元數(shù)據(jù)鍵補(bǔ)上輸出鴻蒙資源時(shí)轉(zhuǎn)成下面這種結(jié)構(gòu){ string: [ { name: hello, value: 你好 } ], plural: [ { name: messageCount, value: [ { quantity: one, value: %d 條消息 }, { quantity: other, value: %d 條消息 } ] } ] }這里要特別留意不同 HarmonyOS API 版本對(duì)資源文件的組織方式可能有差異有的版本把string和plural放在同一個(gè) JSON 的不同數(shù)組里有的版本拆成獨(dú)立文件。我建議在轉(zhuǎn)換器里把“是否輸出 plural 數(shù)組”做成開關(guān)按目標(biāo) API 版本配置。4.2 性能調(diào)優(yōu)分檔緩存、流式解析與并發(fā)轉(zhuǎn)換“高性能”不是堆出來的形容詞落到具體指標(biāo)上我關(guān)注的是解析耗時(shí)和內(nèi)存峰值。剛開始直接File.readAsString再逐行解析一個(gè) 24 MB 的大 PO 文件能把內(nèi)存頂?shù)?200 MB 以上App 必崩。后來做了三件事把它壓下來。第一解析結(jié)果分檔緩存。解析過的條目存在內(nèi)存 Map 里再次請(qǐng)求同一個(gè)語(yǔ)言直接命中不重復(fù)解析。第二盡量用流式接口。gettext_parser 本身支持按塊吐出條目用await for消費(fèi)而不是攢成一個(gè) List內(nèi)存占用能降一半。第三大文件丟給 isolate。Isolate.run(() parseAndConvert(...))可以在后臺(tái)線程完成解析和序列化避免 jank。我這邊在中端測(cè)試機(jī)上測(cè)的一組數(shù)據(jù)僅供參考文件大小 / 條目數(shù)解析方式耗時(shí)內(nèi)存峰值2 MB / 4800 條全量讀入 狀態(tài)機(jī)約 130 ms約 24 MB2 MB / 4800 條流式分塊解析約 95 ms約 12 MB24 MB / 53000 條全量讀入約 2.8 s約 210 MB24 MB / 53000 條isolate 分檔緩存約 1.1 s約 60 MB還有一個(gè)構(gòu)建期的小技巧轉(zhuǎn)換工具本身用dart run執(zhí)行多個(gè)語(yǔ)言文件可以并行轉(zhuǎn)換每個(gè)語(yǔ)言一個(gè) isolate總耗時(shí)能進(jìn)一步壓縮。因?yàn)檎Z(yǔ)言之間沒有依賴并行是天然安全的。4.3 輸出資源的一致性校驗(yàn)自動(dòng)化轉(zhuǎn)換最怕的是“轉(zhuǎn)出來了但轉(zhuǎn)錯(cuò)了”。我加了三個(gè)校驗(yàn)步驟每次轉(zhuǎn)換后自動(dòng)執(zhí)行。第一個(gè)是鍵一致性檢查把基準(zhǔn)語(yǔ)言一般是英文的 key 集合和各語(yǔ)言比對(duì)報(bào)告缺失和多余。多余的 key 通常意味著 PO 文件里殘留了廢棄條目沒清干凈。第二個(gè)是占位符檢查用正則提取%s、%d、{name}這類占位符比對(duì)原文和譯文的集合是否一致不一致的條目直接標(biāo)紅。這個(gè)檢查救過我多次——譯者把%s打成了%S真機(jī)上就跑出奇怪文案。第三個(gè)是復(fù)數(shù)形式數(shù)量檢查對(duì)比Plural-Forms聲明和實(shí)際msgstr[n]條目數(shù)數(shù)量對(duì)不上說明文件本身?yè)p壞。5. 常見問題與排查技巧實(shí)錄5.1 編碼與 BOM 相關(guān)的三個(gè)坑第一坑UTF-8 BOM。有的 Windows 端翻譯工具會(huì)往 PO 文件頭塞 BOMEF BB BFDart 的utf8.decode遇到 BOM 會(huì)把\uFEFF當(dāng)作第一個(gè)字符帶進(jìn)解析結(jié)果。處理辦法是讀取后先檢測(cè)并剝離 BOM 再喂給解析器。第二坑字符集聲明和實(shí)際編碼不符。PO 文件頭的Content-Type可能寫著charsetUTF-8但實(shí)際文件是 Latin-1 或 GBK 編碼。這種情況在從老系統(tǒng)遷移的 PO 里不少見。我在數(shù)據(jù)源層做了個(gè)預(yù)檢讀前 64 字節(jié)嘗試檢測(cè)編碼如果檢測(cè)結(jié)果不是 UTF-8就先用對(duì)應(yīng)字符集轉(zhuǎn)成 UTF-8 再解析。Dart 側(cè)沒有內(nèi)置全套字符集轉(zhuǎn)換需要引入轉(zhuǎn)換類庫(kù)或者更穩(wěn)妥的辦法是讓翻譯工具重新導(dǎo)出一次 UTF-8 版本——我通常選后者因?yàn)闅v史編碼文件里往往混著損壞的字節(jié)硬轉(zhuǎn)不如重導(dǎo)。第三坑字符串里的裸換行。PO 規(guī)范要求長(zhǎng)字符串用引號(hào)續(xù)接但也有不守規(guī)矩的文件直接在msgstr里塞了裸換行導(dǎo)致狀態(tài)機(jī)誤判條目結(jié)束。我的兜底策略是解析出錯(cuò)時(shí)記錄行號(hào)而不是直接拋異常終止整個(gè)文件把單條錯(cuò)誤隔離掉保證其余條目還能用。5.2 復(fù)數(shù)規(guī)則與占位符不匹配復(fù)數(shù)這塊最常見的問題是只取了msgstr[0]就當(dāng)成單數(shù)用。后果是俄文、阿拉伯文這類多復(fù)數(shù)形態(tài)的語(yǔ)言界面上一部分場(chǎng)景永遠(yuǎn)顯示默認(rèn)格式。我的采樣映射方案解決了索引到 CLDR 類別的換算但還有一個(gè)前提PO 文件里必須真的有完整復(fù)數(shù)條目。如果原文里只有msgstr[0]那再怎么映射也只有一種形態(tài)這種情況要回到翻譯流程去補(bǔ)齊。占位符問題則是另一類重災(zāi)區(qū)。gettext 傳統(tǒng)上是%s、%d風(fēng)格而 ARB 喜歡{name}命名風(fēng)格HarmonyOS 資源又常同時(shí)支持%s和{name}。我見過最慘烈的案例是%1$s這種帶位置參數(shù)的占位符被無腦替換成{1}結(jié)果真機(jī)上直接顯示花括號(hào)。我的處理策略是轉(zhuǎn)換時(shí)先按序把%s、%d映射到{arg0}、{arg1}再在目標(biāo)平臺(tái)格式化處按序替換回去。新加的文案則一律要求譯者使用命名占位符從源頭消滅歧義。5.3 大文件解析卡頓與內(nèi)存飆升小 PO 文件隨便解析都沒問題一旦翻譯條目超過兩三萬問題就暴露了??D的根源通常不是 CPU而是字符串頻繁拼接和中間 List 積壓。分析下來占內(nèi)存大頭的往往是readAsString那把整個(gè)文件一次性讀進(jìn)來的字符串對(duì)象加上逐條解析時(shí)臨時(shí)生成的中間字符串兩頭一夾內(nèi)存就上去了。我的解法有兩層。運(yùn)行時(shí)解析走流式不要把整個(gè) PO 內(nèi)容變成一個(gè)超長(zhǎng) String而是分塊讀、分塊解析塊與塊之間共享狀態(tài)機(jī)狀態(tài)。構(gòu)建期工具則更簡(jiǎn)單粗暴把大的 PO 按語(yǔ)言拆成多個(gè)獨(dú)立文件并行解析。真到了單文件幾十 MB 的規(guī)模配合Isolate.run和結(jié)果緩存內(nèi)存峰值能壓到原來的四分之一左右。5.4 我在實(shí)操中總結(jié)的三個(gè)小原則適配做下來沉淀出三條經(jīng)驗(yàn)比任何具體代碼都值錢。第一解析庫(kù)必須保持純 Dart所有 IO 都要通過抽象接口注入。這不是潔癖而是鴻蒙、Web、桌面、測(cè)試環(huán)境對(duì)文件訪問的語(yǔ)義差異太大靠if (Platform.isXxx)打補(bǔ)丁遲早翻車。第二轉(zhuǎn)換工具的校驗(yàn)邏輯要比功能代碼寫得早。多語(yǔ)言資源一旦出問題用戶看到的是亂碼和錯(cuò)位反饋鏈路很長(zhǎng)靠人工排查成本極高校驗(yàn)必須在構(gòu)建階段自動(dòng)完成。第三歸檔時(shí)把 PO 文件和轉(zhuǎn)換腳本放同一個(gè)倉(cāng)庫(kù)做到“改完 PO跑一下腳本資源就齊了”。我后來把這條鏈路接進(jìn)了 CI每次合并前自動(dòng)跑一遍轉(zhuǎn)換和校驗(yàn)已經(jīng)有兩次在發(fā)版前攔下了占位符不一致的問題。這些經(jīng)驗(yàn)對(duì)任何涉及多語(yǔ)言資源遷移的項(xiàng)目都適用不只是鴻蒙這一個(gè)場(chǎng)景。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
九色91国产| 五月激激网w'w'w| 超碰资源在线| wwwC0maV五月花| 欧美色婷婷| 婷色成人| 网色99| 五月亭亭六月天| 天天综合色丁香| 五月丁香六月成人| 五月天婷婷视频30| 大香蕉五月婷婷| 国产精产国品一二三在观看| 91色在线/日韩| 这里只有精品在线视频精品| 色五月激情综合网站| 99热国内精品| 丁香五月成人在线| 亭亭丁香久久五月| 性色婷婷| 日本9区视频| 91狠狠色丁香婷婷综合久久精品| 第四色五月天| 性生活久久朋友人妻| 九色91视频| 国产人妻777人伦精品HD| 丁香六月五月婷婷| 99综合99| 91婷婷丁香| Aaa久久| 色香蕉影院| 色欲五月天| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 天天做天天爱| 天天色天天操天天射| 久久精品66| 伊人婷婷五月天| 9999热在线观看| 国产暴力强伦轩1区二区小说| 九九热婷婷| 成人婷婷五月| 五月丁香成人日| 婷婷五月综合色中文字幕| 白人荫道BBWBBB大荫道| 夜夜嗨一区二区三区直播内容| 丁香五月久久| 午夜69成人做爰视频| 色综合伊人网| 色色无码| 牛色色碰| 婷婷五月丁香综合网| 99精彩视频| AV性爱网| 91日日日| 日日天天干| www.久久综合| 91色婷婷综合久久中文字幕二区| 国产美女无遮挡裸体毛片A片| 天天干,夜夜爽| 91精品无码| 91人人网| 欧美搡BBBBB摔BBBBB| 五月激情综合网| 国产精品久久久久久久久久| 性爱111111| 国产干逼片| 久热精品9999| 国产操B视频| 午夜爱爱网站| 婷婷天天插天天爱| 亚洲aV写真天天综合网久久| 五月婷婷偷拍| 亚洲乱码日产精品BD| 蜜桃成语时李时珍 免费| 亚洲欧洲中文日韩久久AV乱码| 99热精品在线观看| 丁香社92视频| 亚洲婷婷五月天综合| WWW色五月天| 天天插天天日天天爽| 色五月视频无码播放| 这里只有精彩视| 丁香五月婷婷激情中文| 思思久久精品| 在线超碰精品| 中文字幕婷婷五月天| 婷婷在线操| 五月天激情久色| 欧美五月丁香| 网站免费一站二站| 中文字幕欧美精品久久| 99国产小视频2013| 亚洲五月停停| 久草热8精品视频在线观看| 射满了还射免费在线观看 -午夜版全集-新视觉影院 | 色婷六月| 五月综合激情视频| 五月丁香六月成人| 婷婷黄色五月| 99re热久久| 精品无吗va视频免费观看| 激情五月丁香五月| 超碰AV成人| 亚洲久热| 99热免费精品| 操婷婷久久| 99久久99视频只有精品| 人妻视频在线| 色综合色婷色基地| 婷婷五月天首页| 婷婷色片| 五月色情婷婷| 日逼免费视频| 丁香网站| 久月丁香爱婷婷综合| 久久久久久久久人妻| av在线资源| 精品成人在线| 无码毛片992367| 欧美成人va| 风流少妇A片一区二区蜜桃 | 色综合久久88色综合天天99| 国产婷伊人| 天天色丁香| 久久这里有精品在线观看| 激情九九六月激情免费视频| 91av视频在线观看最新网址| 婷婷金品综合视频| 99热最新国内| 欧美性色五月天| 日韩在线视频中文字幕| 69综合在线| 日韩av大全| 天天久久狠狠色综合| 五月婷婷激情在线| 操一操| 91碰碰碰| 99热99ai| 欧美成人精品A片免费一区99| 日韩在线99| 99热国产在线| www.久久久久久久久久.com| 久久偷拍综合五月天| 日韩中文字幕| 五月婷在线色视频| 大香蕉 婷婷| 亚洲激情图文小说| 欧美私人家庭影院| 九玖欧洲亚洲| 五月天另类小说久久小说网| 日本色狠狠| av操B网站| 五月婷婷,六月激情| 99热亚洲| 99热这里只有免费| 超碰爱爱爱| 噜噜吧天天爱| 另类图片天天影视在线观看| 天天综合精品| 婷婷娱乐丁香综合网| 亚洲熟妇AV乱码在线观看| 久久99热这里| 色综合99色| 五月天激情综合10p| 五月天婷婷激情| 丁香五月丐人妻| 激情五月综合| anquye五月| 1024操逼| 丁香五月婷婷激情尤物| 99色区| www.久热| 99视频只有这里精品| 亚州男人天堂婷婷五月| 日本色色网站| 成人超碰AV| 极品少妇XXXX精品少妇偷拍| 久久激情五月婷婷| 大香蕉婷婷五月| 任你爽精品免费视频6| 超碰人人在线| 情涩婷婷五月天| 色婷婷精品视频在线播放| 色播激情五月天| 丁香六月婷婷综合啪啪| 欧美日韩欧美| 丁香五月五月婷婷| 日本的α片xxxwww| 色色婷婷色色| 免费无码毛片一区二区A片| 久久这里只有精品网| 亚洲岛国电影| 久久激情五月| 婷婷性色| 综合五月亭亭9| 一区中文字幕电影| 天堂成人A片永久免费网站| 这里只有精品99www| 亚洲AV日韩AV永久无码网站| www.狠狠| 五月天久久网站| 狼人婷婷久久| 久久女人九九| 欧美性生交XXXXX无码小说| 99免费| 蜘蛛女免费观看完整版高清电影| 欧美婷婷综合网| 天天操天天操天天操天天操天天操 | 五月天激情站| 婷婷五月综合色拍| 91日婷婷在线| 99热热热天天人人人超超碰| 久久久WWW| 风流少妇A片一区二区蜜桃| 五月婷婷丁香在线| 深爱五月天天| 9er热在线精品视频| 色婷婷无吗| 中文av网| 在线播放中文字幕| 女人天堂AV| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 欧美性猛交AAAA片黑人 | 天天激情| 天天干天天色天天干| 亚洲综合1024| 久婷久婷激情肉| 久久综合久色欧美综合狠狠 | 色婷婷成人五月| 九九热只有精品6| 97久人人| 9久久AV| 激情九月丁香婷婷| 粉嫩AV久久一区二区三区| www.五月天婷婷| 亚洲爱爱无码婷婷色五月| 日韩高清成人| 五月丁香欧美综合| 色婷婷激情| 久久婷婷东京热大香樵| 99热热热国产超碰| 欧美日韩成人高清在线| 五月天激情网址| 免费在线观看av网站| 九九色色| 中文字幕丰满孑伦无码专区| 麻豆AV一区二区三区| 性爱综合网| 97操碰视频| 91精品久久久久、久五月天| 五月天婷婷基地| 99r这里| 亚洲五月婷天天操| 深爱五月亚洲| 天天狠狠干| 欧美激情综合色丁香婷婷五月天| 天天爱夜夜爽| 成人丁香色| 超碰人人干| 婷婷五月丁香六月| 九色自拍| 能看的AV| 99热xx| 国产精品男人AV不卡| 超碰cap| 97碰精品| 色天使色婷婷| 狠色狠色狠狠色综合网| 丁香五月亚洲婷婷| 婷婷八月丁香激情综合| 婷婷天天色| 亚洲精品亚洲人成人网| 97色 五月天丁香| 精品国婬伦V无码久久久| 激情国产五月| 天天肏高清在线| 色五月婷婷操逼| 激情床戏| 快色t v在线入口| 99精品小视频| 天天综合色| 一本大道熟女人妻中文字幕在线| 五月丁香久久婷| 五月天婷婷伊人| 99综合免费视频| 色五月开心五月激情五月| 国产色婷婷亚洲| 九九婷婷激情综合网| 欧美三级巜人妻互换| 六月色丁香婷婷| 色色色色色五月| 91碰超| 丁香五月香蕉在线| 开心激情播播五月天| 超碰人人操| 婷婷色六月| 婷婷五月欧美综合| 色五月婷婷综合在线| 久热久| 综合视频五月| 色播六月| 久久99这里只有精品| 荷兰av一级| 亚洲超碰在线| 就去色色五月丁香婷婷久久久| 婷婷六月视频| 99愛国产| 天天做天天爱| 91久久综合亚洲噜噜成人在线 | 久久综合五月天| 大香蕉伊人久久| 婷婷色色网站| 综合五月草 | 亚洲碰碰碰| 婷婷五月av| 综合网网欲色| 亚洲人人操BD| 五月天激情小说| 免费亚洲成人电影AV| 五月激情婷婷图片基地| 欧洲S级在线观看| 亚洲成人色五月婷婷综合| 国产亚洲精久久久久| 色综合婷婷| 久久婷婷五月天丁香| 色v综合网| 婷婷五月婷婷五月天| 亚洲旡码| 成人午夜免费电影| 人妻久久久久久久 | 丁香五月婷婷色| 精品自拍97| 日日噜人人人做人| 日韩成人电影AV| 欧美久久久中文字幕| 久热久色| 婷婷五月天丁香| 国产婷婷五月| 怡红院一二三| 4399精品一区二区| 九九在线这里只有精品视频| 99热99精品在线观看| 熟女激情网| 中文AV在线观看| 色婷婷五月丁香色| 四月婷婷丁香| 日韩有码一区| 99热这里只有精品国产精品| 亚洲AV成人精品网站在线播放| 色五月无码| 91超级碰在线视频| www.97碰碰com| 激情5月婷婷| 97操操网| 亚州性爱99| 风流少妇A片一区二区蜜桃 | 色情五月婷婷| 五月亭亭欧美女人| 亚洲五月丁香六月婷婷| 一级性感黄色内射视频| 色综合丁香| wWW九九在线播放| 色五月婷婷五月| 99热官网精品在线| 在线观看亚洲视频影院| 久久婷婷综合网| 欧美va视频| 99欧州偷拍视频| 99热亚洲| 超碰av在线| 婷婷伊人綜合中文字幕| 99激情视频热| 色六月 婷婷| 五月丁香色婷婷综合| 天天揷综合网| 99热这里只有精| 五月久久网| 欧美精产国品一二三区| 久久五月婷婷丁香| 欧美狠狠草| 色色婷| 五月丁香网中文字幕| 电影91久久久| a久久| 国产成人AV在线| 九九99久久| 五月丁香日本片| 欧美成人AAA片一区国产精品| 国产99视频永久免费| 人妻视频一区而且二区| 九九激情综合| 丁香五月天无码| 97涩婷婷婷婷基地| 91九色国产| 久久九九免费大视频| 亚洲精品久久久无码| 色五月天成人在线| 六月丁香停| 狠狠色成人影片| 亚洲另类婷婷五月综合| 91九色大屁股| 国产,欧美,学生妹,视频| 99久久激情视频| www激情| 播丁香五月婷婷欧美| 中文av网站| 综合激情五月四射婷婷| 激情综合婷婷久久| 99在线精品免费视频| 97婷婷五月| 免费黄色AV| 免费看欧美成人A片无码| 色五月综合在线| 狠狠综合| 丁香五月婷婷激情尤物| 国产成人AV不卡| 六月丁香色色| 操婷婷久久| 99性视频| 韩国激情五月天综合网| 啪啪啪五月天| www。狠狠干。com| 国产色网站| 国产AV熟妇人震精品一品二区| 色欲午夜无码久久久久久张津瑜 | 麻豆精品| 四川BBB搡BBB爽爽视频| 丁香五月电影| 五月婷婷影| 开心五月天激情| 99久久99视频只有精品| 五月婷婷AV| 九色porny在线观看激情四射| www.夜夜操| 五月婷婷色| 色婷婷五月婷婷五月婷婷五月| 另类激情五月| 久久99看免费| 丁香花婷婷五月天| 国产女生爱爱AA| 欧美69久成人做爰视频| 99热| 色偷偷AV亚洲男人的天堂| 丁香五月91| 爽天天天天天天天| 婷婷五月天堂| 丁香五月播播| 99re鈥哸鈥唙| 婷婷丁香五月亚洲| 色色射| 综合六月激情婷婷| 狠狠狠狠狠狠狠狠草| 激情婷婷丁香五月天小说| 六月丁香狠狠爱| 婷婷深爱五月亚洲综合| 狠狠色狠狠鲁| xx综合网| 99re思思精品在线观看| 天天日,夜夜爽| 五月丁香久久综合精品| 五月丁香六月婷婷不卡免费无码| 久久这里在精品视频| 丁香五月婷婷啪啪啪| 丁香五月激情综合婷综| 操逼国产91| 激情文学 综合 九月| 日本婷婷色| 亚洲成人丁香花| 人人操超碰| 日韩不卡123| 婷婷九九色| 日韩野外 无套| 亚洲精品一二三| 婷婷五月天VI| 免费播放AV| 狠狠干狠狠操狠狠爱| 一区二区你懂的| 色色色色色日韩午夜激情| 婷婷丁香五月在线观看91| 日本97人人| cao久久| 日韩精品超碰在线观看| 一起草无码视频| 99热这是里只有精品| 欧美一区二区三区不卡影视| 久久婷婷五月综合伊人| 久久久天天啊| 99色色网| 欧美大片免费观看| 五月婷婷国产| 丁香色五月婷婷17C| 五月丁色AV| 五月人妻婷婷| 激情伊人五月天| 123草逼网| 日本一级黄色电影| 亚洲欧美在线观看| 色天堂操| 婷婷丁香视频在线观看免费| 视频色色色色色色| 婷婷久久久| 国产一区二区三区影院| 六月丁香啪| 色婷婷a| 人人爱操| 久99久视频免费观看| 婷婷五月四狠狠| 中文字幕色色色| 色九亚洲| 五月天丁香婷婷网| 亚洲欧美婷婷五月色综合| 欧美色六月婷婷| 这里只有精品视频99| 丁香六月久久| 天天色五月婷婷91久久久久久久| 久久这里精彩免费在线观看| 天天摸天天日天天舔| www.91九色| 成人午夜天| 99免费在线视频| 亚洲色9| 五月六月丁香激情| 亚洲亚洲人成综合网络| 操日本三片99| 婷婷五月激情在线| 五月丁香影院| 91se在线视频| www.99热这里只有精品| 做爰丰满少妇1313| 91久久1118| 欧美25p| 亚洲V国产V欧美V久久久久久| 97热在线精品| 五月天 另类图片| 五月天六月色| 91黄操| 五月天俺去也| 国产亚洲精品久久久久久久久动漫| 亚洲小电影在线观看黄999| xfplayav在线| 五月丁香啪| 站长推荐无码播放| 中文av网| 超碰永久在线| 99re欧美精品| 丁香5月激情网| 99色在线| 超碰五月婷婷五月天| 丁香五月色播中文在线播放| 26uuu精品一区二区| 四季AV综合网| 婷婷五月激情天| 九九九九精品精| 九九人妻福利| 深爱激情五月网| 操逼三区| 综合激情在线| 中文资源在线a| 色婷婷久久综合中文久久一本| 超碰亚洲欧美| 深爱激情av| 青柠影视免费高清电视剧| 99色色爰| 五月天六月色| 亚洲综合激情五月天婷婷| 久久婷婷成人| 国产67194| 婷色五月天| 日本三级中文字幕| 中文无码婷婷| 久久久久久久久久8888| 色色日本| 色五月亚洲五月天| 久久精品国产一区二区三区四区| 五月丁香va| 内射人妻视频国内| 99精品爱| 五月婷婷色白丝| 婷婷 色 丁香 夜| 天天艹| 99久久这里只有精品| 色播色丁香五月| 66精品成人免费网站在线观看| 东京热五月婷婷| 热久久视频99| 九九激情视频| 天天爱天天做天天日| 亭亭五月色男人| 99综合| 天天日天天摸| 5月婷婷性视频| 日韩在线视频9色| 婷婷五月丁香网| 777久久久| 久久久婷婷婷| 西瓜美女a片| www.99操.com| 九九久久99| 色婷婷在线视频久| 亚洲av成人一区二区电影在线| 五月婷婷五月天在线| 欧日韩成人| 国产亚洲精品AAAAAAA片| 婷婷五月AV| 99九九中文字幕视频| 色色五月天婷婷| 天天色天天爱天天舔| 九九色婷婷五月天| 影音先锋91资源站| 久久亚洲精品成人无码网站导航| 变态另类色图| 五月综合无码| 国产色99| 在线视频色五月| 123日本不卡在线| 天天爱天天操| 婷婷爱综合| 丁香色影院| 人人草人人爱| 五月婷婷六月丁香在线| 激情婷婷人妻| 久久99久久99精品免观看粉嫩| 婷婷99狠狠| 99A片| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 影音先锋一区| 色色婷婷综合网| 99九九综合久久九九| 无码成人AAAAA毛片AI换脸| 丁香五月电影| 清色五月天| 91丨九色丨熟女|老版| 激情深爱综合| 丁香婷婷综合激情五月色| 久久亚洲婷婷| 大香蕉久久久久| 激情九九综合网| 天天爽在线视频| 超碰在线播放免费观看| 成 人片 黄 色 大 片| 欧美99视频| 亚洲色 视频| 91精品熟女| 激情五月婷| 香蕉五月婷婷| 5月丁香美女影院| 五月丁香婷婷综合网| 婷婷五月激情图片| 婷婷五月18永久免费视频| 九九sese| 久热久色| 激情文学久久| 色5月婷婷色| 97偷拍在线视频| 日本女色人人| 色一情一乱一伦一区二区三区| 日韩啪啪视频| 8区视频在线| 男人的天堂五月丁香| 99日韩网站| 99热这里精| 婷婷色五月天第7色| 久久曰曰| 97精品综合久久| 亚洲天堂大香蕉| 五月丁香啪。| 五月丁香色婷婷色| 182TV亚洲| 亚洲免费观看高清完整版AV线| 欧美超碰亚洲| 丁香六月婷婷社区| 九热视频精品| 2017狠狠干| 婷婷色五月激情强奸四射| 97色图片中文字幕视频在线观看| 色综合狠狠色| 美女网黄| WWW,激情五月天,COM| 亚洲五月天色| site:picc-up.com| 亚洲九九在线| 天天做天天爱天天做| 色婷婷裸体色性在线| 99热这里只有精品搜| 婷婷五月丁香手机在线视频| 丁五月激情视频免费| 香蕉人在线香蕉人在线 | 综合网激情| 精品网站:999WWW| 久综合| 99久在线精品99re5热视频| 久久综合播放| 99久热在线精品| 国庆精品久久| 99综合免费视频| 丁香五月天激情综合| 婷婷丁香五另类网站| 五月天啪啪啪| wwwav大香蕉| 激情国产五月| 婷婷久久性爱| 婷婷五月天改成什么了| 激情激情激情网| 婷婷五月综合网| 99日韩| 天天色情站| 五月婷无码| ′久久99一| 激情五月深爱五月| 五月丁香六月婷婷亚洲| 丁香六月婷婷色播| 日本久久天堂| 久久无意婷婷| 综合亚洲六月婷婷在线| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 五月天色色无码| 日韩AV一区二区三区| 激情久久五月天| 热久久66| 日韩成人电影AV| 国产午夜精品一区二区三区四区| 9久久网| 亚洲精品久久久久久久久久吃药| 丁香五月婷婷久久久| 亚洲成人网在线观看| 五月婷婷成人w| 热的五码久久精品| 九九色综合视频| 亚洲综合激情五月久久| 九九色video| 亚洲操操| 这里只有精品视频| 九九99九九精品免费| 久超超碰| 人妻自慰高清合集| 婷婷色五月激情| 亚洲中文字幕av| 丁香五月熟女| 在线五月色播| 99综合视频一体| 亚洲无码AV片| 丁香六月天色婷婷| 99热手机在线精品| 性色av大香综合| av网站中文| 99超级碰免费视频| 97人操人免费视频| 夜丁香五月婷婷| 日韩精品AV一区二区三区| 亚洲成人无码专区| 思思99热| 亚洲综合99| 狠狠操天天干| 久久日本wwww色| 色婷婷丁香五月天在线视频| 五月丁香久久网| 综合亚洲AV| 五月丁香黄色| 99久久99综合| oumeisesewang| 99热都是精品| 久久婷婷五月综合| 婷婷久热| 日本一级特黄大片AAAAA级| 综合五月天完整| 五婷婷综合网| 久久性爱网站| 99热在线观看| 九伊人网| 婷婷六月综合激情| 久久全色| 色色色色综合| 婷婷五月天Av| 狠狠色官网| 99re热在线视频| 日韩久热| 91碰碰碰| 五月婷视频久久| 久久久久婷婷| 亚洲视频操| 激情啪啪五月天| 色色色9| 成人午夜无码视频| 日本黄色在线观看| 99久久偷拍视频| 91av视频| 丁香九色不卡aaa| 激情文学 综合 九月| 99re在线免费视频| 超级碰碰碰碰视频| 综合久久五月天| 激情久久肏屄视频| 大香蕉伊人久久| 五月婷婷在线短视频| 婷婷五月四狠狠| 日本女va| 亚洲 在线 性爱| 久久综合天天综合| 久久五月综合| 99色热视频在线| 亚洲AV网址| 久久九九99| 天天插天天干| 97综合视频在线| 91人人妻人人操| 國語久久婷| 久热这里只有国产| 大波美女VA网站| 五月丁香激情六月| 九九热最新地址| 任你操精品免费| 人人干人人看| 激情九月婷婷九月| 98色丁香五月婷婷综合网| 亚洲av日韩无码| 玖月婷婷爱丁香| 操一操插一插| 色婷婷国产精品综合在线观看| 97人妻碰碰中文无码久热丝袜| 色婷婷丁香五月天| 婷婷丁香大香蕉| 超碰二区| 99色热| 精品一区久热| 色婷婷偷拍| 开心久久五月天| 六月丁香婷婷在线波多| 婷婷五月色天| 五月在线| 激情五月四色| 色婷婷丁香综合中文字幕| 婷婷五月天改成什么了| 热热久久99| 五月丁香| 99色热综合| 五月天久久婷婷| 婷婷五月天日日日干干干| 99久热| 丁香激情五月| 欧美WW在线网| 99热思思在线观看| 99精品大片| 日日操夜夜爽| 人人97操| 欧美美女国产日韩一区二区久| 五月丁香中文字幕| 精品久久艹| 91熟妇大香蕉| 日韩 欧美 国产 一区 二区| 激情五月视频在线婷婷| 五月天久久婷婷| 九九在线91| 亚洲国产色婷婷| 色日本五月天| 夜精品无码A片一区二区蜜桃| 97人人看一| 亚州日本欧州韩美高青高潮一| 久久久27操| 久婷婷视平| 九九性视频| 这里只有精品1| 免费观看欧美成人AA片爱我多深 | 色视五月天婷婷| 久久婷婷成人| 热久久这里只有三级视频| 丁香婷婷激情综合五月激情| 深爱婷婷网| 99热热热99精品婷婷| 99久在线| 婷婷天天婷婷天天澡| 国产精品第一国产精品| 色五月91| 五月天成人在线视频网站| 中文字幕乱码亚洲精品一区| 国产激情AV| 五月丁香六月色| 婷婷影视久久| 亚洲人人96@| 大香蕉婷婷色| 一起草av在线观看| 人人草人人爱手机视频看看| 开心激情站| 久色网| 日本高清久| 丁香久久九九99| 五月天成人在线| 疯狂做受XXXX高潮A片| 色婷婷操逼| 开心激情婷婷| 色黄啪啪| 中文字幕久久一区二区三区| 无码免费人妻A片AAA毛片西瓜| www.五月婷婷| 欧美日韩成人在线观看| 亚洲在线播放| 久久九九经典| 99热亚洲精品66| 四川BBB搡BBB爽爽视频| 久久丁香五月婷婷激情综合网| 99热这里只有精品22| 婷婷午夜丁香| xx久久| 五月丁香六月婷婷久久肏| 思思热视频| 奇米影视在线视频| 色色综合视频| 综合久久十三| 伊人婷婷激情| 无码成人AAAAA毛片AI换脸| 欧美va视频不用播放器的va视频网| 丁香成人五月天| 丁香五月婷婷亚洲人| 久久九九免费视频| 天天射夜夜爽| 国产精品色色| 伊人国产婷婷五月天| 国产精自产拍久久久久久蜜 | 精品人人操| 九九久久99精品免费观看www| 欧美在线97| 婷婷五月综合社区| 久久3p| 色V狠狠的干| 九九热99热| 五月丁香猫咪久久婷婷综合视频激情四射网入口 | 五月 激情视频| 秋霞成人毛片一级A片| 丁香婷婷基地| 五月天另类小说亚洲| 91操人| 天天操,天天插| 久久九网| 欧美性爱五月天| 五月婷婷色影院| 久久性爱视频网站| 五月婷婷视频啪啪美女| 2018夜夜草| 怡红院一二三| 久9热视频在线观看| www.99热| 狠狠搞综合色| 婷婷五月丁香99| 婷婷六月色开| 人人操插| 乱岳熟女50岁| 99热这里只有精品2| 五月天激情网址| 丁香五月播播| 五月丁香啪啪拍| 色9999综合久久| 久久婷婷五月天激情四射| 伊人网欧美在线男人天堂五月丁香 | 亚洲Av成人在线观看| 中美日韩成人在线| site:hcxsz888.com| 亚洲亚洲人成综合网络| 黄色激情五月天| 久久99久久99精品免观看粉| 99热超碰| 色停停五月天| 久久香蕉网| 婷婷丁香成人色综合| 天天天天干| 色五月婷婷五月丁香五月激情五月视频 | 丁香五月天激情小说| 久久精品天| 婷婷六月丁香五月| 亚洲综合婷婷五月天| 色婷婷先锋| 2018国产大陆天天弄| 激情五月婷婷五月丁香五月开心五月| 五月婷婷啪| 亚洲日比视频| 91色婷婷综合久久中文字幕二区| 日韩成人精品一区久久久久| 婷婷色吧| 4399无码视频| 亚洲婷婷久久综合| 亚洲无码成人性爰网| 91精品国产日韩91久久久久久国模| 国产精品美女久久久久AV超清| 99热在线只有精品| 婷婷五月天美女| 久久色午夜在线导航| 能看的av| 五月婷婷视频| 国产探花AV在线| 久久五月网| 激情综合五月丁香六月婷婷| 天天色播| 色狠久| 五月天激情小说电影| 日本久久精品18| 桃色五月婷婷| 婷婷色五月天在线观看| 伊人五月综合网| 综合网激情五月天| 色色五月天网站| 就爱日五月天| a网站免费观看| 亚洲第一成人无码A片| 丁香五月综合网亚洲综合欧美狠狠| 婷婷五月在线免费| 综合色色综合| 97色射| 天天爽天天爽| 久久久久9| 激情五月六月| 狠狠五月激情婷婷直播片| 人人澡天天色天天做| 青青草轻轻操| 日本久久极品| 九九丁香社区欧美激情| 五月婷婷色播| 久操综合| 六月丁香激情| 热99AV网站| 五月开心婷婷| 性韩日色婷婷五月天激情啪啪XXX| 亚洲无aV在线中文字幕| 五月婷婷久久网| 国产乱妇乱子在线播视频播放网站| 亚洲AV网站| 色婷婷a| 野战毛片三一3| 99热这里只有精品官网| 色婷綜合网| 狠狠香婷婷五月| 日韩欧美颜射| 啪啪婷婷五月天激情| 婷婷综合一二三| 色婷婷五月天无码视频| 黄色激情网站在线观看| 日韩在线看AV| 精品国产一区二区三区四区阿崩 | 9久热免费视频99| 激情五月久久| 丁香五月激情婷婷婷婷在线观看| 大香蕉院线| 色婷婷五月网| 日本噜噜色网| 婷婷丁香成人网址| 色婷婷丁香AV综合| 麻豆123区| 久久99热精品a片在线观看| 婷婷五六日| 久久99热免费| 狠狠va| 久久五月天激情视频| 天天成人综合| 日 日干 日日做| 夜夜天天久久婷婷| 五月天激情中文字幕| 开心五月深爱五月婷| 人妻久久久久久久久| 丁香五月天激情小说| 碰99在线| 91美女艹逼网站| 五月伊人婷婷999| 538任你爽视频不一样的| 五月婷婷综合影院| 综合五月丁香六月婷婷| 伊人五月天97| 五月婷婷导航| 亚洲 视频 导航 一区| 丁香六月色婷婷| 99er这里只有精品| 色婷婷六月性| 丁香五月98| 国模淫穴色图| 99热无码| 色婷婷AV在线| 久久久久久欧美精品se一二三四| 婷五月天| 91九色国产| 亚洲综合色婷婷| 99久久国产宗和精品1上映| 国产乱子轮XXX农村| 国产精女同一区二区三区久| 五月综合激情图片| 久久9RE热视频精品98| 国产ava| 开心六月丁香五月婷婷| 妻久久久久| 日本欧美国产| 思思热视频在线| 情趣视频66| 色综合久久44| 婷婷色综合| 精品久9| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 五月天婷婷色五月天| 五月婷婷之六月丁香| 婷婷五月噜噜| 91婷婷色| 天天日天天插| 国精产品一区一区三区免费视频| 激情五月天色色色| 婷久久| 久99视频在线观看| 亚洲激情99| 青草少妇激情| 婷婷色五月丁香六月欧美啪| 少妇高潮A片无套内谢麻豆传| 中文婷婷狠狠| 婷婷射丁香| 丁香八月综合激情| 五月丁香啪啪网| 五月婷婷丁香六月| 无码少妇高潮喷水A片免费| 日本97在线看片| 激情色播| 五月丁香婷婷激情澎湃四射| 97se视频在线| 青柠影视免费高清电视剧| 色涩影院六月丁香| 久久这里只有精品5| 婷婷久久亚洲| 天天干天天干天天干天天干天| 欧美99热| 九伊人网| 开心婷婷五月激情网小说 | 色综合久| 激情婷婷五月丁香啪啪啪| 久久婷婷五月天激情四射| Av性爱网站| 丁香婷婷月| 性无码专区无码| 日韩成人综合| 五月丁香va| 九九自拍网| 大香伊人久色| 亚洲无线视频| 99热99干| 俺去也婷婷| 极品精品一区二区三区在线| 中美日韩成人在线| 99免费视频在线观看爱| 九九色婷婷| 毛片蕉地一二| 插插插色综合网| 99人碰碰碰| 96精品国产综合久久久久久| 亚洲艹网| 人人摸人人干| 日本在线观看99| 久久女婷| 五月天婷婷乱论小说| 成人AV在线中文版| 丁香五月精品视频| 噜噜国产| 97人人操人人插| 婷婷爱综合| 天天爽天天| 先锋影音av色五月天资源站| 99热99ai| 五月天啪啪视频| 丁香久久激情俄| 视频这里只有精品16| 丁香色婷婷| 五月天婷婷操逼视频| 婷婷丁香激情| 影音先锋女人AA鲁色资源 | 99九九热在线观看| 日本三级99人妇网站| 免费99情趣网视频| 狠狠综合网| 精品人妻在线| 激情五月婷婷丁香综合网| 国产精品久久久久久久久久 | 少妇口诉沐足视频播放器网址| 五月天伊人网| 五月丁香久久呀| 亚洲激情五月| WWW久久99久久99久久| 狠狠色五月| 996热| 激情五月天婷婷| 国产操碰| 人妻九九九九| 99热亚洲| 伊人婷婷五月天av| 五月婷婷在线免费观看| 4438全国最大视频成人网站在线观看| 狠色狠色狠色狠色狠色网| 日韩成人电影AV| 色 免费网站视频| 婷婷月综合| 国产免费一区二区三州老师F1F1……| 欧美草久久五月天91| www...com黄在线观看| 狠色狠色狠色狠色狠色网| 91久操| 【乱子伦】黄色| 性爱综合网| 婷婷五月激情的图片| 热99在线| 天天开心婷婷丁香五月| 色五月激情网| 亚洲综合字幕色色| av大香蕉| 国产片天天爽夜夜爽| 欧美性爱五月天| 日韩色色色色色| 色色色色色色色色综合网| 久久婷婷五月| 中文字幕在线观看视频www| 五月婷婷天堂| 久久女婷| 亚州激情网站无码| 中国丰满熟女A片免费观| 久热精品视频在线观| 婷婷五月天网| 色婷婷五月天激情久久| 久久精品国产精品| 99性爱精品| 九月色婷婷综合亚洲| 婷婷六月综合激情| 猫咪伊人久久| 欧美精品18| 在线VA视频| 9|人妻人人操| 色婷婷五月天偷拍| 久久狠狠干| 久久色情| WWW、日本色丁香co m| 日本一级黄色片。| 婷婷五月亚洲一本在线丁香| 五月天AV大香蕉| 欧美久热| 桔色成人官方网站| Av在线不卡一区| 丁香五月人妻| 五月大香蕉| 日99网站| 亚洲精品婷婷| 色婷视频| 激情第四色| 五月婷婷综合久久| 天天射天天干天插色综合| 亚洲天堂久久| 婷婷六月爽| 秋霞网在线免费基地五月婷婷丁香| 九九色欲网| 国产va在线视频| 91热久| 婷婷亚洲综合| 国产丁香五月天婷婷| 成人AV综合在线| 五月激情婷婷丁香| 婷婷五月69| 亚洲丁香婷婷| 亚洲av网站在线观看| 日本五月婷婷久久久六月丁香| 色婷婷另类| 深夜男女福利刺激影院一区| 婷婷五月天深爱| 久久久27操| 中文字幕按摩做爰| 色色色色网站| 噜噜噜噜婷婷五月天| av首页在线| 色婷婷五月在线| 五月天婷婷婷| 丁香六月婷婷久久综合| 东北熟女高潮99综合99|