// ========== i18n 翻译文件 ==========
const I18N = {
zh: {
nav_search: '搜索技能',
nav_categories: '职业分类',
nav_insights: '洞察',
hero_badge: '✦ 中文开发者首选 AI 技能集市',
hero_title: '发现最好的 AI Agent 技能',
hero_sub: '为主流 AI Agent 提供精选技能包,一键安装免配置,开箱即用提升开发效率',
search_placeholder: '搜索 1,000,000+ 个 skill 请输入关键词...',
search_btn: '搜索',
tab_popular: '⭐ 热门',
tab_recent: '🕐 最新',
tab_official: '✅ 官方',
tab_favorites: '❤ 收藏',
tab_history: '📋 历史',
filter_occ: '职业',
filter_cat: '分类',
filter_all_occ: '🌐 全部职业',
filter_all_cat: '🌐 全部分类',
results_info: '显示',
results_of: '/',
results_unit: '个结果',
loading: '加载中…',
empty_title: '未找到相关技能',
empty_desc: '尝试更换关键词或调整筛选条件',
empty_reset: '清空筛选',
footer_copy: '© 2026 skillsABC.com — AI Agent 技能集市',
footer_about: '关于我们',
footer_api: '开发者 API',
footer_submit: '提交技能',
footer_terms: '条款',
footer_privacy: '隐私',
},
en: {
nav_search: 'Search Skills',
nav_categories: 'Categories',
nav_insights: 'Insights',
hero_badge: '✦ #1 AI Skills Marketplace',
hero_title: 'Discover the Best AI Agent Skills',
hero_sub: 'Curated skill packs for Claude Code, Codex, ChatGPT — install in one click',
search_placeholder: 'Search 1,000,000+ skills, e.g. "code review", "git automation"...',
search_btn: 'Search',
tab_popular: '⭐ Popular',
tab_recent: '🕐 Recent',
tab_official: '✅ Official',
tab_favorites: '❤ Favorites',
tab_history: '📋 History',
filter_occ: 'Occupation',
filter_cat: 'Category',
filter_all_occ: '🌐 All Occupations',
filter_all_cat: '🌐 All Categories',
results_info: 'Showing',
results_of: '/',
results_unit: 'results',
loading: 'Loading…',
empty_title: 'No skills found',
empty_desc: 'Try different keywords or adjust filters',
empty_reset: 'Clear filters',
footer_copy: '© 2026 skillsABC.com — AI Agent Skills Marketplace',
footer_about: 'About Us',
footer_api: 'Developer API',
footer_submit: 'Submit Skill',
footer_terms: 'Terms',
footer_privacy: 'Privacy',
},
de: {
nav_search: 'Skills suchen',
nav_categories: 'Kategorien',
nav_insights: 'Einblicke',
hero_badge: '✦ Der führende KI-Skills-Marktplatz',
hero_title: 'Entdecke die besten AI Agent Skills',
hero_sub: 'Kuratierte Skill-Pakete für Claude Code, Codex, ChatGPT – mit einem Klick installieren',
search_placeholder: 'Suche 1.000.000+ Skills, z.B. "Code Review", "Git Automation"...',
search_btn: 'Suchen',
tab_popular: '⭐ Beliebt',
tab_recent: '🕐 Neu',
tab_official: '✅ Offiziell',
tab_favorites: '❤ Favoriten',
tab_history: '📋 Verlauf',
filter_occ: 'Beruf',
filter_cat: 'Kategorie',
filter_all_occ: '🌐 Alle Berufe',
filter_all_cat: '🌐 Alle Kategorien',
results_info: 'Zeige',
results_of: '/',
results_unit: 'Ergebnisse',
loading: 'Laden…',
empty_title: 'Keine Skills gefunden',
empty_desc: 'Versuche andere Suchbegriffe oder passe die Filter an',
empty_reset: 'Filter zurücksetzen',
footer_copy: '© 2026 skillsABC.com — KI-Skills-Marktplatz',
footer_about: 'Über uns',
footer_api: 'Entwickler API',
footer_submit: 'Skill einreichen',
footer_terms: 'Nutzungsbedingungen',
footer_privacy: 'Datenschutz',
},
es: {
nav_search: 'Buscar Skills',
nav_categories: 'Categorías',
nav_insights: 'Perspectivas',
hero_badge: '✦ El mercado líder de habilidades de IA',
hero_title: 'Descubre las mejores habilidades de AI Agent',
hero_sub: 'Paquetes de habilidades para Claude Code, Codex, ChatGPT — instala con un clic',
search_placeholder: 'Busca 1.000.000+ skills, p.ej. "revisión de código"...',
search_btn: 'Buscar',
tab_popular: '⭐ Popular',
tab_recent: '🕐 Reciente',
tab_official: '✅ Oficial',
tab_favorites: '❤ Favoritos',
tab_history: '📋 Historial',
filter_occ: 'Ocupación',
filter_cat: 'Categoría',
filter_all_occ: '🌐 Todas las ocupaciones',
filter_all_cat: '🌐 Todas las categorías',
results_info: 'Mostrando',
results_of: '/',
results_unit: 'resultados',
loading: 'Cargando…',
empty_title: 'No se encontraron skills',
empty_desc: 'Prueba con otras palabras clave o ajusta los filtros',
empty_reset: 'Limpiar filtros',
footer_copy: '© 2026 skillsABC.com — Mercado de habilidades de IA',
footer_about: 'Sobre nosotros',
footer_api: 'API para desarrolladores',
footer_submit: 'Enviar skill',
footer_terms: 'Términos',
footer_privacy: 'Privacidad',
},
fr: {
nav_search: 'Rechercher des Skills',
nav_categories: 'Catégories',
nav_insights: 'Analyses',
hero_badge: '✦ La marketplace de compétences IA n°1',
hero_title: 'Découvrez les meilleures compétences AI Agent',
hero_sub: 'Packs de compétences pour Claude Code, Codex, ChatGPT — installation en un clic',
search_placeholder: 'Rechercher 1 000 000+ skills, ex. "revue de code"...',
search_btn: 'Rechercher',
tab_popular: '⭐ Populaire',
tab_recent: '🕐 Récent',
tab_official: '✅ Officiel',
tab_favorites: '❤ Favoris',
tab_history: '📋 Historique',
filter_occ: 'Métier',
filter_cat: 'Catégorie',
filter_all_occ: '🌐 Tous les métiers',
filter_all_cat: '🌐 Toutes les catégories',
results_info: 'Affichage',
results_of: '/',
results_unit: 'résultats',
loading: 'Chargement…',
empty_title: 'Aucun skill trouvé',
empty_desc: 'Essayez d\'autres mots-clés ou ajustez les filtres',
empty_reset: 'Réinitialiser',
footer_copy: '© 2026 skillsABC.com — Marketplace de compétences IA',
footer_about: 'À propos',
footer_api: 'API développeur',
footer_submit: 'Soumettre un skill',
footer_terms: 'Conditions',
footer_privacy: 'Confidentialité',
},
ja: {
nav_search: 'スキルを検索',
nav_categories: '職業分類',
nav_insights: 'インサイト',
hero_badge: '✦ AIスキルマーケットプレイス',
hero_title: '最高の AI Agent スキル を発見',
hero_sub: 'Claude Code、Codex、ChatGPT向けの厳選スキルパック — ワンクリックでインストール',
search_placeholder: '100万以上のスキルを検索、例: "コードレビュー"...',
search_btn: '検索',
tab_popular: '⭐ 人気',
tab_recent: '🕐 最新',
tab_official: '✅ 公式',
tab_favorites: '❤ お気に入り',
tab_history: '📋 履歴',
filter_occ: '職業',
filter_cat: 'カテゴリ',
filter_all_occ: '🌐 すべての職業',
filter_all_cat: '🌐 すべてのカテゴリ',
results_info: '表示中',
results_of: '/',
results_unit: '件',
loading: '読み込み中…',
empty_title: 'スキルが見つかりません',
empty_desc: '別のキーワードを試すか、フィルターを調整してください',
empty_reset: 'フィルターをリセット',
footer_copy: '© 2026 skillsABC.com — AIスキルマーケットプレイス',
footer_about: '私たちについて',
footer_api: '開発者 API',
footer_submit: 'スキルを投稿',
footer_terms: '利用規約',
footer_privacy: 'プライバシー',
},
ko: {
nav_search: '스킬 검색',
nav_categories: '직업 분류',
nav_insights: '인사이트',
hero_badge: '✦ AI 스킬 마켓플레이스',
hero_title: '최고의 AI Agent 스킬 발견',
hero_sub: 'Claude Code, Codex, ChatGPT용 엄선된 스킬 팩 — 원클릭 설치',
search_placeholder: '100만+ 스킬 검색, 예: "코드 리뷰"...',
search_btn: '검색',
tab_popular: '⭐ 인기',
tab_recent: '🕐 최신',
tab_official: '✅ 공식',
tab_favorites: '❤ 즐겨찾기',
tab_history: '📋 기록',
filter_occ: '직업',
filter_cat: '카테고리',
filter_all_occ: '🌐 모든 직업',
filter_all_cat: '🌐 모든 카테고리',
results_info: '표시 중',
results_of: '/',
results_unit: '개 결과',
loading: '로딩 중…',
empty_title: '스킬을 찾을 수 없습니다',
empty_desc: '다른 키워드를 시도하거나 필터를 조정하세요',
empty_reset: '필터 초기화',
footer_copy: '© 2026 skillsABC.com — AI 스킬 마켓플레이스',
footer_about: '회사 소개',
footer_api: '개발자 API',
footer_submit: '스킬 제출',
footer_terms: '이용약관',
footer_privacy: '개인정보',
},
pt: {
nav_search: 'Pesquisar Skills',
nav_categories: 'Categorias',
nav_insights: 'Insights',
hero_badge: '✦ O marketplace líder de habilidades de IA',
hero_title: 'Descubra as melhores habilidades de AI Agent',
hero_sub: 'Pacotes de habilidades para Claude Code, Codex, ChatGPT — instale com um clique',
search_placeholder: 'Pesquise 1.000.000+ skills, ex: "revisão de código"...',
search_btn: 'Pesquisar',
tab_popular: '⭐ Popular',
tab_recent: '🕐 Recente',
tab_official: '✅ Oficial',
tab_favorites: '❤ Favoritos',
tab_history: '📋 Histórico',
filter_occ: 'Ocupação',
filter_cat: 'Categoria',
filter_all_occ: '🌐 Todas as ocupações',
filter_all_cat: '🌐 Todas as categorias',
results_info: 'Mostrando',
results_of: '/',
results_unit: 'resultados',
loading: 'Carregando…',
empty_title: 'Nenhum skill encontrado',
empty_desc: 'Tente outras palavras-chave ou ajuste os filtros',
empty_reset: 'Limpar filtros',
footer_copy: '© 2026 skillsABC.com — Marketplace de habilidades de IA',
footer_about: 'Sobre nós',
footer_api: 'API para desenvolvedores',
footer_submit: 'Enviar skill',
footer_terms: 'Termos',
footer_privacy: 'Privacidade',
},
ar: {
nav_search: 'البحث عن المهارات',
nav_categories: 'التصنيفات',
nav_insights: 'رؤى',
hero_badge: '✦ سوق مهارات الذكاء الاصطناعي الأول',
hero_title: 'اكتشف أفضل مهارات AI Agent',
hero_sub: 'حزم مهارات منتقاة لـ Claude Code وCodex وChatGPT — تثبيت بنقرة واحدة',
search_placeholder: 'ابحث في أكثر من مليون مهارة...',
search_btn: 'بحث',
tab_popular: '⭐ الأكثر شيوعاً',
tab_recent: '🕐 الأحدث',
tab_official: '✅ رسمي',
tab_favorites: '❤ المفضلة',
tab_history: '📋 السجل',
filter_occ: 'المهنة',
filter_cat: 'الفئة',
filter_all_occ: '🌐 جميع المهن',
filter_all_cat: '🌐 جميع الفئات',
results_info: 'عرض',
results_of: '/',
results_unit: 'نتائج',
loading: 'جارٍ التحميل…',
empty_title: 'لم يتم العثور على مهارات',
empty_desc: 'جرب كلمات مفتاحية مختلفة أو عدّل الفلاتر',
empty_reset: 'مسح الفلاتر',
footer_copy: '© 2026 skillsABC.com — سوق مهارات الذكاء الاصطناعي',
footer_about: 'من نحن',
footer_api: 'واجهة برمجية للمطورين',
footer_submit: 'إرسال مهارة',
footer_terms: 'الشروط',
footer_privacy: 'الخصوصية',
},
};
function applyI18n(lang) {
const t = I18N[lang] || I18N.zh;
const s = (id, html) => { const el = document.getElementById(id); if (el) el.innerHTML = html; };
const st = (id, text) => { const el = document.getElementById(id); if (el) el.textContent = text; };
const sa = (id, attr, val) => { const el = document.getElementById(id); if (el) el.setAttribute(attr, val); };
const sq = (sel, html) => { const el = document.querySelector(sel); if (el) el.innerHTML = html; };
// 导航
sq('a[href="categories.html"]', t.nav_categories);
sq('a[href="insights.html"]', t.nav_insights);
// Hero
sq('.hero-badge', t.hero_badge);
sq('.hero h1', t.hero_title);
st('heroSub', t.hero_sub);
sa('searchInput', 'placeholder', t.search_placeholder);
sq('.search-box button', t.search_btn);
// 标签页
st('tabPopular', t.tab_popular);
st('tabRecent', t.tab_recent);
st('tabOfficial', t.tab_official);
st('tabFavorites', t.tab_favorites);
st('tabHistory', t.tab_history);
// 筛选
st('occFilterLabel', t.filter_occ);
st('catFilterLabel', t.filter_cat);
sq('#occDropdown .occ-option', t.filter_all_occ);
sq('#catDropdown .occ-option', t.filter_all_cat);
// 空状态
sq('.empty-title', t.empty_title);
sq('.empty-desc', t.empty_desc);
sq('.empty-reset', t.empty_reset);
// Footer
st('footerCopy', t.footer_copy);
st('footerAbout', t.footer_about);
st('footerApi', t.footer_api);
st('footerSubmit', t.footer_submit);
st('footerTerms', t.footer_terms);
st('footerPrivacy', t.footer_privacy);
// 重新渲染职业/分类下拉列表
if (typeof ALL_CATS_DATA !== 'undefined' && ALL_CATS_DATA.length) {
const list = document.getElementById('occOptionsList');
if (list) {
list.innerHTML = ALL_CATS_DATA.map(cat => {
const icon = (typeof ICON_MAP !== 'undefined' && ICON_MAP[cat.slug]) || '📁';
return `
${icon} ${getCatName(cat, lang)}
`;
}).join('');
}
// 重新渲染当前选中职业的子分类
if (typeof currentOcc !== 'undefined' && currentOcc && typeof ALL_CATEGORIES !== 'undefined' && ALL_CATEGORIES[currentOcc]) {
const catList = document.getElementById('catOptionsList');
if (catList) {
catList.innerHTML = ALL_CATEGORIES[currentOcc].map(o =>
`📌 ${getCatName(o, lang)}
`
).join('');
}
}
}
// RTL 支持(阿拉伯语)
document.documentElement.dir = lang === 'ar' ? 'rtl' : 'ltr';
// categories.html 专用翻译
if (typeof applyCatI18n === 'function') applyCatI18n(lang);
// index.html 分类下拉框重渲染
if (typeof rerenderOccDropdown === 'function') rerenderOccDropdown(lang);
}
// 页面加载时应用当前语言(由 auth.js 的 DOMContentLoaded 统一调用)
function initI18n() {
const urlLang = new URLSearchParams(window.location.search).get('lang');
const lang = urlLang || localStorage.getItem('sa_lang') || 'zh';
applyI18n(lang);
}
// ===== 详情页 i18n =====
const DETAIL_I18N = {
zh: {
nav_categories: "职业分类", nav_insights: "洞察",
bc_home: "首页", bc_categories: "职业分类",
tab_details: "Details", tab_example: "Example",
lbl_stars: "stars", lbl_forks: "forks", lbl_updated: "更新时间",
install1_title: "安装方式一:skillsABC 命令安装",
install1_hint: "安装说明",
install2_title: "安装方式二:",
install2_hint: "手动安装说明",
dl_zip: "⬇ 下载 Zip 包",
dl_auto_hint: "[自动安装说明] 下载zip包-解压到目录-对智能体说:给我安装这个目录的skill",
guide_title: "安装指南",
guide_step1_title: "⬇ 第一步:下载技能",
guide_step1_desc: "点击上方【下载 Zip 包】按钮下载技能文件",
guide_step2_title: "⚙ 第二步:打开设置",
guide_step2_desc: "打开 Claude 客户端,进入 设置 > 功能",
guide_step3_title: "⬆ 第三步:上传技能",
guide_step3_desc: "点击上传技能按钮,选择下载的 zip 文件完成安装",
cli_title: "命令行安装说明",
cli_desc: "电脑打开PowerShell或者cmd后,复制下面 skillsABC命令 使用或者管理技能:",
loading: "加载中...", no_example: "暂无示例内容", loading_github: "正在从 GitHub 加载 SKILL.md…", loading_github_hint: "首次加载可能需要几秒钟",
footer_copy: "© 2026 skillsABC", footer_about: "关于",
footer_privacy: "隐私政策", footer_contact: "联系我们",
cmd1_title: "安装技能(自动检测 AI 工具目录)",
cmd1_desc: "自动检测当前项目使用的 AI 工具,安装到对应目录。",
cmd2_title: "安装到全局目录",
cmd2_desc: "安装到 ~/.skills/ 全局目录,所有项目共享。",
cmd3_title: "安装到 Claude Code",
cmd3_desc: "安装到当前项目的 .claude/skills/ 目录,供 Claude Code 使用。",
cmd4_title: "安装到 Cursor",
cmd4_desc: "安装到当前项目的 .cursor/rules/ 目录,供 Cursor 使用。",
cmd5_title: "安装到 ChatGPT",
cmd5_desc: "安装到当前项目的 .chatgpt/instructions/ 目录,供 ChatGPT 使用。",
cmd6_title: "查看已安装的技能",
cmd6_desc: "列出当前项目和全局已安装的所有技能及其路径。",
cmd7_title: "更新技能",
cmd7_desc: "重新下载最新版本,覆盖已安装的技能文件。",
cmd8_title: "删除技能",
cmd8_desc: "删除已安装的技能文件并移除安装记录。",
copy_ok: "✓ 复制成功",
share_btn: "分享", fav_btn: "收藏",
share_chk_link: "复制链接", share_chk_title: "标题 + 描述",
share_copy_btn: "复制并去粘贴分享", share_toast: "已复制,请打开微信粘贴分享 ✓",
share_least: "请至少勾选一项",
comment_title: "使用反馈", comment_submit: "发布反馈",
test_images_title: "Skill 展示图",
comment_placeholder_nick: "昵称(选填)", comment_placeholder_body: "分享使用技巧、踩坑经验或问题(10字以上)",
comment_hint: "无关内容会被自动过滤", comment_empty: "暂无反馈,来第一个分享吧",
comment_limit: "今日留言次数已超过,明天再来", comment_min_len: "内容至少10个字",
comment_ok: "反馈已提交,审核后显示 ✓", comment_unit: "条",
comment_view_all: "查看全部 {n} 条反馈 →",
comment_more_btn: "更多评论(共 {n} 条)→",
cp_feedback_title: "用户反馈", cp_h1_suffix: "用户使用反馈",
cp_meta_desc: "用户使用反馈、技巧与踩坑经验",
cp_sub: "真实用户分享的使用技巧、踩坑经验与问题",
cp_bc_feedback: "用户反馈", cp_card_title: "技能信息",
cp_back: "← 返回技能详情", comment_ok_btn: "知道了",
weekdays: ['周日','周一','周二','周三','周四','周五','周六'],
},
en: {
nav_categories: "Categories", nav_insights: "Insights",
bc_home: "Home", bc_categories: "Categories",
tab_details: "Details", tab_example: "Example",
lbl_stars: "stars", lbl_forks: "forks", lbl_updated: "Updated",
install1_title: "Install via skillsABC CLI",
install1_hint: "Install Guide",
install2_title: "Manual Install:",
install2_hint: "Manual Guide",
dl_zip: "⬇ Download Zip",
dl_auto_hint: "[Auto Install] Download zip, extract to directory, tell your AI agent: install the skill in this directory",
guide_title: "Installation Guide",
guide_step1_title: "⬇ Step 1: Download",
guide_step1_desc: "Click the Download Zip button above",
guide_step2_title: "⚙ Step 2: Open Settings",
guide_step2_desc: "Open Claude client, go to Settings > Features",
guide_step3_title: "⬆ Step 3: Upload Skill",
guide_step3_desc: "Click Upload Skill and select the downloaded zip file",
cli_title: "CLI Installation Guide",
cli_desc: "Open PowerShell or cmd, copy the skillsABC command below:",
loading: "Loading...", no_example: "No example available", loading_github: "Loading SKILL.md from GitHub…", loading_github_hint: "First load may take a few seconds",
footer_copy: "© 2026 skillsABC", footer_about: "About",
footer_privacy: "Privacy Policy", footer_contact: "Contact",
cmd1_title: "Install Skill (auto-detect AI tool)",
cmd1_desc: "Auto-detects the AI tool used in the current project and installs to the correct directory.",
cmd2_title: "Install Globally",
cmd2_desc: "Install to ~/.skills/ global directory, shared across all projects.",
cmd3_title: "Install for Claude Code",
cmd3_desc: "Install to .claude/skills/ in the current project.",
cmd4_title: "Install for Cursor",
cmd4_desc: "Install to .cursor/rules/ in the current project.",
cmd5_title: "Install for ChatGPT",
cmd5_desc: "Install to .chatgpt/instructions/ in the current project.",
cmd6_title: "List Installed Skills",
cmd6_desc: "List all installed skills and their paths.",
cmd7_title: "Update Skill",
cmd7_desc: "Re-download the latest version, overwriting existing files.",
cmd8_title: "Remove Skill",
cmd8_desc: "Delete the skill files and remove the install record.",
copy_ok: "✓ Copied",
share_btn: "Share", fav_btn: "Favorite",
share_chk_link: "Copy link", share_chk_title: "Title + Description",
share_copy_btn: "Copy & paste to share", share_toast: "Copied! Open WeChat and paste to share ✓",
share_least: "Please check at least one option",
comment_title: "Feedback", comment_submit: "Post",
test_images_title: "Skill Screenshots",
comment_hint: "Off-topic content will be filtered", comment_empty: "No feedback yet. Be the first!",
comment_limit: "Daily limit reached. Come back tomorrow!", comment_min_len: "Content must be at least 10 characters",
comment_ok: "Submitted! Will show after review ✓", comment_unit: "",
comment_view_all: "View all {n} feedback →",
comment_more_btn: "More feedback ({n} total) →",
cp_feedback_title: "User Feedback", cp_h1_suffix: "User Feedback",
cp_meta_desc: "User feedback, tips and lessons learned",
cp_sub: "Real user tips, lessons learned and questions",
cp_bc_feedback: "Feedback", cp_card_title: "Skill Info",
cp_back: "← Back to Skill", comment_ok_btn: "Got it",
weekdays: ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],
},
de: {
nav_categories: "Kategorien",
nav_insights: "Einblicke",
bc_home: "Startseite",
bc_categories: "Kategorien",
tab_details: "Details",
tab_example: "Beispiel",
lbl_stars: "Sterne",
lbl_forks: "Forks",
lbl_updated: "Aktualisiert",
install1_title: "Installation per skillsABC CLI",
install1_hint: "Installationsanleitung",
install2_title: "Manuelle Installation:",
install2_hint: "Manuelle Anleitung",
dl_zip: "⬇ Zip herunterladen",
dl_auto_hint: "[Auto-Install] Zip herunterladen, entpacken, KI-Agent sagen: Installiere den Skill in diesem Verzeichnis",
guide_title: "Installationsanleitung",
guide_step1_title: "⬇ Schritt 1: Herunterladen",
guide_step1_desc: "Klicke oben auf Zip herunterladen",
guide_step2_title: "⚙ Schritt 2: Einstellungen öffnen",
guide_step2_desc: "Claude-Client öffnen, Einstellungen > Funktionen",
guide_step3_title: "⬆ Schritt 3: Skill hochladen",
guide_step3_desc: "Skill hochladen klicken und Zip-Datei auswählen",
cli_title: "CLI-Installationsanleitung",
cli_desc: "PowerShell oder cmd öffnen, skillsABC-Befehl kopieren:",
loading: "Laden...",
no_example: "Kein Beispiel verfügbar", loading_github: "SKILL.md wird von GitHub geladen…", loading_github_hint: "Erster Ladevorgang kann einige Sekunden dauern",
footer_copy: "© 2026 skillsABC",
footer_about: "Über uns",
footer_privacy: "Datenschutz",
footer_contact: "Kontakt",
cmd1_title: "Skill installieren (KI-Tool auto-erkennen)",
cmd1_desc: "Erkennt automatisch das KI-Tool und installiert in das richtige Verzeichnis.",
cmd2_title: "Global installieren",
cmd2_desc: "In ~/.skills/ installieren, für alle Projekte verfügbar.",
cmd3_title: "Für Claude Code installieren",
cmd3_desc: "In .claude/skills/ des aktuellen Projekts installieren.",
cmd4_title: "Für Cursor installieren",
cmd4_desc: "In .cursor/rules/ des aktuellen Projekts installieren.",
cmd5_title: "Für ChatGPT installieren",
cmd5_desc: "In .chatgpt/instructions/ des aktuellen Projekts installieren.",
cmd6_title: "Installierte Skills auflisten",
cmd6_desc: "Alle installierten Skills und ihre Pfade anzeigen.",
cmd7_title: "Skill aktualisieren",
cmd7_desc: "Neueste Version herunterladen und vorhandene Dateien überschreiben.",
cmd8_title: "Skill entfernen",
cmd8_desc: "Skill-Dateien löschen und Installationseintrag entfernen.",
copy_ok: "✓ Kopiert",
share_btn: "Teilen", fav_btn: "Favorit",
share_chk_link: "Link kopieren", share_chk_title: "Titel + Beschreibung",
share_copy_btn: "Kopieren & teilen", share_toast: "Kopiert! WeChat öffnen und einfügen ✓",
share_least: "Bitte mindestens eine Option auswählen",
comment_title: "Feedback", comment_submit: "Senden",
test_images_title: "Skill Screenshots",
comment_placeholder_nick: "Spitzname (optional)", comment_placeholder_body: "Tipps, Probleme oder Fragen teilen (mind. 10 Zeichen)",
comment_hint: "Themenfremde Inhalte werden gefiltert", comment_empty: "Noch kein Feedback. Sei der Erste!",
comment_limit: "Tageslimit erreicht. Komm morgen wieder!", comment_min_len: "Mindestens 10 Zeichen erforderlich",
comment_ok: "Eingereicht! Wird nach Prüfung angezeigt ✓", comment_unit: "",
comment_view_all: "Alle {n} Bewertungen anzeigen →",
comment_more_btn: "Mehr Bewertungen ({n} gesamt) →",
cp_feedback_title: "Nutzerfeedback", cp_h1_suffix: "Nutzerfeedback",
cp_meta_desc: "Nutzerfeedback, Tipps und Erfahrungen",
cp_sub: "Echte Tipps, Erfahrungen und Fragen von Nutzern",
cp_bc_feedback: "Feedback", cp_card_title: "Skill-Info",
cp_back: "← Zurück zum Skill", comment_ok_btn: "Verstanden",
weekdays: ["So","Mo","Di","Mi","Do","Fr","Sa"],
},
es: {
nav_categories: "Categorías",
nav_insights: "Perspectivas",
bc_home: "Inicio",
bc_categories: "Categorías",
tab_details: "Detalles",
tab_example: "Ejemplo",
lbl_stars: "estrellas",
lbl_forks: "forks",
lbl_updated: "Actualizado",
install1_title: "Instalar con skillsABC CLI",
install1_hint: "Guía de instalación",
install2_title: "Instalación manual:",
install2_hint: "Guía manual",
dl_zip: "⬇ Descargar Zip",
dl_auto_hint: "[Auto-instalación] Descarga el zip, extrae al directorio, dile a tu agente IA: instala el skill en este directorio",
guide_title: "Guía de instalación",
guide_step1_title: "⬇ Paso 1: Descargar",
guide_step1_desc: "Haz clic en el botón Descargar Zip",
guide_step2_title: "⚙ Paso 2: Abrir ajustes",
guide_step2_desc: "Abre el cliente Claude, ve a Ajustes > Funciones",
guide_step3_title: "⬆ Paso 3: Subir skill",
guide_step3_desc: "Haz clic en Subir Skill y selecciona el archivo zip",
cli_title: "Guía de instalación CLI",
cli_desc: "Abre PowerShell o cmd, copia el comando skillsABC:",
loading: "Cargando...",
no_example: "Sin ejemplo disponible", loading_github: "Cargando SKILL.md desde GitHub…", loading_github_hint: "La primera carga puede tardar unos segundos",
footer_copy: "© 2026 skillsABC",
footer_about: "Acerca de",
footer_privacy: "Privacidad",
footer_contact: "Contacto",
cmd1_title: "Instalar skill (detectar herramienta IA)",
cmd1_desc: "Detecta automáticamente la herramienta IA e instala en el directorio correcto.",
cmd2_title: "Instalar globalmente",
cmd2_desc: "Instalar en ~/.skills/, compartido entre todos los proyectos.",
cmd3_title: "Instalar para Claude Code",
cmd3_desc: "Instalar en .claude/skills/ del proyecto actual.",
cmd4_title: "Instalar para Cursor",
cmd4_desc: "Instalar en .cursor/rules/ del proyecto actual.",
cmd5_title: "Instalar para ChatGPT",
cmd5_desc: "Instalar en .chatgpt/instructions/ del proyecto actual.",
cmd6_title: "Listar skills instalados",
cmd6_desc: "Listar todos los skills instalados y sus rutas.",
cmd7_title: "Actualizar skill",
cmd7_desc: "Descargar la última versión, sobreescribiendo archivos existentes.",
cmd8_title: "Eliminar skill",
cmd8_desc: "Eliminar archivos del skill y el registro de instalación.",
copy_ok: "✓ Copiado",
share_btn: "Compartir", fav_btn: "Favorito",
share_chk_link: "Copiar enlace", share_chk_title: "Título + Descripción",
share_copy_btn: "Copiar y compartir", share_toast: "¡Copiado! Abre WeChat y pega para compartir ✓",
share_least: "Por favor marca al menos una opción",
comment_title: "Comentarios", comment_submit: "Publicar",
test_images_title: "Capturas de Skill",
comment_placeholder_nick: "Apodo (opcional)", comment_placeholder_body: "Comparte consejos, problemas o preguntas (mín. 10 caracteres)",
comment_hint: "El contenido irrelevante será filtrado", comment_empty: "Sin comentarios aún. ¡Sé el primero!",
comment_limit: "Límite diario alcanzado. ¡Vuelve mañana!", comment_min_len: "El contenido debe tener al menos 10 caracteres",
comment_ok: "¡Enviado! Se mostrará tras revisión ✓", comment_unit: "",
comment_view_all: "Ver los {n} comentarios →",
comment_more_btn: "Más comentarios ({n} en total) →",
cp_feedback_title: "Comentarios", cp_h1_suffix: "Comentarios de usuarios",
cp_meta_desc: "Comentarios, consejos y experiencias de usuarios",
cp_sub: "Consejos reales, experiencias y preguntas de usuarios",
cp_bc_feedback: "Comentarios", cp_card_title: "Info del skill",
cp_back: "← Volver al skill", comment_ok_btn: "Entendido",
weekdays: ["Dom","Lun","Mar","Mié","Jue","Vie","Sáb"],
},
fr: {
nav_categories: "Catégories",
nav_insights: "Analyses",
bc_home: "Accueil",
bc_categories: "Catégories",
tab_details: "Détails",
tab_example: "Exemple",
lbl_stars: "étoiles",
lbl_forks: "forks",
lbl_updated: "Mis à jour",
install1_title: "Installer via skillsABC CLI",
install1_hint: "Guide d'installation",
install2_title: "Installation manuelle :",
install2_hint: "Guide manuel",
dl_zip: "⬇ Télécharger Zip",
dl_auto_hint: "[Auto-install] Télécharger le zip, extraire dans le répertoire, dire à l'agent IA : installe le skill dans ce répertoire",
guide_title: "Guide d'installation",
guide_step1_title: "⬇ Étape 1 : Télécharger",
guide_step1_desc: "Cliquez sur le bouton Télécharger Zip ci-dessus",
guide_step2_title: "⚙ Étape 2 : Ouvrir les paramètres",
guide_step2_desc: "Ouvrir le client Claude, aller dans Paramètres > Fonctionnalités",
guide_step3_title: "⬆ Étape 3 : Téléverser le skill",
guide_step3_desc: "Cliquer sur Téléverser le skill et sélectionner le fichier zip",
cli_title: "Guide d'installation CLI",
cli_desc: "Ouvrir PowerShell ou cmd, copier la commande skillsABC :",
loading: "Chargement...",
no_example: "Aucun exemple disponible", loading_github: "Chargement de SKILL.md depuis GitHub…", loading_github_hint: "Le premier chargement peut prendre quelques secondes",
footer_copy: "© 2026 skillsABC",
footer_about: "À propos",
footer_privacy: "Confidentialité",
footer_contact: "Contact",
cmd1_title: "Installer le skill (détection auto de l'outil IA)",
cmd1_desc: "Détecte automatiquement l'outil IA et installe dans le bon répertoire.",
cmd2_title: "Installer globalement",
cmd2_desc: "Installer dans ~/.skills/, partagé entre tous les projets.",
cmd3_title: "Installer pour Claude Code",
cmd3_desc: "Installer dans .claude/skills/ du projet actuel.",
cmd4_title: "Installer pour Cursor",
cmd4_desc: "Installer dans .cursor/rules/ du projet actuel.",
cmd5_title: "Installer pour ChatGPT",
cmd5_desc: "Installer dans .chatgpt/instructions/ du projet actuel.",
cmd6_title: "Lister les skills installés",
cmd6_desc: "Lister tous les skills installés et leurs chemins.",
cmd7_title: "Mettre à jour le skill",
cmd7_desc: "Télécharger la dernière version en écrasant les fichiers existants.",
cmd8_title: "Supprimer le skill",
cmd8_desc: "Supprimer les fichiers du skill et l'enregistrement d'installation.",
copy_ok: "✓ Copié",
share_btn: "Partager", fav_btn: "Favori",
share_chk_link: "Copier le lien", share_chk_title: "Titre + Description",
share_copy_btn: "Copier et partager", share_toast: "Copié ! Ouvrez WeChat et collez pour partager ✓",
share_least: "Veuillez cocher au moins une option",
comment_title: "Commentaires", comment_submit: "Publier",
test_images_title: "Captures Skill",
comment_placeholder_nick: "Pseudo (facultatif)", comment_placeholder_body: "Partagez conseils, problèmes ou questions (min. 10 caractères)",
comment_hint: "Le contenu hors sujet sera filtré", comment_empty: "Pas encore de commentaires. Soyez le premier !",
comment_limit: "Limite quotidienne atteinte. Revenez demain !", comment_min_len: "Le contenu doit comporter au moins 10 caractères",
comment_ok: "Soumis ! Sera affiché après vérification ✓", comment_unit: "",
comment_view_all: "Voir les {n} avis →",
comment_more_btn: "Plus d'avis ({n} au total) →",
cp_feedback_title: "Avis utilisateurs", cp_h1_suffix: "Avis utilisateurs",
cp_meta_desc: "Avis, conseils et retours d'expérience des utilisateurs",
cp_sub: "Conseils, retours d'expérience et questions des utilisateurs",
cp_bc_feedback: "Avis", cp_card_title: "Infos skill",
cp_back: "← Retour au skill", comment_ok_btn: "Compris",
weekdays: ["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],
},
ja: {
nav_categories: "職業分類",
nav_insights: "インサイト",
bc_home: "ホーム",
bc_categories: "職業分類",
tab_details: "詳細",
tab_example: "例",
lbl_stars: "スター",
lbl_forks: "フォーク",
lbl_updated: "更新日時",
install1_title: "skillsABC CLI でインストール",
install1_hint: "インストールガイド",
install2_title: "手動インストール:",
install2_hint: "手動ガイド",
dl_zip: "⬇ Zip をダウンロード",
dl_auto_hint: "[自動インストール] zipをダウンロードしてディレクトリに展開し、AIエージェントに「このディレクトリのskillをインストールして」と伝えてください",
guide_title: "インストールガイド",
guide_step1_title: "⬇ ステップ1:ダウンロード",
guide_step1_desc: "上の「Zipをダウンロード」ボタンをクリック",
guide_step2_title: "⚙ ステップ2:設定を開く",
guide_step2_desc: "Claudeクライアントを開き、設定 > 機能へ",
guide_step3_title: "⬆ ステップ3:スキルをアップロード",
guide_step3_desc: "スキルをアップロードをクリックしてzipファイルを選択",
cli_title: "CLIインストールガイド",
cli_desc: "PowerShellまたはcmdを開き、skillsABCコマンドをコピー:",
loading: "読み込み中...",
no_example: "例がありません", loading_github: "GitHubからSKILL.mdを読み込み中…", loading_github_hint: "初回読み込みには数秒かかる場合があります",
footer_copy: "© 2026 skillsABC",
footer_about: "私たちについて",
footer_privacy: "プライバシー",
footer_contact: "お問い合わせ",
cmd1_title: "スキルをインストール(AIツール自動検出)",
cmd1_desc: "現在のプロジェクトのAIツールを自動検出して正しいディレクトリにインストール。",
cmd2_title: "グローバルにインストール",
cmd2_desc: "~/.skills/ にインストール、全プロジェクトで共有。",
cmd3_title: "Claude Code 用にインストール",
cmd3_desc: "現在のプロジェクトの .claude/skills/ にインストール。",
cmd4_title: "Cursor 用にインストール",
cmd4_desc: "現在のプロジェクトの .cursor/rules/ にインストール。",
cmd5_title: "ChatGPT 用にインストール",
cmd5_desc: "現在のプロジェクトの .chatgpt/instructions/ にインストール。",
cmd6_title: "インストール済みスキルを一覧表示",
cmd6_desc: "インストール済みの全スキルとパスを表示。",
cmd7_title: "スキルを更新",
cmd7_desc: "最新バージョンを再ダウンロードして既存ファイルを上書き。",
cmd8_title: "スキルを削除",
cmd8_desc: "スキルファイルを削除してインストール記録を削除。",
copy_ok: "✓ コピー済み",
share_btn: "シェア", fav_btn: "お気に入り",
share_chk_link: "リンクをコピー", share_chk_title: "タイトル + 説明",
share_copy_btn: "コピーしてシェア", share_toast: "コピーしました!WeChatを開いて貼り付けてシェア ✓",
share_least: "少なくとも1つ選択してください",
comment_title: "フィードバック", comment_submit: "投稿",
test_images_title: "Skill スクリーンショット",
comment_placeholder_nick: "ニックネーム(任意)", comment_placeholder_body: "使い方のコツ・問題・質問を共有(10文字以上)",
comment_hint: "無関係なコンテンツは自動フィルタリングされます", comment_empty: "まだフィードバックがありません。最初に投稿しましょう!",
comment_limit: "本日の投稿上限に達しました。明日またどうぞ!", comment_min_len: "10文字以上入力してください",
comment_ok: "送信しました!審査後に表示されます ✓", comment_unit: "件",
comment_view_all: "全{n}件のフィードバックを見る →",
comment_more_btn: "もっと見る(全{n}件)→",
cp_feedback_title: "ユーザーフィードバック", cp_h1_suffix: "ユーザーフィードバック",
cp_meta_desc: "ユーザーのフィードバック、ヒントと経験",
cp_sub: "実際のユーザーによるヒント、経験、質問",
cp_bc_feedback: "フィードバック", cp_card_title: "スキル情報",
cp_back: "← スキル詳細に戻る", comment_ok_btn: "わかった",
weekdays: ["日","月","火","水","木","金","土"],
},
ko: {
nav_categories: "직업 분류",
nav_insights: "인사이트",
bc_home: "홈",
bc_categories: "직업 분류",
tab_details: "상세",
tab_example: "예시",
lbl_stars: "스타",
lbl_forks: "포크",
lbl_updated: "업데이트",
install1_title: "skillsABC CLI로 설치",
install1_hint: "설치 가이드",
install2_title: "수동 설치:",
install2_hint: "수동 가이드",
dl_zip: "⬇ Zip 다운로드",
dl_auto_hint: "[자동 설치] zip을 다운로드하여 디렉토리에 압축 해제 후 AI 에이전트에게 \"이 디렉토리의 skill을 설치해줘\"라고 말하세요",
guide_title: "설치 가이드",
guide_step1_title: "⬇ 1단계: 다운로드",
guide_step1_desc: "위의 Zip 다운로드 버튼 클릭",
guide_step2_title: "⚙ 2단계: 설정 열기",
guide_step2_desc: "Claude 클라이언트 열기, 설정 > 기능으로 이동",
guide_step3_title: "⬆ 3단계: 스킬 업로드",
guide_step3_desc: "스킬 업로드 클릭 후 zip 파일 선택",
cli_title: "CLI 설치 가이드",
cli_desc: "PowerShell 또는 cmd를 열고 skillsABC 명령어를 복사하세요:",
loading: "로딩 중...",
no_example: "예시 없음", loading_github: "GitHub에서 SKILL.md 로딩 중…", loading_github_hint: "첫 로딩은 몇 초 걸릴 수 있습니다",
footer_copy: "© 2026 skillsABC",
footer_about: "소개",
footer_privacy: "개인정보처리방침",
footer_contact: "문의",
cmd1_title: "스킬 설치 (AI 도구 자동 감지)",
cmd1_desc: "현재 프로젝트의 AI 도구를 자동 감지하여 올바른 디렉토리에 설치.",
cmd2_title: "전역 설치",
cmd2_desc: "~/.skills/에 설치, 모든 프로젝트에서 공유.",
cmd3_title: "Claude Code용 설치",
cmd3_desc: "현재 프로젝트의 .claude/skills/에 설치.",
cmd4_title: "Cursor용 설치",
cmd4_desc: "현재 프로젝트의 .cursor/rules/에 설치.",
cmd5_title: "ChatGPT용 설치",
cmd5_desc: "현재 프로젝트의 .chatgpt/instructions/에 설치.",
cmd6_title: "설치된 스킬 목록",
cmd6_desc: "설치된 모든 스킬과 경로 표시.",
cmd7_title: "스킬 업데이트",
cmd7_desc: "최신 버전을 다시 다운로드하여 기존 파일 덮어쓰기.",
cmd8_title: "스킬 제거",
cmd8_desc: "스킬 파일 삭제 및 설치 기록 제거.",
copy_ok: "✓ 복사됨",
share_btn: "공유", fav_btn: "즐겨찾기",
share_chk_link: "링크 복사", share_chk_title: "제목 + 설명",
share_copy_btn: "복사 후 공유", share_toast: "복사됨! WeChat을 열어 붙여넣기로 공유 ✓",
share_least: "하나 이상 선택해 주세요",
comment_title: "사용 후기", comment_submit: "게시",
test_images_title: "Skill 스크린샷",
comment_placeholder_nick: "닉네임 (선택)", comment_placeholder_body: "사용 팁, 문제점 또는 질문 공유 (10자 이상)",
comment_hint: "관련 없는 내용은 자동으로 필터링됩니다", comment_empty: "아직 후기가 없습니다. 첫 번째로 공유해보세요!",
comment_limit: "오늘 게시 한도에 도달했습니다. 내일 다시 오세요!", comment_min_len: "10자 이상 입력해 주세요",
comment_ok: "제출되었습니다! 검토 후 표시됩니다 ✓", comment_unit: "개",
comment_view_all: "전체 {n}개 후기 보기 →",
comment_more_btn: "더 보기(전체 {n}개)→",
cp_feedback_title: "사용자 후기", cp_h1_suffix: "사용자 후기",
cp_meta_desc: "사용자 후기, 팁과 경험",
cp_sub: "실제 사용자의 팁, 경험 및 질문",
cp_bc_feedback: "후기", cp_card_title: "스킬 정보",
cp_back: "← 스킬 상세로 돌아가기", comment_ok_btn: "알겠습니다",
weekdays: ["일","월","화","수","목","금","토"],
},
pt: {
nav_categories: "Categorias",
nav_insights: "Análises",
bc_home: "Início",
bc_categories: "Categorias",
tab_details: "Detalhes",
tab_example: "Exemplo",
lbl_stars: "estrelas",
lbl_forks: "forks",
lbl_updated: "Atualizado",
install1_title: "Instalar via skillsABC CLI",
install1_hint: "Guia de instalação",
install2_title: "Instalação manual:",
install2_hint: "Guia manual",
dl_zip: "⬇ Baixar Zip",
dl_auto_hint: "[Auto-instalação] Baixe o zip, extraia para o diretório, diga ao agente IA: instale o skill neste diretório",
guide_title: "Guia de instalação",
guide_step1_title: "⬇ Passo 1: Baixar",
guide_step1_desc: "Clique no botão Baixar Zip acima",
guide_step2_title: "⚙ Passo 2: Abrir configurações",
guide_step2_desc: "Abrir cliente Claude, ir em Configurações > Recursos",
guide_step3_title: "⬆ Passo 3: Enviar skill",
guide_step3_desc: "Clicar em Enviar Skill e selecionar o arquivo zip",
cli_title: "Guia de instalação CLI",
cli_desc: "Abrir PowerShell ou cmd, copiar o comando skillsABC:",
loading: "Carregando...",
no_example: "Sem exemplo disponível", loading_github: "Carregando SKILL.md do GitHub…", loading_github_hint: "O primeiro carregamento pode levar alguns segundos",
footer_copy: "© 2026 skillsABC",
footer_about: "Sobre nós",
footer_privacy: "Privacidade",
footer_contact: "Contato",
cmd1_title: "Instalar skill (detectar ferramenta IA)",
cmd1_desc: "Detecta automaticamente a ferramenta IA e instala no diretório correto.",
cmd2_title: "Instalar globalmente",
cmd2_desc: "Instalar em ~/.skills/, compartilhado entre todos os projetos.",
cmd3_title: "Instalar para Claude Code",
cmd3_desc: "Instalar em .claude/skills/ do projeto atual.",
cmd4_title: "Instalar para Cursor",
cmd4_desc: "Instalar em .cursor/rules/ do projeto atual.",
cmd5_title: "Instalar para ChatGPT",
cmd5_desc: "Instalar em .chatgpt/instructions/ do projeto atual.",
cmd6_title: "Listar skills instalados",
cmd6_desc: "Listar todos os skills instalados e seus caminhos.",
cmd7_title: "Atualizar skill",
cmd7_desc: "Baixar a versão mais recente, sobrescrevendo arquivos existentes.",
cmd8_title: "Remover skill",
cmd8_desc: "Excluir arquivos do skill e remover o registro de instalação.",
copy_ok: "✓ Copiado",
share_btn: "Compartilhar", fav_btn: "Favorito",
share_chk_link: "Copiar link", share_chk_title: "Título + Descrição",
share_copy_btn: "Copiar e compartilhar", share_toast: "Copiado! Abra o WeChat e cole para compartilhar ✓",
share_least: "Por favor marque pelo menos uma opção",
comment_title: "Feedback", comment_submit: "Publicar",
test_images_title: "Capturas do Skill",
comment_placeholder_nick: "Apelido (opcional)", comment_placeholder_body: "Compartilhe dicas, problemas ou perguntas (mín. 10 caracteres)",
comment_hint: "Conteúdo irrelevante será filtrado", comment_empty: "Sem feedback ainda. Seja o primeiro!",
comment_limit: "Limite diário atingido. Volte amanhã!", comment_min_len: "O conteúdo deve ter pelo menos 10 caracteres",
comment_ok: "Enviado! Será exibido após revisão ✓", comment_unit: "",
comment_view_all: "Ver todos os {n} comentários →",
comment_more_btn: "Mais comentários ({n} no total) →",
cp_feedback_title: "Avaliações", cp_h1_suffix: "Avaliações de usuários",
cp_meta_desc: "Avaliações, dicas e experiências de usuários",
cp_sub: "Dicas reais, experiências e perguntas de usuários",
cp_bc_feedback: "Avaliações", cp_card_title: "Info do skill",
cp_back: "← Voltar ao skill", comment_ok_btn: "Entendido",
weekdays: ["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],
},
ar: {
nav_categories: "التصنيفات",
nav_insights: "رؤى",
bc_home: "الرئيسية",
bc_categories: "التصنيفات",
tab_details: "التفاصيل",
tab_example: "مثال",
lbl_stars: "نجوم",
lbl_forks: "تفرعات",
lbl_updated: "تاريخ التحديث",
install1_title: "التثبيت عبر skillsABC CLI",
install1_hint: "دليل التثبيت",
install2_title: "التثبيت اليدوي:",
install2_hint: "الدليل اليدوي",
dl_zip: "⬇ تحميل Zip",
dl_auto_hint: "[تثبيت تلقائي] حمّل الـ zip، استخرجه في المجلد، ثم قل لوكيل الذكاء الاصطناعي: ثبّت المهارة في هذا المجلد",
guide_title: "دليل التثبيت",
guide_step1_title: "⬇ الخطوة 1: التحميل",
guide_step1_desc: "انقر على زر تحميل Zip أعلاه",
guide_step2_title: "⚙ الخطوة 2: فتح الإعدادات",
guide_step2_desc: "افتح عميل Claude، اذهب إلى الإعدادات > الميزات",
guide_step3_title: "⬆ الخطوة 3: رفع المهارة",
guide_step3_desc: "انقر على رفع مهارة واختر ملف zip",
cli_title: "دليل التثبيت عبر CLI",
cli_desc: "افتح PowerShell أو cmd، انسخ أمر skillsABC:",
loading: "جارٍ التحميل...",
no_example: "لا يوجد مثال", loading_github: "جارٍ تحميل SKILL.md من GitHub…", loading_github_hint: "قد يستغرق التحميل الأول بضع ثوانٍ",
footer_copy: "© 2026 skillsABC",
footer_about: "من نحن",
footer_privacy: "الخصوصية",
footer_contact: "اتصل بنا",
cmd1_title: "تثبيت المهارة (كشف تلقائي لأداة الذكاء الاصطناعي)",
cmd1_desc: "يكشف تلقائياً عن أداة الذكاء الاصطناعي ويثبت في المجلد الصحيح.",
cmd2_title: "التثبيت العام",
cmd2_desc: "التثبيت في ~/.skills/، مشترك بين جميع المشاريع.",
cmd3_title: "التثبيت لـ Claude Code",
cmd3_desc: "التثبيت في .claude/skills/ للمشروع الحالي.",
cmd4_title: "التثبيت لـ Cursor",
cmd4_desc: "التثبيت في .cursor/rules/ للمشروع الحالي.",
cmd5_title: "التثبيت لـ ChatGPT",
cmd5_desc: "التثبيت في .chatgpt/instructions/ للمشروع الحالي.",
cmd6_title: "عرض المهارات المثبتة",
cmd6_desc: "عرض جميع المهارات المثبتة ومساراتها.",
cmd7_title: "تحديث المهارة",
cmd7_desc: "إعادة تحميل أحدث إصدار مع استبدال الملفات الموجودة.",
cmd8_title: "إزالة المهارة",
cmd8_desc: "حذف ملفات المهارة وإزالة سجل التثبيت.",
copy_ok: "✓ تم النسخ",
share_btn: "مشاركة", fav_btn: "مفضلة",
share_chk_link: "نسخ الرابط", share_chk_title: "العنوان + الوصف",
share_copy_btn: "نسخ ومشاركة", share_toast: "تم النسخ! افتح WeChat والصق للمشاركة ✓",
share_least: "يرجى تحديد خيار واحد على الأقل",
comment_title: "التعليقات", comment_submit: "نشر",
test_images_title: "لقطات Skill",
comment_placeholder_nick: "الاسم المستعار (اختياري)", comment_placeholder_body: "شارك نصائح أو مشاكل أو أسئلة (10 أحرف على الأقل)",
comment_hint: "سيتم تصفية المحتوى غير ذي الصلة تلقائياً", comment_empty: "لا توجد تعليقات بعد. كن الأول!",
comment_limit: "تم الوصول إلى الحد اليومي. عد غداً!", comment_min_len: "يجب أن يحتوي المحتوى على 10 أحرف على الأقل",
comment_ok: "تم الإرسال! سيظهر بعد المراجعة ✓", comment_unit: "",
comment_view_all: "عرض جميع {n} تعليقات →",
comment_more_btn: "المزيد من التعليقات ({n} إجمالاً) →",
cp_feedback_title: "آراء المستخدمين", cp_h1_suffix: "آراء المستخدمين",
cp_meta_desc: "آراء المستخدمين ونصائحهم وتجاربهم",
cp_sub: "نصائح وتجارب وأسئلة حقيقية من المستخدمين",
cp_bc_feedback: "الآراء", cp_card_title: "معلومات المهارة",
cp_back: "← العودة إلى تفاصيل المهارة", comment_ok_btn: "حسناً",
weekdays: ["أحد","اثن","ثلا","أرب","خمي","جمع","سبت"],
},
};
function applyDetailI18n(lang) {
const t = DETAIL_I18N[lang] || DETAIL_I18N.zh;
if (!t) return;
const st = (id, text) => { const el = document.getElementById(id); if (el) el.textContent = text; };
const sh = (id, html) => { const el = document.getElementById(id); if (el) el.innerHTML = html; };
const sq = (sel, text) => { const el = document.querySelector(sel); if (el) el.textContent = text; };
const sa = (sel, attr, val) => { const el = document.querySelector(sel); if (el) el.setAttribute(attr, val); };
// 导航
sq('a[href="categories.html"]', t.nav_categories);
sq('a[href="insights.html"]', t.nav_insights);
// 面包屑
st('bc-home', t.bc_home);
st('bc-cat', t.bc_categories);
// git log 标签
st('lbl-stars', t.lbl_stars);
st('lbl-forks', t.lbl_forks);
st('lbl-updated', t.lbl_updated);
// Tab 按钮
st('tabDetails', t.tab_details);
st('tabExample', t.tab_example);
// 右侧安装卡片
st('install1Title', t.install1_title);
st('install1Hint', t.install1_hint);
st('install2Title', t.install2_title);
st('install2Hint', t.install2_hint);
st('dlZipText', t.dl_zip);
st('dlAutoHint', t.dl_auto_hint);
// 安装指南弹窗
st('guideTitle', t.guide_title);
st('guideStep1Title', t.guide_step1_title);
st('guideStep1Desc', t.guide_step1_desc);
st('guideStep2Title', t.guide_step2_title);
st('guideStep2Desc', t.guide_step2_desc);
st('guideStep3Title', t.guide_step3_title);
st('guideStep3Desc', t.guide_step3_desc);
// CLI 弹窗
st('cliTitle', t.cli_title);
st('cliDesc', t.cli_desc);
// Footer
st('footerCopy', t.footer_copy);
st('footerAbout', t.footer_about);
st('footerPrivacy', t.footer_privacy);
st('footerContact', t.footer_contact);
// 微信分享按钮文字
st('wechatShareBtnText', t.share_btn);
st('favBtnText', t.fav_btn);
st('shareChkLinkText', t.share_chk_link);
st('shareChkTitleText', t.share_chk_title);
st('wechatCopyBtn', t.share_copy_btn);
// 评论区
st('commentCardTitle', t.comment_title);
st('commentSubmitBtn', t.comment_submit);
st('commentHint', t.comment_hint);
st('commentLimitMsg', t.comment_limit);
sa('#commentNickname', 'placeholder', t.comment_placeholder_nick);
sa('#commentContent', 'placeholder', t.comment_placeholder_body);
if(t.test_images_title) st('testImagesCardTitle', t.test_images_title);
// 语言按钮显示
const langLabel = document.getElementById('detailLangLabel');
if (langLabel) langLabel.textContent = '🌐 ' + lang.toUpperCase();
// RTL
document.documentElement.dir = lang === 'ar' ? 'rtl' : 'ltr';
// 动态面包屑翻译
if (window._detailCatData && window._detailOccData) {
const cat = window._detailCatData;
const occ = window._detailOccData;
const catSlug = cat.slug || '';
const occSlug = occ.slug || '';
const catNames = (typeof CAT_NAMES !== 'undefined' && CAT_NAMES[catSlug]) ? CAT_NAMES[catSlug] : null;
const occNames = (typeof OCC_NAMES !== 'undefined' && OCC_NAMES[occSlug]) ? OCC_NAMES[occSlug] : null;
const catName = catNames ? (catNames[lang] || catNames.en || cat.name_en || cat.name_zh) : (lang === 'zh' ? cat.name_zh : cat.name_en);
const occName = occNames ? (occNames[lang] || occNames.en || occ.name_en || occ.name_zh) : (lang === 'zh' ? occ.name_zh : occ.name_en);
const bcL1 = document.getElementById('bc-l1');
if (bcL1) bcL1.textContent = catName;
const bcOcc = document.getElementById('bc-occ');
if (bcOcc) bcOcc.textContent = occName;
}
// 日期重新格式化
if (window._detailUpdatedAt) {
const d = new Date(window._detailUpdatedAt);
const weekdays = t.weekdays || ['周日','周一','周二','周三','周四','周五','周六'];
const y = d.getFullYear();
const mo = d.getMonth() + 1;
const day = d.getDate();
const wd = weekdays[d.getDay()];
const hh = String(d.getHours()).padStart(2, '0');
const mm = String(d.getMinutes()).padStart(2, '0');
const el = document.getElementById('statUpdated');
if (el) el.textContent = `${y}/${mo}/${day}/${wd} ${hh}:${mm}`;
}
// 重新渲染评论区(更新"更多评论"按钮文字和条数单位)
if (typeof loadComments === 'function') {
const slug = new URLSearchParams(location.search).get('slug') || '';
if (slug) loadComments(slug);
}
// 更新页面内所有"加载中"占位文字
const loadingText = t.loading || '加载中...';
['fileExplorerLoading'].forEach(id => {
const el = document.getElementById(id);
if (el) el.textContent = loadingText;
});
// 更新 readmeContent 和 exampleContent 里的加载中
['readmeContent', 'exampleContent'].forEach(id => {
const el = document.getElementById(id);
if (el && el.querySelector('div') && el.textContent.trim().match(/加载中|Loading|Laden|Cargando|Chargement|読み込み|로딩|Carregando|التحميل/)) {
el.innerHTML = `${loadingText}
`;
}
});
}
function initDetailI18n() {
const lang = localStorage.getItem('sa_lang') || 'zh';
applyDetailI18n(lang);
}
// ===== category.html i18n =====
const DALEI_I18N = {
zh: {
nav_categories: "职业分类",
nav_insights: "洞察",
bc_home: "首页",
bc_categories: "职业分类",
sort_by: "排序",
sort_stars: "⭐ 星标",
sort_recent: "🕐 最新",
search_hint: "输入关键字搜索",
search_placeholder: "搜索技能...",
results_info: "显示",
results_unit: "个结果",
empty: "未找到相关技能,",
empty_clear: "清空搜索",
occ_unit: "个职业",
loading: "加载中...",
load_fail: "加载失败,请刷新重试",
footer_copy: "© 2026 skillsABC.com — AI Agent 技能集市",
footer_about: "关于我们",
footer_api: "开发者 API",
footer_terms: "条款",
footer_privacy: "隐私",
},
en: {
nav_categories: "Categories",
nav_insights: "Insights",
bc_home: "Home",
bc_categories: "Categories",
sort_by: "Sort by",
sort_stars: "⭐ Stars",
sort_recent: "🕐 Recent",
search_hint: "Type keywords to search",
search_placeholder: "Search skills...",
results_info: "Showing",
results_unit: "results",
empty: "No skills found, ",
empty_clear: "Clear search",
occ_unit: "occupations",
loading: "Loading...",
load_fail: "Load failed, please refresh",
footer_copy: "© 2026 skillsABC.com — AI Agent Skills Marketplace",
footer_about: "About Us",
footer_api: "Developer API",
footer_terms: "Terms",
footer_privacy: "Privacy",
},
de: {
nav_categories: "Kategorien",
nav_insights: "Einblicke",
bc_home: "Startseite",
bc_categories: "Kategorien",
sort_by: "Sortieren",
sort_stars: "⭐ Sterne",
sort_recent: "🕐 Neu",
search_hint: "Suchbegriff eingeben",
search_placeholder: "Skills suchen...",
results_info: "Zeige",
results_unit: "Ergebnisse",
empty: "Keine Skills gefunden, ",
empty_clear: "Suche leeren",
occ_unit: "Berufe",
loading: "Laden...",
load_fail: "Laden fehlgeschlagen, bitte neu laden",
footer_copy: "© 2026 skillsABC.com — KI-Skills-Marktplatz",
footer_about: "Über uns",
footer_api: "Entwickler API",
footer_terms: "Nutzungsbedingungen",
footer_privacy: "Datenschutz",
},
es: {
nav_categories: "Categorías",
nav_insights: "Perspectivas",
bc_home: "Inicio",
bc_categories: "Categorías",
sort_by: "Ordenar",
sort_stars: "⭐ Estrellas",
sort_recent: "🕐 Reciente",
search_hint: "Escribe palabras clave",
search_placeholder: "Buscar skills...",
results_info: "Mostrando",
results_unit: "resultados",
empty: "No se encontraron skills, ",
empty_clear: "Limpiar búsqueda",
occ_unit: "ocupaciones",
loading: "Cargando...",
load_fail: "Error al cargar, actualiza la página",
footer_copy: "© 2026 skillsABC.com — Mercado de habilidades de IA",
footer_about: "Sobre nosotros",
footer_api: "API para desarrolladores",
footer_terms: "Términos",
footer_privacy: "Privacidad",
},
fr: {
nav_categories: "Catégories",
nav_insights: "Analyses",
bc_home: "Accueil",
bc_categories: "Catégories",
sort_by: "Trier",
sort_stars: "⭐ Étoiles",
sort_recent: "🕐 Récent",
search_hint: "Entrez des mots-clés",
search_placeholder: "Rechercher des skills...",
results_info: "Affichage",
results_unit: "résultats",
empty: "Aucun skill trouvé, ",
empty_clear: "Effacer la recherche",
occ_unit: "métiers",
loading: "Chargement...",
load_fail: "Échec du chargement, veuillez actualiser",
footer_copy: "© 2026 skillsABC.com — Marketplace de compétences IA",
footer_about: "À propos",
footer_api: "API développeur",
footer_terms: "Conditions",
footer_privacy: "Confidentialité",
},
ja: {
nav_categories: "職業分類",
nav_insights: "インサイト",
bc_home: "ホーム",
bc_categories: "職業分類",
sort_by: "並び替え",
sort_stars: "⭐ スター",
sort_recent: "🕐 最新",
search_hint: "キーワードを入力",
search_placeholder: "スキルを検索...",
results_info: "表示中",
results_unit: "件",
empty: "スキルが見つかりません、",
empty_clear: "検索をクリア",
occ_unit: "職業",
loading: "読み込み中...",
load_fail: "読み込み失敗、ページを更新してください",
footer_copy: "© 2026 skillsABC.com — AIスキルマーケットプレイス",
footer_about: "私たちについて",
footer_api: "開発者 API",
footer_terms: "利用規約",
footer_privacy: "プライバシー",
},
ko: {
nav_categories: "직업 분류",
nav_insights: "인사이트",
bc_home: "홈",
bc_categories: "직업 분류",
sort_by: "정렬",
sort_stars: "⭐ 스타",
sort_recent: "🕐 최신",
search_hint: "키워드 입력",
search_placeholder: "스킬 검색...",
results_info: "표시 중",
results_unit: "개 결과",
empty: "스킬을 찾을 수 없습니다, ",
empty_clear: "검색 지우기",
occ_unit: "직업",
loading: "로딩 중...",
load_fail: "로드 실패, 새로고침 해주세요",
footer_copy: "© 2026 skillsABC.com — AI 스킬 마켓플레이스",
footer_about: "소개",
footer_api: "개발자 API",
footer_terms: "이용약관",
footer_privacy: "개인정보처리방침",
},
pt: {
nav_categories: "Categorias",
nav_insights: "Análises",
bc_home: "Início",
bc_categories: "Categorias",
sort_by: "Ordenar",
sort_stars: "⭐ Estrelas",
sort_recent: "🕐 Recente",
search_hint: "Digite palavras-chave",
search_placeholder: "Buscar skills...",
results_info: "Mostrando",
results_unit: "resultados",
empty: "Nenhum skill encontrado, ",
empty_clear: "Limpar busca",
occ_unit: "ocupações",
loading: "Carregando...",
load_fail: "Falha ao carregar, atualize a página",
footer_copy: "© 2026 skillsABC.com — Marketplace de habilidades de IA",
footer_about: "Sobre nós",
footer_api: "API para desenvolvedores",
footer_terms: "Termos",
footer_privacy: "Privacidade",
},
ar: {
nav_categories: "التصنيفات",
nav_insights: "رؤى",
bc_home: "الرئيسية",
bc_categories: "التصنيفات",
sort_by: "ترتيب",
sort_stars: "⭐ نجوم",
sort_recent: "🕐 الأحدث",
search_hint: "أدخل كلمات البحث",
search_placeholder: "البحث عن المهارات...",
results_info: "عرض",
results_unit: "نتائج",
empty: "لم يتم العثور على مهارات، ",
empty_clear: "مسح البحث",
occ_unit: "مهن",
loading: "جارٍ التحميل...",
load_fail: "فشل التحميل، يرجى التحديث",
footer_copy: "© 2026 skillsABC.com — سوق مهارات الذكاء الاصطناعي",
footer_about: "من نحن",
footer_api: "واجهة برمجية للمطورين",
footer_terms: "الشروط",
footer_privacy: "الخصوصية",
},
};
function applyDaleiI18n(lang) {
const t = DALEI_I18N[lang] || DALEI_I18N.zh;
if (!t) return;
const st = (id, text) => { const el = document.getElementById(id); if (el) el.textContent = text; };
const sq = (sel, text) => { const el = document.querySelector(sel); if (el) el.textContent = text; };
const sa = (id, attr, val) => { const el = document.getElementById(id); if (el) el.setAttribute(attr, val); };
sq('a[href="categories.html"]', t.nav_categories);
sq('a[href="insights.html"]', t.nav_insights);
st('bc-home', t.bc_home);
st('bc-categories', t.bc_categories);
st('sortBy', t.sort_by);
st('sortStars', t.sort_stars);
st('sortRecent', t.sort_recent);
st('searchHint', t.search_hint);
sa('searchInput', 'placeholder', t.search_placeholder);
st('resultsInfo', t.results_info);
st('resultsUnit', t.results_unit);
st('emptyText', t.empty);
st('emptyClear', t.empty_clear);
st('footerCopy', t.footer_copy);
st('footerAbout', t.footer_about);
st('footerApi', t.footer_api);
st('footerTerms', t.footer_terms);
st('footerPrivacy', t.footer_privacy);
// 更新语言按钮
const langLabel = document.getElementById('daleiLangLabel');
if (langLabel) langLabel.textContent = '\u{1F310} ' + lang.toUpperCase();
// RTL
document.documentElement.dir = lang === 'ar' ? 'rtl' : 'ltr';
// 重新渲染动态内容(如果数据已加载)
if (window._daleiCatData) {
const cat = window._daleiCatData;
const catSlug = cat.slug || "";
const catNames = (typeof CAT_NAMES !== "undefined" && CAT_NAMES[catSlug]) ? CAT_NAMES[catSlug] : null;
const catName = catNames ? (catNames[lang] || catNames.en || cat.name_zh) : (lang === "zh" ? cat.name_zh : cat.name_en);
st("catTitle", catName);
st("breadcrumb-current", catName);
document.getElementById("catSub").textContent = cat.name_en + " · " + cat.occupations.length + " " + t.occ_unit;
sa("searchInput", "placeholder", catName + " ...");
}
}
// ========== occupation.html \u7ffb\u8bd1 ==========
const XIAOLEI_I18N = {
zh: {
nav_categories: '\u804c\u4e1a\u5206\u7c7b',
nav_insights: '\u6d1e\u5bdf',
bc_home: '\u9996\u9875',
bc_categories: '\u804c\u4e1a\u5206\u7c7b',
tasks_title: '\u5178\u578b\u5de5\u4f5c\u4efb\u52a1\uff08O*NET\uff09',
sort_by: 'Sort by',
sort_stars: '\u2b50 Stars',
sort_recent: '\ud83d\udd50 \u6700\u65b0',
search_hint: '\u8f93\u5165\u5173\u952e\u5b57\u641c\u7d22',
search_placeholder: '\u641c\u7d22\u6280\u80fd...',
results_info: '\u663e\u793a',
results_unit: '\u4e2a\u7ed3\u679c',
empty: '\u672a\u627e\u5230\u76f8\u5173\u6280\u80fd\uff0c',
empty_clear: '\u6e05\u7a7a\u641c\u7d22',
load_fail: '\u52a0\u8f7d\u5931\u8d25\uff0c\u8bf7\u5237\u65b0\u91cd\u8bd5',
footer_copy: '\u00a9 2026 skillsABC.com \u2014 AI Agent \u6280\u80fd\u96c6\u5e02',
footer_about: '\u5173\u4e8e\u6211\u4eec',
footer_api: '\u5f00\u53d1\u8005 API',
footer_terms: '\u6761\u6b3e',
footer_privacy: '\u9690\u79c1',
},
en: {
nav_categories: 'Categories',
nav_insights: 'Insights',
bc_home: 'Home',
bc_categories: 'Categories',
tasks_title: 'Typical Work Tasks (O*NET)',
sort_by: 'Sort by',
sort_stars: '\u2b50 Stars',
sort_recent: '\ud83d\udd50 Recent',
search_hint: 'Enter keywords to search',
search_placeholder: 'Search skills...',
results_info: 'Showing',
results_unit: 'results',
empty: 'No skills found, ',
empty_clear: 'Clear search',
load_fail: 'Load failed, please refresh',
footer_copy: '\u00a9 2026 skillsABC.com \u2014 AI Agent Skills Marketplace',
footer_about: 'About Us',
footer_api: 'Developer API',
footer_terms: 'Terms',
footer_privacy: 'Privacy',
},
de: {
nav_categories: 'Kategorien',
nav_insights: 'Einblicke',
bc_home: 'Startseite',
bc_categories: 'Kategorien',
tasks_title: 'Typische Arbeitsaufgaben (O*NET)',
sort_by: 'Sortieren',
sort_stars: '\u2b50 Sterne',
sort_recent: '\ud83d\udd50 Neueste',
search_hint: 'Suchbegriff eingeben',
search_placeholder: 'Skills suchen...',
results_info: 'Zeige',
results_unit: 'Ergebnisse',
empty: 'Keine Skills gefunden, ',
empty_clear: 'Suche leeren',
load_fail: 'Laden fehlgeschlagen, bitte aktualisieren',
footer_copy: '\u00a9 2026 skillsABC.com \u2014 KI-Agent-Skills-Marktplatz',
footer_about: '\u00dcber uns',
footer_api: 'Entwickler-API',
footer_terms: 'Bedingungen',
footer_privacy: 'Datenschutz',
},
es: {
nav_categories: 'Categor\u00edas',
nav_insights: 'Perspectivas',
bc_home: 'Inicio',
bc_categories: 'Categor\u00edas',
tasks_title: 'Tareas t\u00edpicas (O*NET)',
sort_by: 'Ordenar',
sort_stars: '\u2b50 Estrellas',
sort_recent: '\ud83d\udd50 Reciente',
search_hint: 'Ingrese palabras clave',
search_placeholder: 'Buscar skills...',
results_info: 'Mostrando',
results_unit: 'resultados',
empty: 'No se encontraron skills, ',
empty_clear: 'Limpiar b\u00fasqueda',
load_fail: 'Error al cargar, actualice la p\u00e1gina',
footer_copy: '\u00a9 2026 skillsABC.com \u2014 Mercado de habilidades de IA',
footer_about: 'Sobre nosotros',
footer_api: 'API para desarrolladores',
footer_terms: 'T\u00e9rminos',
footer_privacy: 'Privacidad',
},
fr: {
nav_categories: 'Cat\u00e9gories',
nav_insights: 'Perspectives',
bc_home: 'Accueil',
bc_categories: 'Cat\u00e9gories',
tasks_title: 'T\u00e2ches typiques (O*NET)',
sort_by: 'Trier',
sort_stars: '\u2b50 \u00c9toiles',
sort_recent: '\ud83d\udd50 R\u00e9cent',
search_hint: 'Entrez des mots-cl\u00e9s',
search_placeholder: 'Rechercher des skills...',
results_info: 'Affichage',
results_unit: 'r\u00e9sultats',
empty: 'Aucun skill trouv\u00e9, ',
empty_clear: 'Effacer la recherche',
load_fail: '\u00c9chec du chargement, veuillez actualiser',
footer_copy: '\u00a9 2026 skillsABC.com \u2014 March\u00e9 de comp\u00e9tences IA',
footer_about: '\u00c0 propos',
footer_api: 'API d\u00e9veloppeur',
footer_terms: 'Conditions',
footer_privacy: 'Confidentialit\u00e9',
},
ja: {
nav_categories: '\u8077\u696d\u30ab\u30c6\u30b4\u30ea',
nav_insights: '\u30a4\u30f3\u30b5\u30a4\u30c8',
bc_home: '\u30db\u30fc\u30e0',
bc_categories: '\u30ab\u30c6\u30b4\u30ea',
tasks_title: '\u5178\u578b\u7684\u306a\u696d\u52d9\u30bf\u30b9\u30af\uff08O*NET\uff09',
sort_by: '\u4e26\u3073\u66ff\u3048',
sort_stars: '\u2b50 \u30b9\u30bf\u30fc',
sort_recent: '\ud83d\udd50 \u6700\u65b0',
search_hint: '\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u5165\u529b',
search_placeholder: '\u30b9\u30ad\u30eb\u3092\u691c\u7d22...',
results_info: '\u8868\u793a\u4e2d',
results_unit: '\u4ef6',
empty: '\u30b9\u30ad\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3001',
empty_clear: '\u691c\u7d22\u3092\u30af\u30ea\u30a2',
load_fail: '\u8aad\u307f\u8fbc\u307f\u5931\u6557\u3001\u66f4\u65b0\u3057\u3066\u304f\u3060\u3055\u3044',
footer_copy: '\u00a9 2026 skillsABC.com \u2014 AI\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30b9\u30ad\u30eb\u30de\u30fc\u30b1\u30c3\u30c8',
footer_about: '\u79c1\u305f\u3061\u306b\u3064\u3044\u3066',
footer_api: '\u958b\u767a\u8005API',
footer_terms: '\u5229\u7528\u898f\u7d04',
footer_privacy: '\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc',
},
ko: {
nav_categories: '\uc9c1\uc5c5 \ubd84\ub958',
nav_insights: '\uc778\uc0ac\uc774\ud2b8',
bc_home: '\ud648',
bc_categories: '\uce74\ud14c\uace0\ub9ac',
tasks_title: '\uc77c\ubc18\uc801\uc778 \uc5c5\ubb34 (O*NET)',
sort_by: '\uc815\ub82c',
sort_stars: '\u2b50 \uc2a4\ud0c0',
sort_recent: '\ud83d\udd50 \ucd5c\uc2e0',
search_hint: '\ud0a4\uc6cc\ub4dc \uc785\ub825',
search_placeholder: '\uc2a4\ud0ac \uac80\uc0c9...',
results_info: '\ud45c\uc2dc',
results_unit: '\uac1c \uacb0\uacfc',
empty: '\uc2a4\ud0ac\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4, ',
empty_clear: '\uac80\uc0c9 \ucd08\uae30\ud654',
load_fail: '\ub85c\ub4dc \uc2e4\ud328, \uc0c8\ub85c\uace0\uce68\ud558\uc138\uc694',
footer_copy: '\u00a9 2026 skillsABC.com \u2014 AI \uc5d0\uc774\uc804\ud2b8 \uc2a4\ud0ac \ub9c8\ucf13',
footer_about: '\uc18c\uac1c',
footer_api: '\uac1c\ubc1c\uc790 API',
footer_terms: '\uc774\uc6a9\uc57d\uad00',
footer_privacy: '\uac1c\uc778\uc815\ubcf4',
},
pt: {
nav_categories: 'Categorias',
nav_insights: 'Perspectivas',
bc_home: 'In\u00edcio',
bc_categories: 'Categorias',
tasks_title: 'Tarefas t\u00edpicas (O*NET)',
sort_by: 'Ordenar',
sort_stars: '\u2b50 Estrelas',
sort_recent: '\ud83d\udd50 Recente',
search_hint: 'Digite palavras-chave',
search_placeholder: 'Buscar skills...',
results_info: 'Mostrando',
results_unit: 'resultados',
empty: 'Nenhum skill encontrado, ',
empty_clear: 'Limpar busca',
load_fail: 'Falha ao carregar, atualize a p\u00e1gina',
footer_copy: '\u00a9 2026 skillsABC.com \u2014 Marketplace de habilidades de IA',
footer_about: 'Sobre n\u00f3s',
footer_api: 'API para desenvolvedores',
footer_terms: 'Termos',
footer_privacy: 'Privacidade',
},
ar: {
nav_categories: '\u0627\u0644\u062a\u0635\u0646\u064a\u0641\u0627\u062a',
nav_insights: '\u0631\u0624\u0649',
bc_home: '\u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629',
bc_categories: '\u0627\u0644\u062a\u0635\u0646\u064a\u0641\u0627\u062a',
tasks_title: '\u0627\u0644\u0645\u0647\u0627\u0645 \u0627\u0644\u0646\u0645\u0648\u0630\u062c\u064a\u0629 (O*NET)',
sort_by: '\u062a\u0631\u062a\u064a\u0628',
sort_stars: '\u2b50 \u0646\u062c\u0648\u0645',
sort_recent: '\ud83d\udd50 \u0627\u0644\u0623\u062d\u062f\u062b',
search_hint: '\u0623\u062f\u062e\u0644 \u0643\u0644\u0645\u0627\u062a \u0627\u0644\u0628\u062d\u062b',
search_placeholder: '\u0627\u0644\u0628\u062d\u062b \u0639\u0646 \u0627\u0644\u0645\u0647\u0627\u0631\u0627\u062a...',
results_info: '\u0639\u0631\u0636',
results_unit: '\u0646\u062a\u0627\u0626\u062c',
empty: '\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0645\u0647\u0627\u0631\u0627\u062a\u060c ',
empty_clear: '\u0645\u0633\u062d \u0627\u0644\u0628\u062d\u062b',
load_fail: '\u0641\u0634\u0644 \u0627\u0644\u062a\u062d\u0645\u064a\u0644\u060c \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u062d\u062f\u064a\u062b',
footer_copy: '\u00a9 2026 skillsABC.com \u2014 \u0633\u0648\u0642 \u0645\u0647\u0627\u0631\u0627\u062a \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a',
footer_about: '\u0645\u0646 \u0646\u062d\u0646',
footer_api: '\u0648\u0627\u062c\u0647\u0629 \u0628\u0631\u0645\u062c\u064a\u0629 \u0644\u0644\u0645\u0637\u0648\u0631\u064a\u0646',
footer_terms: '\u0627\u0644\u0634\u0631\u0648\u0637',
footer_privacy: '\u0627\u0644\u062e\u0635\u0648\u0635\u064a\u0629',
},
};
function applyXiaoleiI18n(lang) {
const t = XIAOLEI_I18N[lang] || XIAOLEI_I18N.zh;
if (!t) return;
const st = (id, text) => { const el = document.getElementById(id); if (el) el.textContent = text; };
const sq = (sel, text) => { const el = document.querySelector(sel); if (el) el.textContent = text; };
const sa = (id, attr, val) => { const el = document.getElementById(id); if (el) el.setAttribute(attr, val); };
sq('a[href="categories.html"]', t.nav_categories);
sq('a[href="insights.html"]', t.nav_insights);
st('bc-home', t.bc_home);
st('bc-categories', t.bc_categories);
st('xiaoleiTasksTitle', t.tasks_title);
st('sortBy', t.sort_by);
st('sortStars', t.sort_stars);
st('sortRecent', t.sort_recent);
st('searchHint', t.search_hint);
sa('searchInput', 'placeholder', t.search_placeholder);
st('resultsInfo', t.results_info);
st('resultsUnit', t.results_unit);
st('emptyText', t.empty);
st('emptyClear', t.empty_clear);
st('footerCopy', t.footer_copy);
st('footerAbout', t.footer_about);
st('footerApi', t.footer_api);
st('footerTerms', t.footer_terms);
st('footerPrivacy', t.footer_privacy);
const langLabel = document.getElementById('xiaoleiLangLabel');
if (langLabel) langLabel.textContent = '\u{1F310} ' + lang.toUpperCase();
document.documentElement.dir = lang === 'ar' ? 'rtl' : 'ltr';
// \u7528 OCC_NAMES/CAT_NAMES \u7ffb\u8bd1\u52a8\u6001\u5185\u5bb9
if (window._xiaoleiOccData) {
const occ = window._xiaoleiOccData;
const occSlug = occ.slug || '';
const catSlug = window._xiaoleiCatData ? window._xiaoleiCatData.slug : '';
const occNames = (typeof OCC_NAMES !== 'undefined' && OCC_NAMES[occSlug]) ? OCC_NAMES[occSlug] : null;
const catNames = (typeof CAT_NAMES !== 'undefined' && CAT_NAMES[catSlug]) ? CAT_NAMES[catSlug] : null;
const occName = occNames ? (occNames[lang] || occNames.en || occ.name_en || occ.name_zh) : (lang === 'zh' ? occ.name_zh : occ.name_en);
const catName = catNames ? (catNames[lang] || catNames.en) : (window._xiaoleiCatData ? (lang === 'zh' ? window._xiaoleiCatData.name_zh : window._xiaoleiCatData.name_en) : '');
st('occTitle', occName);
const occSub = document.getElementById('occSub');
if (occSub && window._xiaoleiCatData) occSub.textContent = catName + ' \u00b7 ' + occ.name_en;
st('breadcrumb-current', occName);
const catLink = document.getElementById('breadcrumb-cat');
if (catLink && catName) catLink.textContent = catName;
sa('searchInput', 'placeholder', occName + ' ...');
}
}
// ========== Dongcha (Insights) i18n ==========
const DONGCHA_I18N = {
zh: {
nav_categories: '职业分类', nav_insights: '洞察', bc_home: '首页', bc_current: '洞察',
title: '技能时间线', title_sub: '可视化 AI Agent 技能活动随时间的变化,追踪社区增长与领域分布趋势。',
about_h2: '## 关于此时间线', about_body: '此时间线展示了 GitHub 上技能随时间推送的数量。数据基于每个技能仓库的最后推送日期。由于多种因素影响,该数据只是现有技能真实数量的近似值。',
ctrl_granularity: '时间粒度', btn_daily: '每日', btn_weekly: '每周', btn_monthly: '每月',
ctrl_chart_type: '图表类型', btn_area: '面积图', btn_bar: '柱状图', ctrl_cumulative: '累计曲线',
kpi_total: '总技能数', kpi_avg: '平均每分类技能数', kpi_peak: '最高 Stars 技能',
domain_title: '## 领域分布', btn_on: '开启', btn_off: '关闭',
},
en: {
nav_categories: 'Categories', nav_insights: 'Insights', bc_home: 'Home', bc_current: 'Insights',
title: 'Skill Timeline', title_sub: 'Visualize AI Agent skill activity over time, tracking community growth and domain distribution trends.',
about_h2: '## About This Timeline', about_body: 'This timeline shows the number of skills pushed to GitHub over time. Data is based on the last push date of each skill repository. Due to various factors, this data is an approximation of the actual number of existing skills.',
ctrl_granularity: 'Granularity', btn_daily: 'Daily', btn_weekly: 'Weekly', btn_monthly: 'Monthly',
ctrl_chart_type: 'Chart Type', btn_area: 'Area', btn_bar: 'Bar', ctrl_cumulative: 'Cumulative',
kpi_total: 'Total Skills', kpi_avg: 'Avg per Category', kpi_peak: 'Top Stars Skill',
domain_title: '## Domain Distribution', btn_on: 'On', btn_off: 'Off',
},
de: {
nav_categories: 'Kategorien', nav_insights: 'Einblicke', bc_home: 'Startseite', bc_current: 'Einblicke',
title: 'Skill-Zeitlinie', title_sub: 'Visualisierung der KI-Agent-Skill-Aktivität im Zeitverlauf.',
about_h2: '## Über diese Zeitlinie', about_body: 'Diese Zeitlinie zeigt die Anzahl der auf GitHub gepushten Skills im Zeitverlauf.',
ctrl_granularity: 'Granularität', btn_daily: 'Täglich', btn_weekly: 'Wöchentlich', btn_monthly: 'Monatlich',
ctrl_chart_type: 'Diagrammtyp', btn_area: 'Fläche', btn_bar: 'Balken', ctrl_cumulative: 'Kumulativ',
kpi_total: 'Skills gesamt', kpi_avg: 'Ø pro Kategorie', kpi_peak: 'Top-Stars-Skill',
domain_title: '## Domänenverteilung', btn_on: 'Ein', btn_off: 'Aus',
},
es: {
nav_categories: 'Categorías', nav_insights: 'Perspectivas', bc_home: 'Inicio', bc_current: 'Perspectivas',
title: 'Línea de tiempo de habilidades', title_sub: 'Visualiza la actividad de habilidades de agentes IA a lo largo del tiempo.',
about_h2: '## Acerca de esta línea de tiempo', about_body: 'Esta línea de tiempo muestra el número de habilidades enviadas a GitHub a lo largo del tiempo.',
ctrl_granularity: 'Granularidad', btn_daily: 'Diario', btn_weekly: 'Semanal', btn_monthly: 'Mensual',
ctrl_chart_type: 'Tipo de gráfico', btn_area: 'Área', btn_bar: 'Barras', ctrl_cumulative: 'Acumulativo',
kpi_total: 'Total de habilidades', kpi_avg: 'Promedio por categoría', kpi_peak: 'Habilidad con más Stars',
domain_title: '## Distribución de dominios', btn_on: 'Activar', btn_off: 'Desactivar',
},
fr: {
nav_categories: 'Catégories', nav_insights: 'Analyses', bc_home: 'Accueil', bc_current: 'Analyses',
title: 'Chronologie des compétences', title_sub: 'Visualisez l\'activité des compétences d\'agents IA dans le temps.',
about_h2: '## À propos de cette chronologie', about_body: 'Cette chronologie montre le nombre de compétences poussées sur GitHub au fil du temps.',
ctrl_granularity: 'Granularité', btn_daily: 'Quotidien', btn_weekly: 'Hebdomadaire', btn_monthly: 'Mensuel',
ctrl_chart_type: 'Type de graphique', btn_area: 'Aire', btn_bar: 'Barres', ctrl_cumulative: 'Cumulatif',
kpi_total: 'Total des compétences', kpi_avg: 'Moy. par catégorie', kpi_peak: 'Compétence top Stars',
domain_title: '## Distribution des domaines', btn_on: 'Activer', btn_off: 'Désactiver',
},
ja: {
nav_categories: '職業カテゴリ', nav_insights: 'インサイト', bc_home: 'ホーム', bc_current: 'インサイト',
title: 'スキルタイムライン', title_sub: 'AIエージェントのスキル活動を時系列で可視化し、コミュニティの成長と領域分布の傾向を追跡します。',
about_h2: '## このタイムラインについて', about_body: 'このタイムラインは、GitHub上でスキルがプッシュされた数を時系列で示しています。',
ctrl_granularity: '時間粒度', btn_daily: '日次', btn_weekly: '週次', btn_monthly: '月次',
ctrl_chart_type: 'グラフタイプ', btn_area: '面積図', btn_bar: '棒グラフ', ctrl_cumulative: '累積曲線',
kpi_total: '総スキル数', kpi_avg: 'カテゴリ平均', kpi_peak: '最高 Stars スキル',
domain_title: '## 領域分布', btn_on: 'オン', btn_off: 'オフ',
},
ko: {
nav_categories: '직업 분류', nav_insights: '인사이트', bc_home: '홈', bc_current: '인사이트',
title: '스킬 타임라인', title_sub: 'AI 에이전트 스킬 활동을 시간별로 시각화합니다.',
about_h2: '## 이 타임라인에 대해', about_body: '이 타임라인은 GitHub에 푸시된 스킬 수를 시간별로 보여줍니다.',
ctrl_granularity: '시간 단위', btn_daily: '일별', btn_weekly: '주별', btn_monthly: '월별',
ctrl_chart_type: '차트 유형', btn_area: '영역형', btn_bar: '막대형', ctrl_cumulative: '누적 곡선',
kpi_total: '총 스킬 수', kpi_avg: '카테고리 평균', kpi_peak: '최고 Stars 스킬',
domain_title: '## 도메인 분포', btn_on: '켜기', btn_off: '끄기',
},
pt: {
nav_categories: 'Categorias', nav_insights: 'Análises', bc_home: 'Início', bc_current: 'Análises',
title: 'Linha do tempo de habilidades', title_sub: 'Visualize a atividade de habilidades de agentes IA ao longo do tempo.',
about_h2: '## Sobre esta linha do tempo', about_body: 'Esta linha do tempo mostra o número de habilidades enviadas ao GitHub ao longo do tempo.',
ctrl_granularity: 'Granularidade', btn_daily: 'Diário', btn_weekly: 'Semanal', btn_monthly: 'Mensal',
ctrl_chart_type: 'Tipo de gráfico', btn_area: 'Área', btn_bar: 'Barras', ctrl_cumulative: 'Cumulativo',
kpi_total: 'Total de habilidades', kpi_avg: 'Média por categoria', kpi_peak: 'Habilidade top Stars',
domain_title: '## Distribuição de domínios', btn_on: 'Ativar', btn_off: 'Desativar',
},
ar: {
nav_categories: 'الفئات', nav_insights: 'رؤى', bc_home: 'الرئيسية', bc_current: 'رؤى',
title: 'الجدول الزمني للمهارات', title_sub: 'تصور نشاط مهارات وكلاء الذكاء الاصطناعي عبر الزمن.',
about_h2: '## حول هذا الجدول الزمني', about_body: 'يعرض هذا الجدول الزمني عدد المهارات المدفوعة إلى GitHub عبر الزمن.',
ctrl_granularity: 'الدقة الزمنية', btn_daily: 'يومي', btn_weekly: 'أسبوعي', btn_monthly: 'شهري',
ctrl_chart_type: 'نوع الرسم', btn_area: 'مساحة', btn_bar: 'أعمدة', ctrl_cumulative: 'تراكمي',
kpi_total: 'إجمالي المهارات', kpi_avg: 'متوسط لكل فئة', kpi_peak: 'أعلى مهارة نجوماً',
domain_title: '## توزيع المجالات', btn_on: 'تشغيل', btn_off: 'إيقاف',
},
};
function applyDongchaI18n(lang) {
if (!lang) lang = new URLSearchParams(window.location.search).get('lang') || localStorage.getItem('sa_lang') || 'zh';
const t = DONGCHA_I18N[lang] || DONGCHA_I18N.en;
const st = (id, text) => { const el = document.getElementById(id); if (el && text) el.textContent = text; };
const sq = (sel, text) => { const el = document.querySelector(sel); if (el && text) el.textContent = text; };
sq('a[href="categories.html"]', t.nav_categories);
sq('a[href="insights.html"]', t.nav_insights);
st('dcBcHome', t.bc_home);
st('dcBcCurrent', t.bc_current);
st('dcTitle', t.title);
st('dcTitleSub', t.title_sub);
st('dcAboutH2', t.about_h2);
st('dcAboutBody', t.about_body);
st('dcCtrlGranularity', t.ctrl_granularity);
st('dcBtnDaily', t.btn_daily);
st('dcBtnWeekly', t.btn_weekly);
st('dcBtnMonthly', t.btn_monthly);
st('dcCtrlChartType', t.ctrl_chart_type);
st('dcBtnArea', t.btn_area);
st('dcBtnBar', t.btn_bar);
st('dcCtrlCumulative', t.ctrl_cumulative);
st('dcKpiTotal', t.kpi_total);
st('dcKpiAvg', t.kpi_avg);
st('dcKpiPeak', t.kpi_peak);
st('dcDomainTitle', t.domain_title);
// 累计曲线按钮(状态依赖 showCumulative 变量)
const cBtn = document.getElementById('cumulativeBtn');
if (cBtn && t.btn_on && t.btn_off) {
const isOn = typeof showCumulative !== 'undefined' ? showCumulative : true;
cBtn.textContent = isOn ? t.btn_on : t.btn_off;
}
// 重新渲染领域列表(语言切换时更新分类名称)
if (typeof buildDomainList === 'function') buildDomainList();
}
// ========== Auth UI i18n ==========
const AUTH_I18N = {
zh: {
fav_history: '收藏/历史', submit_skill: '提交 Skill', my_skill: '我的 Skill', sign_out: '退出登录',
login: '登录', register: '注册', or: '或',
ph_email: '邮箱', ph_pwd: '密码', ph_username: '用户名',
btn_login: '登录', btn_register: '注册',
github_login: '使用 GitHub 登录', github_register: '使用 GitHub 注册',
nav_login: '登录', nav_submit: '提交技能',
err_fill: '请填写邮箱和密码', err_login: '登录失败', err_register: '注册失败',
},
en: {
fav_history: 'Favorites/History', submit_skill: 'Submit Skill', my_skill: 'My Skills', sign_out: 'Sign Out',
login: 'Login', register: 'Register', or: 'or',
ph_email: 'Email', ph_pwd: 'Password', ph_username: 'Username',
btn_login: 'Login', btn_register: 'Register',
github_login: 'Login with GitHub', github_register: 'Register with GitHub',
nav_login: 'Login', nav_submit: 'Submit Skill',
err_fill: 'Please enter email and password', err_login: 'Login failed', err_register: 'Registration failed',
},
de: {
fav_history: 'Favoriten/Verlauf', submit_skill: 'Skill einreichen', my_skill: 'Meine Skills', sign_out: 'Abmelden',
login: 'Anmelden', register: 'Registrieren', or: 'oder',
ph_email: 'E-Mail', ph_pwd: 'Passwort', ph_username: 'Benutzername',
btn_login: 'Anmelden', btn_register: 'Registrieren',
github_login: 'Mit GitHub anmelden', github_register: 'Mit GitHub registrieren',
nav_login: 'Anmelden', nav_submit: 'Skill einreichen',
err_fill: 'Bitte E-Mail und Passwort eingeben', err_login: 'Anmeldung fehlgeschlagen', err_register: 'Registrierung fehlgeschlagen',
},
es: {
fav_history: 'Favoritos/Historial', submit_skill: 'Enviar Skill', my_skill: 'Mis Skills', sign_out: 'Cerrar sesión',
login: 'Iniciar sesión', register: 'Registrarse', or: 'o',
ph_email: 'Correo', ph_pwd: 'Contraseña', ph_username: 'Usuario',
btn_login: 'Iniciar sesión', btn_register: 'Registrarse',
github_login: 'Entrar con GitHub', github_register: 'Registrarse con GitHub',
nav_login: 'Iniciar sesión', nav_submit: 'Enviar Skill',
err_fill: 'Por favor ingresa correo y contraseña', err_login: 'Error al iniciar sesión', err_register: 'Error al registrarse',
},
fr: {
fav_history: 'Favoris/Historique', submit_skill: 'Soumettre un Skill', my_skill: 'Mes Skills', sign_out: 'Se déconnecter',
login: 'Connexion', register: "S'inscrire", or: 'ou',
ph_email: 'E-mail', ph_pwd: 'Mot de passe', ph_username: "Nom d'utilisateur",
btn_login: 'Se connecter', btn_register: "S'inscrire",
github_login: 'Se connecter avec GitHub', github_register: "S'inscrire avec GitHub",
nav_login: 'Connexion', nav_submit: 'Soumettre un Skill',
err_fill: 'Veuillez saisir votre e-mail et mot de passe', err_login: 'Échec de connexion', err_register: "Échec de l'inscription",
},
ja: {
fav_history: 'お気に入り/履歴', submit_skill: 'スキルを投稿', my_skill: 'マイスキル', sign_out: 'ログアウト',
login: 'ログイン', register: '登録', or: 'または',
ph_email: 'メールアドレス', ph_pwd: 'パスワード', ph_username: 'ユーザー名',
btn_login: 'ログイン', btn_register: '登録',
github_login: 'GitHubでログイン', github_register: 'GitHubで登録',
nav_login: 'ログイン', nav_submit: 'スキルを投稿',
err_fill: 'メールとパスワードを入力してください', err_login: 'ログイン失敗', err_register: '登録失敗',
},
ko: {
fav_history: '즐겨찾기/기록', submit_skill: '스킬 제출', my_skill: '내 스킬', sign_out: '로그아웃',
login: '로그인', register: '회원가입', or: '또는',
ph_email: '이메일', ph_pwd: '비밀번호', ph_username: '사용자명',
btn_login: '로그인', btn_register: '회원가입',
github_login: 'GitHub로 로그인', github_register: 'GitHub로 회원가입',
nav_login: '로그인', nav_submit: '스킬 제출',
err_fill: '이메일과 비밀번호를 입력하세요', err_login: '로그인 실패', err_register: '회원가입 실패',
},
pt: {
fav_history: 'Favoritos/Histórico', submit_skill: 'Enviar Skill', my_skill: 'Meus Skills', sign_out: 'Sair',
login: 'Entrar', register: 'Registrar', or: 'ou',
ph_email: 'E-mail', ph_pwd: 'Senha', ph_username: 'Nome de usuário',
btn_login: 'Entrar', btn_register: 'Registrar',
github_login: 'Entrar com GitHub', github_register: 'Registrar com GitHub',
nav_login: 'Entrar', nav_submit: 'Enviar Skill',
err_fill: 'Por favor insira e-mail e senha', err_login: 'Falha no login', err_register: 'Falha no registro',
},
ar: {
fav_history: 'المفضلة/السجل', submit_skill: 'إرسال مهارة', my_skill: 'مهاراتي', sign_out: 'تسجيل الخروج',
login: 'تسجيل الدخول', register: 'إنشاء حساب', or: 'أو',
ph_email: 'البريد الإلكتروني', ph_pwd: 'كلمة المرور', ph_username: 'اسم المستخدم',
btn_login: 'دخول', btn_register: 'تسجيل',
github_login: 'الدخول عبر GitHub', github_register: 'التسجيل عبر GitHub',
nav_login: 'دخول', nav_submit: 'إرسال مهارة',
err_fill: 'يرجى إدخال البريد الإلكتروني وكلمة المرور', err_login: 'فشل تسجيل الدخول', err_register: 'فشل التسجيل',
},
};
function authT(key) {
const lang = localStorage.getItem('sa_lang') || 'zh';
const t = AUTH_I18N[lang] || AUTH_I18N.en;
return t[key] || AUTH_I18N.zh[key] || key;
}
// ========== Submit Page i18n ==========
const SUBMIT_I18N = {
zh: {
page_title: '提交技能', page_desc: '将你的 Agent 技能分享给社区,帮助更多开发者',
tab_github: '🐙 方式一:GitHub 仓库', tab_github_badge: '验证仓库所有权,自动抓取信息',
tab_direct: '📝 方式二:本地提交', tab_direct_badge: '直接填写内容,无需 GitHub',
login_required: '登录后才能提交技能', login_sub: '请先登录或注册账号', login_btn: '立即登录',
github_required: '需要 GitHub 账号才能使用方式一',
github_sub: '为防止冒领,提交技能需要验证 GitHub 仓库所有权
请使用 GitHub 账号登录后再提交',
github_login_btn: '使用 GitHub 登录',
tip_title: '提交前请确认', tip_body: '你的 Skill 必须已发布到 GitHub 公开仓库,本站通过 GitHub 验证仓库所有权后才能收录。',
tip_create: '点此创建仓库 →',
label_repo: 'GitHub 仓库完整地址', fetch_btn: '获取信息', fetch_hint: '填写完整 GitHub URL 后点「获取信息」自动填充下方内容',
label_name: '技能名称', label_desc: '简介描述', label_occ: '职业分类',
label_skillmd: 'SKILL.md 内容', skillmd_tip: '? 什么是 SKILL.md',
label_images: 'Skill 测试图', images_hint: '(最多 6 张,支持 JPG/PNG/GIF/WebP)',
submit_btn: '提交技能', cancel_btn: '取消',
ph_repo: '例如:https://github.com/username/repo-name',
ph_name: '例如:Data Scraper Agent', ph_desc: '简要描述这个技能的用途和功能...',
ph_skillmd: '粘贴你的 SKILL.md 文件内容(可选)...',
select_big: '-- 请选择大类 --', select_sub: '-- 请选择小类 --',
direct_tip_title: '本地提交', direct_tip_body: '无需 GitHub 仓库,直接填写 Skill 信息提交到 skillsABC。
SKILL.md 内容为必填项,内容经过 AI 安全审核后收录。',
ph_direct_skillmd: '粘贴你的 SKILL.md 文件内容...',
success_title: '提交成功!', success_sub: '技能已收录,slug:',
view_detail: '查看详情', submit_another: '再提交一个',
edit_title: '编辑技能',
nav_categories: '职业分类', nav_insights: '洞察',
},
en: {
page_title: 'Submit Skill', page_desc: 'Share your Agent skill with the community',
tab_github: '🐙 Method 1: GitHub Repo', tab_github_badge: 'Verify repo ownership, auto-fetch info',
tab_direct: '📝 Method 2: Direct Submit', tab_direct_badge: 'Fill in content directly, no GitHub needed',
login_required: 'Login required to submit skills', login_sub: 'Please login or register first', login_btn: 'Login Now',
github_required: 'GitHub account required for Method 1',
github_sub: 'To prevent impersonation, skill submission requires GitHub repo ownership verification
Please login with GitHub first',
github_login_btn: 'Login with GitHub',
tip_title: 'Before you submit', tip_body: 'Your Skill must be published to a public GitHub repo. We verify repo ownership before listing.',
tip_create: 'Create a repo →',
label_repo: 'GitHub Repository URL', fetch_btn: 'Fetch Info', fetch_hint: 'Enter full GitHub URL then click "Fetch Info" to auto-fill',
label_name: 'Skill Name', label_desc: 'Description', label_occ: 'Occupation Category',
label_skillmd: 'SKILL.md Content', skillmd_tip: '? What is SKILL.md',
label_images: 'Skill Screenshots', images_hint: '(Max 6, JPG/PNG/GIF/WebP)',
submit_btn: 'Submit Skill', cancel_btn: 'Cancel',
ph_repo: 'e.g. https://github.com/username/repo-name',
ph_name: 'e.g. Data Scraper Agent', ph_desc: 'Briefly describe what this skill does...',
ph_skillmd: 'Paste your SKILL.md content (optional)...',
select_big: '-- Select Category --', select_sub: '-- Select Subcategory --',
direct_tip_title: 'Direct Submit', direct_tip_body: 'No GitHub repo needed. Fill in your Skill info directly.
SKILL.md content is required and will be reviewed by AI.',
ph_direct_skillmd: 'Paste your SKILL.md content...',
success_title: 'Submitted!', success_sub: 'Skill listed, slug: ',
view_detail: 'View Detail', submit_another: 'Submit Another',
edit_title: 'Edit Skill',
nav_categories: 'Categories', nav_insights: 'Insights',
},
ja: {
page_title: 'スキルを投稿', page_desc: 'あなたのエージェントスキルをコミュニティと共有しましょう',
tab_github: '🐙 方法1:GitHubリポジトリ', tab_github_badge: 'リポジトリ所有権を確認、情報を自動取得',
tab_direct: '📝 方法2:直接投稿', tab_direct_badge: '内容を直接入力、GitHubは不要',
login_required: 'スキルを投稿するにはログインが必要です', login_sub: 'ログインまたは登録してください', login_btn: '今すぐログイン',
github_required: '方法1にはGitHubアカウントが必要です',
github_sub: '不正防止のため、GitHubリポジトリの所有権確認が必要です
GitHubアカウントでログインしてください',
github_login_btn: 'GitHubでログイン',
tip_title: '投稿前に確認', tip_body: 'スキルは公開GitHubリポジトリに公開されている必要があります。',
tip_create: 'リポジトリを作成 →',
label_repo: 'GitHubリポジトリURL', fetch_btn: '情報取得', fetch_hint: 'GitHub URLを入力して「情報取得」をクリック',
label_name: 'スキル名', label_desc: '説明', label_occ: '職業カテゴリ',
label_skillmd: 'SKILL.md 内容', skillmd_tip: '? SKILL.mdとは',
label_images: 'スクリーンショット', images_hint: '(最大6枚、JPG/PNG/GIF/WebP)',
submit_btn: '投稿する', cancel_btn: 'キャンセル',
ph_repo: '例:https://github.com/username/repo-name',
ph_name: '例:Data Scraper Agent', ph_desc: 'このスキルの用途を簡単に説明...',
ph_skillmd: 'SKILL.mdの内容を貼り付け(任意)...',
select_big: '-- 大カテゴリを選択 --', select_sub: '-- サブカテゴリを選択 --',
direct_tip_title: '直接投稿', direct_tip_body: 'GitHubリポジトリ不要。スキル情報を直接入力してください。
SKILL.mdは必須です。',
ph_direct_skillmd: 'SKILL.mdの内容を貼り付け...',
success_title: '投稿完了!', success_sub: 'スキルが登録されました。slug:',
view_detail: '詳細を見る', submit_another: 'もう一つ投稿',
edit_title: 'スキルを編集',
nav_categories: '職業カテゴリ', nav_insights: 'インサイト',
},
ko: {
page_title: '스킬 제출', page_desc: '당신의 에이전트 스킬을 커뮤니티와 공유하세요',
tab_github: '🐙 방법1:GitHub 저장소', tab_github_badge: '저장소 소유권 확인, 정보 자동 가져오기',
tab_direct: '📝 방법2:직접 제출', tab_direct_badge: '내용 직접 입력, GitHub 불필요',
login_required: '스킬을 제출하려면 로그인이 필요합니다', login_sub: '로그인 또는 회원가입 해주세요', login_btn: '지금 로그인',
github_required: '방법1에는 GitHub 계정이 필요합니다',
github_sub: '사칭 방지를 위해 GitHub 저장소 소유권 확인이 필요합니다
GitHub 계정으로 로그인해 주세요',
github_login_btn: 'GitHub로 로그인',
tip_title: '제출 전 확인', tip_body: '스킬은 공개 GitHub 저장소에 게시되어 있어야 합니다.',
tip_create: '저장소 만들기 →',
label_repo: 'GitHub 저장소 URL', fetch_btn: '정보 가져오기', fetch_hint: 'GitHub URL 입력 후 "정보 가져오기" 클릭',
label_name: '스킬 이름', label_desc: '설명', label_occ: '직업 분류',
label_skillmd: 'SKILL.md 내용', skillmd_tip: '? SKILL.md란',
label_images: '스크린샷', images_hint: '(최대 6장, JPG/PNG/GIF/WebP)',
submit_btn: '스킬 제출', cancel_btn: '취소',
ph_repo: '예:https://github.com/username/repo-name',
ph_name: '예:Data Scraper Agent', ph_desc: '이 스킬의 용도를 간략히 설명...',
ph_skillmd: 'SKILL.md 내용 붙여넣기(선택)...',
select_big: '-- 대분류 선택 --', select_sub: '-- 소분류 선택 --',
direct_tip_title: '직접 제출', direct_tip_body: 'GitHub 저장소 없이 스킬 정보를 직접 입력하세요.
SKILL.md는 필수입니다.',
ph_direct_skillmd: 'SKILL.md 내용 붙여넣기...',
success_title: '제출 완료!', success_sub: '스킬이 등록되었습니다. slug:',
view_detail: '상세 보기', submit_another: '하나 더 제출',
edit_title: '스킬 편집',
nav_categories: '직업 분류', nav_insights: '인사이트',
},
de: { page_title: 'Skill einreichen', page_desc: 'Teile deinen Agent-Skill mit der Community', tab_github: '🐙 Methode 1: GitHub Repo', tab_github_badge: 'Repo-Eigentümerschaft prüfen', tab_direct: '📝 Methode 2: Direkt einreichen', tab_direct_badge: 'Inhalt direkt eingeben, kein GitHub nötig', login_required: 'Anmeldung erforderlich', login_sub: 'Bitte anmelden oder registrieren', login_btn: 'Jetzt anmelden', github_required: 'GitHub-Konto für Methode 1 erforderlich', github_sub: 'Bitte mit GitHub anmelden', github_login_btn: 'Mit GitHub anmelden', tip_title: 'Vor dem Einreichen', tip_body: 'Dein Skill muss in einem öffentlichen GitHub-Repo veröffentlicht sein.', tip_create: 'Repo erstellen →', label_repo: 'GitHub-Repository-URL', fetch_btn: 'Info abrufen', fetch_hint: 'GitHub-URL eingeben und "Info abrufen" klicken', label_name: 'Skill-Name', label_desc: 'Beschreibung', label_occ: 'Berufskategorie', label_skillmd: 'SKILL.md Inhalt', skillmd_tip: '? Was ist SKILL.md', label_images: 'Screenshots', images_hint: '(Max. 6, JPG/PNG/GIF/WebP)', submit_btn: 'Einreichen', cancel_btn: 'Abbrechen', ph_repo: 'z.B. https://github.com/username/repo-name', ph_name: 'z.B. Data Scraper Agent', ph_desc: 'Kurze Beschreibung...', ph_skillmd: 'SKILL.md-Inhalt einfügen (optional)...', select_big: '-- Kategorie wählen --', select_sub: '-- Unterkategorie wählen --', direct_tip_title: 'Direkt einreichen', direct_tip_body: 'Kein GitHub-Repo nötig.
SKILL.md ist Pflicht.', ph_direct_skillmd: 'SKILL.md-Inhalt einfügen...', success_title: 'Eingereicht!', success_sub: 'Skill gelistet, slug: ', view_detail: 'Details', submit_another: 'Weiteren einreichen', edit_title: 'Skill bearbeiten', nav_categories: 'Kategorien', nav_insights: 'Einblicke' },
es: { page_title: 'Enviar Skill', page_desc: 'Comparte tu habilidad de agente con la comunidad', tab_github: '🐙 Método 1: Repo GitHub', tab_github_badge: 'Verificar propiedad del repo', tab_direct: '📝 Método 2: Envío directo', tab_direct_badge: 'Sin GitHub necesario', login_required: 'Inicia sesión para enviar', login_sub: 'Por favor inicia sesión', login_btn: 'Iniciar sesión', github_required: 'Se requiere cuenta GitHub', github_sub: 'Por favor inicia sesión con GitHub', github_login_btn: 'Entrar con GitHub', tip_title: 'Antes de enviar', tip_body: 'Tu Skill debe estar en un repo público de GitHub.', tip_create: 'Crear repo →', label_repo: 'URL del repositorio GitHub', fetch_btn: 'Obtener info', fetch_hint: 'Ingresa la URL y haz clic en "Obtener info"', label_name: 'Nombre del skill', label_desc: 'Descripción', label_occ: 'Categoría', label_skillmd: 'Contenido SKILL.md', skillmd_tip: '? ¿Qué es SKILL.md?', label_images: 'Capturas', images_hint: '(Máx. 6, JPG/PNG/GIF/WebP)', submit_btn: 'Enviar', cancel_btn: 'Cancelar', ph_repo: 'ej. https://github.com/usuario/repo', ph_name: 'ej. Data Scraper Agent', ph_desc: 'Describe brevemente...', ph_skillmd: 'Pega el contenido de SKILL.md (opcional)...', select_big: '-- Seleccionar categoría --', select_sub: '-- Seleccionar subcategoría --', direct_tip_title: 'Envío directo', direct_tip_body: 'Sin repo GitHub.
SKILL.md es obligatorio.', ph_direct_skillmd: 'Pega el contenido de SKILL.md...', success_title: '¡Enviado!', success_sub: 'Skill listado, slug: ', view_detail: 'Ver detalle', submit_another: 'Enviar otro', edit_title: 'Editar Skill', nav_categories: 'Categorías', nav_insights: 'Perspectivas' },
fr: { page_title: 'Soumettre un Skill', page_desc: 'Partagez votre compétence d\'agent avec la communauté', tab_github: '🐙 Méthode 1 : Repo GitHub', tab_github_badge: 'Vérifier la propriété du repo', tab_direct: '📝 Méthode 2 : Soumission directe', tab_direct_badge: 'Sans GitHub', login_required: 'Connexion requise', login_sub: 'Veuillez vous connecter', login_btn: 'Se connecter', github_required: 'Compte GitHub requis', github_sub: 'Veuillez vous connecter avec GitHub', github_login_btn: 'Se connecter avec GitHub', tip_title: 'Avant de soumettre', tip_body: 'Votre Skill doit être dans un repo GitHub public.', tip_create: 'Créer un repo →', label_repo: 'URL du dépôt GitHub', fetch_btn: 'Récupérer', fetch_hint: 'Entrez l\'URL GitHub puis cliquez sur "Récupérer"', label_name: 'Nom du skill', label_desc: 'Description', label_occ: 'Catégorie', label_skillmd: 'Contenu SKILL.md', skillmd_tip: '? Qu\'est-ce que SKILL.md ?', label_images: 'Captures', images_hint: '(Max 6, JPG/PNG/GIF/WebP)', submit_btn: 'Soumettre', cancel_btn: 'Annuler', ph_repo: 'ex. https://github.com/user/repo', ph_name: 'ex. Data Scraper Agent', ph_desc: 'Décrivez brièvement...', ph_skillmd: 'Collez le contenu SKILL.md (optionnel)...', select_big: '-- Sélectionner catégorie --', select_sub: '-- Sélectionner sous-catégorie --', direct_tip_title: 'Soumission directe', direct_tip_body: 'Sans repo GitHub.
SKILL.md est obligatoire.', ph_direct_skillmd: 'Collez le contenu SKILL.md...', success_title: 'Soumis !', success_sub: 'Skill listé, slug : ', view_detail: 'Voir détail', submit_another: 'Soumettre un autre', edit_title: 'Modifier le Skill', nav_categories: 'Catégories', nav_insights: 'Analyses' },
pt: { page_title: 'Enviar Skill', page_desc: 'Compartilhe sua habilidade de agente com a comunidade', tab_github: '🐙 Método 1: Repo GitHub', tab_github_badge: 'Verificar propriedade do repo', tab_direct: '📝 Método 2: Envio direto', tab_direct_badge: 'Sem GitHub necessário', login_required: 'Login necessário', login_sub: 'Por favor faça login', login_btn: 'Entrar agora', github_required: 'Conta GitHub necessária', github_sub: 'Por favor entre com GitHub', github_login_btn: 'Entrar com GitHub', tip_title: 'Antes de enviar', tip_body: 'Seu Skill deve estar em um repo público do GitHub.', tip_create: 'Criar repo →', label_repo: 'URL do repositório GitHub', fetch_btn: 'Buscar info', fetch_hint: 'Insira a URL e clique em "Buscar info"', label_name: 'Nome do skill', label_desc: 'Descrição', label_occ: 'Categoria', label_skillmd: 'Conteúdo SKILL.md', skillmd_tip: '? O que é SKILL.md?', label_images: 'Capturas', images_hint: '(Máx. 6, JPG/PNG/GIF/WebP)', submit_btn: 'Enviar', cancel_btn: 'Cancelar', ph_repo: 'ex. https://github.com/usuario/repo', ph_name: 'ex. Data Scraper Agent', ph_desc: 'Descreva brevemente...', ph_skillmd: 'Cole o conteúdo SKILL.md (opcional)...', select_big: '-- Selecionar categoria --', select_sub: '-- Selecionar subcategoria --', direct_tip_title: 'Envio direto', direct_tip_body: 'Sem repo GitHub.
SKILL.md é obrigatório.', ph_direct_skillmd: 'Cole o conteúdo SKILL.md...', success_title: 'Enviado!', success_sub: 'Skill listado, slug: ', view_detail: 'Ver detalhe', submit_another: 'Enviar outro', edit_title: 'Editar Skill', nav_categories: 'Categorias', nav_insights: 'Análises' },
ar: { page_title: 'إرسال مهارة', page_desc: 'شارك مهارة وكيلك مع المجتمع', tab_github: '🐙 الطريقة 1: مستودع GitHub', tab_github_badge: 'التحقق من ملكية المستودع', tab_direct: '📝 الطريقة 2: إرسال مباشر', tab_direct_badge: 'بدون GitHub', login_required: 'يجب تسجيل الدخول', login_sub: 'يرجى تسجيل الدخول أو إنشاء حساب', login_btn: 'تسجيل الدخول الآن', github_required: 'حساب GitHub مطلوب', github_sub: 'يرجى تسجيل الدخول عبر GitHub', github_login_btn: 'الدخول عبر GitHub', tip_title: 'قبل الإرسال', tip_body: 'يجب أن تكون مهارتك في مستودع GitHub عام.', tip_create: 'إنشاء مستودع →', label_repo: 'رابط مستودع GitHub', fetch_btn: 'جلب المعلومات', fetch_hint: 'أدخل رابط GitHub ثم انقر "جلب المعلومات"', label_name: 'اسم المهارة', label_desc: 'الوصف', label_occ: 'الفئة المهنية', label_skillmd: 'محتوى SKILL.md', skillmd_tip: '? ما هو SKILL.md؟', label_images: 'لقطات الشاشة', images_hint: '(بحد أقصى 6، JPG/PNG/GIF/WebP)', submit_btn: 'إرسال', cancel_btn: 'إلغاء', ph_repo: 'مثال: https://github.com/user/repo', ph_name: 'مثال: Data Scraper Agent', ph_desc: 'وصف موجز...', ph_skillmd: 'الصق محتوى SKILL.md (اختياري)...', select_big: '-- اختر الفئة --', select_sub: '-- اختر الفئة الفرعية --', direct_tip_title: 'إرسال مباشر', direct_tip_body: 'بدون مستودع GitHub.
SKILL.md مطلوب.', ph_direct_skillmd: 'الصق محتوى SKILL.md...', success_title: 'تم الإرسال!', success_sub: 'تم إدراج المهارة، slug: ', view_detail: 'عرض التفاصيل', submit_another: 'إرسال آخر', edit_title: 'تعديل المهارة', nav_categories: 'الفئات', nav_insights: 'رؤى' },
};
function submitT(key) {
const lang = localStorage.getItem('sa_lang') || 'zh';
const t = SUBMIT_I18N[lang] || SUBMIT_I18N.en;
return t[key] || SUBMIT_I18N.zh[key] || key;
}
function applySubmitI18n(lang) {
if (!lang) lang = localStorage.getItem('sa_lang') || 'zh';
const st = (id, text) => { const el = document.getElementById(id); if (el && text) el.textContent = text; };
st('submitPageTitle', submitT('page_title'));
st('submitPageDesc', submitT('page_desc'));
st('submitNavCat', submitT('nav_categories'));
st('submitNavInsights', submitT('nav_insights'));
// 重新渲染表单(语言切换时更新动态内容)
if (typeof renderPage === 'function') renderPage();
}
// ========== MyFavorites i18n ==========
const MYFAV_I18N = {
zh: { nav_cat:'职业分类', nav_insights:'洞察', page_title:'我的收藏', page_desc:'保存感兴趣的职业,随时查看所需技能', tab_fav:'收藏技能', tab_hist:'浏览历史', clear_hist:'清空历史', loading:'加载中…', no_fav:'还没有收藏', no_fav_sub:'在技能详情页点击 ♡ 收藏感兴趣的技能', no_hist:'暂无浏览记录', no_hist_sub:'浏览技能详情后会自动记录', view:'查看详情', unfav:'取消收藏', load_fail:'加载失败', load_fail_sub:'请检查后端服务是否运行', confirm_clear:'确定清空所有浏览历史?' },
en: { nav_cat:'Categories', nav_insights:'Insights', page_title:'My Favorites', page_desc:'Save skills you like and revisit anytime', tab_fav:'Favorites', tab_hist:'History', clear_hist:'Clear History', loading:'Loading…', no_fav:'No favorites yet', no_fav_sub:'Click ♡ on a skill detail page to save it', no_hist:'No history yet', no_hist_sub:'Skills you view will appear here', view:'View Detail', unfav:'Remove', load_fail:'Load failed', load_fail_sub:'Please check if the backend is running', confirm_clear:'Clear all browsing history?' },
de: { nav_cat:'Kategorien', nav_insights:'Einblicke', page_title:'Meine Favoriten', page_desc:'Gespeicherte Skills jederzeit abrufen', tab_fav:'Favoriten', tab_hist:'Verlauf', clear_hist:'Verlauf löschen', loading:'Laden…', no_fav:'Noch keine Favoriten', no_fav_sub:'Klicke ♡ auf einer Skill-Seite', no_hist:'Kein Verlauf', no_hist_sub:'Besuchte Skills erscheinen hier', view:'Details', unfav:'Entfernen', load_fail:'Ladefehler', load_fail_sub:'Backend prüfen', confirm_clear:'Gesamten Verlauf löschen?' },
es: { nav_cat:'Categorías', nav_insights:'Perspectivas', page_title:'Mis Favoritos', page_desc:'Guarda skills y accede cuando quieras', tab_fav:'Favoritos', tab_hist:'Historial', clear_hist:'Limpiar historial', loading:'Cargando…', no_fav:'Sin favoritos aún', no_fav_sub:'Haz clic en ♡ en la página de detalle', no_hist:'Sin historial', no_hist_sub:'Los skills visitados aparecerán aquí', view:'Ver detalle', unfav:'Quitar', load_fail:'Error al cargar', load_fail_sub:'Verifica el backend', confirm_clear:'¿Limpiar todo el historial?' },
fr: { nav_cat:'Catégories', nav_insights:'Analyses', page_title:'Mes Favoris', page_desc:'Retrouvez vos skills favoris à tout moment', tab_fav:'Favoris', tab_hist:'Historique', clear_hist:'Effacer l\'historique', loading:'Chargement…', no_fav:'Pas encore de favoris', no_fav_sub:'Cliquez ♡ sur une page de skill', no_hist:'Pas d\'historique', no_hist_sub:'Les skills consultés apparaîtront ici', view:'Voir détail', unfav:'Retirer', load_fail:'Échec du chargement', load_fail_sub:'Vérifiez le backend', confirm_clear:'Effacer tout l\'historique ?' },
ja: { nav_cat:'職業カテゴリ', nav_insights:'インサイト', page_title:'お気に入り', page_desc:'気になるスキルを保存していつでも確認', tab_fav:'お気に入り', tab_hist:'閲覧履歴', clear_hist:'履歴を削除', loading:'読み込み中…', no_fav:'お気に入りはまだありません', no_fav_sub:'スキル詳細ページで ♡ をクリック', no_hist:'閲覧履歴はありません', no_hist_sub:'閲覧したスキルがここに表示されます', view:'詳細を見る', unfav:'削除', load_fail:'読み込み失敗', load_fail_sub:'バックエンドを確認してください', confirm_clear:'閲覧履歴をすべて削除しますか?' },
ko: { nav_cat:'직업 분류', nav_insights:'인사이트', page_title:'즐겨찾기', page_desc:'관심 있는 스킬을 저장하고 언제든지 확인', tab_fav:'즐겨찾기', tab_hist:'방문 기록', clear_hist:'기록 삭제', loading:'로딩 중…', no_fav:'즐겨찾기가 없습니다', no_fav_sub:'스킬 상세 페이지에서 ♡ 클릭', no_hist:'방문 기록 없음', no_hist_sub:'방문한 스킬이 여기에 표시됩니다', view:'상세 보기', unfav:'삭제', load_fail:'로드 실패', load_fail_sub:'백엔드를 확인하세요', confirm_clear:'모든 방문 기록을 삭제하시겠습니까?' },
pt: { nav_cat:'Categorias', nav_insights:'Análises', page_title:'Meus Favoritos', page_desc:'Salve skills e acesse quando quiser', tab_fav:'Favoritos', tab_hist:'Histórico', clear_hist:'Limpar histórico', loading:'Carregando…', no_fav:'Sem favoritos ainda', no_fav_sub:'Clique ♡ na página de detalhes', no_hist:'Sem histórico', no_hist_sub:'Skills visitados aparecerão aqui', view:'Ver detalhe', unfav:'Remover', load_fail:'Falha ao carregar', load_fail_sub:'Verifique o backend', confirm_clear:'Limpar todo o histórico?' },
ar: { nav_cat:'الفئات', nav_insights:'رؤى', page_title:'المفضلة', page_desc:'احفظ المهارات وراجعها في أي وقت', tab_fav:'المفضلة', tab_hist:'السجل', clear_hist:'مسح السجل', loading:'جارٍ التحميل…', no_fav:'لا توجد مفضلة بعد', no_fav_sub:'انقر ♡ في صفحة تفاصيل المهارة', no_hist:'لا يوجد سجل', no_hist_sub:'ستظهر المهارات التي تزورها هنا', view:'عرض التفاصيل', unfav:'إزالة', load_fail:'فشل التحميل', load_fail_sub:'تحقق من الخادم', confirm_clear:'مسح كل سجل التصفح؟' },
};
function myfavT(key) {
const lang = localStorage.getItem('sa_lang') || 'zh';
const t = MYFAV_I18N[lang] || MYFAV_I18N.en;
return t[key] || MYFAV_I18N.zh[key] || key;
}
function applyMyfavI18n(lang) {
if (!lang) lang = localStorage.getItem('sa_lang') || 'zh';
const st = (id, text) => { const el = document.getElementById(id); if (el && text) el.textContent = text; };
st('myfavNavCat', myfavT('nav_cat'));
st('myfavNavInsights', myfavT('nav_insights'));
st('myfavPageTitle', myfavT('page_title'));
st('myfavPageDesc', myfavT('page_desc'));
if (typeof renderPage === 'function') renderPage();
}
// ========== MySkills i18n ==========
const MYSKILLS_I18N = {
zh: { nav_cat:'职业分类', nav_insights:'洞察', page_title:'我的 Skill', page_desc:'你提交的所有技能', submit_new:'+ 提交新技能', login_required:'登录后查看我的技能', login_sub:'请先登录账号', login_btn:'立即登录', loading:'加载中…', load_fail:'加载失败', load_fail_sub:'请检查后端服务是否运行', relogin:'点击此处使用 GitHub 重新登录', no_skills:'还没有提交过技能', no_skills_sub:'分享你的 Agent 技能,帮助更多开发者', submit_now:'立即提交', uncategorized:'未分类', view:'查看', edit:'编辑', delete:'删除', delete_fail:'删除失败', net_error:'网络错误', confirm_delete:'确定删除技能「{slug}」?此操作不可恢复。' },
en: { nav_cat:'Categories', nav_insights:'Insights', page_title:'My Skills', page_desc:'All skills you have submitted', submit_new:'+ Submit New Skill', login_required:'Login to view your skills', login_sub:'Please login first', login_btn:'Login Now', loading:'Loading…', load_fail:'Load failed', load_fail_sub:'Please check if the backend is running', relogin:'Click here to re-login with GitHub', no_skills:'No skills submitted yet', no_skills_sub:'Share your Agent skills with the community', submit_now:'Submit Now', uncategorized:'Uncategorized', view:'View', edit:'Edit', delete:'Delete', delete_fail:'Delete failed', net_error:'Network error', confirm_delete:'Delete skill "{slug}"? This cannot be undone.' },
de: { nav_cat:'Kategorien', nav_insights:'Einblicke', page_title:'Meine Skills', page_desc:'Alle eingereichten Skills', submit_new:'+ Neuen Skill einreichen', login_required:'Anmelden um Skills zu sehen', login_sub:'Bitte anmelden', login_btn:'Jetzt anmelden', loading:'Laden…', load_fail:'Ladefehler', load_fail_sub:'Backend prüfen', relogin:'Mit GitHub neu anmelden', no_skills:'Noch keine Skills eingereicht', no_skills_sub:'Teile deine Agent-Skills', submit_now:'Jetzt einreichen', uncategorized:'Unkategorisiert', view:'Ansehen', edit:'Bearbeiten', delete:'Löschen', delete_fail:'Löschen fehlgeschlagen', net_error:'Netzwerkfehler', confirm_delete:'Skill „{slug}" löschen? Nicht rückgängig zu machen.' },
es: { nav_cat:'Categorías', nav_insights:'Perspectivas', page_title:'Mis Skills', page_desc:'Todos los skills enviados', submit_new:'+ Enviar nuevo Skill', login_required:'Inicia sesión para ver tus skills', login_sub:'Por favor inicia sesión', login_btn:'Iniciar sesión', loading:'Cargando…', load_fail:'Error al cargar', load_fail_sub:'Verifica el backend', relogin:'Volver a entrar con GitHub', no_skills:'Aún no has enviado skills', no_skills_sub:'Comparte tus habilidades de agente', submit_now:'Enviar ahora', uncategorized:'Sin categoría', view:'Ver', edit:'Editar', delete:'Eliminar', delete_fail:'Error al eliminar', net_error:'Error de red', confirm_delete:'¿Eliminar skill "{slug}"? No se puede deshacer.' },
fr: { nav_cat:'Catégories', nav_insights:'Analyses', page_title:'Mes Skills', page_desc:'Tous les skills soumis', submit_new:'+ Soumettre un nouveau Skill', login_required:'Connectez-vous pour voir vos skills', login_sub:'Veuillez vous connecter', login_btn:'Se connecter', loading:'Chargement…', load_fail:'Échec du chargement', load_fail_sub:'Vérifiez le backend', relogin:'Se reconnecter avec GitHub', no_skills:'Aucun skill soumis', no_skills_sub:"Partagez vos compétences d'agent", submit_now:'Soumettre maintenant', uncategorized:'Non catégorisé', view:'Voir', edit:'Modifier', delete:'Supprimer', delete_fail:'Échec de suppression', net_error:'Erreur réseau', confirm_delete:'Supprimer le skill « {slug} » ? Irréversible.' },
ja: { nav_cat:'職業カテゴリ', nav_insights:'インサイト', page_title:'マイスキル', page_desc:'投稿したすべてのスキル', submit_new:'+ 新しいスキルを投稿', login_required:'スキルを見るにはログインが必要です', login_sub:'ログインしてください', login_btn:'今すぐログイン', loading:'読み込み中…', load_fail:'読み込み失敗', load_fail_sub:'バックエンドを確認してください', relogin:'GitHubで再ログイン', no_skills:'まだスキルを投稿していません', no_skills_sub:'エージェントスキルをコミュニティと共有しましょう', submit_now:'今すぐ投稿', uncategorized:'未分類', view:'表示', edit:'編集', delete:'削除', delete_fail:'削除失敗', net_error:'ネットワークエラー', confirm_delete:'スキル「{slug}」を削除しますか?元に戻せません。' },
ko: { nav_cat:'직업 분류', nav_insights:'인사이트', page_title:'내 스킬', page_desc:'제출한 모든 스킬', submit_new:'+ 새 스킬 제출', login_required:'스킬을 보려면 로그인하세요', login_sub:'로그인해 주세요', login_btn:'지금 로그인', loading:'로딩 중…', load_fail:'로드 실패', load_fail_sub:'백엔드를 확인하세요', relogin:'GitHub로 다시 로그인', no_skills:'아직 제출한 스킬이 없습니다', no_skills_sub:'에이전트 스킬을 커뮤니티와 공유하세요', submit_now:'지금 제출', uncategorized:'미분류', view:'보기', edit:'편집', delete:'삭제', delete_fail:'삭제 실패', net_error:'네트워크 오류', confirm_delete:'스킬 "{slug}"을 삭제하시겠습니까? 되돌릴 수 없습니다.' },
pt: { nav_cat:'Categorias', nav_insights:'Análises', page_title:'Meus Skills', page_desc:'Todos os skills enviados', submit_new:'+ Enviar novo Skill', login_required:'Faça login para ver seus skills', login_sub:'Por favor faça login', login_btn:'Entrar agora', loading:'Carregando…', load_fail:'Falha ao carregar', load_fail_sub:'Verifique o backend', relogin:'Entrar novamente com GitHub', no_skills:'Nenhum skill enviado ainda', no_skills_sub:'Compartilhe suas habilidades de agente', submit_now:'Enviar agora', uncategorized:'Sem categoria', view:'Ver', edit:'Editar', delete:'Excluir', delete_fail:'Falha ao excluir', net_error:'Erro de rede', confirm_delete:'Excluir skill "{slug}"? Não pode ser desfeito.' },
ar: { nav_cat:'الفئات', nav_insights:'رؤى', page_title:'مهاراتي', page_desc:'جميع المهارات التي أرسلتها', submit_new:'+ إرسال مهارة جديدة', login_required:'سجل الدخول لعرض مهاراتك', login_sub:'يرجى تسجيل الدخول', login_btn:'تسجيل الدخول الآن', loading:'جارٍ التحميل…', load_fail:'فشل التحميل', load_fail_sub:'تحقق من الخادم', relogin:'إعادة تسجيل الدخول عبر GitHub', no_skills:'لم تُرسل أي مهارات بعد', no_skills_sub:'شارك مهارات وكيلك مع المجتمع', submit_now:'إرسال الآن', uncategorized:'غير مصنف', view:'عرض', edit:'تعديل', delete:'حذف', delete_fail:'فشل الحذف', net_error:'خطأ في الشبكة', confirm_delete:'حذف المهارة "{slug}"؟ لا يمكن التراجع.' },
};
function myskillsT(key) {
const lang = localStorage.getItem('sa_lang') || 'zh';
const t = MYSKILLS_I18N[lang] || MYSKILLS_I18N.en;
return t[key] || MYSKILLS_I18N.zh[key] || key;
}
function applyMyskillsI18n(lang) {
if (!lang) lang = localStorage.getItem('sa_lang') || 'zh';
const st = (id, text) => { const el = document.getElementById(id); if (el && text) el.textContent = text; };
st('myskillsNavCat', myskillsT('nav_cat'));
st('myskillsNavInsights', myskillsT('nav_insights'));
st('myskillsPageTitle', myskillsT('page_title'));
st('myskillsPageDesc', myskillsT('page_desc'));
st('myskillsSubmitLink', myskillsT('submit_new'));
if (typeof renderPage === 'function') renderPage();
}