furifont 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +5 -5
- package/dist/client/200.html +1 -1
- package/dist/client/404.html +1 -1
- package/dist/client/_nuxt/7dpEN058.js +4 -0
- package/dist/client/_nuxt/B35AZ4N5.js +3 -0
- package/dist/client/_nuxt/{Kki0DvjP.js → BK--K-B8.js} +1 -1
- package/dist/client/_nuxt/{CyBtfuI_.js → CCKNrAp3.js} +3 -3
- package/dist/client/_nuxt/CFJDasU9.js +2 -0
- package/dist/client/_nuxt/{DjNJVvMK.js → Cav8jaAI.js} +1 -1
- package/dist/client/_nuxt/{CJJSNjyq.js → Cvflahe0.js} +1 -1
- package/dist/client/_nuxt/D-bzbSL2.js +1 -0
- package/dist/client/_nuxt/D1B77ENm.js +1 -0
- package/dist/client/_nuxt/{B2JUvp84.js → DUyBBmcb.js} +1 -1
- package/dist/client/_nuxt/{Cmcq_Al0.js → IRGIvKlv.js} +1 -1
- package/dist/client/_nuxt/builds/latest.json +1 -1
- package/dist/client/_nuxt/builds/meta/efe0e6b4-05bd-4e0b-a04c-7ec5da4143f9.json +1 -0
- package/dist/client/_nuxt/entry.BSCJYv63.css +1 -0
- package/dist/client/customize/index.html +1 -1
- package/dist/client/furifont.user.js +3 -3
- package/dist/client/index.html +1 -1
- package/dist/client/reference/index.html +1 -1
- package/dist/client/report/index.html +1 -1
- package/dist/client/version.json +1 -1
- package/dist/{config-CVYevUmF.mjs → config-CNDZmTlF.mjs} +19 -5
- package/dist/devframe.mjs +2 -2
- package/dist/index.d.mts +18 -2
- package/dist/index.mjs +2 -2
- package/dist/{studio-BW0TGTYT.mjs → studio-JiPccKUS.mjs} +41 -1
- package/package.json +4 -5
- package/dist/client/_nuxt/BT3b-zWn.js +0 -1
- package/dist/client/_nuxt/CHjPDtV4.js +0 -4
- package/dist/client/_nuxt/CQLpGqLD.js +0 -3
- package/dist/client/_nuxt/DNnooO8M.js +0 -1
- package/dist/client/_nuxt/builds/meta/4f6d63ac-677f-4159-85f5-e2331fac408f.json +0 -1
- package/dist/client/_nuxt/dd6-oMIT.js +0 -2
- package/dist/client/_nuxt/entry.DbYzBu7U.css +0 -1
package/dist/cli.mjs
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as loadConfig, m as version, n as FONT_FORMATS, o as buildFont, r as FurifontConfigSchema, t as CONFIG_FILE } from "./config-CNDZmTlF.mjs";
|
|
2
2
|
import { relative } from "node:path";
|
|
3
3
|
import process from "node:process";
|
|
4
|
-
import {
|
|
4
|
+
import { FURIGANA_SCRIPTS } from "@furifont/core";
|
|
5
5
|
import * as v from "valibot";
|
|
6
6
|
import { cac } from "cac";
|
|
7
7
|
//#region src/cli.ts
|
|
8
8
|
const STUDIO_PAGE = "customize";
|
|
9
9
|
const cli = cac("furifont");
|
|
10
|
-
cli.command("build", "Build a font into --out").option("--config <file>", `Config file`, { default: CONFIG_FILE }).option("--base <font>", "A font to download, such as \"Source Han Serif JP Bold\", or a font file").option("--family <name>", "Font family name").option("--script <script>", `
|
|
10
|
+
cli.command("build", "Build a font into --out").option("--config <file>", `Config file`, { default: CONFIG_FILE }).option("--base <font>", "A font to download, such as \"Source Han Serif JP Bold\", or a font file").option("--family <name>", "Font family name").option("--script <script>", `Furigana script: ${FURIGANA_SCRIPTS.join(", ")}`).option("--take <words>", "Annotate this many words, the most common first").option("--formats <list>", `Fonts to write, comma-separated: ${FONT_FORMATS.join(", ")}`).option("--out <dir>", "Output directory", { default: "fonts" }).action(async (flags) => {
|
|
11
11
|
const cwd = process.cwd();
|
|
12
12
|
const overrides = {
|
|
13
13
|
...flags.base && { base: flags.base },
|
|
14
14
|
...flags.family && { family: flags.family },
|
|
15
|
-
...flags.script && {
|
|
15
|
+
...flags.script && { furiganaScript: v.parse(v.picklist(FURIGANA_SCRIPTS), flags.script) },
|
|
16
16
|
...flags.take && { take: Number(flags.take) },
|
|
17
17
|
...flags.formats && { formats: v.parse(v.array(v.picklist(FONT_FORMATS)), flags.formats.split(",")) }
|
|
18
18
|
};
|
|
@@ -27,7 +27,7 @@ cli.command("build", "Build a font into --out").option("--config <file>", `Confi
|
|
|
27
27
|
});
|
|
28
28
|
process.stderr.write("\r".padEnd(24));
|
|
29
29
|
const { stats } = report;
|
|
30
|
-
console.log(`\r${stats.patterns} words, ${stats.isolated} lone kanji, ${stats.glyphs}
|
|
30
|
+
console.log(`\r${stats.patterns} words, ${stats.isolated} lone kanji, ${stats.glyphs} furigana glyphs`);
|
|
31
31
|
for (const file of files) console.log(` ${relative(cwd, file.path)} ${(file.bytes / 1024 / 1024).toFixed(1)} MB`);
|
|
32
32
|
});
|
|
33
33
|
cli.command("dev", "Open the studio to customize, preview and build fonts").option("--port <port>", "Port to listen on").option("--host <host>", "Host to bind, 0.0.0.0 to reach it from another machine", { default: "localhost" }).option("--open", "Open the studio in a browser", { default: true }).option("--auth", "Ask for the one-time code printed here; --no-auth only on a machine you trust", { default: true }).action(async (flags) => {
|
package/dist/client/200.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Furifont: furigana built into the font</title><script type="importmap">{"imports":{"#entry":"/_nuxt/
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Furifont: furigana built into the font</title><script type="importmap">{"imports":{"#entry":"/_nuxt/CCKNrAp3.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.BSCJYv63.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CCKNrAp3.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/y07Wd5I9.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CkUAspOr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D4ezFGbh.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Cl84O_XS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/IRGIvKlv.js"><script type="module" src="/_nuxt/CCKNrAp3.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/7dpEN058.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DUyBBmcb.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/BK--K-B8.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.CaT3AK-0.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/B4Fx_Djw.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.WL1uhYQu.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/X45Acd-Y.js"><meta name="description" content="A Japanese font that shows furigana by itself."><meta property="og:type" content="website"><meta property="og:url" content="https://furifont.antfu.me"><meta property="og:title" content="Furifont: furigana built into the font"><meta property="og:description" content="A Japanese font that shows furigana by itself."><meta property="og:image" content="https://furifont.antfu.me/og.png"><meta property="og:image:width" content="2400"><meta property="og:image:height" content="1260"><meta property="og:image:alt" content="Furifont: furigana built into the font"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Furifont: furigana built into the font"><meta name="twitter:description" content="A Japanese font that shows furigana by itself."><meta name="twitter:image" content="https://furifont.antfu.me/og.png"><link rel="icon" type="image/svg+xml" href="favicon.svg"></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{devCustomizeBase:"/__furifont/"},app:{baseURL:"/",buildId:"efe0e6b4-05bd-4e0b-a04c-7ec5da4143f9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1792121885211,false]</script></body></html>
|
package/dist/client/404.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Furifont: furigana built into the font</title><script type="importmap">{"imports":{"#entry":"/_nuxt/
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Furifont: furigana built into the font</title><script type="importmap">{"imports":{"#entry":"/_nuxt/CCKNrAp3.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.BSCJYv63.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CCKNrAp3.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/y07Wd5I9.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CkUAspOr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D4ezFGbh.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Cl84O_XS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/IRGIvKlv.js"><script type="module" src="/_nuxt/CCKNrAp3.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/7dpEN058.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DUyBBmcb.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/BK--K-B8.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.CaT3AK-0.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/B4Fx_Djw.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.WL1uhYQu.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/X45Acd-Y.js"><meta name="description" content="A Japanese font that shows furigana by itself."><meta property="og:type" content="website"><meta property="og:url" content="https://furifont.antfu.me"><meta property="og:title" content="Furifont: furigana built into the font"><meta property="og:description" content="A Japanese font that shows furigana by itself."><meta property="og:image" content="https://furifont.antfu.me/og.png"><meta property="og:image:width" content="2400"><meta property="og:image:height" content="1260"><meta property="og:image:alt" content="Furifont: furigana built into the font"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Furifont: furigana built into the font"><meta name="twitter:description" content="A Japanese font that shows furigana by itself."><meta name="twitter:image" content="https://furifont.antfu.me/og.png"><link rel="icon" type="image/svg+xml" href="favicon.svg"></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{devCustomizeBase:"/__furifont/"},app:{baseURL:"/",buildId:"efe0e6b4-05bd-4e0b-a04c-7ec5da4143f9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1792121885211,false]</script></body></html>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var e={meta:{title:`Furifont:ふりがなを表示するフォント`,description:`ふりがなを自分で表示する日本語フォントです。`},nav:{demo:`はじめに`,docs:`ドキュメント`,customize:`カスタマイズ`,report:`報告`,github:`GitHub リポジトリ`,light:`ライトモードに切り替え`,dark:`ダークモードに切り替え`,language:`言語`,rubyOff:`ふりがなを隠す`,rubyOn:`ふりがなを表示`},footer:{fonts:`フォントは{license}です。Source Han Sans と Source Han Serif から作りました。`,data:`読みのデータは {jmdict}、{jmnedict}、{kanjidic}(EDRDG)、{furigana}、{japanpost}(地名)、{desktoptetsu}(JRの駅名)から取っています。ライセンスは CC BY-SA 4.0 です。`,code:`ツールは MIT ライセンスです。`,report:`読みの誤りを報告`,source:`GitHub のソースコード`,made:`制作:{author}`,supported:`{vercel} と{sponsors}の支援を受けています`,sponsors:`スポンサー`},copied:`コピーしました`,shuffle:`別の例文を表示`,editable:`サンプルの文章です。自由に書き換えられます。`,scripts:{hiragana:`ひらがな`,hepburn:`ローマ字`},faces:{sans:`ゴシック`,serif:`明朝`},hero:{title1:`ふりがなは、`,title2:`フォントが振る。`,body:`Furifont は、フォントそのものにふりがなを表示する
|
|
2
|
+
日本語フォントです。言葉ごとの読み方に合わせて、
|
|
3
|
+
合字で切り替えます。カスタムフォントに対応していれば、どこでも使えます。`,download:`フォントをダウンロード`,build:`自分でビルドする`},notice:`フォントの制約により、ふりがなが正しくない場合があります。ご注意ください。`,sections:{try:`試してみる`,how:`仕組み`,selectors:`読みを選ぶ`,download:`ダウンロード`,anyPage:`ウェブサイトで`},playground:{script:`ふりがなの文字`,face:`フォントの種類`,size:`サイズ / {size}px`,weight:`太さ / {weight}`,ruby:`ふりがな`,okurigana:`送り仮名の読み`,okuriganaHint:`JavaScript が必要です。ブラウザの制限により、フォントだけでは送り仮名を扱えません。`,textHint:`文章をクリックすると編集できます。`,copy:`テキストをコピー`},how:{build:{title:`カスタムビルド`,body:`Furifont は、源ノ角ゴシックまたは源ノ明朝を元に作ります。ビルドの工程で、数千の言葉の辞書を読み込み、ふりがなを新しいグリフとして描き込みます。出来上がるのは普通のフォントファイルです。JavaScript もプラグインも要りません。`},ligatures:{title:`仕事をするのは合字`,body:`フォントには、言葉ごとに合字が入っています。今日は、上に「きょう」が付いた一つのグリフになります。置き換えは文字を描くときに行われるので、文章そのものは変わりません。`},longest:{title:`長い単語を優先`,body:`Furifont は、漢字のまとまりを、数千の一般的な言葉の一覧と照らし合わせます。長い言葉から順に試します。たとえば、日本語は日本より先に選ばれます。今日は一つの言葉として、きょうと読みます。`},bare:{title:`迷ったら付けない`,body:`漢字が一つだけのときは、読み方が一つにはっきり決まる場合だけ、ふりがなを付けます。大人気は、だいにんきとも、おとなげとも読めるので、ふりがなを付けません。`},okurigana:{title:`送り仮名はオプトイン`,body:`ブラウザはフォントのスクリプトごとに別々に字形を作るため、フォントは漢字の後ろのかな(送り仮名)を見られません。そこで、JavaScript によるアノテーションで、オプションとして対応しています。`}},selectors:{body:`読み方が複数ある言葉があります。Furifont は、一番よく使う読み方を表示します。別の読み方にするには、最初の漢字のすぐ後ろに異体字セレクタ(目に見えない文字)を書きます。VS226 は読み 1、VS227 は読み 2 で、以降も同じです。VS225 はふりがなを消します。`,lookUp:`読みを調べる`,default:`既定`,reading2:`読み 2(VS227)`,none:`ルビなし(VS225)`},downloads:{all:`すべて ZIP でダウンロード`,family:`ファミリー`,ruby:`ふりがな`,variable:`可変`,formats:`OTFとTTFは、パソコンにインストールするときによく使います。WOFF2はウェブサイト向けに最適化されています。最も快適に使えるので、可変フォントをおすすめします。互換性のために、固定のウェイトが必要になることもあります。`,buildOwn:`自分でフォントを作ることもできます。元のフォント、言葉の数、ふりがなの文字、大きさを選べます。`},anyPage:{body:`どんなウェブサイトでも Furifont で表示できます。漢字がある行には、ふりがなのための余白が付きます。パソコンに Furifont が入っていれば、ダウンロードは要りません。入っていなければ、このサイトからフォントを読み込みます。`,bookmarklet:`ブックマークレット`,bookmarkletHint:`ブックマークバーにドラッグしてください。好きなページでクリックすると、Furifont がオンになります。もう一度クリックすると、オフになります。X や GitHub のように、他のサイトのフォントを読み込めないサイトがあります。そのようなサイトでは、パソコンに Furifont をインストールしてください。`,okurigana:`送り仮名の読み`,okuriganaHint:`送り仮名の前の漢字に、正しい読みを付けます(来る、来ない の 来 など)。`,userscript:`ユーザースクリプト`,install:`ユーザースクリプトをインストール`,userscriptHint:`Tampermonkey や Violentmonkey(小さなプログラムを動かすブラウザの拡張機能)で使えます。日本語のページで、Furifont が自動でオンになります。他のサイトのフォントを読み込めないサイトでも動きます。メニューから、別の Furifont に切り替えたり、オフにしたりできます。`,toast:{message:`このページでは Furifont のフォントを読み込めませんでした。X や GitHub のように、他のサイトのフォントを読み込めないサイトがあります。そのようなサイトでは、パソコンに Furifont をインストールする必要があります。`,download:`フォントをダウンロード`,close:`閉じる`,outdated:`Furifont の新しいバージョンがあります。`,userscript:`ユーザースクリプトを更新`,bookmarklet:`新しいブックマークレットを入手`},menu:{okuriganaOn:`送り仮名の読み:オン`,okuriganaOff:`送り仮名の読み:オフ`}},reference:{eyebrow:`リファレンス`,title:`読みを選ぶ`,body:`Furifont は、言葉の一番よく使う読み方を表示します。別の読み方にするには、言葉の最初の漢字のすぐ後ろに異体字セレクタ(目に見えない文字)を書きます。VS226 は読み 1、VS227 は読み 2 で、以降も同じです。漢字が一つだけの場合は、その漢字の読み方を選びます。VS225 は、ふりがなのない漢字を表示します。`,search:`単語や漢字を検索:市場、今日、生`,searchLabel:`読みを検索`,hint:`読みをクリックすると、セレクタ付きの単語をコピーします。`,unavailable:`リファレンスは用意済みのフォントに入っていますが、ここでは読み込めませんでした({error})。{command} でフォントを作るか、カスタマイズを開いてください。`,loading:`読み込み中`,words:`複数の読みを持つ単語 / {count}`,kanji:`漢字 / {count}`,copyWith:`{text} を {selector} 付きでコピー`,default:`既定`},report:{eyebrow:`報告`,title:`読みの誤りを報告`,body:`ふりがなが間違っている、または必要な言葉にふりがなが付いていない
|
|
4
|
+
場合は、その言葉と正しい読みを教えてください。複数の言葉をまとめて報告できます。報告をもとに辞書を修正します。`,link:`読みの誤りを報告する。`,sections:{words:`言葉 / {count}`,environment:`表示された場所`,note:`その他`},word:`言葉`,expected:`正しい読み`,shown:`表示された読み(任意)`,context:`文(任意)`,remove:`{word} を削除`,add:`言葉を追加`,environment:`環境`,environments:{playground:`このサイトのプレイグラウンド`,website:`他のウェブサイト`,desktop:`デスクトップアプリ`,mobile:`モバイルアプリ`},family:`フォント`,familyAny:`(指定なし)`,url:`ページのアドレス(任意)`,app:`アプリ(任意)`,appPlaceholder:{desktop:`Word、Pages、VS Code`,mobile:`メモ、Kindle`},os:`OS(任意)`,notePlaceholder:`ブラウザ名や、読みが間違っている理由など、参考になること。`,name:`お名前(任意)`,nameHint:`読みを修正したときにクレジットとして記載します。匿名の場合は空欄のままにしてください。`,send:`報告を送信`,sending:`送信中`,sent:`ご報告ありがとうございます。`,again:`さらに報告する`,failed:`報告を送信できませんでした。しばらくしてからもう一度お試しください。`,limited:`短時間に多くの報告が送られました。1時間後にもう一度お試しください。`,privacy:`入力内容、フォントのバージョン、ブラウザ名を保存します。IPアドレスは保存しません。`},docs:{install:`フォントのインストール`,website:`ウェブサイトで使う`,readings:`読みを選ぶ`},customize:{connecting:`furifont dev に接続しています`,title:`カスタマイズ`,offline:{eyebrow:`カスタマイズ / オフライン`,title:`自分だけの Furifont を作る`,body:`カスタマイズは、あなたのパソコンで動くツールです。元のフォントを読み込み、作ったフォントを保存します。好きなフォルダで起動すると、このページがつながった状態で開きます。ライブプレビュー、辞書、ビルドボタンが使えます。作ったフォントは {folder} に保存されます。`,needs:`Node 22.18 以上が必要です(JavaScript のツールを動かす無料のプログラムです)。`,run:`好きなフォルダでカスタマイズを起動する`},auth:{eyebrow:`カスタマイズ / ロック中`,title:`ターミナルのコードを入力`,body:`{command} は、起動したターミナル(コマンドを入力する画面)に 6 桁のコードを表示しました。`,code:`コード`,failed:`コードが一致しません。ターミナルを確認して、もう一度お試しください。`,unlock:`ロックを解除`},sections:{preview:`プレビュー`,build:`ビルド`,overview:`概要`,dictionary:`辞書`,words:`あなたの単語`},options:{family:`フォントの名前`,base:`ベースフォント`,baseHint:`ふりがなを付ける元のフォントです。Source Han Serif JP Bold のようにダウンロードするフォントか、パソコン上の別のフォントファイルのパスを指定します。`,script:`ふりがなの文字`,hiragana:`ひらがな`,katakanaOn:`カタカナ`,hepburn:`ローマ字`,skip:`よく出る言葉を除く`,skipHint:`残った言葉のうち、よく使うものにはふりがなを付けません。読む人がすでに知っているからです。言葉と漢字一文字をよく使う順に並べ、500 ずつ数えます。`,words:`続けてふりがなを付ける言葉の数`,wordsHint:`続く言葉を、よく使う順に選びます。全部で {count} 語にふりがなが付きます。`,jlpt:`JLPT の言葉を除く`,jlptHint:`JLPT(日本語能力試験)の語彙リストで、この級までの言葉にはふりがなを付けません。N5 がいちばんやさしい級です。`,none:`なし`,all:`すべて`,sources:`次の語彙から言葉を選ぶ`,source:{jmdict:{name:`JMdict の全語`,hint:`JMdict:どのリストにも順位がない言葉(四字熟語など)も含む、すべての言葉です。順位のない言葉は、他に当てはまるものがない部分で使います。フォントが約700 KB大きくなります。`},ichi:{name:`基本の言葉`,hint:`JMdict「ichi1」「ichi2」:「一万語」リスト(基本の言葉の一覧)の言葉です。`},news:{name:`新聞の言葉`,hint:`JMdict「news1」「news2」:新聞によく出る 24,000 語です。`},spec:{name:`日常語`,hint:`JMdict「spec1」「spec2」:他の一覧に載っていない、一般的な言葉です。例:日本。`},gai:{name:`外来語`,hint:`JMdict「gai1」「gai2」:他の言語から入った、よく使う言葉です。`},nf:{name:`新聞の順位`,hint:`JMdict「nf01」〜「nf48」:新聞の言葉の一覧で順位がある言葉です(500 語ずつ)。`},tatoeba:{name:`Tatoeba の例文`,hint:`Tatoeba:例文に 3 回以上出てくる言葉です。上のリストにない留守中なども入ります。`},place:{name:`地名`,hint:`JMnedict:駅名と地名です。一般的な言葉に当てはまらない部分で使います。`},"mahjong-yaku":{name:`麻雀の役`,hint:`麻雀の役と牌の名前です(立直など)。一般的な言葉に当てはまらない部分で使います。`},"jr-stations":{name:`JRの駅名`,hint:`デスクトップ鉄のJR駅リストにある駅名です(阿蘇など)。一般的な言葉に当てはまらない部分で使います。`},yojijukugo:{name:`四字熟語`,hint:`JMdict:四字熟語です(阿鼻叫喚など)。一般的な言葉に当てはまらない部分で使います。`},"japan-post":{name:`市区町村と町域`,hint:`日本郵便の郵便番号データにある市区町村と町域の名前です(一宮など)。一般的な言葉に当てはまらない部分で使います。`}},isolated:`漢字一文字にもふりがなを付ける`,share:`漢字一文字のときの確かさ`,shareHint:`漢字が一つだけのとき、辞書の中でその読み方が少なくともこの割合を占める場合だけ、ふりがなを付けます。0.5 から 1 の数を入れます。大きいほど、ふりがなが付く漢字は減ります。`,rubyScale:`ふりがなの大きさ(漢字の何倍か)`,rubyGap:`漢字の上の余白(em)`,squeeze:`最も狭くする幅(通常の何倍か)`,maxWidth:`ふりがなの最大幅(em)`,reset:`初期設定に戻す`,resetHint:`カスタマイズが読み込んだ設定に戻します。追加した言葉はそのまま残ります。`},preview:{compiling:`プレビューを作っています`,weight:`プレビューの太さ`,size:`プレビューのサイズ`,stats:`{glyphs} グリフ / {ms} ms`},build:{words:`単語`,places:`地名`,ambiguous:`複数の読み`,lone:`漢字一文字`,protected:`あなたの設定`,glyphs:`ルビのグリフ`,rules:`ルール`,planning:`計画中`,estimate:{woff2:`≈ {size} WOFF2`,otf:`{size} OTF`},formats:`形式`,estimating:`サイズを見積もり中`,run:`フォントをビルド`,save:`設定を保存`},overview:{hint:`辞書の各部分から、等間隔に選んだ単語です。よく使われる順に並びます。`,randomize:`選び直す`,skip:`対象外`,take:`ルビを付ける`,rest:`ルビなし`,count:`{count} 語`,empty:`単語はありません。`},dictionary:{search:`辞書を検索:今日、生`,results:`{count} 語`,hint:`これらの言葉には、よく使う読み方が複数あります。一つを固定すると、それが標準の読み方になります。`,noTag:`一般的な言葉ではない`,restore:`元に戻す`,remove:`ふりがなを付けない`},custom:{placeholder:`日[に]本[ほん] または 今日[きょう]`,label:`追加する単語`,add:`単語を追加`,added:`追加 / {count}`,pinned:`固定 / {count}`,removed:`ふりがなを付けない / {count}`,none:`なし`,takeOut:`{item} を外す`}}};export{e as default};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{A as e,C as t,E as n,Ht as r,N as i,S as a,T as o,Vt as s,Y as c,Z as l,_ as u,at as d,bt as f,gt as p,j as m,mt as h,q as g,rt as _,s as v,t as y,ut as b,yt as x}from"./CkUAspOr.js";import{st as S,t as C}from"./Cl84O_XS.js";import{a as w,d as T,f as E,g as D,h as O,i as k,l as A,m as j,o as M,p as N,r as ee,s as te,u as P}from"./IRGIvKlv.js";import{t as F}from"./D1B77ENm.js";import{i as I,n as L,r as R,t as z}from"./D-bzbSL2.js";import{t as B}from"#entry";import{a as ne,i as V,n as re,r as H,t as U}from"./BJuAqPpj.js";import{n as W,t as G}from"./BaBNBiev.js";var K=Object.assign(i({__name:`UiTypeGrid`,props:{size:{}},setup(e){let t=a(()=>{let t=Math.round(L.baseline*e.size),n=n=>`${Math.round(t+(n-L.baseline)*e.size)}px`,r=e=>`transparent ${n(e)}, var(--ff-line) ${n(e)} calc(${n(e)} + 1px), transparent calc(${n(e)} + 1px)`,{emTop:i,emBottom:a}=L;return{backgroundImage:[`linear-gradient(${[i,a].map(r).join(`, `)})`,`linear-gradient(90deg, var(--ff-line) 1px, transparent 1px)`].join(`, `),backgroundSize:`100% ${e.size*R}px, ${e.size}px 100%`,backgroundPosition:`100vmax 100vmax`}});return(e,r)=>(c(),n(`div`,{"aria-hidden":`true`,class:`pointer-events-none absolute -inset-[100vmax] -z-1`,style:s(f(t))},null,4))}}),{__name:`UiTypeGrid`});function q(e){let t=new Map,n=/(?<!\p{sc=Han})\p{sc=Han}+(?=\p{sc=Hiragana})/gu,r=n=>{if(!t.has(n)){let r=new Map;for(let[t,i]of Object.entries(e.pairs[n]??{}))for(let e of i)r.set(e,t||null);t.set(n,r.size?{reading:r,longest:Math.max(...[...r.keys()].map(e=>e.length))}:void 0)}return t.get(n)},i=(t,n)=>{let r=t.length>[...t][0].length,i=(r?e.words[t]?.map(e=>[...e.matchAll(/\[([^\]]*)\]/g)].map(e=>e[1]).join(``)):e.readings[t])?.indexOf(n)??-1;return i>=+!!r&&i<15&&e.lone[t]!==n?i+1:0};return{find:e=>{let t=[];for(let{0:a,index:o}of e.matchAll(n)){let n=r(a),s=e.slice(o+a.length,o+a.length+(n?.longest??0)),c;for(let e=s.length;e>0&&c===void 0;e--)c=n?.reading.get(s.slice(0,e));let l=c?i(a,c):0;c&&l&&t.push({at:o,length:a.length,reading:c,salt:l})}return t},saltOf:i}}var J=new Map;function Y(e,t){let n=J.get(e);return n||(n=(t?t(e):fetch(e).then(t=>t.ok?t.text():Promise.reject(Error(e)))).then(JSON.parse),n.catch(()=>J.delete(e)),J.set(e,n)),n}async function X({readings:e,pairs:t,fetchText:n}){try{let[r,i]=await Promise.all([Y(e,n),Y(t,n)]);return r.salt===!0?q({pairs:i,readings:r.kanji,words:r.words,lone:r.lone}):void 0}catch{return}}function Z(e){let t=v().app.baseURL,n=p();async function r(){let r=x(e),i=await X({readings:`${t}${N(r,`ivs.json`)}`,pairs:`${t}okurigana.json`});r.stem===x(e).stem&&(n.value=i)}return g(r),_(()=>x(e).stem,r),{reader:n}}var ie={class:`grid lg:grid-cols-2`},ae={class:`flex flex-col gap-8 border-base px-6 py-16 lg:border-r lg:py-24`},oe={class:`display hero-title font-semibold`},se={class:`max-w-[46ch] text-[15px] lh-1.625 color-muted ws-pre-line`},ce={class:`flex flex-wrap gap-3`},le={class:`relative isolate flex flex-col justify-center gap-4 overflow-hidden border-t border-base px-6 py-12 lg:border-t-0`},ue={class:`relative`},de={key:0,class:`label no-ruby absolute right-3 bottom-3 border border-base bg-base px-2 py-1`},fe={class:`label absolute bottom-4 left-4 border border-base bg-base px-2 py-1`},Q=44,pe=Object.assign(i({__name:`DemoHero`,emits:[`download`],setup(i,{emit:s}){let l=s,u=h(V[0].text),p=a(()=>V.find(e=>e.text===u.value)?.author),{family:g,ruby:_,okurigana:v}=B(),{reader:y}=Z(g);return(i,a)=>{let s=G,h=K,x=z;return c(),n(`div`,ie,[t(`div`,ae,[a[4]||=t(`span`,{class:`label`},`振り仮名 / furigana`,-1),t(`h1`,oe,[e(r(i.$t(`hero.title1`)),1),a[3]||=t(`br`,null,null,-1),e(r(i.$t(`hero.title2`)),1)]),t(`p`,se,r(i.$t(`hero.body`)),1),t(`div`,ce,[m(s,{variant:`solid`,icon:`i-ph-download-simple`,onClick:a[0]||=e=>l(`download`)},{default:d(()=>[e(r(i.$t(`hero.download`)),1)]),_:1}),m(s,{to:`/customize`,icon:`i-ph-sliders-horizontal`},{default:d(()=>[e(r(i.$t(`hero.build`)),1)]),_:1})])]),t(`div`,le,[m(s,{icon:`i-ph-shuffle`,class:`absolute right-3 top-3 w-9 bg-base px-0`,"aria-label":i.$t(`shuffle`),title:i.$t(`shuffle`),onClick:a[1]||=e=>u.value=(`otherSample`in i?i.otherSample:f(ne))(f(u)).text},null,8,[`aria-label`,`title`]),t(`div`,ue,[m(h,{size:Q}),m(x,{text:f(u),"onUpdate:text":a[2]||=e=>b(u)?u.value=e:null,family:f(g).family,ruby:f(_),size:Q,okurigana:f(v)?f(y):void 0},null,8,[`text`,`family`,`ruby`,`okurigana`])]),f(p)?(c(),n(`span`,de,`⁄ `+r(f(p)),1)):o(``,!0),t(`span`,fe,r(f(g).family)+` Regular / `+r(Q)+`px`,1)])])}}}),{__name:`DemoHero`}),me={class:`grid lg:grid-cols-[340px_1fr]`},he={class:`flex flex-col gap-5 border-b border-base p-6 lg:border-b-0 lg:border-r`},ge={class:`flex flex-col gap-1.5`},_e={class:`text-xs lh-1.625 color-muted`},ve={class:`flex min-w-0 flex-col`},ye={class:`min-h-72 flex-1 px-6 py-8`},be={class:`flex items-center gap-3 border-t border-base px-6 py-3`},xe={class:`text-xs color-muted`},Se=Object.assign(i({__name:`DemoPlayground`,setup(i){let a=h(`今日は日本語の勉強をします。
|
|
2
|
+
明日は東京の大学へ行きます。
|
|
3
|
+
私は毎朝新聞を読みます。桜が咲きました。`),{face:o,script:s,ruby:l,okurigana:u,family:p,faces:g,scripts:_}=B(),{reader:v}=Z(p),y=h(30),x=h(400),{copied:S,copy:C}=I();return(i,h)=>{let T=H,E=W,D=re,O=U,k=z,A=G;return c(),n(`div`,me,[t(`div`,he,[m(E,{label:i.$t(`playground.script`)},{default:d(()=>[m(T,{modelValue:f(s),"onUpdate:modelValue":h[0]||=e=>b(s)?s.value=e:null,label:i.$t(`playground.script`),options:f(_)},null,8,[`modelValue`,`label`,`options`])]),_:1},8,[`label`]),m(E,{label:i.$t(`playground.face`)},{default:d(()=>[m(T,{modelValue:f(o),"onUpdate:modelValue":h[1]||=e=>b(o)?o.value=e:null,label:i.$t(`playground.face`),options:f(g)},null,8,[`modelValue`,`label`,`options`])]),_:1},8,[`label`]),m(E,{label:i.$t(`playground.size`,{size:f(y)})},{default:d(()=>[m(D,{modelValue:f(y),"onUpdate:modelValue":h[2]||=e=>b(y)?y.value=e:null,min:16,max:64},null,8,[`modelValue`])]),_:1},8,[`label`]),m(E,{label:i.$t(`playground.weight`,{weight:f(x)})},{default:d(()=>[m(D,{modelValue:f(x),"onUpdate:modelValue":h[3]||=e=>b(x)?x.value=e:null,min:`MIN_WEIGHT`in i?i.MIN_WEIGHT:f(M),max:`MAX_WEIGHT`in i?i.MAX_WEIGHT:f(w),step:10},null,8,[`modelValue`,`min`,`max`])]),_:1},8,[`label`]),m(O,{modelValue:f(l),"onUpdate:modelValue":h[4]||=e=>b(l)?l.value=e:null},{default:d(()=>[e(r(i.$t(`playground.ruby`)),1)]),_:1},8,[`modelValue`]),t(`div`,ge,[m(O,{modelValue:f(u),"onUpdate:modelValue":h[5]||=e=>b(u)?u.value=e:null},{default:d(()=>[e(r(i.$t(`playground.okurigana`)),1)]),_:1},8,[`modelValue`]),t(`p`,_e,r(i.$t(`playground.okuriganaHint`)),1)])]),t(`div`,ve,[t(`div`,ye,[m(k,{text:f(a),"onUpdate:text":h[6]||=e=>b(a)?a.value=e:null,family:f(p).family,ruby:f(l),size:f(y),weight:f(x),okurigana:f(u)?f(v):void 0},null,8,[`text`,`family`,`ruby`,`size`,`weight`,`okurigana`])]),t(`div`,be,[t(`div`,xe,r(i.$t(`playground.textHint`)),1),h[8]||=t(`div`,{class:`flex-auto`},null,-1),m(A,{variant:`ghost`,icon:f(S)?`i-ph-check`:`i-ph-copy`,onClick:h[7]||=e=>f(C)(f(a))},{default:d(()=>[e(r(f(S)?i.$t(`copied`):i.$t(`playground.copy`)),1)]),_:1},8,[`icon`])])])])}}}),{__name:`DemoPlayground`}),Ce={class:`overflow-hidden`},we={class:`-mb-px -mr-px grid sm:grid-cols-2 lg:grid-cols-3`},Te={class:`font-mono text-xs color-muted`},Ee={class:`text-base font-semibold tracking-tight`},De={class:`text-sm lh-1.625 color-muted`},Oe=Object.assign(i({__name:`DemoHowItWorks`,setup(e){let i=[`build`,`ligatures`,`longest`,`bare`,`okurigana`];return(e,a)=>(c(),n(`div`,Ce,[t(`ol`,we,[(c(),n(u,null,l(i,(n,i)=>t(`li`,{key:n,class:`flex flex-col gap-3 border-b border-r border-base p-8`},[t(`span`,Te,r(String(i+1).padStart(2,`0`)),1),t(`h3`,Ee,r(e.$t(`how.${n}.title`)),1),t(`p`,De,r(e.$t(`how.${n}.body`)),1)])),64))])]))}}),{__name:`DemoHowItWorks`}),ke={class:`grid sm:grid-cols-[1fr_2fr] overflow-hidden`},Ae={class:`flex flex-col gap-4 border-b border-base p-6 sm:border-b-0 sm:border-r`},je={class:`text-sm lh-1.625 color-muted`},Me={class:`grid grid-cols-2 lg:grid-cols-5 -mb-px -mr-px`},Ne={class:`label`},Pe=[`onClick`],Fe=Object.assign(i({__name:`DemoSelectors`,setup(i){let a=e=>String.fromCodePoint(917984+e),o=[{label:`selectors.default`,text:`市場`,code:`市場`},{label:`selectors.reading2`,text:`市${a(2)}場`,code:`市\\u{E01E2}場`},{label:`selectors.default`,text:`今日`,code:`今日`},{label:`selectors.reading2`,text:`今${a(2)}日`,code:`今\\u{E01E2}日`},{label:`selectors.none`,text:`今${a(0)}日`,code:`今\\u{E01E0}日`}],{copied:s,copy:p}=I(),{family:h,ruby:g}=B();return(i,a)=>{let _=G,v=z;return c(),n(`div`,ke,[t(`div`,Ae,[t(`p`,je,r(i.$t(`selectors.body`)),1),m(_,{to:`/reference`,icon:`i-ph-list-magnifying-glass`,class:`self-start`},{default:d(()=>[e(r(i.$t(`selectors.lookUp`)),1)]),_:1})]),t(`ul`,Me,[(c(),n(u,null,l(o,e=>t(`li`,{key:e.code,class:`flex flex-col gap-2 border-b border-r border-base p-4 last:border-r-0`},[m(v,{text:e.text,family:f(h).family,ruby:f(g),size:36},null,8,[`text`,`family`,`ruby`]),t(`span`,Ne,r(i.$t(e.label)),1),t(`button`,{type:`button`,class:`focus-ring self-start font-mono text-xs color-muted hover:color-base`,onClick:t=>f(p)(e.text)},r(f(s)===e.text?i.$t(`copied`):e.code),9,Pe)])),64))])])}}}),{__name:`DemoSelectors`}),Ie={},Le={class:`grid lg:grid-cols-[5fr_4fr]`},Re={class:`w-full border-b border-base text-sm lg:border-b-0 lg:border-r`},ze={class:`border-b border-base text-left`},Be={class:`label px-6 py-3 font-normal`},Ve={class:`label px-3 py-3 font-normal`},He={class:`label px-3 py-3 font-normal`},Ue={class:`px-6 py-3 font-medium`},We={class:`px-3 py-3 color-muted`},Ge={class:`px-3 py-3`},Ke={class:`flex gap-3 font-mono text-xs`},qe=[`href`],Je={class:`flex gap-3 font-mono text-xs`},Ye=[`href`],Xe={class:`flex flex-col gap-4 p-6`},Ze={class:`text-sm color-muted lh-1.625`},Qe={class:`text-sm color-muted lh-1.625`};function $e(i,a){let o=G;return c(),n(`div`,Le,[t(`table`,Re,[t(`thead`,null,[t(`tr`,ze,[t(`th`,Be,r(i.$t(`downloads.family`)),1),t(`th`,Ve,r(i.$t(`downloads.ruby`)),1),t(`th`,He,r(i.$t(`downloads.variable`)),1),(c(!0),n(u,null,l(`WEIGHTS`in i?i.WEIGHTS:f(E),e=>(c(),n(`th`,{key:e.style,class:`label px-3 py-3 font-normal`},r(e.style),1))),128))])]),t(`tbody`,null,[(c(!0),n(u,null,l(`FAMILIES`in i?i.FAMILIES:f(k),e=>(c(),n(`tr`,{key:e.stem,class:`border-b border-base last:border-b-0`},[t(`td`,Ue,r(e.family),1),t(`td`,We,r(i.$t(`scripts.${e.script}`)),1),t(`td`,Ge,[t(`span`,Ke,[(c(),n(u,null,l([`ttf`,`woff2`],n=>t(`a`,{key:n,href:(`releaseUrl`in i?i.releaseUrl:f(j))(`${e.stem}VF.${n}`),class:`focus-ring underline underline-offset-3 hover:color-muted`},r(n),9,qe)),64))])]),(c(!0),n(u,null,l(`WEIGHTS`in i?i.WEIGHTS:f(E),a=>(c(),n(`td`,{key:a.style,class:`px-3 py-3`},[t(`span`,Je,[(c(),n(u,null,l([`otf`,`woff2`],n=>t(`a`,{key:n,href:(`releaseUrl`in i?i.releaseUrl:f(j))(`${e.stem}-${a.style}.${n}`),class:`focus-ring underline underline-offset-3 hover:color-muted`},r(n),9,Ye)),64))])]))),128))]))),128))])]),t(`div`,Xe,[t(`p`,Ze,r(i.$t(`downloads.formats`)),1),m(o,{href:(`releaseUrl`in i?i.releaseUrl:f(j))(`Furifont.zip`),icon:`i-ph-download-simple`,class:`self-start`},{default:d(()=>[e(r(i.$t(`downloads.all`)),1)]),_:1},8,[`href`]),t(`p`,Qe,r(i.$t(`downloads.buildOwn`)),1),m(o,{to:`/customize`,icon:`i-ph-sliders-horizontal`,class:`self-start`},{default:d(()=>[e(r(i.$t(`nav.customize`)),1)]),_:1})])])}var et=Object.assign(y(Ie,[[`render`,$e]]),{__name:`DemoDownloads`}),tt='var Furifont=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let t={fonts:[{family:`Furifont Sans`,base:`Source Han Sans JP`,face:`sans`,furiganaScript:`hiragana`},{family:`Furifont Sans Romaji`,base:`Source Han Sans JP`,face:`sans`,furiganaScript:`hepburn`},{family:`Furifont Serif`,base:`Source Han Serif JP`,face:`serif`,furiganaScript:`hiragana`},{family:`Furifont Serif Romaji`,base:`Source Han Serif JP`,face:`serif`,furiganaScript:`hepburn`}],weights:[{style:`Regular`,weight:400}],variable:{style:`VF`,weights:[250,900]},options:{take:4e4}},n={base:12290,selector:65024},r=`U+2E80-2FDF,U+3000-30FF,U+3190-319F,U+31F0-31FF,U+3400-4DBF,U+4E00-9FFF,U+F900-FAFF,U+FE00-FE0F,U+FF00-FFEF,U+20000-3FFFF,U+E0100-E01EF`,i=/[\\p{sc=Han}\\p{sc=Hiragana}\\p{sc=Katakana}]/u;function a(e){return(e.match(/\\s*(?:"(?:[^"\\\\]|\\\\.)*"|\'(?:[^\'\\\\]|\\\\.)*\'|[^,]+)/g)??[]).map(e=>e.trim()).filter(Boolean)}function o(e){return e.replace(/^(["\'])(.*)\\1$/,`$2`)}let s=/mono|courier|consol|menlo|monaco|等幅/i;function c(e){let t=e.map(o);return t.some(e=>e===`monospace`||e===`ui-monospace`)||s.test(t[0]??``)}async function l({family:e,url:n,fetchFont:i}){let a=(t,n=`400`)=>new FontFace(e,t,{unicodeRange:r,weight:n}).load().catch(()=>void 0),o=await Promise.all(t.weights.map(({style:t,weight:n})=>a(`local("${e} ${t}")${n===400?`,local("${e}")`:``}`,String(n)))),s=t.variable.weights.join(` `),c=o.some(Boolean)?o:[await(i?i(n).then(e=>a(e,s),()=>void 0):a(`url("${n}")`,s))];for(let e of c)e&&document.fonts.add(e);return c.some(Boolean)}function u(e){let t=/* @__PURE__ */ new Map,n=/(?<!\\p{sc=Han})\\p{sc=Han}+(?=\\p{sc=Hiragana})/gu,r=n=>{if(!t.has(n)){let r=/* @__PURE__ */ new Map;for(let[t,i]of Object.entries(e.pairs[n]??{}))for(let e of i)r.set(e,t||null);t.set(n,r.size?{reading:r,longest:Math.max(...[...r.keys()].map(e=>e.length))}:void 0)}return t.get(n)},i=(t,n)=>{let r=t.length>[...t][0].length,i=(r?e.words[t]?.map(e=>[...e.matchAll(/\\[([^\\]]*)\\]/g)].map(e=>e[1]).join(``)):e.readings[t])?.indexOf(n)??-1;return i>=+!!r&&i<15&&e.lone[t]!==n?i+1:0};return{find:e=>{let t=[];for(let{0:a,index:o}of e.matchAll(n)){let n=r(a),s=e.slice(o+a.length,o+a.length+(n?.longest??0)),c;for(let e=s.length;e>0&&c===void 0;e--)c=n?.reading.get(s.slice(0,e));let l=c?i(a,c):0;c&&l&&t.push({at:o,length:a.length,reading:c,salt:l})}return t},saltOf:i}}let d=/* @__PURE__ */ new Map;function f(e,t){let n=d.get(e);return n||(n=(t?t(e):fetch(e).then(t=>t.ok?t.text():Promise.reject(Error(e)))).then(JSON.parse),n.catch(()=>d.delete(e)),d.set(e,n)),n}async function p({readings:e,pairs:t,fetchText:n}){try{let[r,i]=await Promise.all([f(e,n),f(t,n)]);return r.salt===!0?u({pairs:i,readings:r.kanji,words:r.words,lone:r.lone}):void 0}catch{return}}function m(e,t){return{href:new URL(`/#downloads`,e).href,text:t.download}}function h(e,t,n){document.querySelector(`furifont-toast`)?.remove();let r=document.createElement(`furifont-toast`),i=r.attachShadow({mode:`open`}),a=new CSSStyleSheet;a.replaceSync(`:host{all:initial}div{position:fixed;z-index:2147483647;right:16px;bottom:16px;display:flex;gap:16px;align-items:start;max-width:360px;padding:12px 16px;border:1px solid #fafafa2b;background:#0a0a0a;color:#fafafa;font:14px/1.5 system-ui,sans-serif}p{margin:0}a{color:inherit;margin-right:12px}button{padding:0;border:0;background:none;color:inherit;font:inherit;cursor:pointer}`),i.adoptedStyleSheets=[a];let o=document.createElement(`p`);o.append(e,` `,...t.map(({href:e,text:t})=>Object.assign(document.createElement(`a`),{href:e,target:`_blank`,rel:`noopener`,textContent:t})));let s=Object.assign(document.createElement(`button`),{ariaLabel:n,textContent:`×`,onclick:()=>r.remove()}),c=Object.assign(document.createElement(`div`),{role:`alert`});c.append(o,s),i.append(c),document.body.append(r),setTimeout(()=>r.remove(),1e4)}function g(e){let[t=0,n=0,r=0]=e.split(`.`).map(Number);return t*1e3+n*100+r}function _(e){let t=document.createElement(`canvas`).getContext(`2d`);return t.font=`1000px "${e}"`,Math.round(t.measureText(String.fromCodePoint(n.base,n.selector)).width)-2e3}async function v({family:e,url:t,toast:n},r){let i=new URL(`/version.json`,t).href,a;try{a=g(JSON.parse(await(r.fetchText?r.fetchText(i):fetch(i).then(e=>e.text()))).version)}catch{return}let o=[...g(r.version)<a?[r]:[],..._(e)<a?[m(t,n)]:[]];o.length&&h(n.outdated,o,n.close)}function y(e){let t=[];for(let n of e.filter(e=>e.isConnected)){let e=document.createTreeWalker(n,NodeFilter.SHOW_TEXT);for(let n=e.currentNode;n;n=e.nextNode())n.nodeType===Node.TEXT_NODE&&n.parentElement&&t.push(n)}return t}function b(e){let t=new Set(y(e).filter(e=>i.test(e.nodeValue??``)).map(e=>e.parentElement));for(let n of e){if(n.nodeType!==Node.ELEMENT_NODE)continue;let e=n;e.matches(`input,textarea`)&&t.add(e);for(let n of e.querySelectorAll(`input,textarea`))t.add(n)}return t}function x(e){let t=new CSSStyleSheet,n=[],r,i=0,s=()=>{for(let e of document.querySelectorAll(`[data-furifont-reading]`)){let t=r?r.saltOf(e.textContent??``,e.dataset.furifontReading):0;t?e.dataset.furifontSalt=String(t):delete e.dataset.furifontSalt}},l=e=>{if(!r)return;let t=y(e).filter(e=>/\\p{sc=Han}\\p{sc=Hiragana}/u.test(e.nodeValue??``)&&!e.parentElement.closest(`script,style,textarea,noscript,ruby,[contenteditable]:not([contenteditable=false]),[data-furifont-reading]`));for(let e of t)for(let{at:t,length:n,reading:i,salt:a}of r.find(e.nodeValue??``).reverse()){let r=t?e.splitText(t):e;r.length>n&&r.splitText(n);let o=document.createElement(`span`);o.dataset.furifontReading=i,o.dataset.furifontSalt=String(a),r.replaceWith(o),o.append(r)}},u={dispose:()=>{},sheet:t,family:e,restyle:()=>{let e=Array.from({length:15},(e,t)=>`[data-furifont-salt="${t+1}"]{font-feature-settings:"salt" ${t+1}!important}`).join(``),r=n.map((e,t)=>`[data-furifont="${t}"]{font-family:"${u.family}",${e}!important}`).join(``);t.replaceSync(`${r}[data-furifont-tight]{line-height:normal!important}ruby,ruby *{font-feature-settings:"ss01"!important}${e}`)},okurigana:e=>{let n=++i;r=void 0,s(),e&&!t.disabled&&p(e).then(e=>{n===i&&e&&(r=e,s(),l([document.body]))})}},d=e=>{let t=[...b(e)].filter(e=>!e.hasAttribute(`data-furifont`)).map(e=>{let{fontFamily:t,lineHeight:n,fontSize:r}=getComputedStyle(e),i=a(t);return o(i[0]??``)===u.family&&i.shift(),{element:e,stack:i,tight:Number.parseFloat(n)<1.6*Number.parseFloat(r)}}).filter(({stack:e})=>e.length&&!c(e)),r=n.length;for(let{element:e,stack:r,tight:i}of t){let t=r.join(`,`),a=n.includes(t)?n.indexOf(t):n.push(t)-1;e.setAttribute(`data-furifont`,String(a)),i&&e.setAttribute(`data-furifont-tight`,``)}n.length>r&&u.restyle()},f=new MutationObserver(e=>{let t=e.flatMap(e=>e.type===`characterData`?[e.target]:[...e.addedNodes]);d(t),l(t)});return u.dispose=()=>{f.disconnect(),i++,r=void 0,document.adoptedStyleSheets=document.adoptedStyleSheets.filter(e=>e!==t);for(let e of document.querySelectorAll(`[data-furifont],[data-furifont-tight]`))e.removeAttribute(`data-furifont`),e.removeAttribute(`data-furifont-tight`);for(let e of document.querySelectorAll(`[data-furifont-reading]`))e.replaceWith(...e.childNodes);window.furifont===u&&delete window.furifont},window.furifont=u,document.adoptedStyleSheets=[...document.adoptedStyleSheets,t],d([document.body]),f.observe(document.body,{childList:!0,characterData:!0,subtree:!0}),u}async function S(e){let{family:t,url:n,toast:r,okurigana:i,update:a}=e,o=window.furifont;o?.family===t?(o.sheet.disabled=!o.sheet.disabled,o.sheet.disabled||o.okurigana(i)):(o??=x(t),o.family=t,o.restyle(),o.sheet.disabled=!1,await l(e)?(o.okurigana(i),a&&await v(e,a)):(o.sheet.disabled=!0,o.family=``,h(r.message,[m(n,r)],r.close)))}return e.JAPANESE=i,e.UNICODE_RANGE=r,e.createOkuriganaReader=u,e.isMonospace=c,e.loadFurifont=l,e.loadOkuriganaReader=p,e.parseFontStack=a,e.showToast=h,e.toggleFurifont=S,e})({});',$={class:`grid lg:grid-cols-[340px_1fr]`},nt={class:`flex flex-col gap-5 border-b border-base p-6 lg:border-b-0 lg:border-r`},rt={class:`text-sm lh-1.625 color-muted`},it={class:`flex flex-col gap-1.5`},at={class:`text-xs lh-1.625 color-muted`},ot={class:`grid sm:grid-cols-2`},st={class:`flex flex-col gap-3 border-b border-base p-6 sm:border-b-0 sm:border-r`},ct={class:`label`},lt=[`href`],ut={class:`text-sm lh-1.625 color-muted`},dt={class:`flex flex-col gap-3 p-6`},ft={class:`label`},pt={class:`text-sm lh-1.625 color-muted`},mt=Object.assign(i({__name:`DemoAnyPage`,setup(i){let{t:o}=ee(),{face:s,script:l,okurigana:u,family:p,faces:h,scripts:g}=B(),_=a(()=>{let e={family:p.value.family,url:O(p.value),toast:{message:o(`anyPage.toast.message`),download:o(`anyPage.toast.download`),close:o(`anyPage.toast.close`),outdated:o(`anyPage.toast.outdated`)},okurigana:u.value?{readings:D(p.value),pairs:P}:void 0,update:{version:T,href:`${A}/#any-page`,text:o(`anyPage.toast.bookmarklet`)}};return`javascript:${encodeURIComponent(`void (()=>{${tt};Furifont.toggleFurifont(${JSON.stringify(e)})})()`)}`}),y=`${v().app.baseURL}furifont.user.js`;return(i,a)=>{let o=H,v=W,x=U,S=G;return c(),n(`div`,$,[t(`div`,nt,[t(`p`,rt,r(i.$t(`anyPage.body`)),1),m(v,{label:i.$t(`playground.script`)},{default:d(()=>[m(o,{modelValue:f(l),"onUpdate:modelValue":a[0]||=e=>b(l)?l.value=e:null,label:i.$t(`playground.script`),options:f(g)},null,8,[`modelValue`,`label`,`options`])]),_:1},8,[`label`]),m(v,{label:i.$t(`playground.face`)},{default:d(()=>[m(o,{modelValue:f(s),"onUpdate:modelValue":a[1]||=e=>b(s)?s.value=e:null,label:i.$t(`playground.face`),options:f(h)},null,8,[`modelValue`,`label`,`options`])]),_:1},8,[`label`]),t(`div`,it,[m(x,{modelValue:f(u),"onUpdate:modelValue":a[2]||=e=>b(u)?u.value=e:null},{default:d(()=>[e(r(i.$t(`anyPage.okurigana`)),1)]),_:1},8,[`modelValue`]),t(`p`,at,r(i.$t(`anyPage.okuriganaHint`)),1)])]),t(`div`,ot,[t(`div`,st,[t(`span`,ct,r(i.$t(`anyPage.bookmarklet`)),1),t(`a`,{href:f(_),class:`btn-solid focus-ring self-start`},[a[3]||=t(`span`,{class:`i-ph-bookmark-simple`},null,-1),e(` `+r(f(p).family),1)],8,lt),t(`p`,ut,r(i.$t(`anyPage.bookmarkletHint`)),1)]),t(`div`,dt,[t(`span`,ft,r(i.$t(`anyPage.userscript`)),1),m(S,{href:y,icon:`i-ph-puzzle-piece`,class:`self-start`},{default:d(()=>[e(r(i.$t(`anyPage.install`)),1)]),_:1}),t(`p`,pt,r(i.$t(`anyPage.userscriptHint`)),1)])])])}}}),{__name:`DemoAnyPage`}),ht={class:`flex items-center gap-2 border-t border-base px-6 py-3 text-xs color-muted bg-amber:5`},gt=[`href`],_t=i({__name:`index`,setup(i){function a(){document.getElementById(`downloads`)?.scrollIntoView({behavior:`smooth`})}let o=S();return g(()=>{o.hash&&document.getElementById(o.hash.slice(1))?.scrollIntoView({behavior:`smooth`})}),(i,o)=>{let s=pe,l=Se,u=F,p=Oe,h=Fe,g=C,_=et,v=mt;return c(),n(`div`,null,[m(s,{onDownload:a}),m(u,{index:`01`,title:i.$t(`sections.try`)},{default:d(()=>[m(l)]),_:1},8,[`title`]),m(u,{index:`02`,title:i.$t(`sections.how`)},{default:d(()=>[m(p)]),_:1},8,[`title`]),m(u,{index:`03`,title:i.$t(`sections.selectors`)},{default:d(()=>[m(h)]),_:1},8,[`title`]),t(`p`,ht,[o[0]||=t(`span`,{class:`i-ph-warning shrink-0 text-base text-amber`,"aria-hidden":`true`},null,-1),t(`span`,null,[e(r(i.$t(`notice`))+` `,1),m(g,{to:`/report`,class:`focus-ring underline underline-offset-3 hover:color-base`},{default:d(()=>[e(r(i.$t(`report.link`)),1)]),_:1})])]),m(u,{id:`downloads`,index:`04`,title:i.$t(`sections.download`)},{aside:d(()=>[o[1]||=t(`div`,{class:`flex-auto`},null,-1),t(`a`,{href:`RELEASE_URL`in i?i.RELEASE_URL:f(te),target:`_blank`,rel:`noopener`,class:`focus-ring self-start font-mono text-xs underline underline-offset-3 color-muted hover:color-inherit`},`v`+r(`VERSION`in i?i.VERSION:f(T)),9,gt)]),default:d(()=>[m(_)]),_:1},8,[`title`]),m(u,{id:`any-page`,index:`05`,title:i.$t(`sections.anyPage`)},{default:d(()=>[m(v)]),_:1},8,[`title`])])}}});export{_t as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e={meta:{title:`Furifont:內建振假名的日文字型`,description:`自帶振假名的日語字型。`},nav:{demo:`簡介`,docs:`文件`,customize:`自訂`,report:`回報`,github:`GitHub 儲存庫`,light:`切換為淺色`,dark:`切換為深色`,language:`語言`,rubyOff:`隱藏振假名`,rubyOn:`顯示振假名`},footer:{fonts:`字型採用{license},源自 Source Han Sans 和 Source Han Serif。`,data:`讀音資料來自 {jmdict}、{jmnedict}、{kanjidic}(EDRDG)、{furigana}、{japanpost}(地名)和 {desktoptetsu}(JR 站名),採用 CC BY-SA 4.0 授權。`,code:`工具採用 MIT 授權。`,report:`回報錯誤讀音`,source:`GitHub 上的原始碼`,made:`作者:{author}`,supported:`由 {vercel} 和{sponsors}支持`,sponsors:`贊助者`},copied:`已複製`,shuffle:`換一個例句`,editable:`範例文字,可以編輯。`,scripts:{hiragana:`平假名`,hepburn:`羅馬字`},faces:{sans:`黑體`,serif:`明體`},hero:{title1:`振假名,`,title2:`交給字型。`,body:`Furifont 是一款把振假名直接顯示在字型上的日語字型。它用連字(ligature)依詞語的讀音切換。只要支援自訂字型,哪裡都能用。`,download:`下載字型`,build:`自行建置`},notice:`受字型限制,振假名可能不正確,請留意。`,sections:{try:`試試看`,how:`運作原理`,selectors:`選擇讀音`,download:`下載`,anyPage:`用於網站`},playground:{script:`振假名所用文字`,face:`字型樣式`,size:`字級 / {size}px`,weight:`字重 / {weight}`,ruby:`振假名`,okurigana:`送假名讀音`,okuriganaHint:`需要 JavaScript。受瀏覽器限制,字型無法自行處理送假名。`,textHint:`點選文字即可編輯。`,copy:`複製文字`},how:{build:{title:`客製建置`,body:`Furifont 以思源黑體或思源宋體為基礎編譯而成。建置時會讀取包含數千個詞的辭典,並把振假名繪製成新的字形。得到的是普通的字型檔案,不需要 JavaScript,也不需要外掛。`},ligatures:{title:`由連字完成工作`,body:`字型中為每個詞準備了連字。今日 會變成上方帶有 きょう 的單個字形。替換發生在繪製文字時,所以文字本身不會改變。`},longest:{title:`長詞優先`,body:`Furifont 把每一組漢字與幾千個常用詞的清單對照,先試最長的詞。例如,會先選 日本語,再考慮 日本。今日 會當作一個詞,讀作 きょう。`},bare:{title:`拿不準就不加`,body:`只有一個漢字時,只有當某個讀音明顯最可能,才加振假名。大人気 可以讀作 だいにんき,也可以讀作 おとなげ,所以不加振假名。`},okurigana:{title:`可選的送假名支援`,body:`瀏覽器依字型的文字種類分別排版,所以字型看不到漢字後面的假名(稱為送假名)。我們透過 JavaScript 標註,提供可選的支援。`}},selectors:{body:`有些詞有多個常用讀音。Furifont 顯示最常見的那個。要選其他讀音,就在第一個漢字後面緊接一個變體選擇器(看不見的字元)。VS226 是讀音 1,VS227 是讀音 2,依此類推。VS225 會移除振假名。`,lookUp:`查詢讀音`,default:`預設`,reading2:`讀音 2(VS227)`,none:`無振假名(VS225)`},downloads:{all:`全部下載為 ZIP`,family:`字型家族`,ruby:`振假名`,variable:`可變`,formats:`OTF 和 TTF 常用於安裝到電腦上。WOFF2 針對網站做了最佳化。我們推薦使用可變字型,體驗最佳。在某些情況下,為了相容性,你可能需要固定字重的版本。`,buildOwn:`你也可以自己製作字型。可以選擇其他基礎字型、詞的數量、振假名所用文字或尺寸。`},anyPage:{body:`你可以在任何網站上使用 Furifont。有漢字的行會留出放振假名的空間。如果電腦上已安裝 Furifont,就不用下載。否則字型會從本站載入。`,bookmarklet:`書籤小工具`,bookmarkletHint:`把它拖到書籤列。在任何頁面點選它,就會開啟 Furifont;再點一次就會關閉。有些網站(如 X 和 GitHub)不允許載入其他網站的字型。在這些網站上,請在電腦上安裝 Furifont。`,okurigana:`送假名讀音`,okuriganaHint:`為送假名前的漢字選出正確的讀音,例如「来る」「来ない」中的「来」。`,userscript:`使用者腳本`,install:`安裝使用者腳本`,userscriptHint:`適用於 Tampermonkey 或 Violentmonkey(執行小腳本的瀏覽器擴充功能)。它會在日語頁面自動開啟 Furifont,在不允許載入其他網站字型的網站上也能用。你可以在它的選單裡切換到另一款 Furifont 字型,或將其關閉。`,toast:{message:`Furifont 無法在此頁面載入字型。有些網站(如 X 和 GitHub)不允許載入其他網站的字型。在這些網站上,需要在電腦上安裝 Furifont。`,download:`下載字型`,close:`關閉`,outdated:`Furifont 有新版本了。`,userscript:`更新使用者腳本`,bookmarklet:`取得新的書籤小工具`},menu:{okuriganaOn:`送假名讀音:開`,okuriganaOff:`送假名讀音:關`}},reference:{eyebrow:`參考`,title:`選擇讀音`,body:`Furifont 顯示詞最常見的讀音。要顯示其他讀音,就在詞的第一個漢字後面緊接一個變體選擇器(看不見的字元)。VS226 是讀音 1,VS227 是讀音 2,依此類推。單個漢字後面的選擇器,選的是這個漢字的讀音。VS225 顯示不帶振假名的漢字。`,search:`搜尋詞語或漢字:市場、今日、生`,searchLabel:`搜尋讀音`,hint:`點選讀音即可複製帶有選擇器的詞語。`,unavailable:`參考表隨現成字型一起提供,但這裡沒能載入({error})。請用 {command} 製作字型,或開啟自訂。`,loading:`載入中`,words:`有多個讀音的詞 / {count}`,kanji:`漢字 / {count}`,copyWith:`複製帶有 {selector} 的「{text}」`,default:`預設`},report:{eyebrow:`回報`,title:`回報錯誤讀音`,body:`如果 Furifont 顯示了錯誤的假名注音,或該有注音的詞沒有注音,請告訴我們這些詞和正確的讀音。可以一次回報多個詞。我們會根據回報修正詞典。`,link:`回報錯誤讀音。`,sections:{words:`詞語 / {count}`,environment:`出現的位置`,note:`其他`},word:`詞語`,expected:`正確讀音`,shown:`顯示的讀音(選填)`,context:`句子(選填)`,remove:`刪除 {word}`,add:`新增詞語`,environment:`環境`,environments:{playground:`本站的試用區`,website:`其他網站`,desktop:`桌面應用程式`,mobile:`行動應用程式`},family:`字型`,familyAny:`(不限)`,url:`頁面網址(選填)`,app:`應用程式(選填)`,appPlaceholder:{desktop:`Word、Pages、VS Code`,mobile:`備忘錄、Kindle`},os:`系統(選填)`,notePlaceholder:`任何有幫助的資訊,例如瀏覽器,或讀音錯誤的原因。`,name:`你的名字(選填)`,nameHint:`修正讀音時用於致謝。留空即可匿名。`,send:`送出回報`,sending:`傳送中`,sent:`感謝你的回報。`,again:`繼續回報`,failed:`回報送出失敗,請稍後再試。`,limited:`你在短時間內送出了太多回報,請一小時後再試。`,privacy:`我們會儲存你填寫的內容、字型版本和瀏覽器名稱,不會儲存你的 IP 位址。`},docs:{install:`安裝字型`,website:`在網站上使用`,readings:`選擇讀音`},customize:{connecting:`正在連線至 furifont dev`,title:`自訂`,offline:{eyebrow:`自訂 / 離線`,title:`建置你自己的 Furifont`,body:`自訂是執行在你電腦上的工具。它讀取基礎字型,並儲存製作好的字型。在任意資料夾中啟動它,本頁就會連線並開啟,提供即時預覽、辭典和建置按鈕。製作好的字型儲存在 {folder}。`,needs:`需要 Node 22.18 或更新版本(一個執行 JavaScript 工具的免費程式)。`,run:`在任意資料夾中啟動自訂`},auth:{eyebrow:`自訂 / 已鎖定`,title:`輸入終端機顯示的驗證碼`,body:`{command} 在你的終端機(輸入指令的視窗)中顯示了一個六位數驗證碼。`,code:`驗證碼`,failed:`驗證碼無效,請查看終端機後再試一次。`,unlock:`解鎖`},sections:{preview:`預覽`,build:`建置`,dictionary:`辭典`,words:`你的詞語`},options:{family:`字型名稱`,base:`基礎字型`,baseHint:`要加振假名的字型。可以是要下載的字型,如 Source Han Serif JP Bold,也可以是電腦上另一個字型檔案的路徑。`,script:`振假名所用文字`,hiragana:`平假名`,katakanaOn:`片假名`,hepburn:`羅馬字`,skip:`略過最常見的詞`,skipHint:`在剩下的詞中,最常見的不加振假名,因為讀者已經認識。詞語和單個漢字依常用程度排序,每 500 個一級。`,words:`接著加振假名的詞數`,wordsHint:`接下來的詞,依常用程度依次選取。共 {count} 個詞加振假名。`,jlpt:`略過 JLPT 詞彙`,jlptHint:`JLPT(日本語能力試驗)詞表中到這個級別為止的詞不加振假名。N5 是最簡單的級別。`,none:`無`,all:`全部`,sources:`從以下來源選詞`,source:{jmdict:{name:`JMdict 全部詞語`,hint:`JMdict:所有詞語,包括任何列表都沒有排名的詞語,例如 四字熟語。無排名的詞語在沒有其他內容符合的文字上使用,會使字型增大約 700 KB。`},ichi:{name:`基礎詞`,hint:`JMdict「ichi1」和「ichi2」:「一萬語」詞表(基礎詞彙表)中的詞。`},news:{name:`報紙用詞`,hint:`JMdict「news1」和「news2」:報紙中出現最多的 24,000 個詞。`},spec:{name:`日常詞`,hint:`JMdict「spec1」和「spec2」:其他詞表沒有收錄的常用詞,如 日本。`},gai:{name:`外來語`,hint:`JMdict「gai1」和「gai2」:日語從其他語言借來的常用詞。`},nf:{name:`報紙排名`,hint:`JMdict「nf01」至「nf48」:報紙詞表中有排名的詞,每 500 個詞一級。`},tatoeba:{name:`Tatoeba 例句`,hint:`Tatoeba:在例句中出現三次或以上的詞語,例如 留守中,即使上面的列表都沒有收錄。`},place:{name:`地名`,hint:`JMnedict:站名和地名。在沒有常用詞符合的文字上使用。`},"mahjong-yaku":{name:`麻將役種`,hint:`麻將的役種和牌名,例如 立直。在沒有常用詞符合的文字上使用。`},"jr-stations":{name:`JR 站名`,hint:`Desktop Tetsu 列表中的 JR 站名,例如 阿蘇。在沒有常用詞符合的文字上使用。`},yojijukugo:{name:`四字熟語`,hint:`JMdict:四字熟語,例如 阿鼻叫喚。在沒有常用詞符合的文字上使用。`},"japan-post":{name:`市區町村與町域`,hint:`日本郵便郵遞區號資料中的市區町村和町域名稱,例如 一宮。在沒有常用詞符合的文字上使用。`}},isolated:`單個漢字也加振假名`,share:`單個漢字的把握度`,shareHint:`只有一個漢字時,只有當某個讀音在辭典中至少占這個比例,才加振假名。請輸入 0.5 到 1 之間的數。數字越大,加振假名的漢字越少。`,rubyScale:`振假名大小(漢字的幾倍)`,rubyGap:`漢字上方的間距(em)`,squeeze:`最窄壓縮到(正常寬度的幾倍)`,maxWidth:`振假名最大寬度(em)`,reset:`恢復預設`,resetHint:`回到自訂載入的設定。你加入的詞會保留。`},preview:{compiling:`正在製作預覽`,weight:`預覽字重`,size:`預覽字級`,stats:`{glyphs} 個字形 / {ms} ms`},build:{words:`詞語`,places:`地名`,ambiguous:`多讀音`,lone:`單個漢字`,protected:`你的設定`,glyphs:`振假名字形`,rules:`規則`,planning:`規劃中`,estimate:{woff2:`≈ {size} WOFF2`,otf:`{size} OTF`},formats:`格式`,estimating:`正在估算大小`,run:`建置字型`,save:`儲存設定`},dictionary:{search:`搜尋辭典:今日、生`,results:`{count} 個詞`,hint:`這些詞有多個常用讀音。固定其中一個,它就成為預設讀音。`,noTag:`不是常用詞`,restore:`還原`,remove:`不加振假名`},custom:{placeholder:`日[に]本[ほん] 或 今日[きょう]`,label:`要新增的詞`,add:`新增詞語`,added:`已新增 / {count}`,pinned:`已固定 / {count}`,removed:`不加振假名 / {count}`,none:`無`,takeOut:`移除 {item}`}}};export{e as default};
|
|
1
|
+
var e={meta:{title:`Furifont:內建振假名的日文字型`,description:`自帶振假名的日語字型。`},nav:{demo:`簡介`,docs:`文件`,customize:`自訂`,report:`回報`,github:`GitHub 儲存庫`,light:`切換為淺色`,dark:`切換為深色`,language:`語言`,rubyOff:`隱藏振假名`,rubyOn:`顯示振假名`},footer:{fonts:`字型採用{license},源自 Source Han Sans 和 Source Han Serif。`,data:`讀音資料來自 {jmdict}、{jmnedict}、{kanjidic}(EDRDG)、{furigana}、{japanpost}(地名)和 {desktoptetsu}(JR 站名),採用 CC BY-SA 4.0 授權。`,code:`工具採用 MIT 授權。`,report:`回報錯誤讀音`,source:`GitHub 上的原始碼`,made:`作者:{author}`,supported:`由 {vercel} 和{sponsors}支持`,sponsors:`贊助者`},copied:`已複製`,shuffle:`換一個例句`,editable:`範例文字,可以編輯。`,scripts:{hiragana:`平假名`,hepburn:`羅馬字`},faces:{sans:`黑體`,serif:`明體`},hero:{title1:`振假名,`,title2:`交給字型。`,body:`Furifont 是一款把振假名直接顯示在字型上的日語字型。它用連字(ligature)依詞語的讀音切換。只要支援自訂字型,哪裡都能用。`,download:`下載字型`,build:`自行建置`},notice:`受字型限制,振假名可能不正確,請留意。`,sections:{try:`試試看`,how:`運作原理`,selectors:`選擇讀音`,download:`下載`,anyPage:`用於網站`},playground:{script:`振假名所用文字`,face:`字型樣式`,size:`字級 / {size}px`,weight:`字重 / {weight}`,ruby:`振假名`,okurigana:`送假名讀音`,okuriganaHint:`需要 JavaScript。受瀏覽器限制,字型無法自行處理送假名。`,textHint:`點選文字即可編輯。`,copy:`複製文字`},how:{build:{title:`客製建置`,body:`Furifont 以思源黑體或思源宋體為基礎編譯而成。建置時會讀取包含數千個詞的辭典,並把振假名繪製成新的字形。得到的是普通的字型檔案,不需要 JavaScript,也不需要外掛。`},ligatures:{title:`由連字完成工作`,body:`字型中為每個詞準備了連字。今日 會變成上方帶有 きょう 的單個字形。替換發生在繪製文字時,所以文字本身不會改變。`},longest:{title:`長詞優先`,body:`Furifont 把每一組漢字與幾千個常用詞的清單對照,先試最長的詞。例如,會先選 日本語,再考慮 日本。今日 會當作一個詞,讀作 きょう。`},bare:{title:`拿不準就不加`,body:`只有一個漢字時,只有當某個讀音明顯最可能,才加振假名。大人気 可以讀作 だいにんき,也可以讀作 おとなげ,所以不加振假名。`},okurigana:{title:`可選的送假名支援`,body:`瀏覽器依字型的文字種類分別排版,所以字型看不到漢字後面的假名(稱為送假名)。我們透過 JavaScript 標註,提供可選的支援。`}},selectors:{body:`有些詞有多個常用讀音。Furifont 顯示最常見的那個。要選其他讀音,就在第一個漢字後面緊接一個變體選擇器(看不見的字元)。VS226 是讀音 1,VS227 是讀音 2,依此類推。VS225 會移除振假名。`,lookUp:`查詢讀音`,default:`預設`,reading2:`讀音 2(VS227)`,none:`無振假名(VS225)`},downloads:{all:`全部下載為 ZIP`,family:`字型家族`,ruby:`振假名`,variable:`可變`,formats:`OTF 和 TTF 常用於安裝到電腦上。WOFF2 針對網站做了最佳化。我們推薦使用可變字型,體驗最佳。在某些情況下,為了相容性,你可能需要固定字重的版本。`,buildOwn:`你也可以自己製作字型。可以選擇其他基礎字型、詞的數量、振假名所用文字或尺寸。`},anyPage:{body:`你可以在任何網站上使用 Furifont。有漢字的行會留出放振假名的空間。如果電腦上已安裝 Furifont,就不用下載。否則字型會從本站載入。`,bookmarklet:`書籤小工具`,bookmarkletHint:`把它拖到書籤列。在任何頁面點選它,就會開啟 Furifont;再點一次就會關閉。有些網站(如 X 和 GitHub)不允許載入其他網站的字型。在這些網站上,請在電腦上安裝 Furifont。`,okurigana:`送假名讀音`,okuriganaHint:`為送假名前的漢字選出正確的讀音,例如「来る」「来ない」中的「来」。`,userscript:`使用者腳本`,install:`安裝使用者腳本`,userscriptHint:`適用於 Tampermonkey 或 Violentmonkey(執行小腳本的瀏覽器擴充功能)。它會在日語頁面自動開啟 Furifont,在不允許載入其他網站字型的網站上也能用。你可以在它的選單裡切換到另一款 Furifont 字型,或將其關閉。`,toast:{message:`Furifont 無法在此頁面載入字型。有些網站(如 X 和 GitHub)不允許載入其他網站的字型。在這些網站上,需要在電腦上安裝 Furifont。`,download:`下載字型`,close:`關閉`,outdated:`Furifont 有新版本了。`,userscript:`更新使用者腳本`,bookmarklet:`取得新的書籤小工具`},menu:{okuriganaOn:`送假名讀音:開`,okuriganaOff:`送假名讀音:關`}},reference:{eyebrow:`參考`,title:`選擇讀音`,body:`Furifont 顯示詞最常見的讀音。要顯示其他讀音,就在詞的第一個漢字後面緊接一個變體選擇器(看不見的字元)。VS226 是讀音 1,VS227 是讀音 2,依此類推。單個漢字後面的選擇器,選的是這個漢字的讀音。VS225 顯示不帶振假名的漢字。`,search:`搜尋詞語或漢字:市場、今日、生`,searchLabel:`搜尋讀音`,hint:`點選讀音即可複製帶有選擇器的詞語。`,unavailable:`參考表隨現成字型一起提供,但這裡沒能載入({error})。請用 {command} 製作字型,或開啟自訂。`,loading:`載入中`,words:`有多個讀音的詞 / {count}`,kanji:`漢字 / {count}`,copyWith:`複製帶有 {selector} 的「{text}」`,default:`預設`},report:{eyebrow:`回報`,title:`回報錯誤讀音`,body:`如果 Furifont 顯示了錯誤的假名注音,或該有注音的詞沒有注音,請告訴我們這些詞和正確的讀音。可以一次回報多個詞。我們會根據回報修正詞典。`,link:`回報錯誤讀音。`,sections:{words:`詞語 / {count}`,environment:`出現的位置`,note:`其他`},word:`詞語`,expected:`正確讀音`,shown:`顯示的讀音(選填)`,context:`句子(選填)`,remove:`刪除 {word}`,add:`新增詞語`,environment:`環境`,environments:{playground:`本站的試用區`,website:`其他網站`,desktop:`桌面應用程式`,mobile:`行動應用程式`},family:`字型`,familyAny:`(不限)`,url:`頁面網址(選填)`,app:`應用程式(選填)`,appPlaceholder:{desktop:`Word、Pages、VS Code`,mobile:`備忘錄、Kindle`},os:`系統(選填)`,notePlaceholder:`任何有幫助的資訊,例如瀏覽器,或讀音錯誤的原因。`,name:`你的名字(選填)`,nameHint:`修正讀音時用於致謝。留空即可匿名。`,send:`送出回報`,sending:`傳送中`,sent:`感謝你的回報。`,again:`繼續回報`,failed:`回報送出失敗,請稍後再試。`,limited:`你在短時間內送出了太多回報,請一小時後再試。`,privacy:`我們會儲存你填寫的內容、字型版本和瀏覽器名稱,不會儲存你的 IP 位址。`},docs:{install:`安裝字型`,website:`在網站上使用`,readings:`選擇讀音`},customize:{connecting:`正在連線至 furifont dev`,title:`自訂`,offline:{eyebrow:`自訂 / 離線`,title:`建置你自己的 Furifont`,body:`自訂是執行在你電腦上的工具。它讀取基礎字型,並儲存製作好的字型。在任意資料夾中啟動它,本頁就會連線並開啟,提供即時預覽、辭典和建置按鈕。製作好的字型儲存在 {folder}。`,needs:`需要 Node 22.18 或更新版本(一個執行 JavaScript 工具的免費程式)。`,run:`在任意資料夾中啟動自訂`},auth:{eyebrow:`自訂 / 已鎖定`,title:`輸入終端機顯示的驗證碼`,body:`{command} 在你的終端機(輸入指令的視窗)中顯示了一個六位數驗證碼。`,code:`驗證碼`,failed:`驗證碼無效,請查看終端機後再試一次。`,unlock:`解鎖`},sections:{preview:`預覽`,build:`建置`,overview:`概覽`,dictionary:`辭典`,words:`你的詞語`},options:{family:`字型名稱`,base:`基礎字型`,baseHint:`要加振假名的字型。可以是要下載的字型,如 Source Han Serif JP Bold,也可以是電腦上另一個字型檔案的路徑。`,script:`振假名所用文字`,hiragana:`平假名`,katakanaOn:`片假名`,hepburn:`羅馬字`,skip:`略過最常見的詞`,skipHint:`在剩下的詞中,最常見的不加振假名,因為讀者已經認識。詞語和單個漢字依常用程度排序,每 500 個一級。`,words:`接著加振假名的詞數`,wordsHint:`接下來的詞,依常用程度依次選取。共 {count} 個詞加振假名。`,jlpt:`略過 JLPT 詞彙`,jlptHint:`JLPT(日本語能力試驗)詞表中到這個級別為止的詞不加振假名。N5 是最簡單的級別。`,none:`無`,all:`全部`,sources:`從以下來源選詞`,source:{jmdict:{name:`JMdict 全部詞語`,hint:`JMdict:所有詞語,包括任何列表都沒有排名的詞語,例如 四字熟語。無排名的詞語在沒有其他內容符合的文字上使用,會使字型增大約 700 KB。`},ichi:{name:`基礎詞`,hint:`JMdict「ichi1」和「ichi2」:「一萬語」詞表(基礎詞彙表)中的詞。`},news:{name:`報紙用詞`,hint:`JMdict「news1」和「news2」:報紙中出現最多的 24,000 個詞。`},spec:{name:`日常詞`,hint:`JMdict「spec1」和「spec2」:其他詞表沒有收錄的常用詞,如 日本。`},gai:{name:`外來語`,hint:`JMdict「gai1」和「gai2」:日語從其他語言借來的常用詞。`},nf:{name:`報紙排名`,hint:`JMdict「nf01」至「nf48」:報紙詞表中有排名的詞,每 500 個詞一級。`},tatoeba:{name:`Tatoeba 例句`,hint:`Tatoeba:在例句中出現三次或以上的詞語,例如 留守中,即使上面的列表都沒有收錄。`},place:{name:`地名`,hint:`JMnedict:站名和地名。在沒有常用詞符合的文字上使用。`},"mahjong-yaku":{name:`麻將役種`,hint:`麻將的役種和牌名,例如 立直。在沒有常用詞符合的文字上使用。`},"jr-stations":{name:`JR 站名`,hint:`Desktop Tetsu 列表中的 JR 站名,例如 阿蘇。在沒有常用詞符合的文字上使用。`},yojijukugo:{name:`四字熟語`,hint:`JMdict:四字熟語,例如 阿鼻叫喚。在沒有常用詞符合的文字上使用。`},"japan-post":{name:`市區町村與町域`,hint:`日本郵便郵遞區號資料中的市區町村和町域名稱,例如 一宮。在沒有常用詞符合的文字上使用。`}},isolated:`單個漢字也加振假名`,share:`單個漢字的把握度`,shareHint:`只有一個漢字時,只有當某個讀音在辭典中至少占這個比例,才加振假名。請輸入 0.5 到 1 之間的數。數字越大,加振假名的漢字越少。`,rubyScale:`振假名大小(漢字的幾倍)`,rubyGap:`漢字上方的間距(em)`,squeeze:`最窄壓縮到(正常寬度的幾倍)`,maxWidth:`振假名最大寬度(em)`,reset:`恢復預設`,resetHint:`回到自訂載入的設定。你加入的詞會保留。`},preview:{compiling:`正在製作預覽`,weight:`預覽字重`,size:`預覽字級`,stats:`{glyphs} 個字形 / {ms} ms`},build:{words:`詞語`,places:`地名`,ambiguous:`多讀音`,lone:`單個漢字`,protected:`你的設定`,glyphs:`振假名字形`,rules:`規則`,planning:`規劃中`,estimate:{woff2:`≈ {size} WOFF2`,otf:`{size} OTF`},formats:`格式`,estimating:`正在估算大小`,run:`建置字型`,save:`儲存設定`},overview:{hint:`從辭典的每一部分等距抽取的詞語,依常用程度排序。`,randomize:`重新抽取`,skip:`已跳過`,take:`已採用`,rest:`不加注音`,count:`{count} 個詞`,empty:`這裡沒有詞語。`},dictionary:{search:`搜尋辭典:今日、生`,results:`{count} 個詞`,hint:`這些詞有多個常用讀音。固定其中一個,它就成為預設讀音。`,noTag:`不是常用詞`,restore:`還原`,remove:`不加振假名`},custom:{placeholder:`日[に]本[ほん] 或 今日[きょう]`,label:`要新增的詞`,add:`新增詞語`,added:`已新增 / {count}`,pinned:`已固定 / {count}`,removed:`不加振假名 / {count}`,none:`無`,takeOut:`移除 {item}`}}};export{e as default};
|