aboutsummaryrefslogtreecommitdiffstats
path: root/locales
diff options
context:
space:
mode:
authorsillylaird <sillyfanboy@gmail.com>2026-09-03 00:33:59 +0000
committersillylaird <sillyfanboy@gmail.com>2026-09-03 00:33:59 +0000
commit898b52edcb47bcb3e9d6106e74ca73e74ea01e70 (patch)
tree85c6ee5ad58b860144551184d4cf86b560c62b91 /locales
downloadwww-898b52edcb47bcb3e9d6106e74ca73e74ea01e70.tar.gz
www-898b52edcb47bcb3e9d6106e74ca73e74ea01e70.zip
import live www.sillylaird.ca webrootHEADmain
Diffstat (limited to 'locales')
-rw-r--r--locales/README.md24
-rw-r--r--locales/en.php187
-rw-r--r--locales/ja.php191
-rw-r--r--locales/zh.php191
4 files changed, 593 insertions, 0 deletions
diff --git a/locales/README.md b/locales/README.md
new file mode 100644
index 0000000..5a04920
--- /dev/null
+++ b/locales/README.md
@@ -0,0 +1,24 @@
+# Locales
+
+Flat key → string dicts, one file per language: `en.php`, `ja.php`, `zh.php`.
+Loaded by `partials/i18n.php` via the `t($key)` helper.
+
+**EN is source of truth.** Missing keys in ja/zh fall back to English, then to
+the key string itself. When you add UI strings, add the EN key first and mirror
+it in ja/zh in the same change when possible.
+
+## Migration strategy
+
+The existing `foo.php` / `foo_jp.php` / `foo_zh.php` triples are kept as-is.
+When you next edit a page triple, collapse it:
+
+1. `require_once __DIR__ . '/partials/i18n.php';` at the top of `foo.php`.
+2. Replace the hardcoded English strings with `<?= t('foo.someKey') ?>`.
+3. Add matching keys to `locales/{en,ja,zh}.php`.
+4. Replace `foo_jp.php` / `foo_zh.php` with a one-line redirect stub:
+ `<?php header('Location: /foo.php?lang=jp'); exit;`
+ (or leave them until you're ready to migrate routing).
+
+Language detection reads the current filename's `_jp.php` / `_zh.php`
+suffix, matching the existing URL scheme. No routing changes required to
+start using `t()`.
diff --git a/locales/en.php b/locales/en.php
new file mode 100644
index 0000000..6fa3d07
--- /dev/null
+++ b/locales/en.php
@@ -0,0 +1,187 @@
+<?php
+// English strings. Keys use dot notation grouped by page, e.g. 'home.title'.
+// Add new keys here first; translators add matching keys in ja.php / zh.php.
+return [
+ 'common.skip' => 'Skip to content',
+ 'common.top' => '↑ Top',
+
+ 'hitcounter.title' => 'Visitor Counter (Local)',
+ 'hitcounter.subtitle' => 'Counts unique visits per browser using localStorage + sessionStorage.',
+ 'hitcounter.label' => 'You are visitor number:',
+
+ // profile
+ 'profile.title' => 'Profile — SillyLaird',
+ 'profile.desc' => 'Contact card/profile for Laird Lonergan.',
+ 'profile.h1' => 'Laird Lonergan',
+ 'profile.subtitle' => 'Simple contact card.',
+
+ // multibox guide
+ 'multibox.title' => 'MMORPG Multiboxing Guide — SillyLaird',
+ 'multibox.title_short' => 'MMORPG Multiboxing Guide — SillyLaird',
+ 'multibox.desc' => 'A comprehensive guide to MMORPG multiboxing: what it is, how it works, and its impact on gaming communities.',
+ 'multibox.desc_short' => 'Multiboxing guide landing page.',
+ 'multibox.h1' => 'MMORPG Multiboxing Guide',
+ 'multibox.subtitle' => 'This guide moved into the unified gaming section.',
+ 'multibox.link_main' => 'Multiboxing (main page)',
+ 'multibox.link_what' => 'What is Multiboxing? (detailed)',
+
+ // hat collection website
+ 'hat.title' => 'Hat Collection Website — SillyLaird',
+ 'hat.desc' => 'Notes / file structure for hat collection website.',
+ 'hat.h1' => 'Hat Collection Website',
+ 'hat.subtitle' => 'Notes / layout sketch.',
+
+ // game collection
+ 'collection.title' => 'Game Collection — SillyLaird',
+ 'collection.desc' => 'Video games, consoles, hardware, song packs, and wishlist.',
+ 'collection.h1' => 'Game Collection',
+ 'collection.subtitle' => 'Video Games / Consoles / Hardware / Song Packs / Wishlist',
+ 'collection.games_label' => 'titles',
+ 'collection.games_blurb' => 'Video game titles — system :: title.',
+ 'collection.systems_label' => 'systems',
+ 'collection.empty' => 'No video game titles yet. Add them in the admin Collection tab.',
+ 'collection.empty_system' => 'No games listed for this system yet.',
+ 'collection.consoles_title' => 'Consoles — SillyLaird',
+ 'collection.consoles_blurb' => 'Consoles and living-room systems. Each row is name :: model.',
+ 'collection.consoles_label' => 'consoles',
+ 'collection.consoles_empty' => 'No consoles yet. Add them in the admin Collection tab.',
+ 'collection.hardware_title' => 'Hardware — SillyLaird',
+ 'collection.hardware_page_blurb' => 'Cabinets, controllers, PCs. Each row is name :: model.',
+ 'collection.hardware_label' => 'items',
+ 'collection.hardware_empty' => 'No hardware yet. Add items in the admin Collection tab.',
+ 'collection.online_subtitle' => 'Konami rhythm song packs and tools. Each row is game :: pack.',
+ 'collection.online_links_label' => 'song packs',
+ 'collection.online_empty' => 'No song packs yet. Add them in the admin Collection tab.',
+ 'collection.online_empty_cat' => 'No song packs listed for this game yet.',
+ 'collection.visit_product' => 'store',
+ 'collection.no_photo' => 'no photo',
+ 'collection.jump_nav' => 'Collection sections',
+ 'collection.menu_games' => 'Video Games',
+ 'collection.menu_videogames' => 'Video Games',
+ 'collection.menu_consoles' => 'Consoles',
+ 'collection.menu_hardware' => 'Hardware',
+ 'collection.menu_tech' => 'Video Games',
+ 'collection.menu_packs' => 'Song Packs',
+ 'collection.menu_online' => 'Song Packs',
+ 'collection.menu_wishlist' => 'Wishlist',
+ 'collection.packs_title' => 'Song Packs — SillyLaird',
+ 'collection.wishlist_title' => 'Wishlist — SillyLaird',
+ 'collection.wishlist_blurb' => 'Titles, consoles, hardware, and packs I want next.',
+ 'collection.wishlist_count' => 'on the list',
+ 'collection.wishlist_empty' => 'Wishlist is empty. Mark items Wishlist in admin.',
+ 'collection.spec_system' => 'System',
+ 'collection.spec_game' => 'Game',
+ 'collection.spec_status' => 'Status',
+ 'collection.spec_link' => 'Link',
+ 'collection.spec_link_yes' => 'store page',
+ 'collection.back_gaming' => '← Gaming hub',
+ 'collection.back_home' => 'Home',
+ 'home.card_collection' => 'Game Collection',
+ 'home.card_collection_desc' => 'Video games, consoles, hardware, song packs.',
+
+ // links
+ 'links.title' => 'Links — SillyLaird',
+ 'links.desc' => 'The obligatory page of links.',
+ 'links.h1' => 'Links',
+ 'links.subtitle' => 'Websites I like. Content varies.',
+ 'links.grp_start' => 'Start Here',
+ 'links.grp_networks' => 'Networks',
+ 'links.grp_media' => 'Media',
+ 'links.grp_contact' => 'Contact',
+ 'links.h2_friends' => "Friends' Sites",
+ 'links.h2_buttons' => 'Buttons / Badges',
+
+ // guestbook (shared, EN-only flow)
+ 'guestbook.title' => 'Guestbook — SillyLaird',
+ 'guestbook.desc' => 'A shared guestbook powered by PHP and a database.',
+ 'guestbook.h1' => 'Guestbook',
+ 'guestbook.subtitle' => 'Sign the guestbook below! Comments are shared across all visitors.',
+ 'guestbook.reset_form' => 'Reset Form',
+ 'guestbook.reset_comments' => 'Reset Comments',
+ 'guestbook.iframe_form' => 'Guestbook Comment Form',
+ 'guestbook.iframe_comments'=> 'Guestbook Comments',
+
+ // guestbook (local, JP/ZH flow)
+ 'guestbook.local_title' => 'Guestbook (Local) — SillyLaird',
+ 'guestbook.local_desc' => 'Simple localStorage guestbook.',
+ 'guestbook.local_h1' => 'Guestbook (Local)',
+ 'guestbook.local_subtitle' => 'This page stores entries in your browser (localStorage). It is not shared between visitors.',
+ 'guestbook.label_name' => 'Name',
+ 'guestbook.label_message' => 'Message',
+ 'guestbook.label_captcha' => 'Captcha',
+ 'guestbook.captcha_ph' => 'Enter code',
+ 'guestbook.refresh_captcha'=> 'Refresh Captcha',
+ 'guestbook.submit' => 'Submit',
+
+ // startpage (/startpage/) — its own title so the browser tab and the
+ // OG/Twitter card name the page instead of reusing the homepage's.
+ 'startpage.title' => 'Startpage — SillyLaird',
+ 'startpage.desc' => 'SillyLaird\'s browser startpage — link cards, search bar, live radio and now-playing, all in one terminal-flavoured dashboard.',
+
+ // home / index
+ 'home.title' => 'Home — SillyLaird',
+ 'home.desc' => 'SillyLaird\'s personal homepage — terminal vibes, small-web links, live music & radio, guestbook, gaming archives, and contact info across clearnet, Tor, I2P, Gemini & Gopher.',
+ 'home.h1' => 'Laird Lonergan (SillyLaird) — Personal Homepage',
+ 'home.tagline' => 'Terminal vibes meet small-web chaos',
+ 'home.where_start' => 'Where to start',
+ 'home.card_now' => 'Now',
+ 'home.card_now_desc' => "What I'm doing lately.",
+ 'home.card_blog' => 'Blog',
+ 'home.card_blog_desc' => 'Longer writing and notes.',
+ 'home.card_journal' => 'Journal',
+ 'home.card_journal_desc' => 'Short day-to-day entries.',
+ 'home.card_gaming' => 'Gaming',
+ 'home.card_gaming_desc' => 'Games I play and archive.',
+ 'home.network' => 'Network & Links',
+ 'home.guestbook_form' => 'Leave a message',
+ 'home.guestbook_comments' => 'Recent comments',
+ 'home.made_with' => 'Made with ♥ on the small web',
+ 'home.welcome' => "Welcome! This is my personal homepage. It's meant to feel like a simple link hub with personality — not a corporate site.",
+ 'home.contact' => 'Contact',
+ 'home.pronunciation' => 'Pronunciation: Laird Lonergan',
+ 'home.vibe' => 'My Current Vibe',
+ 'home.music' => 'Music',
+ 'home.updates' => 'Latest Updates',
+ 'home.blog' => 'Current Blog',
+ 'home.blog_visit' => 'Visit the full archive →',
+ 'home.changelog' => 'Changelog',
+ 'home.changelog_visit' => 'Visit the full changelog →',
+ 'home.friends' => 'Friends',
+ 'home.guestbook' => 'Guestbook',
+ 'home.guestbook_open' => 'Open full guestbook',
+ 'home.refresh_form' => 'Refresh Form',
+ 'home.refresh_comments' => 'Refresh Comments',
+ 'home.games' => 'Games',
+ 'home.countries' => 'Countries',
+ 'home.sponsors' => 'Sponsors / VPNs / Buttons',
+ 'home.loading' => 'Loading…',
+ 'home.lastfm_loading' => 'Loading live music data...',
+ 'home.now_playing' => 'Now playing',
+ 'home.recent_tracks' => 'Recent tracks',
+ 'home.radio_listen' => 'Listen on radio.sillylaird.ca',
+ 'home.radio_loading' => 'Tuning radio feed',
+ 'home.radio_offline' => 'Radio is offline right now',
+ 'home.guestbook_loading' => 'Loading recent comments',
+ 'home.guestbook_empty' => 'No comments yet — be the first to sign!',
+ 'home.guestbook_reload' => 'Reload comments',
+ 'home.lain_alt' => 'Lain avatar — pixel art character from Serial Experiments Lain',
+ 'home.lain_secret_1' => 'Let\'s all love Lain.',
+ 'home.lain_secret_2' => 'Present day. Present time.',
+ 'home.lain_secret_3' => 'The wired is watching.',
+ 'home.visit_counter' => 'You are visitor',
+ 'home.person.name' => 'Laird Lonergan',
+ 'home.person.jobtitle' => 'Software Developer & Content Creator',
+ 'home.person.desc' => 'Personal homepage of Laird Lonergan (SillyLaird) — links, projects, and personal logs.',
+ 'home.site.name' => "SillyLaird's Personal Homepage",
+
+ // homepage sidebar
+ 'home.sidebar_nav' => 'Homepage navigation',
+ 'home.sidebar_index' => 'Index',
+ 'home.sidebar_top' => 'Top',
+ 'home.sidebar_vibe' => 'Last.fm / Vibe',
+ 'home.sidebar_network' => 'Network',
+ 'home.sidebar_map' => 'Site Map',
+ 'home.sidebar_startpage' => 'Startpage',
+ 'home.sidebar_altnets' => 'Alt nets',
+ 'home.sidebar_altnets_aria'=> 'Alternate network protocols',
+];
diff --git a/locales/ja.php b/locales/ja.php
new file mode 100644
index 0000000..3dc273d
--- /dev/null
+++ b/locales/ja.php
@@ -0,0 +1,191 @@
+<?php
+// Japanese strings. Missing keys fall back to en.php.
+return [
+ 'common.skip' => '本文へ移動',
+ 'common.top' => '↑ 先頭へ',
+
+ 'hitcounter.title' => '訪問者カウンター (ローカル)',
+ 'hitcounter.subtitle' => 'localStorage と sessionStorage を使い、ブラウザ単位でユニーク訪問を数えます。',
+ 'hitcounter.label' => 'あなたは訪問者番号:',
+
+ // profile — body kept in English in original triple
+ // (only the skip-link differs); fall back to en.php for the rest.
+
+ // multibox guide — JP variant uses the short title/desc
+ 'multibox.title' => 'MMORPG Multiboxing Guide — SillyLaird',
+ 'multibox.desc' => 'Multiboxing guide landing page.',
+
+ // hat — body unchanged
+
+ // links — JP heading was partially translated
+ 'links.grp_start' => 'はじめに',
+ 'links.grp_networks' => 'ネットワーク',
+ 'links.grp_media' => 'メディア',
+ 'links.grp_contact' => '連絡先',
+ 'links.h2_friends' => "友達' Sites",
+
+ // guestbook (local flow used by JP)
+ 'guestbook.local_title' => 'ゲストブック (Local) — SillyLaird',
+ 'guestbook.local_h1' => 'ゲストブック (Local)',
+
+ // home / index
+ 'home.title' => 'ホーム — SillyLaird',
+ 'home.h1' => 'レアド・ロナーガン (SillyLaird) — 個人ホームページ',
+ 'home.tagline' => 'ターミナル感 × スモールウェブのカオス',
+ 'home.where_start' => 'はじめに',
+ 'home.card_now' => 'Now',
+ 'home.card_now_desc' => '最近やっていること。',
+ 'home.card_blog' => 'ブログ',
+ 'home.card_blog_desc' => '長めの文章やメモ。',
+ 'home.card_journal' => 'ジャーナル',
+ 'home.card_journal_desc' => '日々の短い記録。',
+ 'home.card_gaming' => 'ゲーム',
+ 'home.card_gaming_desc' => 'プレイ中・保管中のゲーム。',
+ 'home.network' => 'ネットワーク & リンク',
+ 'home.guestbook_form' => 'メッセージを残す',
+ 'home.guestbook_comments' => '最近のコメント',
+ 'home.made_with' => 'Made with ♥ on the small web',
+ 'home.welcome' => 'ようこそ!これは私の個人ホームページです。企業サイトではなく、個性を大切にしたシンプルなハブとして作っています。',
+ 'home.contact' => '連絡先',
+ 'home.pronunciation' => '発音: Laird Lonergan',
+ 'home.vibe' => '今の雰囲気',
+ 'home.music' => '音楽',
+ 'home.updates' => '最新の更新',
+ 'home.blog' => '現在のブログ',
+ 'home.blog_visit' => 'Visit the full archive →',
+ 'home.changelog' => '更新履歴',
+ 'home.changelog_visit' => 'Visit the full changelog →',
+ 'home.friends' => '友達',
+ 'home.guestbook' => 'ゲストブック',
+ 'home.guestbook_open' => 'ゲストブックを開く',
+ 'home.refresh_form' => 'フォームを更新',
+ 'home.refresh_comments' => 'コメントを更新',
+ 'home.games' => 'ゲーム',
+ 'home.countries' => '国',
+ 'home.sponsors' => 'スポンサー / VPN / ボタン',
+ 'home.loading' => '読み込み中…',
+ 'home.lastfm_loading' => '読み込み中…',
+ 'home.person.name' => 'レアド・ロナーガン',
+ 'home.person.jobtitle' => 'ソフトウェア開発者 & コンテンツクリエイター',
+ 'home.person.desc' => 'レアド・ロナーガン(SillyLaird)の個人用ホームページ。リンク、プロジェクト、個人的なログを掲載しています。',
+ 'home.site.name' => 'SillyLairdの個人ホームページ',
+
+ // startpage (/startpage/)
+ 'startpage.title' => 'スタートページ — SillyLaird',
+ 'startpage.desc' => 'SillyLaird のブラウザ用スタートページ — リンクカード、検索バー、ライブラジオと再生中の曲を一つのターミナル風ダッシュボードに。',
+
+ // fill gaps vs en.php (were falling back to English)
+ 'home.desc' => 'SillyLaird の個人ホームページ — ターミナル感、スモールウェブのリンク、ライブ音楽とラジオ、ゲストブック、ゲームアーカイブ、そして clearnet / Tor / I2P / Gemini / Gopher での連絡先。',
+ 'home.now_playing' => '再生中',
+ 'home.recent_tracks' => '最近の曲',
+ 'home.radio_listen' => 'radio.sillylaird.ca で聴く',
+ 'home.radio_loading' => 'ラジオをチューニング中',
+ 'home.radio_offline' => 'ラジオは現在オフラインです',
+ 'home.guestbook_loading' => '最近のコメントを読み込み中',
+ 'home.guestbook_empty' => 'まだコメントはありません — 最初にサインしよう!',
+ 'home.guestbook_reload' => 'コメントを再読込',
+ 'home.lain_alt' => 'Lain アバター — Serial Experiments Lain のピクセルアート',
+ 'home.lain_secret_1' => 'Let\'s all love Lain.',
+ 'home.lain_secret_2' => 'Present day. Present time.',
+ 'home.lain_secret_3' => 'The wired is watching.',
+ 'home.visit_counter' => '訪問者番号',
+ 'home.blog_visit' => '全アーカイブを見る →',
+ 'home.changelog_visit' => '更新履歴をすべて見る →',
+ 'home.sidebar_nav' => 'ホームページのナビゲーション',
+ 'home.sidebar_index' => '目次',
+ 'home.sidebar_top' => 'トップ',
+ 'home.sidebar_vibe' => 'Last.fm / Vibe',
+ 'home.sidebar_network' => 'ネットワーク',
+ 'home.sidebar_map' => 'サイトマップ',
+ 'home.sidebar_startpage' => 'スタートページ',
+ 'home.sidebar_altnets' => '代替ネット',
+ 'home.sidebar_altnets_aria'=> '代替ネットワークプロトコル',
+
+ 'profile.title' => 'プロフィール — SillyLaird',
+ 'profile.desc' => 'Laird Lonergan の連絡先カード / プロフィール。',
+ 'profile.h1' => 'Laird Lonergan',
+ 'profile.subtitle' => 'シンプルな連絡先カード。',
+
+ 'multibox.title_short' => 'MMORPG Multiboxing Guide — SillyLaird',
+ 'multibox.desc_short' => 'マルチボクシング入門ページ。',
+ 'multibox.h1' => 'MMORPG マルチボクシングガイド',
+ 'multibox.subtitle' => 'このガイドは統合ゲーミングセクションへ移動しました。',
+ 'multibox.link_main' => 'マルチボクシング(メイン)',
+ 'multibox.link_what' => 'マルチボクシングとは?(詳細)',
+
+ 'hat.title' => '帽子コレクションサイト — SillyLaird',
+ 'hat.desc' => '帽子コレクションサイトのメモ / 構成。',
+ 'hat.h1' => '帽子コレクションサイト',
+ 'hat.subtitle' => 'メモ / レイアウトスケッチ。',
+
+ // game collection
+ 'collection.title' => 'ゲームコレクション — SillyLaird',
+ 'collection.desc' => '個人のゲームカタログ — ハードと Konami 楽曲パック。',
+ 'collection.h1' => 'ゲームコレクション',
+ 'collection.subtitle' => '手元にある機種・ゲーム・楽曲パックの小さなカタログ。',
+ 'collection.games_label' => '本',
+ 'collection.systems_label' => '機種',
+ 'collection.empty' => 'まだ機種がありません。管理の Collection か games.json で追加。',
+ 'collection.empty_system' => 'この機種にはまだゲームがありません。',
+ 'collection.online_subtitle' => 'Konami 音ゲーの楽曲パックなど。各行は 機種 :: パック名。',
+ 'collection.online_links_label' => 'パック',
+ 'collection.online_empty' => 'まだ楽曲パックがありません。管理の Collection で追加。',
+ 'collection.online_empty_cat' => 'この機種にはまだ楽曲パックがありません。',
+ 'collection.visit_product' => 'ストア',
+ 'collection.no_photo' => '写真なし',
+ 'collection.jump_nav' => 'コレクションの区分',
+ 'collection.menu_games' => 'ビデオゲーム',
+ 'collection.menu_videogames' => 'ビデオゲーム',
+ 'collection.menu_consoles' => '本体',
+ 'collection.menu_hardware' => 'ハードウェア',
+ 'collection.menu_tech' => 'ビデオゲーム',
+ 'collection.menu_packs' => '楽曲パック',
+ 'collection.menu_online' => '楽曲パック',
+ 'collection.menu_wishlist' => 'ウィッシュリスト',
+ 'collection.games_blurb' => 'タイトル一覧。各行は 機種 :: タイトル。',
+ 'collection.consoles_title' => '本体 — SillyLaird',
+ 'collection.consoles_blurb' => 'ゲーム機。各行は 名前 :: 機種。',
+ 'collection.consoles_label' => '台',
+ 'collection.consoles_empty' => 'まだ本体がありません。',
+ 'collection.hardware_title' => 'ハードウェア — SillyLaird',
+ 'collection.hardware_page_blurb' => '筐体・コントローラーなど。各行は 名前 :: 機種。',
+ 'collection.hardware_label' => '点',
+ 'collection.hardware_empty' => 'まだハードウェアがありません。',
+ 'collection.packs_title' => '楽曲パック — SillyLaird',
+ 'collection.wishlist_title' => 'ウィッシュリスト — SillyLaird',
+ 'collection.wishlist_blurb' => '次に欲しいハードとパック。',
+ 'collection.wishlist_count' => '件',
+ 'collection.wishlist_empty' => 'ウィッシュリストは空です。管理画面で Wishlist に設定。',
+ 'collection.spec_system' => '機種',
+ 'collection.spec_game' => 'ゲーム',
+ 'collection.spec_status' => '状態',
+ 'collection.spec_link' => 'リンク',
+ 'collection.spec_link_yes' => 'ストアページ',
+ 'collection.back_gaming' => '← ゲームハブ',
+ 'collection.back_home' => 'ホーム',
+ 'home.card_collection' => 'ゲームコレクション',
+ 'home.card_collection_desc' => 'ハードと楽曲パックのカタログ。',
+
+ 'links.title' => 'リンク — SillyLaird',
+ 'links.desc' => 'お約束のリンク集。',
+ 'links.h1' => 'リンク',
+ 'links.subtitle' => '好きなサイト。内容はまちまち。',
+ 'links.h2_buttons' => 'ボタン / バッジ',
+
+ 'guestbook.title' => 'ゲストブック — SillyLaird',
+ 'guestbook.desc' => 'PHP とデータベースで動く共有ゲストブック。',
+ 'guestbook.h1' => 'ゲストブック',
+ 'guestbook.subtitle' => '下のフォームからサインを!コメントは全員で共有されます。',
+ 'guestbook.reset_form' => 'フォームをリセット',
+ 'guestbook.reset_comments' => 'コメントをリセット',
+ 'guestbook.iframe_form' => 'ゲストブック記入フォーム',
+ 'guestbook.iframe_comments'=> 'ゲストブックのコメント',
+ 'guestbook.local_desc' => 'シンプルな localStorage ゲストブック。',
+ 'guestbook.local_subtitle' => 'このページはブラウザの localStorage に保存します。訪問者間では共有されません。',
+ 'guestbook.label_name' => '名前',
+ 'guestbook.label_message' => 'メッセージ',
+ 'guestbook.label_captcha' => 'キャプチャ',
+ 'guestbook.captcha_ph' => 'コードを入力',
+ 'guestbook.refresh_captcha'=> 'キャプチャを更新',
+ 'guestbook.submit' => '送信',
+];
diff --git a/locales/zh.php b/locales/zh.php
new file mode 100644
index 0000000..73ce96a
--- /dev/null
+++ b/locales/zh.php
@@ -0,0 +1,191 @@
+<?php
+// Chinese strings. Missing keys fall back to en.php.
+return [
+ 'common.skip' => '跳至内容',
+ 'common.top' => '↑ 回到顶部',
+
+ 'hitcounter.title' => '访客计数器 (本地)',
+ 'hitcounter.subtitle' => '使用 localStorage 和 sessionStorage,按浏览器统计独立访问。',
+ 'hitcounter.label' => '您是第几位访客:',
+
+ // profile — body kept in English in original triple
+
+ // multibox guide — ZH variant uses the short title/desc
+ 'multibox.title' => 'MMORPG Multiboxing Guide — SillyLaird',
+ 'multibox.desc' => 'Multiboxing guide landing page.',
+
+ // hat — original ZH page used a hybrid English+ZH title
+ 'hat.title' => 'Hat Collection Web网站 — SillyLaird',
+ 'hat.h1' => 'Hat Collection Web网站',
+
+ // links — ZH heading was partially translated; subtitle too
+ 'links.subtitle' => 'Web网站s I like. Content varies.',
+ 'links.grp_start' => '从这里开始',
+ 'links.grp_networks' => '网络',
+ 'links.grp_media' => '媒体',
+ 'links.grp_contact' => '联系方式',
+ 'links.h2_friends' => "朋友们' Sites",
+
+ // guestbook (local flow used by ZH)
+ 'guestbook.local_title' => '留言板 (Local) — SillyLaird',
+ 'guestbook.local_h1' => '留言板 (Local)',
+
+ // home / index
+ 'home.title' => '主页 — SillyLaird',
+ 'home.h1' => '莱尔德·隆纳根 (SillyLaird) — 个人主页',
+ 'home.tagline' => '终端气质遇上小网混沌',
+ 'home.where_start' => '从这里开始',
+ 'home.card_now' => 'Now',
+ 'home.card_now_desc' => '最近在做什么。',
+ 'home.card_blog' => '博客',
+ 'home.card_blog_desc' => '较长的文章和笔记。',
+ 'home.card_journal' => '日志',
+ 'home.card_journal_desc' => '日常短记录。',
+ 'home.card_gaming' => '游戏',
+ 'home.card_gaming_desc' => '我在玩和存档的游戏。',
+ 'home.network' => '网络 & 链接',
+ 'home.guestbook_form' => '留言',
+ 'home.guestbook_comments' => '最新评论',
+ 'home.made_with' => 'Made with ♥ on the small web',
+ 'home.welcome' => '欢迎!这是我的个人主页。它的定位是一个充满个性的简单链接枢纽,而不是一个公司网站。',
+ 'home.contact' => '联系',
+ 'home.pronunciation' => '发音: Laird Lonergan',
+ 'home.vibe' => '当前氛围',
+ 'home.music' => '音乐',
+ 'home.updates' => '最新更新',
+ 'home.blog' => '当前博客',
+ 'home.blog_visit' => 'Visit the full archive →',
+ 'home.changelog' => '更新日志',
+ 'home.changelog_visit' => 'Visit the full changelog →',
+ 'home.friends' => '朋友们',
+ 'home.guestbook' => '留言板',
+ 'home.guestbook_open' => '打开留言板',
+ 'home.refresh_form' => '刷新表单',
+ 'home.refresh_comments' => '刷新评论',
+ 'home.games' => '游戏',
+ 'home.countries' => '国家',
+ 'home.sponsors' => '赞助商 / VPN / 按钮',
+ 'home.loading' => '加载中…',
+ 'home.lastfm_loading' => '加载中…',
+ 'home.person.name' => '莱尔德·隆纳根',
+ 'home.person.jobtitle' => '软件开发人员 & 内容创作者',
+ 'home.person.desc' => '莱尔德·隆纳根 (SillyLaird) 的个人主页。包含链接、项目和个人日志。',
+ 'home.site.name' => 'SillyLaird 的个人主页',
+
+ // startpage (/startpage/)
+ 'startpage.title' => '起始页 — SillyLaird',
+ 'startpage.desc' => 'SillyLaird 的浏览器起始页 — 链接卡片、搜索栏、实时电台与正在播放,集中在一个终端风格的面板里。',
+
+ // fill gaps vs en.php (were falling back to English)
+ 'home.desc' => 'SillyLaird 的个人主页 — 终端气质、小网链接、实时音乐与电台、留言板、游戏档案,以及 clearnet / Tor / I2P / Gemini / Gopher 上的联系方式。',
+ 'home.now_playing' => '正在播放',
+ 'home.recent_tracks' => '最近曲目',
+ 'home.radio_listen' => '在 radio.sillylaird.ca 收听',
+ 'home.radio_loading' => '正在调谐电台',
+ 'home.radio_offline' => '电台当前离线',
+ 'home.guestbook_loading' => '正在加载最近评论',
+ 'home.guestbook_empty' => '还没有评论 — 来当第一个吧!',
+ 'home.guestbook_reload' => '重新加载评论',
+ 'home.lain_alt' => 'Lain 头像 — 《玲音》像素角色',
+ 'home.lain_secret_1' => 'Let\'s all love Lain.',
+ 'home.lain_secret_2' => 'Present day. Present time.',
+ 'home.lain_secret_3' => 'The wired is watching.',
+ 'home.visit_counter' => '您是第几位访客',
+ 'home.blog_visit' => '查看完整归档 →',
+ 'home.changelog_visit' => '查看完整更新日志 →',
+ 'home.sidebar_nav' => '主页导航',
+ 'home.sidebar_index' => '目录',
+ 'home.sidebar_top' => '顶部',
+ 'home.sidebar_vibe' => 'Last.fm / Vibe',
+ 'home.sidebar_network' => '网络',
+ 'home.sidebar_map' => '站点地图',
+ 'home.sidebar_startpage' => '起始页',
+ 'home.sidebar_altnets' => '替代网络',
+ 'home.sidebar_altnets_aria'=> '替代网络协议',
+
+ 'profile.title' => '个人资料 — SillyLaird',
+ 'profile.desc' => 'Laird Lonergan 的联系卡片 / 个人资料。',
+ 'profile.h1' => 'Laird Lonergan',
+ 'profile.subtitle' => '简洁的联系卡片。',
+
+ 'multibox.title_short' => 'MMORPG Multiboxing Guide — SillyLaird',
+ 'multibox.desc_short' => '多开指南落地页。',
+ 'multibox.h1' => 'MMORPG 多开指南',
+ 'multibox.subtitle' => '本指南已移入统一的游戏分区。',
+ 'multibox.link_main' => '多开(主页)',
+ 'multibox.link_what' => '什么是多开?(详细)',
+
+ 'hat.desc' => '帽子收藏网站的笔记 / 结构。',
+ 'hat.subtitle' => '笔记 / 布局草图。',
+
+ // game collection
+ 'collection.title' => '游戏收藏 — SillyLaird',
+ 'collection.desc' => '个人游戏目录 — 主机库与 Konami 曲包。',
+ 'collection.h1' => '游戏收藏',
+ 'collection.subtitle' => '手头的主机、游戏与曲包小目录。',
+ 'collection.games_label' => '款游戏',
+ 'collection.systems_label' => '个系统',
+ 'collection.empty' => '还没有系统。请在管理的 Collection 标签或 games.json 中添加。',
+ 'collection.empty_system' => '该系统下还没有游戏。',
+ 'collection.online_subtitle' => 'Konami 音游曲包与工具。每行是 游戏 :: 曲包名。',
+ 'collection.online_links_label' => '个曲包',
+ 'collection.online_empty' => '还没有曲包。请在管理的 Collection 标签中添加。',
+ 'collection.online_empty_cat' => '该游戏下还没有曲包。',
+ 'collection.visit_product' => '商店',
+ 'collection.no_photo' => '无图',
+ 'collection.jump_nav' => '收藏分区',
+ 'collection.menu_games' => '电子游戏',
+ 'collection.menu_videogames' => '电子游戏',
+ 'collection.menu_consoles' => '主机',
+ 'collection.menu_hardware' => '硬件',
+ 'collection.menu_tech' => '电子游戏',
+ 'collection.menu_packs' => '曲包',
+ 'collection.menu_online' => '曲包',
+ 'collection.menu_wishlist' => '愿望单',
+ 'collection.games_blurb' => '游戏标题。每行是 系统 :: 标题。',
+ 'collection.consoles_title' => '主机 — SillyLaird',
+ 'collection.consoles_blurb' => '游戏主机。每行是 名称 :: 型号。',
+ 'collection.consoles_label' => '台',
+ 'collection.consoles_empty' => '还没有主机。',
+ 'collection.hardware_title' => '硬件 — SillyLaird',
+ 'collection.hardware_page_blurb' => '机台、手柄、电脑等。每行是 名称 :: 型号。',
+ 'collection.hardware_label' => '件',
+ 'collection.hardware_empty' => '还没有硬件。',
+ 'collection.packs_title' => '曲包 — SillyLaird',
+ 'collection.wishlist_title' => '愿望单 — SillyLaird',
+ 'collection.wishlist_blurb' => '接下来想要的主机与曲包。',
+ 'collection.wishlist_count' => '项',
+ 'collection.wishlist_empty' => '愿望单为空。请在管理后台标为 Wishlist。',
+ 'collection.spec_system' => '系统',
+ 'collection.spec_game' => '游戏',
+ 'collection.spec_status' => '状态',
+ 'collection.spec_link' => '链接',
+ 'collection.spec_link_yes' => '商店页',
+ 'collection.back_gaming' => '← 游戏中心',
+ 'collection.back_home' => '首页',
+ 'home.card_collection' => '游戏收藏',
+ 'home.card_collection_desc' => '主机库 + 曲包目录。',
+
+ 'links.title' => '链接 — SillyLaird',
+ 'links.desc' => '例行的链接页。',
+ 'links.h1' => '链接',
+ 'links.subtitle' => '我喜欢的网站。内容各异。',
+ 'links.h2_buttons' => '按钮 / 徽章',
+
+ 'guestbook.title' => '留言板 — SillyLaird',
+ 'guestbook.desc' => '由 PHP 和数据库驱动的共享留言板。',
+ 'guestbook.h1' => '留言板',
+ 'guestbook.subtitle' => '在下方签名吧!评论对所有访客共享。',
+ 'guestbook.reset_form' => '重置表单',
+ 'guestbook.reset_comments' => '重置评论',
+ 'guestbook.iframe_form' => '留言板表单',
+ 'guestbook.iframe_comments'=> '留言板评论',
+ 'guestbook.local_desc' => '简单的 localStorage 留言板。',
+ 'guestbook.local_subtitle' => '本页将条目保存在浏览器 localStorage 中,访客之间不共享。',
+ 'guestbook.label_name' => '名字',
+ 'guestbook.label_message' => '留言',
+ 'guestbook.label_captcha' => '验证码',
+ 'guestbook.captcha_ph' => '输入代码',
+ 'guestbook.refresh_captcha'=> '刷新验证码',
+ 'guestbook.submit' => '提交',
+];