@file-viewer/core 2.2.3 → 2.2.5
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/README.en.md +17 -0
- package/README.md +17 -0
- package/dist/browser/controller.js +2 -2
- package/dist/contracts/types.d.ts +59 -4
- package/dist/features/printMask.d.ts +3 -2
- package/dist/features/printMask.js +74 -12
- package/dist/features/printMaskDesigner.d.ts +2 -1
- package/dist/features/printMaskDesigner.js +186 -13
- package/dist/headless.d.ts +5 -3
- package/dist/headless.js +3 -2
- package/dist/i18n/messages.d.ts +4 -2
- package/dist/i18n/messages.ja.d.ts +7 -0
- package/dist/i18n/messages.ja.js +435 -0
- package/dist/i18n/messages.js +59 -17
- package/dist/index.d.ts +6 -4
- package/dist/index.js +4 -3
- package/dist/lifecycle/operations.d.ts +6 -4
- package/dist/lifecycle/operations.js +12 -5
- package/dist/output/export.js +2 -1
- package/dist/platform/assets.d.ts +8 -5
- package/dist/platform/assets.js +67 -13
- package/dist/renderers/image.js +48 -12
- package/dist/source/precheck.d.ts +36 -0
- package/dist/source/precheck.js +250 -0
- package/dist/viewer/createViewer.js +2 -1
- package/dist/viewer/operations.js +4 -3
- package/dist/viewer/state.js +19 -7
- package/package.json +1 -1
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in Japanese messages for every runtime viewer state and renderer.
|
|
3
|
+
* Keep placeholders such as {count}, {name}, and {type} aligned with the
|
|
4
|
+
* Chinese and English catalogs; scripts/verify-japanese-i18n.mjs enforces it.
|
|
5
|
+
*/
|
|
6
|
+
export const JA_JP_MESSAGES = {
|
|
7
|
+
'toolbar.zoomGroup': 'ズーム操作',
|
|
8
|
+
'toolbar.zoomOut': '縮小',
|
|
9
|
+
'toolbar.zoomIn': '拡大',
|
|
10
|
+
'toolbar.zoomReset': '倍率をリセット',
|
|
11
|
+
'toolbar.download': 'ダウンロード',
|
|
12
|
+
'toolbar.downloadTitle': '元のファイルをダウンロード',
|
|
13
|
+
'toolbar.print': '印刷',
|
|
14
|
+
'toolbar.printTitle': 'レンダリング済みの全内容を印刷',
|
|
15
|
+
'toolbar.printDirect': '直接印刷',
|
|
16
|
+
'toolbar.printMask': 'マスク・印章付き印刷',
|
|
17
|
+
'toolbar.printMaskTitle': '機密領域を隠すか印章を追加してから印刷',
|
|
18
|
+
'toolbar.printMaskAdd': 'マスクを追加',
|
|
19
|
+
'toolbar.printMaskClear': 'クリア',
|
|
20
|
+
'toolbar.printMaskCancel': 'キャンセル',
|
|
21
|
+
'toolbar.printMaskConfirm': '印刷を確定',
|
|
22
|
+
'toolbar.printMaskHint': 'マスクを描画するか、印章をアップロードして移動・サイズ変更します。',
|
|
23
|
+
'toolbar.printStampUpload': '印章をアップロード',
|
|
24
|
+
'toolbar.printStampRemove': '印章を削除',
|
|
25
|
+
'toolbar.printStampResize': '印章のサイズ変更',
|
|
26
|
+
'toolbar.exportHtml': 'HTML',
|
|
27
|
+
'toolbar.exportHtmlTitle': '現在のレンダリング結果を HTML として書き出す',
|
|
28
|
+
'toolbar.search': '検索',
|
|
29
|
+
'toolbar.searchPlaceholder': 'ドキュメントを検索',
|
|
30
|
+
'toolbar.searchPrevious': '前の一致',
|
|
31
|
+
'toolbar.searchNext': '次の一致',
|
|
32
|
+
'toolbar.searchClear': '検索をクリア',
|
|
33
|
+
'toolbar.theme': 'テーマ',
|
|
34
|
+
'toolbar.themeToLight': 'ライトモードに切り替え',
|
|
35
|
+
'toolbar.themeToDark': 'ダークモードに切り替え',
|
|
36
|
+
'state.ready.title': 'プレビュー完了',
|
|
37
|
+
'state.ready.message': 'ファイルのレンダリングが完了しました。',
|
|
38
|
+
'state.empty.title': 'ファイルがありません',
|
|
39
|
+
'state.empty.message': 'ファイルを選択するか、アクセス可能な URL を指定してプレビューを開始してください。',
|
|
40
|
+
'state.unsupported.install.title': 'プレビュー機能の追加が必要です',
|
|
41
|
+
'state.unsupported.install.message': '{extension}は対応表に含まれていますが、このプロジェクトには {rendererLabel} renderer がまだ組み込まれていません。',
|
|
42
|
+
'state.unsupported.install.description': '{presetPackage} をインストールし、options.preset / options.renderers から対応機能を渡してください{rendererTip}。Vite プロジェクトでは @file-viewer/vite-plugin によるインストール済み preset の自動検出も利用できます。',
|
|
43
|
+
'state.unsupported.title': 'オンラインプレビューには未対応です',
|
|
44
|
+
'state.unsupported.message': '{extension}はオンラインでプレビューできません。ダウンロードするか、対応形式へ変換してください。',
|
|
45
|
+
'state.unsupported.description': 'Office、PDF、OFD、Typst、圧縮ファイル、メール、OLB/DRA、CAD、地理空間データ、3D モデル、Excalidraw、draw.io、EPUB、UMD、Markdown、コード/テキスト、画像、音声/動画、フォント、構造化データ資産のオンラインプレビューに対応しています。',
|
|
46
|
+
'state.error.title': 'プレビューに失敗しました',
|
|
47
|
+
'preview.downloading': 'ファイルをダウンロードしています...',
|
|
48
|
+
'preview.streamingPdf': 'PDF ストリーミングプレビューを準備しています...',
|
|
49
|
+
'preview.reading': 'ファイル内容を解析しています...',
|
|
50
|
+
'error.download': 'ダウンロードに失敗しました',
|
|
51
|
+
'error.print': '印刷に失敗しました',
|
|
52
|
+
'error.exportHtml': 'HTML の書き出しに失敗しました',
|
|
53
|
+
'error.noDownloadSource': 'ダウンロード可能な元ファイルがありません',
|
|
54
|
+
'error.noExportContent': '書き出し可能なプレビュー内容がありません',
|
|
55
|
+
'error.printUnavailable': 'このファイル形式は文書全体の印刷に対応していません。元ファイルをダウンロードし、ローカルアプリで印刷してください。',
|
|
56
|
+
'error.printWindowBlocked': 'ブラウザーによって印刷ウィンドウがブロックされました',
|
|
57
|
+
'error.remoteDownload': 'ファイルのダウンロードに失敗しました',
|
|
58
|
+
'error.localRead': 'ローカルファイルの読み込みに失敗しました',
|
|
59
|
+
'error.load': 'ファイルの読み込みに失敗しました',
|
|
60
|
+
'error.stream': 'PDF ストリーミングプレビューの読み込みに失敗しました',
|
|
61
|
+
'error.beforeOperation': '操作前の検証に失敗しました',
|
|
62
|
+
'error.unknown': '不明なエラー',
|
|
63
|
+
'error.blobUnavailable': '現在の実行環境では Blob を利用できないため、ファイル内容を読み込めません。',
|
|
64
|
+
'error.sourceUnsupported': 'このファイル入力元には対応していません。',
|
|
65
|
+
'error.fileReadArrayBuffer': 'ファイルのバイナリ内容を読み込めませんでした。',
|
|
66
|
+
'error.fileReadDataUrl': 'ファイルの Data URL を読み込めませんでした。',
|
|
67
|
+
'error.fileReadText': 'ファイルのテキスト内容を読み込めませんでした。',
|
|
68
|
+
'error.imageDataUrlRead': '画像データを読み込めませんでした。',
|
|
69
|
+
'operation.download': '元ファイルをダウンロード',
|
|
70
|
+
'operation.print': 'レンダリング済みの全内容を印刷',
|
|
71
|
+
'operation.exportHtml': 'レンダリング結果を HTML として書き出す',
|
|
72
|
+
'operation.zoomIn': 'プレビューを拡大',
|
|
73
|
+
'operation.zoomOut': 'プレビューを縮小',
|
|
74
|
+
'operation.zoomReset': 'プレビュー倍率をリセット',
|
|
75
|
+
'pdf.toolbar.toggleNavigation': 'ナビゲーションペインを切り替え',
|
|
76
|
+
'pdf.toolbar.previousPage': '前のページ',
|
|
77
|
+
'pdf.toolbar.nextPage': '次のページ',
|
|
78
|
+
'pdf.toolbar.fitWidth': '幅に合わせる',
|
|
79
|
+
'pdf.toolbar.zoomOut': '縮小',
|
|
80
|
+
'pdf.toolbar.zoomIn': '拡大',
|
|
81
|
+
'pdf.toolbar.rotateLeft': '左に回転',
|
|
82
|
+
'pdf.toolbar.rotateRight': '右に回転',
|
|
83
|
+
'pdf.nav.typeLabel': 'PDF ナビゲーションの種類',
|
|
84
|
+
'pdf.nav.pagesTab': 'ページ',
|
|
85
|
+
'pdf.nav.outlineTab': '目次',
|
|
86
|
+
'pdf.nav.pagesTitle': 'ページナビゲーション',
|
|
87
|
+
'pdf.nav.outlineTitle': '目次ナビゲーション',
|
|
88
|
+
'pdf.nav.pageCount': '{count} ページ',
|
|
89
|
+
'pdf.nav.itemCount': '{count} 件',
|
|
90
|
+
'pdf.nav.pageLabel': '{page} ページ',
|
|
91
|
+
'pdf.nav.outlineEmpty': 'この PDF には利用可能な目次がありません',
|
|
92
|
+
'pdf.nav.outlineFallbackTitle': '目次 {index}',
|
|
93
|
+
'pdf.thumbnail.alt': '{page} ページのサムネイル',
|
|
94
|
+
'pdf.state.loading': 'PDF を読み込んでいます...',
|
|
95
|
+
'pdf.error.browserWindow': 'PDF プレビューにはブラウザーウィンドウが必要です',
|
|
96
|
+
'pdf.error.missingSource': 'PDF に読み取り可能なデータソースがありません',
|
|
97
|
+
'pdf.error.loadFailed': 'PDF の読み込みに失敗しました',
|
|
98
|
+
'pdf.error.notLoaded': 'PDF の読み込みがまだ完了していません。しばらくしてから再試行してください。',
|
|
99
|
+
'pdf.error.unloaded': 'PDF はアンロードされているため、印刷を続行できません',
|
|
100
|
+
'pdf.error.canvasUnavailable': 'このブラウザーでは PDF 印刷用キャンバスを作成できません',
|
|
101
|
+
'pdf.export.pageTitle': '{title} - {page} ページ',
|
|
102
|
+
'spreadsheet.loading.kicker': 'Excel ワークブック',
|
|
103
|
+
'spreadsheet.loading.title': 'Excel ワークブックを解析しています',
|
|
104
|
+
'spreadsheet.loading.hint': 'ワークシート、スタイル、大規模データ用ビューポートを準備しています。',
|
|
105
|
+
'spreadsheet.loading.streaming': '表示範囲のデータを順次読み込んでいます',
|
|
106
|
+
'spreadsheet.tabs.ariaLabel': 'ワークシート一覧',
|
|
107
|
+
'spreadsheet.state.parsingWorkbook': 'Excel ワークブックを解析しています。しばらくお待ちください...',
|
|
108
|
+
'spreadsheet.state.preparingSheet': 'ワークシート内容を準備しています...',
|
|
109
|
+
'spreadsheet.state.preparingSheetNamed': '「{name}」を準備しています...',
|
|
110
|
+
'spreadsheet.state.cachedRows': '{cached} / {total} 行をキャッシュ済み',
|
|
111
|
+
'spreadsheet.state.rows': '全 {rows} 行をビューポートに応じて順次読み込みます',
|
|
112
|
+
'spreadsheet.state.rowsAndColumns': '全 {rows} 行、{cols} 列をビューポートに応じて順次読み込みます',
|
|
113
|
+
'spreadsheet.error.parseFailed': 'Excel の解析に失敗しました',
|
|
114
|
+
'spreadsheet.error.workerFailed': 'Excel Worker の実行に失敗しました',
|
|
115
|
+
'word.error.invalidDocx': '有効な DOCX/OOXML パッケージではありません。ダウンロードが不完全か、サーバーのエラー応答に置き換わった可能性があります。再アップロードするかファイル元を確認してください。',
|
|
116
|
+
'word.error.missingOdfContent': 'ODF ファイルに content.xml がありません。',
|
|
117
|
+
'word.error.odfXmlParseFailed': 'ODF XML の解析に失敗しました。',
|
|
118
|
+
'word.title.rtf': 'RTF 文書プレビュー',
|
|
119
|
+
'word.title.openDocumentPresentation': 'OpenDocument プレゼンテーションプレビュー',
|
|
120
|
+
'word.title.openDocumentText': 'OpenDocument 文書プレビュー',
|
|
121
|
+
'word.page.fallback': '{page} ページ',
|
|
122
|
+
'word.page.empty': 'このページから抽出できるテキストはありません',
|
|
123
|
+
'word.body': '本文',
|
|
124
|
+
'word.body.empty': '読み取り可能なテキストを抽出できませんでした',
|
|
125
|
+
'ofd.state.loading': 'OFD を解析しています...',
|
|
126
|
+
'ofd.error.empty': 'OFD ファイルにレンダリング可能な文書がありません',
|
|
127
|
+
'ofd.error.parseFailed': 'OFD ファイルの解析に失敗しました',
|
|
128
|
+
'presentation.state.loading': 'PPTX を解析しています...',
|
|
129
|
+
'presentation.error.title': 'PPTX プレビューに失敗しました',
|
|
130
|
+
'presentation.error.parseFailed': 'PPTX の解析に失敗しました',
|
|
131
|
+
'presentation.ppt.state.loading': 'PowerPoint 97–2003 を解析しています...',
|
|
132
|
+
'presentation.ppt.error.title': 'PPT プレビューに失敗しました',
|
|
133
|
+
'presentation.ppt.error.parseFailed': 'この PPT ファイルを解析できませんでした。',
|
|
134
|
+
'presentation.ppt.error.assetHint': '@file-viewer/ppt モジュール、pptWasmUrl、application/wasm MIME タイプ、Web Crypto、CSP 設定を確認してください。',
|
|
135
|
+
'archive.error.nestedUnsupported': '.{type} 形式はオンラインでプレビューできません。ダウンロードするか、対応形式へ変換してください。',
|
|
136
|
+
'archive.loading.readingDirectory': '圧縮ファイルのディレクトリを読み込んでいます...',
|
|
137
|
+
'archive.loading.readingDirectoryHint': '大きなファイルは Worker で解析し、メインスレッドのブロックを防ぎます。',
|
|
138
|
+
'archive.search.placeholder': '圧縮ファイル内を絞り込み',
|
|
139
|
+
'archive.sidebar.hide': 'ファイル一覧を非表示',
|
|
140
|
+
'archive.sidebar.show': 'ファイル一覧を表示',
|
|
141
|
+
'archive.preview.title': '圧縮ファイル内プレビュー',
|
|
142
|
+
'archive.preview.chooseFile': 'ファイルを選択してください',
|
|
143
|
+
'archive.preview.downloadFile': 'ファイルをダウンロード',
|
|
144
|
+
'archive.error.title': '圧縮ファイルプレビューのお知らせ',
|
|
145
|
+
'archive.stats.summary': '{count} ファイル · {size} · 直接プレビュー可能 {previewable} 件',
|
|
146
|
+
'archive.warning.encrypted': '暗号化された内容を検出しました。正しいパスワードを入力するとプレビューできます。パスワードはこのセッション中だけ libarchive Worker に渡されます。',
|
|
147
|
+
'archive.password.title': '圧縮ファイルのパスワードを入力',
|
|
148
|
+
'archive.password.description': 'この圧縮ファイルには暗号化された内容があります。ディレクトリの読み込みや内部ファイルのプレビューを続けるにはパスワードが必要です。',
|
|
149
|
+
'archive.password.placeholder': '圧縮ファイルのパスワード',
|
|
150
|
+
'archive.password.invalid': 'パスワードが正しくないか、復号できませんでした。再入力してください。',
|
|
151
|
+
'archive.password.required': '続行するにはパスワードを入力してください。',
|
|
152
|
+
'archive.password.cancel': 'キャンセル',
|
|
153
|
+
'archive.password.confirm': 'ロックを解除してプレビュー',
|
|
154
|
+
'archive.error.passwordRequired': 'パスワード入力がキャンセルされたため、暗号化された圧縮ファイルをプレビューできません。',
|
|
155
|
+
'archive.error.encryptedRequiresWorker': 'この圧縮ファイルのオンライン復号プレビューには libarchive Worker/WASM の配布が必要です。',
|
|
156
|
+
'archive.empty.title': '左側のファイルを選択してプレビュー',
|
|
157
|
+
'archive.empty.message': '最初にディレクトリのみを読み取ります。ファイル内容はクリック時にオンデマンドで展開し、容量が許す場合は IndexedDB にキャッシュします。',
|
|
158
|
+
'archive.loading.initializingCandidate': '{label} を初期化しています...',
|
|
159
|
+
'archive.loading.initializingCandidateHint': 'サーバーで Worker/WASM が正しく配布されていない場合は、自動的に互換モードへ切り替えます。',
|
|
160
|
+
'archive.error.candidateInitTimeout': '{label} の初期化がタイムアウトしました',
|
|
161
|
+
'archive.error.encryptedCheckTimeout': '{label} の暗号化チェックがタイムアウトしました',
|
|
162
|
+
'archive.loading.directoryReadyHint': 'ディレクトリの読み込み後、内部ファイルをクリックするとオンデマンドで展開します。',
|
|
163
|
+
'archive.error.candidateReadTimeout': '{label} のディレクトリ読み込みがタイムアウトしました',
|
|
164
|
+
'archive.loading.workerFallback': 'Worker を利用できないため、ZIP/TAR 互換モードへ切り替えています...',
|
|
165
|
+
'archive.loading.workerFallbackHint': '互換モードは追加の静的 Worker を必要とせず、モバイル WebView や一時的なローカルサーバーにも適しています。',
|
|
166
|
+
'archive.notice.workerFallback': 'この環境では libarchive Worker を起動できなかったため、ZIP/TAR/GZIP 互換モードへ自動的に切り替えました。RAR、7z などでは vendor/libarchive/worker-bundle.js と libarchive.wasm の配布を推奨します。',
|
|
167
|
+
'archive.error.tooLarge': '圧縮ファイルのサイズ {size} が安全上限 {limit} を超えています。ダウンロードしてローカルで展開してください。',
|
|
168
|
+
'archive.loading.initializingWorker': '圧縮ファイル解析 Worker を初期化しています...',
|
|
169
|
+
'archive.loading.initializingWorkerHint': '大きなファイルは Worker で解析し、メインスレッドのブロックを防ぎます。',
|
|
170
|
+
'archive.error.workerInitFailed': '圧縮ファイル Worker の初期化に失敗しました',
|
|
171
|
+
'archive.error.workerUnsupported': 'このブラウザーは Web Worker に対応していません。',
|
|
172
|
+
'archive.error.indexedDbUnavailable': 'IndexedDB を利用できません',
|
|
173
|
+
'archive.error.entryTooLarge': '圧縮ファイル内の {name} は {size} で、プレビュー上限 {limit} を超えています。',
|
|
174
|
+
'archive.loading.extracting': '{name} をオンデマンドで展開しています...',
|
|
175
|
+
'archive.loading.rendering': '{name} をレンダリングしています...',
|
|
176
|
+
'archive.loading.exporting': '{name} を書き出しています...',
|
|
177
|
+
'media.audio.title': '音声プレビュー',
|
|
178
|
+
'media.audio.description': 'ブラウザー標準プレーヤーで開きます。互換性は現在のブラウザーが対応する音声コーデックに依存します。',
|
|
179
|
+
'media.audio.unsupported': 'このブラウザーは音声再生に対応していません。',
|
|
180
|
+
'media.video.title': '動画プレビュー',
|
|
181
|
+
'media.video.unsupported': 'このブラウザーはこの動画形式に対応していません。',
|
|
182
|
+
'media.video.hlsHint': 'HLS はセグメント読み込みに元の URL を優先します。ローカルの単一ファイルプレイリストを渡す場合は、セグメント URL にブラウザーからアクセスできることを確認してください。',
|
|
183
|
+
'media.midi.title': 'MIDI ファイル',
|
|
184
|
+
'media.midi.loading': 'MIDI トラックを解析しています...',
|
|
185
|
+
'media.midi.trackHeader': 'トラック',
|
|
186
|
+
'media.midi.instrumentHeader': '楽器',
|
|
187
|
+
'media.midi.channelHeader': 'チャンネル',
|
|
188
|
+
'media.midi.noteCountHeader': 'ノート数',
|
|
189
|
+
'media.midi.durationHeader': '長さ',
|
|
190
|
+
'media.midi.durationStat': '長さ',
|
|
191
|
+
'media.midi.trackStat': 'トラック',
|
|
192
|
+
'media.midi.noteStat': 'ノート',
|
|
193
|
+
'media.midi.parseFailed': 'MIDI の解析に失敗しました',
|
|
194
|
+
'email.mbox.subject': '{filename} · 1 通目',
|
|
195
|
+
'email.mbox.summary': 'MBOX から {count} 通のメールを検出しました。現在は 1 通目を表示しています。',
|
|
196
|
+
'email.error.title': 'メールプレビューのお知らせ',
|
|
197
|
+
'email.meta.from': '差出人',
|
|
198
|
+
'email.meta.to': '宛先',
|
|
199
|
+
'email.meta.cc': 'Cc',
|
|
200
|
+
'email.meta.date': '日時',
|
|
201
|
+
'email.tabs.text': '本文',
|
|
202
|
+
'email.tabs.headers': 'ヘッダー',
|
|
203
|
+
'email.attachments.title': '添付ファイル',
|
|
204
|
+
'email.attachments.empty': '添付ファイルはありません',
|
|
205
|
+
'email.attachments.download': '添付ファイルをダウンロード',
|
|
206
|
+
'email.attachments.opening': '添付ファイル {name} を開いています...',
|
|
207
|
+
'email.attachments.nestedUnavailable': 'この実行環境では添付ファイルの入れ子プレビューを利用できません。{name} をダウンロードして確認してください。',
|
|
208
|
+
'email.loading.parsing': 'メールを解析しています...',
|
|
209
|
+
'data.font.sample': 'Flyfish Viewer 日本語プレビュー AaBbCc 1234567890',
|
|
210
|
+
'data.error.fontFaceUnsupported': 'このブラウザーは FontFace API に対応していません',
|
|
211
|
+
'data.title.font': 'フォントファイルプレビュー',
|
|
212
|
+
'data.title.sqlite': 'SQLite データベースプレビュー',
|
|
213
|
+
'data.title.parquet': 'Parquet 列指向データプレビュー',
|
|
214
|
+
'data.title.avro': 'Avro オブジェクトコンテナプレビュー',
|
|
215
|
+
'data.title.wasm': 'WebAssembly モジュールプレビュー',
|
|
216
|
+
'data.title.eps': 'EPS ベクターファイル概要',
|
|
217
|
+
'data.title.ai': 'Illustrator ファイル概要',
|
|
218
|
+
'data.title.webarchive': 'WebArchive 概要プレビュー',
|
|
219
|
+
'data.title.summary': 'データ資産概要',
|
|
220
|
+
'data.label.format': '形式',
|
|
221
|
+
'data.label.size': 'サイズ',
|
|
222
|
+
'data.label.rendering': 'レンダラー',
|
|
223
|
+
'data.label.objects': 'オブジェクト',
|
|
224
|
+
'data.label.sampleTable': 'サンプルテーブル',
|
|
225
|
+
'data.label.rows': '行',
|
|
226
|
+
'data.label.columns': '列',
|
|
227
|
+
'data.label.sampleRows': 'サンプル行',
|
|
228
|
+
'data.label.imports': 'インポート',
|
|
229
|
+
'data.label.exports': 'エクスポート',
|
|
230
|
+
'data.label.magic': 'マジック',
|
|
231
|
+
'data.label.note': '注記',
|
|
232
|
+
'data.label.container': 'コンテナ',
|
|
233
|
+
'data.value.schemaRead': '読み込み済み',
|
|
234
|
+
'data.value.schemaUnread': '未読み込み',
|
|
235
|
+
'data.note.aiSummary': 'PDF 互換でない AI は安全な概要として表示します。',
|
|
236
|
+
'data.note.postscriptSummary': 'PostScript の概要プレビュー',
|
|
237
|
+
'data.note.webarchive': '読み取り可能な断片を安全に抽出します。Web スクリプトは実行しません。',
|
|
238
|
+
'data.image.alt': '資産プレビュー',
|
|
239
|
+
'psd.title': 'PSD レイヤープレビュー',
|
|
240
|
+
'psd.action.fit': '全体表示',
|
|
241
|
+
'psd.action.showAll': 'すべて表示',
|
|
242
|
+
'psd.action.hideAll': 'すべて非表示',
|
|
243
|
+
'psd.layers.title': 'レイヤー',
|
|
244
|
+
'psd.layers.redrawable': '再描画可能 {count} 件',
|
|
245
|
+
'psd.layers.empty': '表示可能なレイヤーがありません。合成画像を表示します。',
|
|
246
|
+
'psd.layers.hidden': '非表示',
|
|
247
|
+
'drawing.error.viewerLoadFailed': 'diagrams.net viewer の読み込みに失敗しました',
|
|
248
|
+
'drawing.error.excalidrawEmpty': 'この Excalidraw ファイルにはプレビュー可能な要素がありません',
|
|
249
|
+
'drawing.error.excalidrawTimeout': 'Excalidraw の SVG 書き出しがタイムアウトしたため、rough.js レンダラーへ切り替えます。',
|
|
250
|
+
'drawing.error.drawioParseFailed': 'Draw.io XML の解析に失敗しました:{message}',
|
|
251
|
+
'drawing.error.drawioNoModel': 'この Draw.io ファイルには直接レンダリング可能な mxGraphModel がありません。',
|
|
252
|
+
'drawing.error.drawioNoElements': 'この Draw.io ファイルにはプレビュー可能な要素がありません。',
|
|
253
|
+
'drawing.error.viewerInitFailed': 'diagrams.net viewer が正しく初期化されませんでした',
|
|
254
|
+
'drawing.error.drawioTimeout': 'diagrams.net 公式 Viewer がタイムアウトしたため、ローカル SVG プレビューへ切り替えます。',
|
|
255
|
+
'drawing.error.svgParseFailed': 'SVG の解析に失敗しました',
|
|
256
|
+
'drawing.error.plantumlRenderFailed': 'PlantUML SVG のレンダリングに失敗しました:{status}',
|
|
257
|
+
'drawing.title.excalidraw': 'Excalidraw SVG プレビュー',
|
|
258
|
+
'drawing.title.mermaid': 'Mermaid SVG プレビュー',
|
|
259
|
+
'drawing.title.plantuml': 'PlantUML SVG プレビュー',
|
|
260
|
+
'drawing.title.drawio': 'Draw.io オフライン SVG プレビュー',
|
|
261
|
+
'drawing.toolbar.zoomOut': '縮小',
|
|
262
|
+
'drawing.toolbar.zoomIn': '拡大',
|
|
263
|
+
'drawing.toolbar.fit': '全体表示',
|
|
264
|
+
'drawing.toolbar.fitWidth': '幅に合わせる',
|
|
265
|
+
'drawing.state.loading': '図面プレビューを読み込んでいます...',
|
|
266
|
+
'text.code.loadingHighlight': 'シンタックスハイライトを読み込んでいます...',
|
|
267
|
+
'text.code.indexingLargeFile': '大きなファイルを索引化しています {progress}%',
|
|
268
|
+
'text.code.virtualized': '大きなファイル · 仮想スクロール · ハイライト無効',
|
|
269
|
+
'text.code.firstSegment': '先頭セグメント',
|
|
270
|
+
'text.code.previousSegment': '前のセグメント',
|
|
271
|
+
'text.code.nextSegment': '次のセグメント',
|
|
272
|
+
'text.code.lastSegment': '末尾セグメント',
|
|
273
|
+
'ebook.toc': '目次',
|
|
274
|
+
'ebook.reading': '読書中',
|
|
275
|
+
'ebook.itemCount': '{count} 件',
|
|
276
|
+
'epub.title': 'EPUB 電子書籍',
|
|
277
|
+
'epub.previousPage': '前へ',
|
|
278
|
+
'epub.nextPage': '次へ',
|
|
279
|
+
'epub.loading': 'EPUB を解析しています...',
|
|
280
|
+
'epub.chapterFallback': '第 {index} 章',
|
|
281
|
+
'epub.renderIncomplete': 'EPUB 本文のレンダリングが完了しませんでした。更新して再試行してください。',
|
|
282
|
+
'umd.title': 'UMD 電子書籍',
|
|
283
|
+
'umd.previousChapter': '前の章',
|
|
284
|
+
'umd.nextChapter': '次の章',
|
|
285
|
+
'umd.loading': 'UMD を解析しています...',
|
|
286
|
+
'umd.emptyContent': '読み取り可能な本文を解析できませんでした',
|
|
287
|
+
'umd.chapterFallback': '第 {index} 章',
|
|
288
|
+
'umd.galleryFallback': 'ギャラリー {index}',
|
|
289
|
+
'umd.warningBodyTooShort': 'UMD 本文が宣言された長さより短く、不完全な可能性があります',
|
|
290
|
+
'umd.error.unexpectedEnd': 'UMD 構造が不完全で、予期せず終了しました',
|
|
291
|
+
'umd.error.invalidFile': '有効な UMD 電子書籍ファイルではありません',
|
|
292
|
+
'typst.summaryRenderer': 'Typst WASM レンダラー',
|
|
293
|
+
'typst.pageSummary.empty': '0 ページ',
|
|
294
|
+
'typst.pageSummary.ready': '{count} ページ / {width} x {height} pt',
|
|
295
|
+
'typst.status.compiling': 'コンパイル中',
|
|
296
|
+
'typst.status.failed': 'コンパイル失敗',
|
|
297
|
+
'typst.status.rendered': 'レンダリング済み',
|
|
298
|
+
'typst.loading.title': 'Typst を解析しています',
|
|
299
|
+
'typst.loading.hint': 'コンパイラーを読み込み、ページプレビューを生成しています...',
|
|
300
|
+
'typst.error.title': 'Typst のレンダリングに失敗しました',
|
|
301
|
+
'typst.error.timeout': 'Typst WASM / フォントの読み込みまたはコンパイルが {seconds} 秒を超えました',
|
|
302
|
+
'typst.error.timeoutHint': 'Typst compiler WASM、renderer WASM、フォントディレクトリのダウンロード速度とキャッシュ戦略を確認してください。低速回線やリージョンをまたぐ配信では options.typst.renderTimeoutMs を増やしてください。',
|
|
303
|
+
'typst.error.assetHint': 'Typst にはローカルの compiler / renderer WASM とフォントディレクトリが必要です。file-viewer-copy-assets を実行するか、options.typst.compilerWasmUrl / options.typst.rendererWasmUrl / options.typst.fontAssetsUrl を設定し、サーバーが WASM を application/wasm で返すことを確認してください。',
|
|
304
|
+
'typst.error.svgParseFailed': 'Typst SVG の解析に失敗しました',
|
|
305
|
+
'typst.error.wasmLoadFailed': 'Typst WASM の読み込みに失敗しました',
|
|
306
|
+
'xmind.toolbar.zoomOut': '縮小',
|
|
307
|
+
'xmind.toolbar.zoomIn': '拡大',
|
|
308
|
+
'xmind.toolbar.fit': '全体表示',
|
|
309
|
+
'xmind.toolbar.fitTitle': 'キャンバス全体を表示',
|
|
310
|
+
'xmind.state.loading': 'XMind マインドマップを解析しています...',
|
|
311
|
+
'xmind.stats.nodes': 'ノード',
|
|
312
|
+
'xmind.stats.depth': '深さ',
|
|
313
|
+
'xmind.stats.theme': 'テーマ',
|
|
314
|
+
'xmind.stats.template': 'テンプレート',
|
|
315
|
+
'xmind.badge.paused': '一時停止',
|
|
316
|
+
'xmind.badge.collapsed': '折りたたみ',
|
|
317
|
+
'xmind.badge.floating': 'フローティング',
|
|
318
|
+
'xmind.badge.summary': 'サマリー',
|
|
319
|
+
'xmind.badge.callout': '吹き出し',
|
|
320
|
+
'xmind.imageResource': '画像リソース:{name}',
|
|
321
|
+
'xmind.error.unrecognized': 'XMind ファイルを認識できません。ZIP パッケージ内に content.json または content.xml がありません。',
|
|
322
|
+
'xmind.error.noCanvas': 'この XMind ファイルにはプレビュー可能なキャンバスがありません',
|
|
323
|
+
'cad.toolbar.fit': '全体表示',
|
|
324
|
+
'cad.toolbar.zoomOut': '縮小',
|
|
325
|
+
'cad.toolbar.zoomIn': '拡大',
|
|
326
|
+
'cad.layers.title': 'レイヤー',
|
|
327
|
+
'cad.layers.count': '{count} 件',
|
|
328
|
+
'cad.layers.merged': '{name}(同名レイヤー {count} 件を統合)',
|
|
329
|
+
'cad.inspector.title': '構造',
|
|
330
|
+
'cad.inspector.entities': 'エンティティ',
|
|
331
|
+
'cad.inspector.blocks': 'ブロック',
|
|
332
|
+
'cad.inspector.pages': 'ページ',
|
|
333
|
+
'cad.inspector.drawn': '描画済み',
|
|
334
|
+
'cad.state.loadingViewer': 'CAD ビューアーを読み込んでいます...',
|
|
335
|
+
'cad.state.parsing': 'CAD を解析しています...',
|
|
336
|
+
'cad.error.parseFailed': 'CAD ファイルの解析に失敗しました',
|
|
337
|
+
'image.alt': '画像',
|
|
338
|
+
'image.toolbar.rotation': '画像の回転',
|
|
339
|
+
'image.toolbar.rotateLeft': '画像を左に回転',
|
|
340
|
+
'image.toolbar.rotateRight': '画像を右に回転',
|
|
341
|
+
'image.lightbox.alt': '画像プレビュー',
|
|
342
|
+
'image.lightbox.close': '画像プレビューを閉じる',
|
|
343
|
+
'gitBundle.error.invalid': '有効な Git bundle ファイルではありません。',
|
|
344
|
+
'gitBundle.error.missingPack': 'Git bundle ヘッダーの後に PACK データがありません。',
|
|
345
|
+
'gitBundle.notice.delta': 'この bundle には delta 圧縮オブジェクトが含まれています。ビューアーは一般的な OFS_DELTA / REF_DELTA をブラウザー内で解決します。ファイルが不足する場合は、bundle が非常に大きい、オブジェクト数が多い、または外部 prerequisite が必要な可能性があります。',
|
|
346
|
+
'gitBundle.title.history': '履歴',
|
|
347
|
+
'gitBundle.title.fileTree': 'ファイルツリー',
|
|
348
|
+
'gitBundle.file.choose': '確認するファイルを選択',
|
|
349
|
+
'gitBundle.file.noTree': 'この bundle の tree/blob オブジェクトは delta 圧縮されている可能性があり、展開可能なファイルを解析できませんでした。',
|
|
350
|
+
'gitBundle.file.none': '解析済みファイルはありません',
|
|
351
|
+
'gitBundle.history.empty': 'commit オブジェクトを解析できませんでした。refs と pack の概要のみ表示します。',
|
|
352
|
+
'gitBundle.toolbar.summary': '{commits} コミット · {files} ファイル',
|
|
353
|
+
'gitBundle.meta.bundle': 'Bundle',
|
|
354
|
+
'gitBundle.meta.refs': 'Refs',
|
|
355
|
+
'gitBundle.meta.commits': 'コミット',
|
|
356
|
+
'gitBundle.meta.objects': 'オブジェクト',
|
|
357
|
+
'gitBundle.meta.deltas': 'Delta',
|
|
358
|
+
'gitBundle.meta.objectFormat': 'オブジェクト形式',
|
|
359
|
+
'gitBundle.meta.objectTypes': 'オブジェクト種類',
|
|
360
|
+
'geo.error.unrecognized': 'GeoJSON データを認識できません',
|
|
361
|
+
'geo.error.xmlParseFailed': 'XML の解析に失敗しました',
|
|
362
|
+
'geo.error.unsupported': '.{type} 地理空間形式には対応していません',
|
|
363
|
+
'geo.title': '地理空間データプレビュー',
|
|
364
|
+
'geo.featureCount': 'フィーチャー数',
|
|
365
|
+
'geo.bounds': '範囲',
|
|
366
|
+
'geo.geometryTypes': 'ジオメトリ種類',
|
|
367
|
+
'geo.aria': '地理空間 SVG プレビュー',
|
|
368
|
+
'geo.loading': '地理空間データを解析しています...',
|
|
369
|
+
'geo.projection': '座標系',
|
|
370
|
+
'geo.engine': 'レンダラー',
|
|
371
|
+
'geo.basemap': 'ベースマップ',
|
|
372
|
+
'geo.basemap.offline': 'オフライン空ベースマップ',
|
|
373
|
+
'geo.basemap.custom': 'カスタムタイル',
|
|
374
|
+
'geo.engine.maplibre': 'MapLibre ベクターマップ',
|
|
375
|
+
'geo.engine.svg': 'SVG フォールバック',
|
|
376
|
+
'geo.error.projection': '地理座標の変換に失敗しました:{reason}',
|
|
377
|
+
'geo.action.fit': '範囲に合わせる',
|
|
378
|
+
'model.toolbar.fit': '全体表示',
|
|
379
|
+
'model.toolbar.rotate': '回転',
|
|
380
|
+
'model.toolbar.wireframe': 'ワイヤーフレーム',
|
|
381
|
+
'model.toolbar.grid': 'グリッド',
|
|
382
|
+
'model.toolbar.axes': '軸',
|
|
383
|
+
'model.state.loadingSummary': 'モデルを読み込んでいます',
|
|
384
|
+
'model.state.loading': '3D モデルを解析しています...',
|
|
385
|
+
'model.state.loaded': 'モデルを読み込みました',
|
|
386
|
+
'model.state.parseFailed': 'モデルの解析に失敗しました',
|
|
387
|
+
'model.summary.meshes': '{count} メッシュ',
|
|
388
|
+
'model.summary.points': '{count} 点群',
|
|
389
|
+
'model.error.daeEmpty': 'DAE モデルに有効なシーンがありません',
|
|
390
|
+
'model.error.unsupported': '.{type} モデル形式にはまだ対応していません',
|
|
391
|
+
'model.error.parseFailed': '{type} モデルの解析に失敗しました',
|
|
392
|
+
'model.notice.signature': 'ファイルシグネチャを検出しました:{signature}。',
|
|
393
|
+
'loading.generic.label': 'ファイル内容',
|
|
394
|
+
'loading.generic.hint': '内容構造とプレビューを準備しています。',
|
|
395
|
+
'loading.word.label': 'Word 文書',
|
|
396
|
+
'loading.word.hint': '文書構造、テキストスタイル、レイアウトを準備しています。',
|
|
397
|
+
'loading.wordWorker.hint': 'Worker で文書構造、テキストスタイル、レイアウトを準備しています。',
|
|
398
|
+
'loading.sheet.label': 'Excel ワークブック',
|
|
399
|
+
'loading.sheet.hint': 'ワークシート、スタイル、ビューポートデータを準備しています。',
|
|
400
|
+
'loading.csv.label': '表形式データ',
|
|
401
|
+
'loading.csv.hint': '行、列、基本スタイルを準備しています。',
|
|
402
|
+
'loading.presentation.label': 'PowerPoint プレゼンテーション',
|
|
403
|
+
'loading.presentation.hint': 'スライドレイアウトとメディア内容を構築しています。',
|
|
404
|
+
'loading.pdf.label': 'PDF 文書',
|
|
405
|
+
'loading.pdf.hint': 'ページ画像、テキストレイヤー、ズーム表示を読み込んでいます。',
|
|
406
|
+
'loading.ofd.label': 'OFD レイアウト文書',
|
|
407
|
+
'loading.ofd.hint': 'OFD ページとレイアウトオブジェクトを解析しています。',
|
|
408
|
+
'loading.archive.label': '圧縮ファイル',
|
|
409
|
+
'loading.archive.hint': 'Worker を起動し、圧縮ファイル内の項目を読み込んでいます。',
|
|
410
|
+
'loading.email.label': 'メールファイル',
|
|
411
|
+
'loading.email.hint': 'メールヘッダー、本文、添付ファイルを解析しています。',
|
|
412
|
+
'loading.msg.hint': 'Outlook メッセージと添付ファイルを解析しています。',
|
|
413
|
+
'loading.eda.label': 'EDA ファイル',
|
|
414
|
+
'loading.eda.hint': 'EDA コンテナ構造とプロパティを読み込んでいます。',
|
|
415
|
+
'loading.cad.label': 'CAD 図面',
|
|
416
|
+
'loading.cad.hint': 'CAD レイヤー、ジオメトリ、キャンバス表示を準備しています。',
|
|
417
|
+
'loading.dwg.hint': 'Worker で DWG ジオメトリと LibreDWG WASM を読み込んでいます。',
|
|
418
|
+
'loading.dwf.hint': 'ネイティブ DWF レンダラーと W2D/W3D グラフィックスを読み込んでいます。',
|
|
419
|
+
'loading.dwfx.hint': 'ネイティブ DWFx/XPS レンダラーとページグラフィックスを読み込んでいます。',
|
|
420
|
+
'loading.xps.hint': 'ネイティブ XPS レンダラーと埋め込みフォントを読み込んでいます。',
|
|
421
|
+
'loading.drawio.label': 'draw.io ダイアグラム',
|
|
422
|
+
'loading.drawio.hint': '図形、コネクター、SVG プレビューを解析しています。',
|
|
423
|
+
'loading.excalidraw.label': 'Excalidraw シーン',
|
|
424
|
+
'loading.excalidraw.hint': '手描き要素を解析し、安全な SVG を生成しています。',
|
|
425
|
+
'loading.epub.label': 'EPUB 電子書籍',
|
|
426
|
+
'loading.epub.hint': '目次、章リソース、読書ページを解析しています。',
|
|
427
|
+
'loading.umd.label': 'UMD 電子書籍',
|
|
428
|
+
'loading.umd.hint': 'モバイル電子書籍のメタデータ、目次、圧縮された章を解析しています。',
|
|
429
|
+
'loading.image.label': '画像ファイル',
|
|
430
|
+
'loading.image.hint': 'ピクセルをデコードしてプレビューを生成しています。',
|
|
431
|
+
'loading.video.label': '動画ファイル',
|
|
432
|
+
'loading.video.hint': 'メディアリソースとプレーヤーを準備しています。',
|
|
433
|
+
'loading.audio.label': '音声ファイル',
|
|
434
|
+
'loading.audio.hint': '音声リソースと再生コントロールを準備しています。',
|
|
435
|
+
};
|
package/dist/i18n/messages.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { JA_JP_MESSAGES } from './messages.ja.js';
|
|
2
|
+
export const FILE_VIEWER_SUPPORTED_LOCALES = ['zh-CN', 'en-US', 'ja-JP'];
|
|
1
3
|
export const FILE_VIEWER_DEFAULT_LOCALE = 'zh-CN';
|
|
2
4
|
export const FILE_VIEWER_FALLBACK_LOCALE = 'en-US';
|
|
3
5
|
const ZH_CN_MESSAGES = {
|
|
@@ -10,13 +12,16 @@ const ZH_CN_MESSAGES = {
|
|
|
10
12
|
'toolbar.print': '打印',
|
|
11
13
|
'toolbar.printTitle': '打印完整渲染内容',
|
|
12
14
|
'toolbar.printDirect': '直接打印',
|
|
13
|
-
'toolbar.printMask': '
|
|
14
|
-
'toolbar.printMaskTitle': '
|
|
15
|
+
'toolbar.printMask': '遮罩/盖章打印',
|
|
16
|
+
'toolbar.printMaskTitle': '遮盖敏感区域或上传印章后再打印',
|
|
15
17
|
'toolbar.printMaskAdd': '添加掩膜',
|
|
16
18
|
'toolbar.printMaskClear': '清空',
|
|
17
19
|
'toolbar.printMaskCancel': '取消',
|
|
18
20
|
'toolbar.printMaskConfirm': '确认打印',
|
|
19
|
-
'toolbar.printMaskHint': '
|
|
21
|
+
'toolbar.printMaskHint': '绘制遮盖块,或上传印章后拖动和缩放',
|
|
22
|
+
'toolbar.printStampUpload': '上传印章',
|
|
23
|
+
'toolbar.printStampRemove': '删除印章',
|
|
24
|
+
'toolbar.printStampResize': '缩放印章',
|
|
20
25
|
'toolbar.exportHtml': 'HTML',
|
|
21
26
|
'toolbar.exportHtmlTitle': '导出当前渲染后的 HTML',
|
|
22
27
|
'toolbar.search': '搜索',
|
|
@@ -319,6 +324,7 @@ const ZH_CN_MESSAGES = {
|
|
|
319
324
|
'cad.toolbar.zoomIn': '放大',
|
|
320
325
|
'cad.layers.title': '图层',
|
|
321
326
|
'cad.layers.count': '{count} 项',
|
|
327
|
+
'cad.layers.merged': '{name}(已合并 {count} 个同名图层)',
|
|
322
328
|
'cad.inspector.title': '结构',
|
|
323
329
|
'cad.inspector.entities': '实体',
|
|
324
330
|
'cad.inspector.blocks': '块',
|
|
@@ -328,6 +334,9 @@ const ZH_CN_MESSAGES = {
|
|
|
328
334
|
'cad.state.parsing': '正在解析 CAD...',
|
|
329
335
|
'cad.error.parseFailed': 'CAD 文件解析失败',
|
|
330
336
|
'image.alt': '图片',
|
|
337
|
+
'image.toolbar.rotation': '图片旋转',
|
|
338
|
+
'image.toolbar.rotateLeft': '向左旋转图片',
|
|
339
|
+
'image.toolbar.rotateRight': '向右旋转图片',
|
|
331
340
|
'image.lightbox.alt': '图片预览',
|
|
332
341
|
'image.lightbox.close': '关闭图片预览',
|
|
333
342
|
'gitBundle.error.invalid': '当前文件不是标准 Git bundle。',
|
|
@@ -433,13 +442,16 @@ const EN_US_MESSAGES = {
|
|
|
433
442
|
'toolbar.print': 'Print',
|
|
434
443
|
'toolbar.printTitle': 'Print the complete rendered document',
|
|
435
444
|
'toolbar.printDirect': 'Print now',
|
|
436
|
-
'toolbar.printMask': 'Mask & print',
|
|
437
|
-
'toolbar.printMaskTitle': 'Cover sensitive areas before printing',
|
|
445
|
+
'toolbar.printMask': 'Mask / stamp & print',
|
|
446
|
+
'toolbar.printMaskTitle': 'Cover sensitive areas or add a stamp before printing',
|
|
438
447
|
'toolbar.printMaskAdd': 'Add mask',
|
|
439
448
|
'toolbar.printMaskClear': 'Clear',
|
|
440
449
|
'toolbar.printMaskCancel': 'Cancel',
|
|
441
450
|
'toolbar.printMaskConfirm': 'Print',
|
|
442
|
-
'toolbar.printMaskHint': '
|
|
451
|
+
'toolbar.printMaskHint': 'Draw cover blocks, or upload a stamp and drag or resize it.',
|
|
452
|
+
'toolbar.printStampUpload': 'Upload stamp',
|
|
453
|
+
'toolbar.printStampRemove': 'Remove stamp',
|
|
454
|
+
'toolbar.printStampResize': 'Resize stamp',
|
|
443
455
|
'toolbar.exportHtml': 'HTML',
|
|
444
456
|
'toolbar.exportHtmlTitle': 'Export the rendered HTML',
|
|
445
457
|
'toolbar.search': 'Search',
|
|
@@ -742,6 +754,7 @@ const EN_US_MESSAGES = {
|
|
|
742
754
|
'cad.toolbar.zoomIn': 'Zoom in',
|
|
743
755
|
'cad.layers.title': 'Layers',
|
|
744
756
|
'cad.layers.count': '{count} items',
|
|
757
|
+
'cad.layers.merged': '{name} ({count} merged layers)',
|
|
745
758
|
'cad.inspector.title': 'Structure',
|
|
746
759
|
'cad.inspector.entities': 'Entities',
|
|
747
760
|
'cad.inspector.blocks': 'Blocks',
|
|
@@ -751,6 +764,9 @@ const EN_US_MESSAGES = {
|
|
|
751
764
|
'cad.state.parsing': 'Parsing CAD...',
|
|
752
765
|
'cad.error.parseFailed': 'Failed to parse CAD file',
|
|
753
766
|
'image.alt': 'Image',
|
|
767
|
+
'image.toolbar.rotation': 'Image rotation',
|
|
768
|
+
'image.toolbar.rotateLeft': 'Rotate image left',
|
|
769
|
+
'image.toolbar.rotateRight': 'Rotate image right',
|
|
754
770
|
'image.lightbox.alt': 'Image preview',
|
|
755
771
|
'image.lightbox.close': 'Close image preview',
|
|
756
772
|
'gitBundle.error.invalid': 'This file is not a valid Git bundle.',
|
|
@@ -849,22 +865,48 @@ const EN_US_MESSAGES = {
|
|
|
849
865
|
export const FILE_VIEWER_BUILTIN_MESSAGES = Object.freeze({
|
|
850
866
|
'zh-CN': ZH_CN_MESSAGES,
|
|
851
867
|
'en-US': EN_US_MESSAGES,
|
|
868
|
+
'ja-JP': JA_JP_MESSAGES,
|
|
852
869
|
});
|
|
853
|
-
const
|
|
854
|
-
|
|
870
|
+
const normalizeLocaleCandidate = (locale) => {
|
|
871
|
+
const normalized = String(locale || '').trim().replace(/_/g, '-').toLowerCase();
|
|
872
|
+
if (!normalized) {
|
|
873
|
+
return undefined;
|
|
874
|
+
}
|
|
875
|
+
if (normalized === 'zh' || normalized.startsWith('zh-')) {
|
|
876
|
+
return 'zh-CN';
|
|
877
|
+
}
|
|
878
|
+
if (normalized === 'ja' || normalized.startsWith('ja-')) {
|
|
879
|
+
return 'ja-JP';
|
|
880
|
+
}
|
|
881
|
+
if (normalized === 'en' || normalized.startsWith('en-')) {
|
|
882
|
+
return 'en-US';
|
|
883
|
+
}
|
|
884
|
+
return undefined;
|
|
885
|
+
};
|
|
886
|
+
const getBrowserLocales = () => {
|
|
855
887
|
const browserNavigator = typeof window !== 'undefined' ? window.navigator : undefined;
|
|
856
888
|
if (!browserNavigator) {
|
|
857
|
-
return
|
|
889
|
+
return [];
|
|
858
890
|
}
|
|
859
|
-
return ((
|
|
891
|
+
return Array.from(new Set([
|
|
892
|
+
...(Array.isArray(browserNavigator.languages) ? browserNavigator.languages : []),
|
|
893
|
+
browserNavigator.language,
|
|
894
|
+
].filter((value) => typeof value === 'string' && Boolean(value.trim()))));
|
|
860
895
|
};
|
|
861
896
|
export const normalizeFileViewerLocale = (locale) => {
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
897
|
+
if (locale && locale !== 'auto') {
|
|
898
|
+
return normalizeLocaleCandidate(locale) || FILE_VIEWER_FALLBACK_LOCALE;
|
|
899
|
+
}
|
|
900
|
+
const browserLocales = getBrowserLocales();
|
|
901
|
+
for (const candidate of browserLocales) {
|
|
902
|
+
const resolved = normalizeLocaleCandidate(candidate);
|
|
903
|
+
if (resolved) {
|
|
904
|
+
return resolved;
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
return browserLocales.length > 0
|
|
908
|
+
? FILE_VIEWER_FALLBACK_LOCALE
|
|
909
|
+
: FILE_VIEWER_DEFAULT_LOCALE;
|
|
868
910
|
};
|
|
869
911
|
const getCustomMessages = (input) => {
|
|
870
912
|
var _a;
|
|
@@ -884,7 +926,7 @@ export const translateFileViewerMessage = (input, key, params = {}) => {
|
|
|
884
926
|
const customMessage = typeof customMessages === 'function'
|
|
885
927
|
? customMessages(key, params, locale)
|
|
886
928
|
: customMessages === null || customMessages === void 0 ? void 0 : customMessages[key];
|
|
887
|
-
const message = customMessage || FILE_VIEWER_BUILTIN_MESSAGES[locale][key] || FILE_VIEWER_BUILTIN_MESSAGES[FILE_VIEWER_DEFAULT_LOCALE][key];
|
|
929
|
+
const message = customMessage || FILE_VIEWER_BUILTIN_MESSAGES[locale][key] || FILE_VIEWER_BUILTIN_MESSAGES[FILE_VIEWER_FALLBACK_LOCALE][key] || FILE_VIEWER_BUILTIN_MESSAGES[FILE_VIEWER_DEFAULT_LOCALE][key];
|
|
888
930
|
return formatFileViewerMessage(message, params);
|
|
889
931
|
};
|
|
890
932
|
export const createFileViewerTranslator = (input) => {
|