Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

[![GitHub Repo stars](https://img.shields.io/github/stars/SneakRead/sneakread?style=flat&logo=github)](https://github.com/SneakRead/sneakread) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) · [sneakread.com](https://sneakread.com) · 纯前端、无后端、无账号 · [English](README.md)

粘贴任意公开网址,SneakRead 通过阅读器把它抓成正文,然后**全屏渲染成一个真实的桌面软件** —— VS Code、Claude Code、Word、WPS、Google Docs、Notion、Slack、飞书、钉钉、企业微信、Teams、Gmail、Excel 或 Outlook —— 让「看网页」看起来像「在工作」。品牌:全球叫 **SneakRead**,中文叫 **摸鱼**。
粘贴任意公开网址,SneakRead 通过阅读器把它抓成正文,然后**全屏渲染成一个真实的桌面软件** —— VS Code、Claude Code、Word、WPS、Google 文档、Notion、Slack、飞书、钉钉、企业微信、Teams、Gmail、Excel 或 Outlook —— 让「看网页」看起来像「在工作」。品牌:全球叫 **SneakRead**,中文叫 **摸鱼**。

![BBC 世界杯首页,此刻是一份 Word 文档——真功能区、真字数统计、真状态栏](docs/screenshots/zh-word.jpg)

Expand All @@ -25,7 +25,7 @@
| Word | 标题栏、Colorful 功能区、标尺、画布上的纸张、状态栏 | 干净的文章 |
| VS Code | 完整工作台:活动栏、资源管理器、**真 Monaco 编辑器**、终端、minimap | 源码 markdown |
| Claude Code | 跑着 AI 编码助手的 macOS 终端:工具调用、流式回答、context 余量 | 文章当成 AI 的回答 |
| Google Docs | 文档顶栏、菜单、药丸工具栏、页面 | 干净的文章 |
| Google 文档 | 文档顶栏、菜单、药丸工具栏、页面 | 干净的文章 |
| Notion | 侧栏、List view 数据库、右侧 peek 面板与属性区 | 文章当成一个页面 |
| 飞书文档 | 面包屑、目录栏、AI 速览、分享按钮、可选署名水印 | 干净的云文档 |
| Slack | 深紫侧栏、频道列表、消息流、输入框 | 文章拆成一串消息 |
Expand Down
5 changes: 2 additions & 3 deletions src/core/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,8 @@ export type DocumentRecord = ReaderDoc & {
lastSyncedAt: string
}

// A locale override for a skin's user-facing name. Only Feishu/Lark needs this
// (飞书/飞书文档 in zh, Lark/Lark Docs in en) — every other app is named the
// same worldwide, so `i18nNames` stays undefined for them.
// A locale override for a skin's user-facing name. Most brands stay unchanged;
// use this for product names that have a real regional name, such as Google 文档.
export type SkinLocaleName = { label: string; appName: string }

export type Skin = {
Expand Down
3 changes: 3 additions & 0 deletions src/skins/docs/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,9 @@ const docs: SkinDefinition = {
fileExtension: 'gdoc',
accent: '#4285f4',
faviconGlyph: 'D',
i18nNames: {
zh: { label: 'Google 文档', appName: 'Google 文档' },
},
Surface: DocsSkin,
}
export default docs
8 changes: 4 additions & 4 deletions src/skins/labels.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Resolve a skin's user-facing name for the current language. Only Feishu/Lark
// carries locale overrides (飞书/飞书文档 ⇄ Lark/Lark Docs); every other skin
// returns its single worldwide name. Leaf module — imports only types, so both
// the app shell and the shared skin chrome can use it without import cycles.
// Resolve a skin's user-facing name for the current language. Most skins use
// one worldwide name; `i18nNames` overrides it where a product has a real
// regional name (飞书, Google 文档, 钉钉, …). Leaf module — imports only types,
// so both the app shell and the shared skin chrome can use it without cycles.
import type { Skin } from '../core/types'
import type { Lang } from '../i18n'

Expand Down
6 changes: 1 addition & 5 deletions src/skins/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,7 @@ export type SkinDefinition = {
accent: string
/** 1–2 char glyph for the favicon tile. Defaults to the first letter of `label`. */
faviconGlyph?: string
/**
* Locale overrides for `label`/`appName`. Only Feishu/Lark needs it — the app is
* literally rebranded by region (飞书/飞书文档 in zh, Lark/Lark Docs in en). Every
* other disguise is named the same worldwide, so leave this undefined.
*/
/** Locale overrides for product names that differ by region. */
i18nNames?: Partial<Record<Lang, SkinLocaleName>>
/** The disguise. Receives the document to render as that app. */
Surface: ComponentType<{ doc: DocumentRecord }>
Expand Down