PageSourceSearch

https://me.kixking.xyz/i18n.js

js kixking.xyz collected 2026-10-02 02:11:20 UTC 72,060 bytes, 1,252 lines download raw bytes

1/**
2 * kixking Profile — Internationalization (i18n) Engine
3 * Zero Dependencies, Fast, Scalable Dictionary Architecture
4 */
5
6(function (root, factory) {
7  if (typeof define === 'function' && define.amd) {
8    define([], factory);
9  } else if (typeof module === 'object' && module.exports) {
10    module.exports = factory();
11  } else {
12    root.I18N = factory();
13  }
14})(typeof self !== 'undefined' ? self : this, function () {
15  'use strict';
16
17  const STORAGE_KEY = 'kixking_profile_lang';
18
19  const translations = {
20    ja: {
21      // Common / Head
22      page_title: 'kixking (@kixking) — 一生ヘタレプログラマ | Profile & Portfolio',
23      page_description: '一生ヘタレプログラマ kixking(@kixking)の公式プロフィール&ポートフォリオハブ。Android/iOSアプリ開発、Windowsデスクトップ(C#/WPF)、Web開発、個人開発作品を掲載。',
24      location_time_prefix: 'Tokyo •',
25      role_title: 'Developer & Creator',
26      profile_subname: '一生ヘタレプログラマ',
27
28      // Hero
29      hero_bio: '一生ヘタレプログラマ・kixking (@kixking) のポートフォリオ&リンクハブ。Android / iOS ネイティブアプリ、Windows デスクトップ (C#/WPF)、Web フロントエンド / バックエンド (Laravel, Next.js)、およびLINEスタンプ制作を行っています。AIコーディングツールを活用した開発と、堅実なアーキテクチャ設計・運用を重視しています。',
30      action_contact_x: 'X / DMで連絡',
31      action_share_url: 'URLを共有',
32      badge_copied_handle: '@kixking をコピーしました',
33      toast_share_copied: 'URLをコピーしました',
34      toast_lang_changed: '言語を「日本語」に変更しました',
35      toast_theme_changed: 'テーマを変更しました',
36
37      // Section Titles
38      sec_links_title: 'LINKS & PROFILES',
39      sec_apps_title: 'GOOGLE PLAY APPS',
40      sec_apps_subtitle: 'Google Play 公開中の自作アプリ(全6作品)',
41      sec_tools_title: 'WEB TOOLS & EXPERIMENTS',
42      sec_tools_subtitle: 'ブラウザ完結の自作Webツール & ユーティリティ',
43      sec_stack_title: 'TECH STACK',
44      sec_stack_subtitle: '保有技術スタック & 開発領域',
45
46      // Tools Card
47      link_sudoku_title: 'Sudoku 9×9 Generator & Solver',
48      link_sudoku_desc: '単一解を数学的に保証する9×9数独(ナンプレ)の自動生成&ソルバーツール(メモ・印刷対応)',
49      link_queens_title: 'Queens & Star Battle Generator',
50      link_queens_desc: '単一解を数学的に保証するクイーンズ(スターバトル)自動生成ツール(デイリー・Xシェア対応)',
51
52      // Links
53      link_github_title: 'GitHub',
54      link_github_desc: 'ソースコード、個人プロジェクト、開発リポジトリ',
55      link_blog_title: 'Blog',
56      link_blog_desc: '個人ブログ、技術記事や日々の記録',
57      link_line_title: 'LINE Stickers',
58      link_line_desc: '自作LINEスタンプの販売ページ一覧',
59      link_x_title: 'X',
60      link_x_desc: '日々の開発メモや気になったことの記録',
61      link_qiita_title: 'Qiita',
62      link_qiita_desc: '技術知見、トラブルシューティング、備忘録',
63      link_note_title: 'Note',
64      link_note_desc: '開発にまつわるエッセイ、思考のログ',
65
66      // Google Play Apps (Summary & Detail)
67      app_developer_badge: 'Developer Page',
68      app_btn_detail: '詳細を見る',
69      app_btn_store: 'Google Play',
70      app_btn_view_page: '専用ページ',
71      apps_page_nav_back: '← プロフィールへ戻る',
72      app_page_back_apps: '← Apps 一覧',
73      apps_page_title: 'Published Apps — 一生ヘタレプログラマ kixking',
74      apps_page_heading: 'Google Play Apps',
75      apps_page_sub: '一生ヘタレプログラマ kixking (@kixking) が Google Play にて公開中の自作Androidアプリ全6作品。日常のちょっとした不便を解æ
75¶ˆã™ã‚‹ãƒ„ールから触感を楽しむトイまで、無駄のない設計と手触り感を大切に開発しています。',
76      app_sec_overview: 'アプリ概要 & 開発背景',
77      app_section_features: '主な機能 & 特徴',
78      app_section_tech: '技術仕様 & アーキテクチャ',
79      app_view_on_play: 'Google Play で見る',
80      other_apps_title: 'Other Applications',
81
82      // 1. PairLauncher
83      app_pairlauncher_name: 'PairLauncher - Split Screen',
84      app_pairlauncher_cat: 'Launcher / Split Screen',
85      app_pairlauncher_desc: '画面分割(Split Screen)で2つのアプリを同時起動するマルチタスクランチャー',
86      app_pairlauncher_detail: 'YouTubeを見ながらメモを取る、SNSを見ながらブラウジングするなど、よく使う2つのアプリのペアをワンタップで画面分割起動できるショートカットランチャーです。',
87      app_pairlauncher_f1: '頻繁に使う2アプリの組み合わせをホーム画面にショートカット保存',
88      app_pairlauncher_f2: 'Android Multi-Window API を活用したネイティブ高速起動',
89      app_pairlauncher_f3: '不要な権限・トラッキングを一切要求しない完全スタンドアロン設計',
90      app_pairlauncher_tech: 'Kotlin • Jetpack Compose • Android Multi-Window Framework',
91
92      // 2. Jiggly Pudding
93      app_pudding_name: 'Jiggly Pudding',
94      app_pudding_cat: 'Physics / Casual Toy',
95      app_pudding_desc: '物理演算でぷるぷる揺れるプリンの触感を楽しむカジュアルトイ',
96      app_pudding_detail: '画面上のプリンを突いたり弾いたり、スマホを傾けたりして、物理演算によるリアルな「ぷるぷる感」と心地よい振動(Haptics)を楽しむリラクゼーション・トイアプリです。',
97      app_pudding_f1: '弾性と減衰を計算するカスタム2Dスプリング物理シミュレーション',
98      app_pudding_f2: '指のドラッグ速度・加速度に連動するダイナミックな変形アニメーション',
99      app_pudding_f3: '指先にプリンの弾力が伝わる細やかなハプティックフィードバック',
100      app_pudding_tech: 'Kotlin • Custom 2D Physics Simulation • Haptic Vibration API',
101
102      // 3. LifeTicker
103      app_lifeticker_name: 'LifeTicker',
104      app_lifeticker_cat: 'Utility / Life Clock',
105      app_lifeticker_desc: '時間・経過日数をカウントし人生の時間を可視化するティッカーツール',
106      app_lifeticker_detail: '生まれてからの経過日数や、想定寿命に対する人生の残り時間をパーセンテージで可視化。時間の有限性を静かに意識し、今日一日を大切に過ごすためのミニマルツールです。',
107      app_lifeticker_f1: '生年月日から経過日数・人生の残り時間・今年の進捗率をリアルタイム算出',
108      app_lifeticker_f2: '焦燥感を煽るプッシュ通知を一切排した、静かで無機質なミニマルUI',
109      app_lifeticker_f3: 'ダークモード・ペーパーホワイトに最適化されたエディトリアル表示',
110      app_lifeticker_tech: 'Kotlin • Jetpack Compose • Precise Temporal Calculation',
111
112      // 4. ChatTube
113      app_chattube_name: 'ChatTube',
114      app_chattube_cat: 'Viewer / Live Chat',
115      app_chattube_desc: 'YouTube Live 配信専用チャットビューア',
116      app_chattube_detail: 'YouTubeライブの配信映像を読み込まず、チャット欄(ライブチャット)のみを超軽量・省パケットで閲覧できる専用ビューアーです。通信制限時やBGM視聴時のã
116Šä¾›ã«æœ€é©ã§ã™ã€‚',
117      app_chattube_f1: '映像非読み込みによる圧倒的な低通信量・低バッテリー消費',
118      app_chattube_f2: '高速で流れるコメントも引っかかりなく追えるスムーズなスクロール最適化',
119      app_chattube_f3: '配信URLの共有からワンタップで即座にチャット展開',
120      app_chattube_tech: 'Kotlin • Optimized WebView Container • DOM Scripting Engine',
121
122      // 5. Simple Web Browser
123      app_browser_name: 'Simple Web Browser',
124      app_browser_cat: 'Browser / Lightweight',
125      app_browser_desc: 'ミニマル設計の超軽量セーフWebブラウザ',
126      app_browser_detail: '検索と閲覧だけに特化し、余計なおすすめフィード・複雑なタブ管理・広告追跡を削ぎ落とした、軽快に動作するミニマル設計のブラウザです。',
127      app_browser_f1: 'アプリサイズ数MB・瞬時起動の超軽量フットプリント',
128      app_browser_f2: '閲覧履歴やトラッキングを溜め込まないクリーンなセッション設計',
129      app_browser_f3: '片手操作に最適化された下部配置のアクションバー',
130      app_browser_tech: 'Kotlin • Android WebKit Engine • Lightweight Architecture',
131
132      // 6. MyWebView
133      app_mywebview_name: 'MyWebView',
134      app_mywebview_cat: 'Tool / Developer Container',
135      app_mywebview_desc: 'Web制作・検証用カスタムWebViewコンテナ',
136      app_mywebview_detail: '指定した任意のWebサイトURLを、まるでネイティブアプリであるかのように全画面表示・テスト・動作検証できる開発者・制作者向けのユーティリティです。',
137      app_mywebview_f1: 'URL入力だけでWebページをフルスクリーンアプリ化してプレビュー',
138      app_mywebview_f2: 'Webアプリ・PWAのモバイル実機動作確認やレスポンシブ検証に最適',
139      app_mywebview_f3: 'ユーザーエージェント切替やキャッシュクリア機能を完備',
140      app_mywebview_tech: 'Kotlin • Jetpack Compose • Advanced WebView Client',
141
142      // Tech Stack Categories
143      stack_mobile_cat: 'Mobile App Development',
144      stack_desktop_cat: 'Desktop Application',
145      stack_web_cat: 'Web Frontend & Backend',
146      stack_ai_cat: 'AI-Assisted Development',
147      stack_tools_cat: 'Dev Tools & Infrastructure',
148      stack_api_cat: 'APIs & Integrations',
149      stack_mgmt_cat: 'Engineering Management',
150
151      // Footer
152      footer_home: 'Home',
153      footer_privacy: 'Privacy & Terms',
154      lang_label: 'Language',
155      theme_label: 'Theme',
156      theme_light_tip: 'ライトテーマ',
157      theme_system_tip: 'システム連動',
158      theme_dark_tip: 'ダークテーマ',
159
160      // Privacy Page
161      privacy_page_title: 'Privacy Policy & Terms — kixking',
162      privacy_title: 'Privacy Policy & Terms',
163      privacy_meta: '制定・改定: 2026年8月19日',
164      privacy_sec1_title: '1. プライバシー方針 & アクセス解析',
165      privacy_sec1_p: '当サイト(https://me.kixking.xyz/)は、訪問者のプライバシー保護を最優先とし、個人情報の適切な取り扱いに努めます。',
166      privacy_sec1_li1: '個人情報の非取得: 氏名、住所、電話番号、メールアドレス等の個人を特定可能な情報を入力・送信させるフォームや機能はありません。',
167      privacy_sec1_li2: 'Google アナリティクスの利用: 当サイトでは、コンテンツの改善および利用状況の把握を目的として、Google社の提供するアクセス解析ツール「Google アナリティクス(GA4)」を利用しています。',
168      privacy_sec1_li3: 'Cookie(クッキー)の使用: Google アナリティクスはトラフィックデータの収集のために Cookie を使用します。このデータは匿名で収集されており、個人を特定するものではありません。',
169      privacy_sec1_li4_prefix: 'データ収集の無効化(オプトアウト): ユーザーは、ブラウザの Cookie 設定を無効化するか、Google社が提供する「',
170      privacy_sec1_li4_link: 'Google アナリティクス オプトアウト アドオン',
171      privacy_sec1_li4_suffix: '」を利用することで、トラフィックデータの収集を無効にできます。',
172      privacy_sec2_title: '2. 免責事項',
173      privacy_sec2_p: '掲載情報には注意を払っておりますが、正確性や安全性を完全に保証するものではありません。',
174      privacy_sec2_li1: '当サイトの情報を利用したことにより生じた損害について、管理者は責任を負いません。',
175      privacy_sec2_li2: '外部リンク先(GitHub, X, Qiita, Note, LINE Store等)で提供されるコンテンツ・サービスについて責任を負うものではありません。',
176      privacy_sec3_title: '3. 著作権について',
177      privacy_sec3_p1: '当サイトに掲載されている文章・画像・デザイン・LINEスタンプ作品の著作権は管理者に帰属します。無断転載・複製・二次配布を禁じます。',
178      privacy_sec3_p2: '公開しているソースコードについては、各リポジトリに記載のオープンソースライセンスに準じます。',
179      privacy_sec4_title: '4. 連絡先',
180      privacy_sec4_p: 'ご連絡は、X または GitHub よりお願いいたします。',
181
182      // 404 Page
183      err_404_title: '404 Not Found',
184      err_404_subtitle: 'Page Does Not Exist',
185      err_404_desc: 'お探しのページは存在しないか、移動・非公開に設定されています。',
186      err_404_back: '← トップページへ戻る',
187
188      // Sudoku 9x9 Tool
189      sudoku_nav_back: '← プロフィール',
190      sudoku_badge: 'Web Tool',
191      sudoku_heading: 'Sudoku 9×9 Generator & Solver',
192      sudoku_sub: '単一解を数学的に保証する9×9数独の自動生成&ソルバーツール。手触りの良いメモ(Pencil Marks)やキーボード操作、自作問題の自動解法、印刷用レイアウトに対応しています。',
193      sudoku_tab_play: 'プレイ & 自動生成',
194      sudoku_tab_solver: '自作問題 & 解答ソルバー',
195      sudoku_btn_new: '新しく生成',
196      sudoku_btn_solve: '解答を出力',
197      sudoku_btn_note: 'メモ',
198      sudoku_btn_erase: '消去',
199      sudoku_btn_undo: '戻す',
200      sudoku_btn_redo: '進む',
201      sudoku_btn_hint: 'ヒント',
202      sudoku_stat_timer: 'TIME:',
203      sudoku_stat_mistakes: 'MISTAKES:',
204      sudoku_stat_hints: 'HINTS:',
205      sudoku_btn_copy_text: 'テキストコピー',
206      sudoku_btn_copy_ascii: 'ASCIIコピー',
207      sudoku_btn_print: '印刷 / PDF',
208      sudoku_btn_import: '読み込む',
209
210      // Queens & Star Battle Tool
211      queens_nav_back: '← プロフィール',
212      queens_badge: 'Web Tool',
213      queens_heading: 'Queens & Star Battle Generator',
214      queens_sub: '伝統的な数理パズル「スターバトルï¼
214ˆStar Battle)」およびQueensとして親しまれているロジックパズルの自動生成Webツール。各行・各列・各色ブロックに👑を1つ配置し、👑同士は斜めも含め隣接禁止。一意解保証、デイリー日替わり問題、Xシェア対応。',
215      queens_mode_daily: '📅 今日のデイリー',
216      queens_mode_random: '🎲 ランダム生成',
217      queens_btn_new: '新しく生成',
218      queens_rules_title: 'ルールと遊び方(クリックで展開)',
219      queens_rule_1: '1. 各行・各列に👑を1つだけ配置します。',
220      queens_rule_2: '2. 色分けされた各ブロックにも👑を1つだけ配置します。',
221      queens_rule_3: '3. 👑同士は上下左右・斜めの8方向で隣接してはいけません(王手禁止)。',
222      queens_rule_4: '操作: 1回タップで👑、2回タップで✕(置けない目印)。ドラッグで一気に✕を塗れます。',
223      queens_stat_time: 'TIME:',
224      queens_stat_queens: 'QUEENS:',
225      queens_stat_hints: 'HINTS:',
226      queens_stat_best: 'BEST:',
227      queens_input_auto: '🔄 通常 (👑/✕/消去)',
228      queens_input_queen: '👑 クイーン',
229      queens_input_mark: '✕ マーク (ドラッグ可)',
230      queens_btn_assist: '自動✕アシスト',
231      queens_btn_undo: '戻す',
232      queens_btn_redo: '進む',
233      queens_btn_restart: 'リセット',
234      queens_btn_hint: 'ヒント',
235      queens_btn_solve: '正解',
236      queens_share_lead: 'お見事!結果をX(旧Twitter)でシェアしてタイムを競おう!',
237      queens_btn_copy_res: '結果をコピー',
238      queens_btn_post_x: 'Xにポストする',
239      queens_assist_on: '自動✕アシスト: ON',
240      queens_assist_off: '自動✕アシスト: OFF',
241      queens_win_title: 'Puzzle Solved!',
242      queens_win_msg: 'お見事!クリアタイム: ',
243      queens_confirm_solve: '正解を表示しますか?',
244
245      // WhatIsMyIP & Client Inspector
246      checker_nav_back: '← プロフィール',
247      checker_badge: 'Web Tool',
248      checker_heading: 'WhatIsMyIP & Client Inspector',
249      checker_sub: '現在のグローバルIPアドレス、プロバイダ(ISP)、ブラウザ・OS環境、画面解像度、WebRTC漏洩状態を一瞬で診断するモダン環境チェッカー。社内VPN確認、IP制限申請、不具合調査用の報告テキストを一括コピーできます。',
250      checker_hero_label: 'YOUR PUBLIC IP ADDRESS',
251      checker_btn_copy: 'コピー',
252      checker_btn_copy_all: '📋 調査報告テキストを一括コピー',
253      checker_btn_share: '共有',
254      checker_btn_refresh: '再測定',
255      checker_shortcut_guide: '<kbd>C</kbd> IPコピー &nbsp;•&nbsp; <kbd>A</kbd> 全報告コピー &nbsp;•&nbsp; <kbd>R</kbd> 再測定',
256      checker_card_network: 'ネットワーク & IP',
257      checker_lbl_ip: 'プライマリIP',
258      checker_lbl_ipv4: 'IPv4アドレス',
259      checker_lbl_ipv6: 'IPv6アドレス',
260      checker_lbl_dual: 'デュアルスタック',
261      checker_lbl_isp: 'プロバイダ (ISP)',
262      checker_lbl_asn: 'AS番号',
263      checker_lbl_loc: '接続地域 (推定)',
264      checker_lbl_proto: 'プロトコル',
265      checker_lbl_webrtc: 'WebRTC漏洩',
266      checker_card_browser: 'ブラウザ & OS',
267      checker_lbl_browser: 'ブラウザ',
268      checker_lbl_os: 'OS環境',
269      checker_lbl_cpu: 'CPUアーキテクチャ',
270      checker_lbl_lang: '優先言語',
271      checker_lbl_tz: 'タイムゾーン',
272      checker_lbl_ua: 'User-Agent',
273      checker_card_display: 'ディスプレイ & 画面',
274      checker_lbl_screen: '画面解像度',
275      checker_lbl_viewport: '表示領域 (Viewport)',
276      checker_lbl_dpr: 'Retina比率 (DPR)',
277      checker_lbl_color_depth: '色深度',
278      checker_lbl_theme: 'カラーモード',
279      checker_lbl_touch: 'タッチ操作',
280      checker_card_security: 'セキュリティ & 設定',
281      checker_lbl_cookie: 'Cookie',
282      checker_lbl_storage: 'LocalStorage',
283      checker_lbl_idb: 'IndexedDB',
284      checker_lbl_dnt: 'Do Not Track (DNT)',
285      checker_lbl_ping: '応答速度 (Ping)',
286      checker_lbl_conn: '回線タイプ',
287      checker_privacy_desc: 'プライバシー保護: このツールで取得・表示された環境情報は、お客様のブラウザ内でのみ表示・解析さã
287‚Œã¾ã™ã€‚サーバーへのログ保存や第三者へのデータ送信は一切行われません。',
288      link_checker_title: 'WhatIsMyIP & Client Inspector',
289      link_checker_desc: 'グローバルIP、ISP、OS、ブラウザ、画面解像度を一発診断(報告用テキスト一括コピー対応)',
290
291      // 3D Solar System Orrery
292      solar_nav_back: '← プロフィール',
293      solar_badge: '3D Tech Demo',
294      solar_heading: 'Interactive 3D Solar System',
295      solar_sub: 'WebGL / Three.js による完全リアルタイム3D太陽系シミュレーター。太陽系共通重心(Barycenter)のふらつき公転、ケプラー公転、3D軌道傾斜角、自転軸傾斜角、土星の環、小惑星帯をフォトリアルプロシージャルテクスチャで再現。',
296      planet_overview: '全体',
297      planet_sun: '太陽',
298      planet_mercury: '水星',
299      planet_venus: '金星',
300      planet_earth: '地球',
301      planet_mars: '火星',
302      planet_jupiter: '木星',
303      planet_saturn: '土星',
304      planet_uranus: '天王星',
305      planet_neptune: '海王星',
306      solar_pause: '一時停止',
307      solar_play: '再生',
308      solar_speed_lbl: '速度:',
309      solar_ctrl_hint: 'ドラッグ: 360°回転 • スクロール: 拡大/縮小 • 惑星クリック: 追従',
310      solar_toggle_orbits: '⭕ 軌道線',
311      solar_toggle_audio: '🔊 サウンド',
312      stat_radius: '赤道半径',
313      stat_mass: '質量',
314      stat_gravity: '表面重力',
315      stat_temp: '平均温度',
316      stat_orbit: '公転周期',
317      stat_rotation: '自転周期',
318      link_solar_title: 'Interactive 3D Solar System',
319      link_solar_desc: 'WebGL / Three.js によるリアルタイム3D太陽系シミュレーター(太陽系重心公転・3D軌道傾斜・フォトリアルテクスチャ)',
320
321      // Breadcrumbs & Related Tools Hub
322      nav_breadcrumb_home: 'Home',
323      nav_breadcrumb_tools: 'Web Tools',
324      sec_related_tools: 'OTHER WEB TOOLS & DEMOS',
325      related_solar_title: '3D Solar System',
326      related_solar_desc: '太陽系共通重心・ケプラー公転シミュレーター',
327      related_checker_title: 'WhatIsMyIP',
328      related_checker_desc: 'IPv4/IPv6・OS・ブラウザ環境チェッカー',
329      related_queens_title: 'Queens Puzzle',
330      related_queens_desc: '数学的単一解保証の盤面ロジックパズル',
331      related_sudoku_title: 'Sudoku 9×9',
332      related_sudoku_desc: '9×9ナンプレ自動生成&高速ソルバー',
333      related_xsearch_title: 'X高度検索コマンド生成機',
334      related_xsearch_desc: 'いいね数・リポスト数・リプ除外の特殊検索ビルダー',
335      related_gravity_title: 'Gravity Chimes',
336      related_gravity_desc: '幾何学物理演算&プロシージャル音響マシン',
337
338      // Ink Drop
339      related_ind_title: 'Ink Drop',
340      related_ind_desc: '滲む前にタップで消す反射神経ミニゲーム',
341      ind_lives: 'しみ',
342      ind_sound: 'サウンド',
343      ind_lead: 'インクが紙に滲みきる前に、タップで消す。',
344      ind_rule_1: '小さいうちに消すほど高得点',
345      ind_rule_2: '朱色の雫は速いが <strong>3倍</strong>',
346      ind_rule_3: '連続で消すとコンボ倍率が上がる。空振りでリセット',
347      ind_rule_4: 'しみが 3 つ残ったら終わり',
348      ind_start: 'はじめる',
349      ind_best: 'ベスト',
350      ind_resume: 'つづける',
351      ind_new_best: 'ベスト更新',
352      ind_stat_hits: '消した数',
353      ind_stat_combo: '最大コンボ',
354      ind_stat_time: '時間',
355      ind_retry: 'もう一度',
356      ind_share: 'シェア',
357      ind_share_score: 'Ink Drop で{score}点',
358      ind_share_best: '(自己ベスト更新)',
359      ind_share_hits: '{hits}滴消した',
360      ind_share_hits_combo: '{hits}滴消して最大{combo}コンボ',
361      ind_footnote: '記録はこのブラウザ内にだけ保存される。',
362
363      // X First Post Finder
364      related_xfp_title: 'X 最初のポスト検索',
365      related_xfp_desc: 'アカウントの初ポストを年・月単位で絞り込み',
366      xfp_heading: 'X 最初のポスト検索',
367      xfp_sub: 'ユーザー名から、そのアカウントが一番最初に投稿したポストを探す。年 → 月の順に検索範囲を絞り込んで、最古のポストまでたどり着く。',
368      xfp_lbl_handle: 'ユーザー名',
369      xfp_hint_handle: '@ID、プロフィールURL、@ID を含む文章のどれでもOK',
370      xfp_err_handle: 'ユーザー名は英数字と _ の 1〜15 文字',
371      xfp_lbl_join: '登録月',
372      xfp_optional: '任意',
373      xfp_hint_join: 'プロフィールの「2010年6月からXを利用しています」をそのまま貼ってもOK',
374      xfp_ph_join: '2010/6',
375      xfp_err_join: '年月を読み取れない',
376      xfp_lbl_replies: 'リプライを除外',
377      xfp_hint_replies: '-filter:replies。最初の「単独ポスト」だけを見たいとき用',
378      xfp_join_heading: '登録直後から探す',
379      xfp_join_1m: '登録月',
380      xfp_join_3m: '登録から3ヶ月',
381      xfp_join_1y: '登録から1年',
382      xfp_year_heading: '年から絞り込む',
383      xfp_year_hint: '年をタップすると月別に切り替わる。',
384      xfp_open_year: 'この年全体を開く ↗',
385      xfp_lbl_mode: '開くタブ',
386      xfp_hint_mode: '古い期間は「最新」だと0件になることがある。出ないときは「話題」で開く。',
387      xfp_step1: '「話題」タブは並び順が時系列ではないので、月別リンクで範囲を狭めて投稿日時を見比べる。「最新」タブで表示されるなら新しい順なので、一番下が最古。',
388      xfp_notes_heading: '注意点',
389      xfp_note_login: 'X の検索はログインが必要。',
390      xfp_note_index: '非公開アカウント、削除済みポスト、検索インデックスから漏れた古いポストは表示されない。',
391      xfp_note_archive: '自分のアカウントなら、<strong>設定 → アカウント → データのアーカイブをダウンロード</strong>で取得できる全履歴が確実。',
392      xfp_note_privacy: '入力内容は送信されない。検索リンクをブラウザ内で組み立てているだけ。',
393      xfp_toast_query_copied: '検索クエリをコピーした',
394      xfp_toast_url_copied: '共有URLをコピーした',
395      xfp_toast_copy_failed: 'コピーに失敗した',
396      xfp_clear: 'クリア',
397      xfp_paste: '貼り付け',
398      xfp_options: '検索オプション',
399      xfp_result_lead: '古い期間から順に開く。0件なら次へ進み、ヒットしたら範囲を狭める。開いた期間には ✓ が付く。',
400      xfp_reset_checked: '✓ をリセット',
401      xfp_next: '次に開く',
402      xfp_toast_paste_failed: 'クリップボードを読み取れなかった',
403
404      // Gravity Chimes (SCR-016)
405      gc_nav_back: '← プロフィール',
406      gc_badge: 'Sound Experiment',
407      gc_experiment_label: 'Physics & Web Audio Lab',
408      gc_title: 'Gravity Chimes',
409      gc_desc: '重力と反発でボールが跳ね回るたびに、絶対に不協和音にならないペンタトニック旋律をプロシージャルに合成。外部音声ファイル完全ゼロ・Pure JSの音響実験サンドボックスです。',
410      gc_audio_prompt_text: '🎵 音声を有効にするには画面をクリックするかボタンを押してください',
411      gc_btn_enable_audio: 'サウンド開始 ▶',
412      gc_tool_line: '弾性ライン',
413      gc_tool_pin: '音階ピン',
414      gc_tool_ball: 'ボール投擲',
415      gc_tool_erase: '消しゴム',
416      gc_panel_presets: 'プリセット体験',
417      gc_preset_zen_name: 'Zen Polygon (幾何学の禅)',
418      gc_preset_zen_desc: '回転六角形内の永遠のバウンス',
419      gc_preset_rain_name: 'Rain Chimes (雨のピタゴラ)',
420      gc_preset_rain_desc: '降り注ぐ水滴とピンの森',
421      gc_preset_clock_name: 'Clockwork (時計仕掛け)',
422      gc_preset_clock_desc: '回転ギアとシーソーの連鎖',
423      gc_preset_sandbox_name: 'Sandbox (自由創作)',
424      gc_preset_sandbox_desc: '自分だけのピタゴラ楽器を作る',
425      gc_panel_music: '音階・調律',
426      gc_scale_label: '音階スケール',
427      gc_vol_label: 'マスター音量',
428      gc_panel_physics: '物理パラメータ',
429      gc_gravity_mode_label: '重力モード',
430      gc_grav_down: '地球 (↓)',
431      gc_grav_zero: '無重力 (0)',
432      gc_grav_hole: '中心引力 (●)',
433      gc_grav_anti: '反重力 (↑)',
434      gc_bpm_label: 'スポナー射出テンポ (BPM)',
435      gc_btn_pause: '一時停止',
436      gc_btn_play: '再生',
437      gc_btn_clear_balls: 'ボール消去',
438      gc_btn_clear_all: '全消去',
439      gc_btn_record: '録音 (WebM)',
440      gc_author_desc: 'Pure JS 2D物理演算とWeb Audio APIによるプロシージャル幾何学音響実験',
441
442      // X Advanced Search Tool
443      xsearch_nav_back: 'プロフィール',
444      xsearch_badge: 'Web Tool',
445      xsearch_heading: 'X (Twitter) 高度検索コマンド生成機',
446      xsearch_sub: 'いいね数(1,000いいね等)、リポスト数、リプライ除外、メディア指定、日付範囲などの公式特殊検索演算子をGUIで直感的に組み立てるWebツール。',
447      xsearch_presets_heading: 'ワンタップ神プリセット',
448      xsearch_preset_faves: '💎 1,000いいね良ポスト',
449      xsearch_preset_viral: '🔥 5,000いいね超バズ',
450      xsearch_preset_rt: '🔄 500リポスト拡散',
451      xsearch_preset_clean: '🧹 スパム・bot排除',
452      xsearch_preset_video: '🎥 動画付き話題ポスト',
453      xsearch_preset_question: '❓ 悩み・質問リサーチ',
454      xsearch_preset_year_ago: '📅 1年前の今日',
455      xsearch_card_keywords: 'キーワード検索',
456      xsearch_kw_all: 'すべての言葉を含む (AND)',
457      xsearch_kw_exact: '完全一致フレーズ ("...")',
458      xsearch_kw_any: 'いずれかの言葉を含む (OR)',
459      xsearch_kw_none: '含まない言葉 (NOT -)',
460      xsearch_kw_question: '疑問形のみ抽出 (?)',
461      xsearch_card_metrics: 'エンゲージメント閾値',
462      xsearch_metric_faves: '最小いいね数 (min_faves)',
463      xsearch_metric_rts: '最小リポスト数 (min_retweets)',
464      xsearch_metric_replies: '最小リプライ数 (min_replies)',
465      xsearch_tip_views: 'X公式仕様について: Xの仕様上、min_faves や min_retweets などの演算子はキーワードなしの「単体」では0件になります。またインプレッション数(閲覧数)の検索演算子は存在しません。バズや反響の大きいポストを抽出する場合は、検索語句+「最小いいね数(min_faves)」の組み合わせが最も高精度・確実にヒットします。',
466      xsearch_card_filters: 'フィルター & メディア',
467      xsearch_filter_no_replies: 'リプライ(返信)を除外',
468      xsearch_filter_images: '画像付きのみ',
469      xsearch_filter_videos: '動画付きのみ',
470      xsearch_filter_links: 'リンク付きのみ',
471      xsearch_filter_no_links: 'リンク(URL)を除外',
472      xsearch_filter_lang_ja: '日本語のみ (lang:ja)',
473      xsearch_filter_verified: '認証バッジのみ',
474      xsearch_card_dates: '期間指定 (Date Range)',
475      xsearch_date_since: '開始日 (since)',
476      xsearch_date_until: '終了日 (until)',
477      xsearch_card_accounts: 'アカウント指定',
478      xsearch_account_from: '次のアカウントからの投稿 (from:)',
479      xsearch_account_to: '次のアカウント宛て (to:)',
480      xsearch_output_heading: '生成された検索コマンド',
481      xsearch_warn_missing_kw: '検索キーワードが未入力です。Xの仕様上、演算子単体では検索結果ã
481Œ0件になるため、検索語句を入力してください。',
482      xsearch_tab_top: '話題のポスト',
483      xsearch_tab_live: '最新のポスト',
484      xsearch_lbl_keyword: '検索キーワード',
485      xsearch_hint_keyword: '※複数語はスペース区切りでAND検索',
486      xsearch_lbl_conditions: '絞り込み条件(タップで選択)',
487      xsearch_filter_likes: '最低いいね数',
488      opt_all: '指定なし',
489      opt_all_period: '全期間',
490      xsearch_filter_media: 'メディア',
491      xsearch_filter_period: '投稿時期',
492      xsearch_tab_label: '表示タブ:',
493      xsearch_tip_smart: '<strong>X検索を使いこなす3大ポイント:</strong><br>1. <strong>いいね数指定 (`min_faves:1000`)</strong> で宣伝やスパムを消して有益なポストだけを抽出できます。<br>2. <strong>リプライ除外 (`-filter:replies`)</strong> を併用すると、スレッドへの返信が消えて話題の「親ポスト」だけがスッキリ並びます。<br>3. 検索コマンドは<strong>キーワードと一緒に使うのがX公式の仕様</strong>です。まずは気になるキーワードを入力してお試しください!',
494      xsearch_btn_open_x: 'Xで検索を開く',
495      xsearch_btn_copy: 'コピー',
496      xsearch_btn_reset: 'リセット',
497      xsearch_btn_share: 'URL共有',
498      xsearch_copied_toast: '検索コマンドをコピーしました!',
499
500      // Flagship Portal Global Navigation & Announcement
501      hub_nav_lineup: 'ラインアップ',
502      hub_nav_articles: 'コラム・記事',
503      hub_nav_tech: '技術・仕様',
504      hub_nav_topics: 'トピックス',
505      hub_nav_contact: 'お問い合わせ',
506      hub_sub_announce: '一生ヘタレプログラマ kixking の作品・ツール一覧。PC・スマートフォンで快適に動作します。',
507
508      // Hero Slider Captions
509      hub_hero1_tag: '3D WEB ORRERY',
510      hub_hero1_title: '深宇宙を、手のひらに。',
511      hub_hero1_sub: '3D SOLAR SYSTEM ORRERY — 太陽系共通重心(Barycenter)公転、ケプラー軌道、リアルタイムWeb Audio音響を完全再現。',
512      hub_hero1_cta: '3D宇宙を体験する',
513
514      hub_hero2_tag: 'HIGH-ACCURACY UTILITY',
515      hub_hero2_title: '接続のすべてを、瞬時に見抜く。',
516      hub_hero2_sub: 'WHATISMYIP & CLIENT INSPECTOR — IPv4/IPv6デュアルスタック同時測定、2026年最新Client Hints対応、1タップ共有。',
517      hub_hero2_cta: '環境を即時診断する',
518
519      hub_hero3_tag: 'NATIVE ANDROID APPS',
520      hub_hero3_title: '指先の心地よさを、極限まで。',
521      hub_hero3_sub: 'GOOGLE PLAY STORE APPS — 画面分割PairLauncher、物理玩具Jiggly Puddingなど Google Play 配信中の自作アプリ全6作。',
522      hub_hero3_cta: 'アプリ一覧を見る',
523
524      hub_hero4_tag: 'MATHEMATICAL LOGIC',
525      hub_hero4_title: '論理と美の、極限へ。',
526      hub_hero4_sub: 'QUEENS & SUDOKU PUZZLE SUITE — 数学的一意解保証のデイリーパズル生成エンジン。',
527      hub_hero4_cta: 'パズルを解く',
528
529      // Important Notices & Topics Ticker
530      hub_notice_badge: '重要なお知らせ',
531      hub_notice_1: '【仕様更新】WhatIsMyIP にて IPv4/IPv6 デュアルスタック同時測定 & Web Share API 連携を実装しました',
532      hub_notice_2: '【技術更新】3D Solar System に太陽系共通重心(Barycenter)公転物理演算および3D軌道傾斜角を完全実装しました',
533      hub_notice_view_all: '一覧を見る',
534      hub_topics_badge: 'トピックス',
535
536      // Lineup Section (Showcase style)
537      hub_lineup_heading: 'ラインアップ',
538      hub_lineup_sub: 'kixking が開発したWebツール、ネイティブアプリ、技術実験デモの全モデル。',
539      hub_btn_detail: '詳細はこちら',
540      hub_btn_experience: '体験する',
541      hub_btn_specs: '技術仕様を見る',
542
543      // Related Services Grid
544      hub_sec_services: '関連サービス & リソース',
545      hub_sec_services_sub: 'ソースコード、技術知見、執筆エッセイ、各種プラットフォームでの発信一覧。',
546      hub_service_github_title: 'GitHub リポジトリ',
547      hub_service_github_desc: '全ツールのオープンソースコードおよび開発ログ',
548      hub_service_note_title: 'Note エッセイ',
549      hub_service_note_desc: '開発哲学、設計思想、クリエイティブ思考録',
550      hub_service_qiita_title: 'Qiita 技術記事',
551      hub_service_qiita_desc: 'トラブルシューティング、アーキテクチャ知見',
552      hub_service_play_title: 'Google Play 開発者ページ',
553      hub_service_play_desc: '公開中の全Androidアプリのストア公式カタログ',
554      hub_service_line_title: 'LINE Creators Market',
555      hub_service_line_desc: '自作LINEスタンプ販売ページ一覧',
556      hub_service_blog_title: '公式ブログ (kixking.xyz)',
557      hub_service_blog_desc: '個人ブログ、長編記事とã
557‚¢ãƒ¼ã‚«ã‚¤ãƒ–',
558
559      // Floating Widget & Footer
560      hub_widget_btn: '相談・連絡',
561      hub_widget_modal_title: 'kixking について / お問い合わせ',
562      hub_widget_modal_desc: '開発のご相談、アプリへのご意見、不具合報告、技術的なディスカッションは X (@kixking1020) のDMまたはGitHubにて受け付けております。'
563    },
564
565    en: {
566      // Common / Head
567      page_title: 'kixking (@kixking) — Lifelong Humble Programmer | Profile & Portfolio',
568      page_description: 'Official link hub and developer portfolio of kixking (@kixking / Lifelong Humble Programmer). Native mobile, web full-stack, and creative apps.',
569      location_time_prefix: 'Tokyo •',
570      role_title: 'Developer & Creator',
571      profile_subname: 'Lifelong Humble Programmer',
572
573      // Hero
574      hero_bio: 'Lifelong humble programmer kixking (@kixking) — Engineer and creator specializing in Android / iOS native apps, Windows desktop (C#/WPF), Web full-stack (Laravel, Next.js), and LINE stickers. Focused on AI-assisted development and solid architecture design & operations.',
575      action_contact_x: 'Contact on X',
576      action_share_url: 'Share URL',
577      badge_copied_handle: 'Copied @kixking to clipboard',
578      toast_share_copied: 'URL copied to clipboard',
579      toast_lang_changed: 'Switched language to English',
580      toast_theme_changed: 'Theme updated',
581
582      // Section Titles
583      sec_links_title: 'LINKS & PROFILES',
584      sec_apps_title: 'GOOGLE PLAY APPS',
585      sec_apps_subtitle: 'Published Android applications on Google Play (6 apps)',
586      sec_tools_title: 'WEB TOOLS & EXPERIMENTS',
587      sec_tools_subtitle: 'Self-contained client-side web tools & utilities',
588      sec_stack_title: 'TECH STACK',
589      sec_stack_subtitle: 'Core Technical Stack & Capabilities',
590
591      // Tools Card
592      link_sudoku_title: 'Sudoku 9×9 Generator & Solver',
593      link_sudoku_desc: 'Fast, deterministic 9x9 Sudoku generator & solver with guaranteed unique solutions',
594      link_queens_title: 'Queens & Star Battle Generator',
595      link_queens_desc: 'Fast, deterministic Queens & Star Battle puzzle generator with unique solution guarantee',
596
597      // Links
598      link_github_title: 'GitHub',
599      link_github_desc: 'Source code, personal projects, and public repositories',
600      link_blog_title: 'Blog',
601      link_blog_desc: 'Personal blog, technical essays, and dev notes',
602      link_line_title: 'LINE Stickers',
603      link_line_desc: 'Original creators sticker collections on LINE Store',
604      link_x_title: 'X',
605      link_x_desc: 'Daily development thoughts, memos, and tech notes',
606      link_qiita_title: 'Qiita',
607      link_qiita_desc: 'Technical troubleshooting guides and knowledge base',
608      link_note_title: 'Note',
609      link_note_desc: 'Essays, creative thoughts, and engineering reflections',
610
611      // Google Play Apps (Summary & Detail)
612      app_developer_badge: 'Developer Page',
613      app_btn_detail: 'Details',
614      app_btn_store: 'Google Play',
615      app_btn_view_page: 'Dedicated Page',
616      apps_page_nav_back: '← Back to Profile',
617      app_page_back_apps: '← Back to Apps',
618      apps_page_title: 'Published Apps — kixking (Lifelong Humble Programmer)',
619      apps_page_heading: 'Google Play Apps',
620      apps_page_sub: 'Complete catalog of 6 native Android applications published on Google Play by lifelong humble programmer kixking (@kixking). Designed with craftsmanship, minimal footprints, and tactile ergonomics.',
621      app_sec_overview: 'Overview & Story',
622      app_section_features: 'Key Features',
623      app_section_tech: 'Technical Specifications',
624      app_view_on_play: 'View on Google Play',
625      other_apps_title: 'Other Applications',
626
627      // 1. PairLauncher
628      app_pairlauncher_name: 'PairLauncher - Split Screen',
629      app_pairlauncher_cat: 'Launcher / Split Screen',
630      app_pairlauncher_desc: 'Dual-app split screen launcher for Android multitasking',
631      app_pairlauncher_detail: 'Instantly launch two selected applications in split-screen mode with a single tap. Boost your productivity by taking notes while watching videos or browsing while researching.',
632      app_pairlauncher_f1: 'Save frequently used dual-app combinations directly to your home screen',
633      app_pairlauncher_f2: 'Instant launching utilizing native Android Multi-Window APIs',
634      app_pairlauncher_f3: 'Strict privacy design requiring zero invasive permissions or analytics tracking',
635      app_pairlauncher_tech: 'Kotlin • Jetpack Compose • Android Multi-Window Framework',
636
637      // 2. Jiggly Pudding
638      app_pudding_name: 'Jiggly Pudding',
639      app_pudding_cat: 'Physics / Casual Toy',
640      app_pudding_desc: 'Tactile physics simulation casual pudding game toy',
641      app_pudding_detail: 'A calming tactile toy app that lets you poke, flick, and wobble an organic pudding model simulated with real-time elasticity, spring physics, and haptic sensations.',
642      app_pudding_f1: 'Custom 2D spring-damper physics simulation engine for realistic jiggle mechanics',
643      app_pudding_f2: 'Dynamic deformation animation responding to finger drag velocity and momentum',
644      app_pudding_f3: 'Refined tactile haptic vibration feedback on every touch and release',
645      app_pudding_tech: 'Kotlin • Custom 2D Physics Simulation • Haptic Vibration API',
646
647      // 3. LifeTicker
648      app_lifeticker_name: 'LifeTicker',
649      app_lifeticker_cat: 'Utility / Life Clock',
650      app_lifeticker_desc: 'Lifetime visualization countdown & countup ticker',
651      app_lifeticker_detail: 'Visualize your elapsed days and remaining lifetime percentage c
651alculated from your birthdate and life expectancy. A quiet tool to foster mindful daily living.',
652      app_lifeticker_f1: 'Real-time calculation of elapsed days, remaining lifetime, and year progress',
653      app_lifeticker_f2: 'Calm, noise-free minimal UI with zero anxiety-inducing push notifications',
654      app_lifeticker_f3: 'Editorial typography optimized for dark obsidian and warm paper modes',
655      app_lifeticker_tech: 'Kotlin • Jetpack Compose • Precise Temporal Calculation',
656
657      // 4. ChatTube
658      app_chattube_name: 'ChatTube',
659      app_chattube_cat: 'Viewer / Live Chat',
660      app_chattube_desc: 'Optimized YouTube Live chat dedicated viewer',
661      app_chattube_detail: 'A dedicated lightweight viewer for YouTube Live chat streams without loading the heavy video player. Great for saving mobile data and battery while listening to streams.',
662      app_chattube_f1: 'Massive bandwidth and battery savings by isolating the chat stream',
663      app_chattube_f2: 'Optimized smooth scrolling capable of tracking high-velocity live comments',
664      app_chattube_f3: 'Instant one-tap chat launch via native share intent from YouTube',
665      app_chattube_tech: 'Kotlin • Optimized WebView Container • DOM Scripting Engine',
666
667      // 5. Simple Web Browser
668      app_browser_name: 'Simple Web Browser',
669      app_browser_cat: 'Browser / Lightweight',
670      app_browser_desc: 'Ultra-lightweight, minimal and safe web browser',
671      app_browser_detail: 'Focused purely on speed and clean browsing, stripping away cluttered news feeds, complex tab bloat, and tracking scripts for a snappy search experience.',
672      app_browser_f1: 'Featherweight app footprint under a few megabytes with instant cold start',
673      app_browser_f2: 'Clean ephemeral session design that avoids hoarding unnecessary tracking data',
674      app_browser_f3: 'Ergonomic bottom-aligned action bar optimized for one-handed operation',
675      app_browser_tech: 'Kotlin • Android WebKit Engine • Lightweight Architecture',
676
677      // 6. MyWebView
678      app_mywebview_name: 'MyWebView',
679      app_mywebview_cat: 'Tool / Developer Container',
680      app_mywebview_desc: 'Customizable developer WebView test container',
681      app_mywebview_detail: 'A developer utility that allows you to preview and test any web URL in a clean, fullscreen native container, making responsive PWA testing effortless.',
682      app_mywebview_f1: 'Instant fullscreen preview for web apps and PWAs directly on real mobile devices',
683      app_mywebview_f2: 'Essential tool for web developers to inspect layout rendering and performance',
684      app_mywebview_f3: 'Built-in user agent switching and cache-busting capabilities',
685      app_mywebview_tech: 'Kotlin • Jetpack Compose • Advanced WebView Client',
686
687      // Tech Stack Categories
688      stack_mobile_cat: 'Mobile App Development',
689      stack_desktop_cat: 'Desktop Application',
690      stack_web_cat: 'Web Frontend & Backend',
691      stack_ai_cat: 'AI-Assisted Development',
692      stack_tools_cat: 'Dev Tools & Infrastructure',
693      stack_api_cat: 'APIs & Integrations',
694      stack_mgmt_cat: 'Engineering Management',
695
696      // Footer
697      footer_home: 'Home',
698      footer_privacy: 'Privacy & Terms',
699      lang_label: 'Language',
700      theme_label: 'Theme',
701      theme_light_tip: 'Light theme',
702      theme_system_tip: 'System theme',
703      theme_dark_tip: 'Dark theme',
704
705      // Privacy Page
706      privacy_page_title: 'Privacy Policy & Terms — kixking',
707      privacy_title: 'Privacy Policy & Terms',
708      privacy_meta: 'Last Updated: August 19, 2026',
709      privacy_sec1_title: '1. Privacy Policy & Analytics',
710      privacy_sec1_p: 'This website (https://me.kixking.xyz/) prioritizes visitor privacy and handles all interactions with strict confidentiality.',
711      privacy_sec1_li1: 'No Personal Data Collection: We do not collect names, addresses, phone numbers, or private contact details through any forms.',
712      privacy_sec1_li2: 'Google Analytics: We use Google Analytics 4 (GA4) solely to understand aggregated traffic trends and improve site experience.',
713      privacy_sec1_li3: 'Use of Cookies: Google Analytics uses cookies to collect anonymous traffic statistics. No personally identifiable information is stored.',
714      privacy_sec1_li4_prefix: 'Opt-Out: You can disable cookies in your browser settings or install the official ',
715      privacy_sec1_li4_link: 'Google Analytics Opt-out Browser Add-on',
716      privacy_sec1_li4_suffix: ' to prevent data collection.',
717      privacy_sec2_title: '2. Disclaimer',
718      privacy_sec2_p: 'While all content is provided in good faith, we make no warranties regarding completeness or absolute reliability.',
719      privacy_sec2_li1: 'The administrator shall not be held liable for any damages resulting from the use of information on this site.',
720      privacy_sec2_li2: 'We are not responsible for the content or privacy practices of external linked sites (GitHub, X, Qiita, Note, LINE Store, etc.).',
721      privacy_sec3_title: '3. Intellectual Property & Copyright',
722      privacy_sec3_p1: 'All text, visual designs, and LINE sticker works on this site are the intellectual property of the author. Unauthorized reproduction is prohibited.',
723      privacy_sec3_p2: 'Published source code repositories are governed by their respective open source licenses (e.g., MIT License).',
724      privacy_sec4_title: '4. Contact',
725      privacy_sec4_p: 'For inquiries or development opportunities, please reach out via direct message on X or GitHub.',
726
727      // 404 Page
728      err_404_title: '404 Not Found',
729      err_404_subtitle: 'Page Does Not Exist',
730      err_404_desc: 'The requested URL does not exist or has been moved.',
731      err_404_back: '← Back to Home',
732
733      // Sudoku 9x9 Tool
734      sudoku_nav_back: '← Profile',
735      sudoku_badge: 'Web Tool',
736      sudoku_heading: 'Sudoku 9×9 Generator & Solver',
737      sudoku_sub: 'Fast, deterministic 9x9 Sudoku generator & solver with guaranteed unique solutions. Features fluid candidate notes (pencil marks), tactile keyboard ergonomics, and print-ready paper layouts.',
738      sudoku_tab_play: 'Play & Generate',
739      sudoku_tab_solver: 'Custom Solver & Input',
740      sudoku_btn_new: 'New Puzzle',
741      sudoku_btn_solve: 'Solve Board',
742      sudoku_btn_note: 'Notes',
743      sudoku_btn_erase: 'Erase',
744      sudoku_btn_undo: 'Undo',
745      sudoku_btn_redo: 'Redo',
746      sudoku_btn_hint: 'Hint',
747      sudoku_stat_timer: 'TIME:',
748      sudoku_stat_mistakes: 'MISTAKES:',
749      sudoku_stat_hints: 'HINTS:',
750      sudoku_btn_copy_text: 'Copy 81-Text',
751      sudoku_btn_copy_ascii: 'Copy ASCII',
752      sudoku_btn_print: 'Print / PDF',
753      sudoku_btn_import: 'Import',
754
755      // Queens & Star Battle Tool
756      queens_nav_back: '← Profile',
757      queens_badge: 'Web Tool',
758      queens_heading: 'Queens & Star Battle Generator',
759      queens_sub: 'Procedural generator and interactive player for the classic logic puzzle "Star Battle" (also known as Queens). Place 1 Queen per row, column, and colored region, with no touching (even diagonally). Guaranteed unique solutions, daily puzzles, and X share.',
760      queens_mode_daily: '📅 Daily Puzzle',
761      queens_mode_random: '🎲 Random Grid',
762      queens_btn_new: 'New Puzzle',
763      queens_rules_title: 'Rules & How to Play (Click to Expand)',
764      queens_rule_1: '1. Place exactly 1 👑 Queen per row and column.',
765      queens_rule_2: '2. Place exactly 1 👑 Queen per colored region.',
766      queens_rule_3: '3. 👑 Queens CANNOT touch in any of the 8 directions (including diagonals).',
767      queens_rule_4: 'Controls: Tap once for 👑, twice for ✕. Drag to paint ✕ quickly across cells.',
768      queens_stat_time: 'TIME:',
769      queens_stat_queens: 'QUEENS:',
770      queens_stat_hints: 'HINTS:',
771      queens_stat_best: 'BEST:',
772      queens_input_auto: '🔄 Auto (👑/✕/Clear)',
773      queens_input_queen: '👑 Queen',
774      queens_input_mark: '✕ Mark (Draggable)',
775      queens_btn_assist: 'Auto-X Assist',
776      queens_btn_undo: 'Undo',
777      queens_btn_redo: 'Redo',
778      queens_btn_restart: 'Reset',
779      queens_btn_hint: 'Hint',
780      queens_btn_solve: 'Solution',
781      queens_share_lead: 'Solved! Share your time and emoji grid on X to challenge friends!',
782      queens_btn_copy_res: 'Copy Result',
783      queens_btn_post_x: 'Post to X',
784      queens_assist_on: 'Auto-X Assist: ON',
785      queens_assist_off: 'Auto-X Assist: OFF',
786      queens_win_title: 'Puzzle Solved!',
787      queens_win_msg: 'Great job! Solved in: ',
788      queens_confirm_solve: 'Reveal the solution?',
789
790      // WhatIsMyIP & Client Inspector
791      checker_nav_back: '← Profile',
792      checker_badge: 'Web Tool',
793      checker_heading: 'WhatIsMyIP & Client Inspector',
794      checker_sub: 'Fast, comprehensive browser and network inspector. Check your public IP address, ISP, OS, browser version, screen resolution, and WebRTC leak status with one-click report export.',
795      checker_hero_label: 'YOUR PUBLIC IP ADDRESS',
796      checker_btn_copy: 'Copy',
797      checker_btn_copy_all: '📋 Copy Full Diagnostic Report',
798      checker_btn_share: 'Share',
799      checker_btn_refresh: 'Re-test',
800      checker_shortcut_guide: '<kbd>C</kbd> Copy IP &nbsp;•&nbsp; <kbd>A</kbd> Copy Report &nbsp;•&nbsp; <kbd>R</kbd> Re-test',
801      checker_card_network: 'Network & IP',
802      checker_lbl_ip: 'Primary IP',
803      checker_lbl_ipv4: 'IPv4 Address',
804      checker_lbl_ipv6: 'IPv6 Address',
805      checker_lbl_dual: 'Dual-Stack',
806      checker_lbl_isp: 'ISP / Organization',
807      checker_lbl_asn: 'ASN',
808      checker_lbl_loc: 'Location (Approx)',
809      checker_lbl_proto: 'Protocol',
810      checker_lbl_webrtc: 'WebRTC Leak',
811      checker_card_browser: 'Browser & OS',
812      checker_lbl_browser: 'Browser',
813      checker_lbl_os: 'Operating System',
814      checker_lbl_cpu: 'CPU Architecture',
815      checker_lbl_lang: 'Preferred Languages',
816      checker_lbl_tz: 'Timezone',
817      checker_lbl_ua: 'User-Agent',
818      checker_card_display: 'Display & Screen',
819      checker_lbl_screen: 'Screen Resolution',
820      checker_lbl_viewport: 'Viewport Window',
821      checker_lbl_dpr: 'Device Pixel Ratio',
822      checker_lbl_color_depth: 'Color Depth',
823      checker_lbl_theme: 'Color Scheme',
824      checker_lbl_touch: 'Touch Points',
825      checker_card_security: 'Security & Features',
826      checker_lbl_cookie: 'Cookies',
827      checker_lbl_storage: 'LocalStorage',
828      checker_lbl_idb: 'IndexedDB',
829      checker_lbl_dnt: 'Do Not Track (DNT)',
830      checker_lbl_ping: 'Latency (Ping)',
831      checker_lbl_conn: 'Connection Type',
832      checker_privacy_desc: 'Privacy Guarantee: All diagnostics and environment checks are processed locally in your browser. Zero logs stored, zero third-party tracking.',
833      link_checker_title: 'WhatIsMyIP & Client Inspector',
834      link_checker_desc: 'Instant public IP, ISP, OS, browser, screen resolution & WebRTC leak inspector with 1-click export.',
835
836      // 3D Solar System Orrery
837      solar_nav_back: '← Profile',
838      solar_badge: '3D Tech Demo',
839      solar_heading: 'Interactive 3D Solar System',
840      solar_sub: 'Full real-time 3D solar system simulation powered by WebGL & Three.js. Features Solar Barycentric wobble physics, Keplerian orbits, 3D axial tilt, Saturn’s rings, asteroid belt, and high-res procedural textures.',
841      planet_overview: 'Overview',
842      planet_sun: 'Sun',
843      planet_mercury: 'Mercury',
844      planet_venus: 'Venus',
845      planet_earth: 'Earth',
846      planet_mars: 'Mars',
847      planet_jupiter: 'Jupiter',
848      planet_saturn: 'Saturn',
849      planet_uranus: 'Uranus',
850      planet_neptune: 'Neptune',
851      solar_pause: 'Pause',
852      solar_play: 'Play',
853      solar_speed_lbl: 'Speed:',
854      solar_ctrl_hint: 'Drag: 360° Rotate • Scroll: Zoom • Click Planet: Track',
855      solar_toggle_orbits: '⭕ Orbits',
856      solar_toggle_audio: '🔊 Audio',
857      stat_radius: 'Equatorial Radius',
858      stat_mass: 'Mass',
859      stat_gravity: 'Surface Gravity',
860      stat_temp: 'Mean Temperature',
861      stat_orbit: 'Orbital Period',
862      stat_rotation: 'Rotation Period',
863      link_solar_title: 'Interactive 3D Solar System',
864      link_solar_desc: 'WebGL / Three.js 3D planetary simulation (Solar Barycentric wobble, 3D orbits & procedural textures)',
865
866      // Breadcrumbs & Related Tools Hub
867      nav_breadcrumb_home: 'Home',
868      nav_breadcrumb_tools: 'Web Tools',
869      sec_related_tools: 'OTHER WEB TOOLS & DEMOS',
870      related_solar_title: '3D Solar System',
871      related_solar_desc: 'Real-time Keplerian planetary orbit simulator',
872      related_checker_title: 'WhatIsMyIP',
873      related_checker_desc: 'IPv4/IPv6, OS, browser & WebRTC inspector',
874      related_queens_title: 'Queens Puzzle',
875      related_queens_desc: 'Daily color-region queen logic puzzle',
876      related_sudoku_title: 'Sudoku 9×9',
877      related_sudoku_desc: 'Unique-solution 9x9 Sudoku generator & solver',
878      related_xsearch_title: 'X Advanced Search Operator Generator',
879      related_xsearch_desc: 'Build powerful queries with min_faves, min_retweets & filters',
880      related_gravity_title: 'Gravity Chimes',
881      related_gravity_desc: 'Procedural 2D physics & Web Audio sound machine',
882
883      // Ink Drop
884      related_ind_title: 'Ink Drop',
885      related_ind_desc: 'Tap the ink before it bleeds — a reflex mini game',
886      ind_lives: 'STAINS',
887      ind_sound: 'Sound',
888      ind_lead: 'Tap each ink drop before it bleeds into the paper.',
889      ind_rule_1: 'The smaller the drop, the more points',
890      ind_rule_2: 'Vermilion drops are fast but worth <strong>3×</strong>',
891      ind_rule_3: 'Chain taps for a combo multiplier. A miss resets it',
892      ind_rule_4: 'Three stains and it is over',
893      ind_start: 'Start',
894      ind_best: 'Best',
895      ind_resume: 'Resume',
896      ind_new_best: 'NEW BEST',
897      ind_stat_hits: 'Drops',
898      ind_stat_combo: 'Max combo',
899      ind_stat_time: 'Time',
900      ind_retry: 'Play again',
901      ind_share: 'Share',
902      ind_share_score: 'Scored {score} in Ink Drop',
903      ind_share_best: ' (new personal best)',
904      ind_share_hits: 'Cleared {hits} drops',
905      ind_share_hits_combo: 'Cleared {hits} drops with a max combo of {combo}',
906      ind_footnote: 'Your best score is stored only in this browser.',
907
908      // X First Post Finder
909      related_xfp_title: 'X First Post Finder',
910      related_xfp_desc: "Narrow down an account's first post by year and month",
911      xfp_heading: 'X First Post Finder',
912      xfp_sub: 'Find the very first post of any X account by narrowing the search window year by year, then month by month.',
913      xfp_lbl_handle: 'Username',
914      xfp_hint_handle: 'An @handle, a profile URL, or any text containing the @handle',
915      xfp_err_handle: 'Usernames are 1–15 letters, digits or _',
916      xfp_lbl_join: 'Joined',
917      xfp_optional: 'optional',
918      xfp_hint_join: 'Paste "Joined June 2010" from the profile as is',
919      xfp_ph_join: 'June 2010',
920      xfp_err_join: 'Could not read the month',
921      xfp_lbl_replies: 'Exclude replies',
922      xfp_hint_replies: '-filter:replies — show standalone posts only',
923      xfp_join_heading: 'Start from the join date',
924      xfp_join_1m: 'Join month',
925      xfp_join_3m: 'First 3 months',
926      xfp_join_1y: 'First year',
927      xfp_year_heading: 'Narrow down by year',
928      xfp_year_hint: 'Tap a year to switch to its months.',
929      xfp_open_year: 'Open the whole year ↗',
930      xfp_lbl_mode: 'Open in tab',
931      xfp_hint_mode: '"Latest" often returns nothing for old ranges. Use "Top" if nothing shows up.',
932      xfp_step1: '"Top" is not chronological, so narrow the range with monthly links and compare post dates. If "Latest" works, it is newest first and the bottom post is the oldest.',
933      xfp_notes_heading: 'Notes',
934      xfp_note_login: 'X search requires you to be logged in.',
935      xfp_note_index: 'Protected accounts, deleted posts and old posts missing from the search index will not show up.',
936      xfp_note_archive: 'For your own account, <strong>Settings → Your account → Download an archive of your data</strong> is the most reliable full history.',
937      xfp_note_privacy: 'Nothing you type is sent anywhere. Links are built in your browser.',
938      xfp_toast_query_copied: 'Query copied',
939      xfp_toast_url_copied: 'Share URL copied',
940      xfp_toast_copy_failed: 'Copy failed',
941      xfp_clear: 'Clear',
942      xfp_paste: 'Paste',
943      xfp_options: 'Search options',
944      xfp_result_lead: 'Open periods from the oldest. No results? Move on. Found some? Narrow the range. Opened periods get a ✓.',
945      xfp_reset_checked: 'Reset ✓',
946      xfp_next: 'OPEN NEXT',
947      xfp_toast_paste_failed: 'Could not read the clipboard',
948
949      // Gravity Chimes (SCR-016)
950      gc_nav_back: '← Profile',
951      gc_badge: 'Sound Experiment',
952      gc_experiment_label: 'Physics & Web Audio Lab',
953      gc_title: 'Gravity Chimes',
954      gc_desc: 'Procedural geometric sound machine synthesizing harmonious pentatonic melodies upon every physics bounce. Pure JS & Web Audio API with zero external audio assets.',
955      gc_audio_prompt_text: '🎵 Click anywhere on the screen or press the button to enable audio',
956      gc_btn_enable_audio: 'Enable Audio ▶',
957      gc_tool_line: 'Elastic Line',
958      gc_tool_pin: 'Chime Pin',
959      gc_tool_ball: 'Spawn Orb',
960      gc_tool_erase: 'Eraser',
961      gc_panel_presets: 'Presets',
962      gc_preset_zen_name: 'Zen Polygon',
963      gc_preset_zen_desc: 'Infinite loop inside rotating hexagon',
964      gc_preset_rain_name: 'Rain Chimes',
965      gc_preset_rain_desc: 'Cascading drops through pin forest',
966      gc_preset_clock_name: 'Kinetic Clockwork',
967      gc_preset_clock_desc: 'Gears and seesaws kinetic chain',
968      gc_preset_sandbox_name: 'Sandbox',
969      gc_preset_sandbox_desc: 'Freestyle kinetic musical instrument',
970      gc_panel_music: 'Scales & Tunings',
971      gc_scale_label: 'Musical Scale',
972      gc_vol_label: 'Master Volume',
973      gc_panel_physics: 'Physics Parameters',
974      gc_gravity_mode_label: 'Gravity Mode',
975      gc_grav_down: 'Earth (↓)',
976      gc_grav_zero: 'Zero-G (0)',
977      gc_grav_hole: 'Black Hole (●)',
978      gc_grav_anti: 'Anti-G (↑)',
979      gc_bpm_label: 'Spawner Tempo (BPM)',
980      gc_btn_pause: 'Pause',
981      gc_btn_play: 'Resume',
982      gc_btn_clear_balls: 'Clear Orbs',
983      gc_btn_clear_all: 'Clear All',
984      gc_btn_record: 'Record (WebM)',
985      gc_author_desc: 'Pure JS 2D physics & Web Audio API procedural sound synthesizer',
986
987      // X Advanced Search Tool
988      xsearch_nav_back: 'Profile',
989      xsearch_badge: 'Web Tool',
990      xsearch_heading: 'X (Twitter) Advanced Search Operator Generator',
991      xsearch_sub: 'Visually construct powerful search queries using official operators like min_faves (likes), min_retweets, excluding replies, media filters, and date ranges.',
992      xsearch_presets_heading: '1-Click Power Presets',
993      xsearch_preset_faves: '💎 1,000+ Likes',
994      xsearch_preset_viral: '🔥 5,000+ Super Viral',
995      xsearch_preset_rt: '🔄 500+ Reposts',
996      xsearch_preset_clean: '🧹 Clean (No Spam/Replies)',
997      xsearch_preset_video: '🎥 Viral Videos',
998      xsearch_preset_question: '❓ Questions & Issues',
999      xsearch_preset_year_ago: '📅 1 Year Ago Today',
1000      xsearch_card_keywords: 'Keywords',
1001      xsearch_kw_all: 'All of these words (AND)',
1002      xsearch_kw_exact: 'Exact phrase ("...")',
1003      xsearch_kw_any: 'Any of these words (OR)',
1004      xsearch_kw_none: 'None of these words (NOT -)',
1005      xsearch_kw_question: 'Questions only (?)',
1006      xsearch_card_metrics: 'Engagement Thresholds',
1007      xsearch_metric_faves: 'Minimum Likes (min_faves)',
1008      xsearch_metric_rts: 'Minimum Reposts (min_retweets)',
1009      xsearch_metric_replies: 'Minimum Replies (min_replies)',
1010      xsearch_tip_views: 'About X Official Specs: Search operators like min_faves or min_retweets return 0 results when used alone without keywords. Furthermore, view count (impressions) operators do not exist on X. Combining your search term with "Minimum Likes (min_faves)" yields the most reliable results.',
1011      xsearch_card_filters: 'Filters & Media',
1012      xsearch_filter_no_replies: 'Exclude replies (-filter:replies)',
1013      xsearch_filter_images: 'Images only (filter:images)',
1014      xsearch_filter_videos: 'Videos only (filter:videos)',
1015      xsearch_filter_links: 'Links only (filter:links)',
1016      xsearch_filter_no_links: 'Exclude links (-filter:links)',
1017      xsearch_filter_lang_ja: 'Japanese only (lang:ja)',
1018      xsearch_filter_verified: 'Verified users only',
1019      xsearch_card_dates: 'Date Range',
1020      xsearch_date_since: 'Since date (YYYY-MM-DD)',
1021      xsearch_date_until: 'Until date (YYYY-MM-DD)',
1022      xsearch_card_accounts: 'Account Filters',
1023      xsearch_account_from: 'From these accounts (from:)',
1024      xsearch_account_to: 'To these accounts (to:)',
1025      xsearch_output_heading: 'Generated Query',
1026      xsearch_warn_missing_kw: 'No search keyword entered. Due to X specifications, queries with only operators return 0 results. Please enter a search term.',
1027      xsearch_tab_top: 'Top Posts',
1028      xsearch_tab_live: 'Latest Posts',
1029      xsearch_btn_open_x: 'Search on X',
1030      xsearch_btn_copy: 'Copy',
1031      xsearch_btn_reset: 'Reset',
1032      xsearch_btn_share: 'Share URL',
1033      xsearch_lbl_keyword: 'Search Keyword',
1034      xsearch_hint_keyword: 'Separate multiple words with spaces',
1035      xsearch_lbl_conditions: 'Filters (Click to toggle)',
1036      xsearch_filter_likes: 'Minimum Likes',
1037      opt_all: 'Any',
1038      opt_all_period: 'All Time',
1039      xsearch_filter_media: 'Media',
1040      xsearch_filter_period: 'Date Range',
1041      xsearch_tab_label: 'Tab:',
1042      xsearch_tip_smart: '<strong>Top 3 Tips for X Search:</strong><br>1. Use <strong>Min Likes (`min_faves:1000`)</strong> to filter out noise and discover high-quality posts.<br>2. Use <strong>Exclude Replies (`-filter:replies`)</strong> to hide comment threads and view original posts only.<br>3. Search operators work best when <strong>combined with keywords</strong>. Type your keywords and explore!',
1043      xsearch_copied_toast: 'Query copied to clipboard!',
1044
1045      // Flagship Portal Global Navigation & Announcement
1046      hub_nav_lineup: 'Lineup',
1047      hub_nav_articles: 'Articles',
1048      hub_nav_tech: 'Engineering',
1049      hub_nav_topics: 'Topics',
1050      hub_nav_contact: 'Contact',
1051      hub_sub_announce: 'Lifelong humble programmer kixking works & tools suite. Optimized for Desktop & Mobile.',
1052
1053      // Hero Slider Captions
1054      hub_hero1_tag: '3D WEB ORRERY',
1055      hub_hero1_title: 'Deep Space in Your Hands.',
1056      hub_hero1_sub: '3D SOLAR SYSTEM ORRERY — Solar Barycentric wobble physics, Keplerian orbits, and real-time Web Audio ambient synthesis.',
1057      hub_hero1_cta: 'Experience in 3D',
1058
1059      hub_hero2_tag: 'HIGH-ACCURACY UTILITY',
1060      hub_hero2_title: 'Instant Network Transparency.',
1061      hub_hero2_sub: 'WHATISMYIP & CLIENT INSPECTOR — Dual-stack IPv4/IPv6 detection, 2026 high-entropy Client Hints, and 1-tap Web Share.',
1062      hub_hero2_cta: 'Inspect Environment',
1063
1064      hub_hero3_tag: 'NATIVE ANDROID APPS',
1065      hub_hero3_title: 'Tactile Ergonomics Perfected.',
1066      hub_hero3_sub: 'GOOGLE PLAY STORE APPS — 6 published native Android apps including PairLauncher and Jiggly Pudding.',
1067      hub_hero3_cta: 'Browse App Catalog',
1068
1069      hub_hero4_tag: 'MATHEMATICAL LOGIC',
1070      hub_hero4_title: 'Pure Logic & Aesthetic.',
1071      hub_hero4_sub: 'QUEENS & SUDOKU PUZZLE SUITE — Math-proven unique-solution generator with daily seeded puzzles.',
1072      hub_hero4_cta: 'Play Puzzles',
1073
1074      // Important Notices & Topics Ticker
1075      hub_notice_badge: 'Important Notice',
1076      hub_notice_1: '[Feature Update] WhatIsMyIP IPv4/IPv6 Dual-Stack inspection & Web Share API launched',
1077      hub_notice_2: '[Tech Update] 3D Solar System Barycentric Wobble physics & 3D orbital inclinations released',
1078      hub_notice_view_all: 'View All',
1079      hub_topics_badge: 'Topics',
1080
1081      // Lineup Section (Showcase style)
1082      hub_lineup_heading: 'Lineup',
1083      hub_lineup_sub: 'All models and creations engineered by kixking — Web tools, native Android apps, and tech demos.',
1084      hub_btn_detail: 'Learn More',
1085      hub_btn_experience: 'Experience Now',
1086      hub_btn_specs: 'View Specifications',
1087
1088      // Related Services Grid
1089      hub_sec_services: 'Related Services & Resources',
1090      hub_sec_services_sub: 'Source code repositories, technical essays, articles, and store profiles across platforms.',
1091      hub_service_github_title: 'GitHub Repositories',
1092      hub_service_github_desc: 'Open-source code, commits, and implementation logs',
1093      hub_service_note_title: 'Note Essays',
1094      hub_service_note_desc: 'Development philosophy, design essays, and creative reflections',
1095      hub_service_qiita_title: 'Qiita Articles',
1096      hub_service_qiita_desc: 'Troubleshooting, architecture insights, and benchmarks',
1097      hub_service_play_title: 'Google Play Developer',
1098      hub_service_play_desc: 'Official Android store catalog for all 6 published apps',
1099      hub_service_line_title: 'LINE Creators Market',
1100      hub_service_line_desc: 'Collection of original custom LINE sticker sets',
1101      hub_service_blog_title: 'Official Blog (kixking.xyz)',
1102      hub_service_blog_desc: 'Personal technical blog, archives, and essays',
1103
1104      // Floating Widget & Footer
1105      hub_widget_btn: 'Contact',
1106      hub_widget_modal_title: 'About kixking / Contact',
1107      hub_widget_modal_desc: 'For inquiries, bug reports, collaboration, or engineering feedback, please reach out via X (@kixking1020) DM or GitHub.'
1108    }
1109  };
1110
1111  let currentLang = 'ja';
1112
1113  function getSavedLanguage() {
1114    // 1. Check URL query parameter (?lang=en or ?lang=ja)
1115    try {
1116      const urlParams = new URLSearchParams(window.location.search);
1117      const queryLang = urlParams.get('lang');
1118      if (queryLang && (queryLang === 'ja' || queryLang === 'en')) {
1119        return queryLang;
1120      }
1121    } catch (e) {}
1122
1123    // 2. Check localStorage
1124    try {
1125      const saved = localStorage.getItem(STORAGE_KEY);
1126      if (saved && (saved === 'ja' || saved === 'en')) {
1127        return saved;
1128      }
1129    } catch (e) {}
1130
1131    // 3. Check browser locale
1132    try {
1133      const browserLang = (navigator.language || navigator.userLanguage || '').toLowerCase();
1134      if (browserLang.startsWith('ja')) {
1135        return 'ja';
1136      }
1137      return 'en'; // Default to English for international visitors
1138    } catch (e) {
1139      return 'ja';
1140    }
1141  }
1142
1143  function applyLanguage(lang, showToastFeedback = false) {
1144    if (!translations[lang]) lang = 'ja';
1145    currentLang = lang;
1146
1147    // Set html lang attribute
1148    document.documentElement.setAttribute('lang', lang);
1149
1150    // Save to localStorage
1151    try {
1152      localStorage.setItem(STORAGE_KEY, lang);
1153    } catch (e) {}
1154
1155    // Update all elements with data-i18n
1156    const elements = document.querySelectorAll('[data-i18n]');
1157    const dict = translations[lang];
1158
1159    elements.forEach((el) => {
1160      const key = el.getAttribute('data-i18n');
1161      if (dict[key] !== undefined) {
1162        // If element has inner tags or is plain text
1163        if (el.getAttribute('data-i18n-html') === 'true') {
1164          el.innerHTML = dict[key];
1165        } else {
1166          el.textContent = dict[key];
1167        }
1168      }
1169    });
1170
1171    // Update placeholders / titles / aria-labels with data-i18n-attr
1172    const attrElements = document.querySelectorAll('[data-i18n-attr]');
1173    attrElements.forEach((el) => {
1174      const config = el.getAttribute('data-i18n-attr'); // e.g. "title:theme_light_tip"
1175      if (config) {
1176        config.split(';').forEach((pair) => {
1177          const [attr, key] = pair.split(':');
1178          if (attr && key && dict[key] !== undefined) {
1179            el.setAttribute(attr.trim(), dict[key]);
1180          }
1181        });
1182      }
1183    });
1184
1185    // Update language toggle buttons
1186    const langButtons = document.querySelectorAll('.lang-btn');
1187    langButtons.forEach((btn) => {
1188      const btnLang = btn.getAttribute('data-lang-val');
1189      if (btnLang === lang) {
1190        btn.classList.add('active');
1191        btn.setAttribute('aria-checked', 'true');
1192      } else {
1193        btn.classList.remove('active');
1194        btn.setAttribute('aria-checked', 'false');
1195      }
1196    });
1197
1198    // Send GA4 Event
1199    if (typeof window.gtag === 'function') {
1200      try {
1201        window.gtag('event', 'language_change', { language: lang });
1202      } catch (e) {}
1203    }
1204
1205    // Trigger toast if requested
1206    if (showToastFeedback && typeof window.showToastMessage === 'function') {
1207      window.showToastMessage(dict.toast_lang_changed);
1208    }
1209  }
1210
1211  function init() {
1212    const initialLang = getSavedLanguage();
1213    applyLanguage(initialLang, false);
1214
1215    // Bind language button clicks
1216    document.addEventListener('DOMContentLoaded', () => {
1217      setupLangButtons();
1218    });
1219    // In case DOM is already loaded
1220    if (document.readyState === 'complete' || document.readyState === 'interactive') {
1221      setupLangButtons();
1222    }
1223  }
1224
1225  function setupLangButtons() {
1226    const langButtons = document.querySelectorAll('.lang-btn');
1227    langButtons.forEach((btn) => {
1228      btn.addEventListener('click', () => {
1229        const lang = btn.getAttribute('data-lang-val');
1230        if (lang && lang !== currentLang) {
1231          applyLanguage(lang, true);
1232        }
1233      });
1234    });
1235  }
1236
1237  // Self-initialize
1238  init();
1239
1240  return {
1241    translations: translations,
1242    getCurrentLanguage: function () {
1243      return currentLang;
1244    },
1245    setLanguage: function (lang, showToast) {
1246      applyLanguage(lang, showToast);
1247    },
1248    t: function (key) {
1249      return (translations[currentLang] && translations[currentLang][key]) || key;
1250    }
1251  };
1252});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.