November
4th,
2024
在行動裝置的 Safari 瀏覽器中,有時候會遇到簡體中文的網頁,這時候如果你是繁體中文的使用者,可能會覺得閱讀起來不是很親切,這時候你可以透過使用 Userscripts 搭配本篇所提供的 Script,讓瀏覽器自動幫你轉換簡體中文為繁體中文。
如果你是使用桌面版的 Microsoft Edge、Google Chrome 和 Firefox 瀏覽器,我會推薦你使用新同文堂擴充套件,非常的方便好用。
不過如果是要在行動裝置的 Safari 瀏覽器上進行簡繁轉換,就沒有現成的擴充套件可以使用了。這時候就可以使用 Userscripts 來達成,這套開源的 Safari 指令碼管理工具,使用方式跟 Tampermonkey 差不多,在網頁開啟時去執行特定的指令碼,進行我們額外想要執行的動作。
這裡所提供的 Script 同樣可以用在 Tampermonkey 上。
這裡我借用新同文堂背後所使用的字詞轉換字典,TongWen Dict,在開啟網頁的時候,透過 Userscripts 去取得該字典,並進行網頁內容的簡繁轉換。
以下是我所提供的 Userscripts 範例程式碼:
// ==UserScript==
// @name 簡繁轉換
// @description 將網站中的簡體字詞轉換成繁體字詞
// @license MIT
// @author Poy Chang
// @homepage https://blog.poychang.net
// @version 0.2.4
// @updateURL https://raw.githubusercontent.com/poychang/userscripts/main/src/convert-to-zhtw.user.js
// @match *://*/*
// @exclude http://*.tw/*
// @exclude https://*.tw/*
// 更多關於簡繁轉換的資料可以參考同文堂所提供的資料:https://github.com/tongwentang/tongwen-dict
// ==/UserScript==
let s2tChar = {};
let s2tPhrase = {};
// 使用同文堂 v1.0.1 版的轉換字典
const url = (filename) =>
`https://www.unpkg.com/tongwen-dict@1.0.1/dist/${filename}`;
const loadDict = () =>
fetch(url("manifest.json"))
.then((res) => res.json())
// 取得 manifest.json 中所提供的檔案列表,僅取得 s2t (簡轉繁)的字典
.then((manifest) =>
Promise.all(
manifest.dicts
.filter((d) => d.min)
.filter((d) => d.filename.substring(0, 3) === "s2t")
.map((d) => url(d.filename))
)
)
// 將取得的 URL 所回傳的 json 資料,並且保存到 s2tChar 和 s2tPhrase
.then((urls) =>
Promise.all(urls.map((url) => fetch(url).then((res) => res.json())))
)
.then(([s2t_char, s2t_phrase]) => {
s2tChar = s2t_char;
s2tPhrase = s2t_phrase;
})
.catch((error) => {
console.error("Error fetching data:", error);
});
// 詞彙轉換
function toTrad(itxt) {
var txt = "",
s = "",
bol = true,
leng = 5;
for (var i = 0, c = itxt.length; i < c; ) {
bol = true;
for (var j = leng; j > 1; j--) {
s = itxt.substr(i, j);
if (s in s2tPhrase) {
txt += s2tPhrase[s];
i += j;
bol = false;
break;
}
}
if (bol) {
s = itxt.substr(i, 1);
txt += s in s2tChar ? s2tChar[s] : s;
i++;
}
}
if (txt != "") itxt = txt;
return itxt;
}
function convert(node) {
var treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT);
var textNode;
while ((textNode = treeWalker.nextNode())) {
// console.log(textNode.nodeValue)
textNode.nodeValue = toTrad(textNode.nodeValue);
}
}
(function () {
"use strict";
loadDict().then(() => {
convert(window.document.body);
const callback = (mutationsList) => {
mutationsList.forEach((mutation) => {
if (
mutation.type == "childList" &&
mutation.addedNodes.length > 0
) {
Array.from(mutation.addedNodes).find((node) => {
convert(node);
});
}
});
};
const observer = new MutationObserver(callback);
observer.observe(document.body, { childList: true, subtree: true });
});
})();
本篇完整範例程式碼請參考 poychang/userscripts。
使用方式
- 安裝 Userscripts 應用程式
- 開啟 Userscripts,點擊
Set Userscripts Directory
設定 Userscripts 所使用的資料夾 - 打開 iPhone 的
Setting
>Apps
>Safari
>Extensions
>Userscripts
,啟用此擴充套件並將權限設定成允許存取所有網站 - 之後點選 Safari 網址列左邊的小圖示,裡面的選單就會有
Userscripts
- 使用 Safari 開啟上面的指令碼檔案(你也可以用下載的方式存到 Userscripts 所使用的資料夾中),然後點選網址列左邊的小圖示裡面的
Userscripts
選單,就會出現安裝指令碼的選項
由於我已經安裝過了,所以會變成
Tap to re-install
,如果你是第一次安裝,會是Tap to install
。
這樣就可以在 Safari 瀏覽器上,自動將網頁中的簡體字詞轉換成繁體字詞了。
後記
這裡要再一次感謝新同文堂的開發者們,提供了這麼好用的字詞轉換字典,讓我可以開心的完成這個指令碼,輕鬆的進行簡繁轉換。
參考資料: