Skip to content
Merged
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
74 changes: 74 additions & 0 deletions .agents/skills/localize-rustfs-docs/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
---
name: localize-rustfs-docs
description: Localize, add, review, or repair RustFS documentation languages and FumaPress internationalization. Use for locale directories, translated Markdown or MDX, localized navigation and UI, terminology decisions, language routing, hreflang metadata, search indexes, redirects, and translation-quality reviews in docs.rustfs.com.
---

# Localize RustFS documentation

Build each locale as a complete RustFS documentation experience. Preserve product meaning and operational accuracy; do not perform literal sentence-by-sentence substitution.

## Required context

1. Read `../rustfs-docs/SKILL.md` and the repository `STYLE.md` before editing content.
2. Read [the current FumaPress internationalization guide](https://press.fumadocs.dev/docs/internationalization.md) before changing `press.config.tsx` or locale layout.
3. Read [references/terminology.md](references/terminology.md) before translating or reviewing terminology.
4. Verify commands, flags, configuration keys, defaults, ports, APIs, and feature claims against `rustfs/rustfs`; never infer them from a translation.

## Translation standard

- Translate meaning in the context of the RustFS product, its Console, and S3-compatible behavior. Rewrite sentence structure when necessary for natural target-language documentation.
- Keep `RustFS`, protocol names, API names, CLI commands, code, environment variables, configuration keys, file paths, URLs, JSON/YAML keys, and identifiers unchanged.
- Use the glossary consistently. When a technical term has no established translation, keep the English term and add a short target-language explanation on first use.
- Preserve visible Console labels exactly when instructing the reader to click them; add a translation in parentheses only when it improves comprehension.
- Preserve the source page's technical scope. Do not add capabilities, defaults, warnings, or recommendations during translation unless they are verified and added to every maintained locale.
- Keep code fences byte-for-byte equivalent across locales unless a localized string is itself part of the demonstrated behavior. Translate prose outside code fences instead.
- Preserve links and cited sources. Localize internal documentation links to the current locale while keeping external destinations unchanged.
- Review the completed page as native technical writing. Reject awkward calques, ambiguous pronouns, untranslated prose fragments, terminology drift, and sentences that are grammatically correct but unnatural.

## Configure FumaPress i18n

1. Define all locales with `defineI18n` and choose the parser explicitly. This repository uses locale directories, so keep `parser: "dir"`.
2. Pass the resulting translations API to `defineConfig`.
3. Use an official `@fumapress/language` preset when available. A preset localizes Fumadocs UI and FumaPress strings; setting only `displayName` is insufficient.
4. Localize repository-owned navigation, footer text, labels, and calls to action separately because language packs cannot translate hard-coded strings.
5. Keep `content/<locale>/` trees structurally aligned. Every maintained page must have a target-locale counterpart or an explicitly documented fallback decision.
6. Emit the correct `<html lang>`, canonical URL, and `hreflang` alternates for every page.
7. Verify that search output is partitioned by locale and that the language switcher retains the corresponding page path.

## Content and navigation workflow

1. Start from the current default-language page, not from an older translation.
2. Identify RustFS-specific terms and runtime claims before translating.
3. Translate headings and prose for reader intent, then reconcile terminology against the glossary and nearby translated pages.
4. Copy or share required images without changing the English, light-theme screenshot policy from `rustfs-docs`.
5. Update the target locale's `meta.json`. Use bare entries for pages inside the same folder; use locale-prefixed URLs for cross-folder navigation entries.
6. Check that frontmatter, heading levels, admonitions, links, images, code-fence languages, and MDX component structure match the source page.
7. Review the rendered page, including sidebar, breadcrumbs, table of contents, previous/next links, search, and custom navbar/footer text.

## Routing and deployment

- Keep locale prefixes explicit (`/en/...`, `/zh/...`) while `hideLocale: "never"` is configured.
- Redirect `/` to the default locale and preserve every historical unprefixed URL by redirecting it to the equivalent default-locale URL.
- Treat hosting configuration as part of i18n. `_redirects` is used by Cloudflare-style static hosting; Vercel requires `vercel.json`, `vercel.ts`, or a configured bulk redirects file.
- Never delete a legacy redirect merely because the destination gained a locale prefix. Prefix its destination and retain the original source.
- Smoke-test redirects against the deployed preview. A successful build or deployment status does not prove that redirects work.

## Validation

Run all repository checks:

```bash
npm run docs:check
npm run types:check
npm run build
```

Then verify:

- `content/en` and every maintained locale contain the same relative file set.
- Commands and non-localized code blocks remain identical across translated counterparts.
- Every generated internal `href` resolves to a generated page or public asset.
- Target-language pages do not expose unexpected English framework UI strings.
- `/`, representative legacy URLs, and representative locale URLs return the intended status and destination on the deployment preview.

Do not commit `node_modules/`, `dist/`, preview output, or temporary translation files.
4 changes: 4 additions & 0 deletions .agents/skills/localize-rustfs-docs/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Localize RustFS Docs"
short_description: "Build and verify localized RustFS documentation"
default_prompt: "Use $localize-rustfs-docs to add or review a documentation locale end to end."
65 changes: 65 additions & 0 deletions .agents/skills/localize-rustfs-docs/references/terminology.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# RustFS localization terminology

Use this hierarchy when choosing a translation:

1. The term used by the current RustFS product, Console, source code, or API.
2. An established term already used consistently in the target-language RustFS documentation.
3. The standard term used by the relevant ecosystem, such as Amazon S3 or Kubernetes.
4. English with a concise target-language explanation when no stable translation exists.

Never choose a dictionary translation that changes the RustFS concept. Search the repository and upstream source before adding a new translation, and update this glossary when a new term becomes canonical.

## Simplified Chinese baseline

| Source term | Preferred Chinese | Guidance |
|---|---|---|
| RustFS | RustFS | Never translate or alter capitalization. |
| Amazon S3 / S3 | Amazon S3 / S3 | Keep the product and protocol name. |
| S3-compatible | 兼容 S3 | Do not claim complete or 100% compatibility. |
| object storage | 对象存储 | Use for the storage model. |
| bucket | 存储桶 | Use consistently in prose. Preserve `bucket` in code and API names. |
| object | 对象 | Use for an S3 object; do not substitute “file” unless the source specifically means a local file. |
| object key | 对象键 | Keep `Key` unchanged in API or JSON examples. |
| access key | 访问密钥 | Preserve `RUSTFS_ACCESS_KEY` and SDK field names. |
| secret key | 秘密密钥 | Preserve `RUSTFS_SECRET_KEY` and SDK field names. |
| Console | 控制台 | Keep visible English UI labels unchanged in step instructions. |
| endpoint | 端点 | Use “S3 API 端点” when the endpoint type could be ambiguous. |
| region | 区域 | Preserve region values such as `us-east-1`. |
| tenant | 租户 | Use in the RustFS Operator and multi-tenancy context. |
| storage pool | 存储池 | Do not shorten to “池” when the storage meaning is unclear. |
| erasure coding | 纠删码 | Use for the data-protection scheme. |
| healing | 修复 | Use for RustFS data or node recovery operations; do not translate as medical “healing”. |
| rebalance | 数据再平衡 | Use “再平衡” for the operation name when context is already clear. |
| decommission | 退役 | Use the established RustFS operation name “存储池退役”; explain that the pool is drained and deactivated rather than substituting a generic “下线”. |
| replication | 复制 | Qualify as “站点复制” or “存储桶复制” according to the RustFS feature. |
| versioning | 版本控制 | Use specifically for S3 object versioning. |
| object lock | 对象锁定 | Do not conflate with distributed locks. |
| legal hold | 依法保留 | Use the established Amazon S3 Chinese term; preserve API names such as `ObjectLockLegalHold`. |
| lifecycle management | 生命周期管理 | Use for S3 lifecycle rules. |
| IAM | IAM | Keep the acronym; explain as identity and access management on first conceptual use. |
| KMS | KMS | Keep the acronym; distinguish RustFS built-in KMS from external backends. |
| STS | STS | Keep the acronym; explain temporary credentials when needed. |
| OIDC | OIDC | Keep the acronym and protocol terminology. |
| server-side encryption | 服务端加密 | Keep SSE-S3, SSE-KMS, and SSE-C unchanged. |
| path-style addressing | 路径式寻址 | Preserve SDK option names such as `forcePathStyle`. |
| virtual-hosted-style addressing | 虚拟主机式寻址 | Relate it to `RUSTFS_SERVER_DOMAINS` when relevant. |
| presigned URL | 预签名 URL | Keep URL uppercase. |
| multipart upload | 分片上传 | Use the established S3 term. |
| health check | 健康检查 | Keep endpoint paths unchanged. |
| readiness | 就绪状态 | Use for readiness probes and `/health/ready`. |
| observability | 可观测性 | Keep OpenTelemetry and OTLP unchanged. |
| webhook | Webhook | Prefer the established English product term over a literal translation. |
| rootless | 无 root 权限 | In Podman context, prefer this over the ambiguous literal “无根”. |
| root credentials | 根凭证 | Use for the deployment-wide `RUSTFS_ACCESS_KEY` / `RUSTFS_SECRET_KEY` pair; do not confuse it with an operating-system root account. |

## UI labels and identifiers

When the Console screenshot or interface displays an English label, write instructions like `Select **Buckets(存储桶)**` rather than translating the clickable label to a string the reader cannot find. Keep exact casing for buttons, menu items, resource kinds, and error messages.

Do not translate identifiers embedded in prose, including:

- executable and command names such as `rustfs`, `rc`, `aws`, and `kubectl`;
- Kubernetes resource kinds such as `Tenant`, `Secret`, and `PersistentVolumeClaim`;
- environment variables and flags;
- API actions, HTTP methods, status text, metric names, and JSON/YAML keys;
- filenames, paths, package names, image tags, domains, and URLs.
1 change: 1 addition & 0 deletions .claude/skills/localize-rustfs-docs
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

This playbook directs AI agents working in the RustFS documentation repository so that every deliverable stays accurate, auditable, and easy to maintain.

> **Every agent:** the operating playbook for writing and reviewing these docs is the skill at [`.agents/skills/rustfs-docs/SKILL.md`](.agents/skills/rustfs-docs/SKILL.md) — factual-accuracy discipline, canonical constants, FumaPress syntax, screenshots, and the `npm run docs:check` / `npm run build` pre-flight. Read it before changing anything under `content/`. It uses the cross-client `.agents/skills/` convention; Claude Code auto-loads it via the `.claude/skills/rustfs-docs` symlink, and other agents should open the file directly. See also `STYLE.md` for the detailed style guide.
> **Every agent:** the operating playbook for writing and reviewing these docs is the skill at [`.agents/skills/rustfs-docs/SKILL.md`](.agents/skills/rustfs-docs/SKILL.md) — factual-accuracy discipline, canonical constants, FumaPress syntax, screenshots, and the `npm run docs:check` / `npm run build` pre-flight. Read it before changing anything under `content/`. For translations, locale structure, language UI, or internationalized routing, also read [`.agents/skills/localize-rustfs-docs/SKILL.md`](.agents/skills/localize-rustfs-docs/SKILL.md). It requires product-context translation instead of literal substitution and defines the RustFS terminology workflow. Skills use the cross-client `.agents/skills/` convention; Claude Code auto-loads them through matching `.claude/skills/` symlinks, and other agents should open the files directly. See also `STYLE.md` for the detailed style guide.

## 1. Repository Snapshot
- Framework: **FumaPress** (static-site generator powered by Waku + Fumadocs). Content lives in `content/`; site configuration is in `press.config.tsx`, `source.config.ts`, and `waku.config.ts`.
Expand Down
13 changes: 0 additions & 13 deletions content/developer/examples/meta.json

This file was deleted.

12 changes: 0 additions & 12 deletions content/developer/sdk/meta.json

This file was deleted.

File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
"title": "Administration",
"defaultOpen": true,
"pages": [
"[Console](/administration/console)",
"[Console](/en/administration/console)",
"data",
"protocols",
"cors",
"[Virtual-Host Access](/integration/virtual)"
"[Virtual-Host Access](/en/integration/virtual)"
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
"webdav",
"ftps",
"sftp",
"[MCP Server](/developer/mcp)"
"[MCP Server](/en/developer/mcp)"
]
}
13 changes: 13 additions & 0 deletions content/en/developer/examples/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"title": "Examples",
"pages": [
"[rc](/en/operations/rc)",
"[AWS CLI](/en/developer/examples/aws-cli)",
"[s3cmd](/en/developer/examples/s3cmd)",
"[rclone](/en/developer/examples/rclone)",
"[boto3 (Python)](/en/developer/examples/boto3)",
"[AWS SDK for JavaScript](/en/developer/examples/aws-sdk-js)",
"[AWS SDK for Go](/en/developer/examples/aws-sdk-go)",
"[Terraform](/en/developer/examples/terraform)"
]
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
12 changes: 12 additions & 0 deletions content/en/developer/sdk/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"title": "SDK",
"pages": [
"[Java](/en/developer/sdk/java)",
"[Python](/en/developer/sdk/python)",
"[Rust](/en/developer/sdk/rust)",
"[JavaScript](/en/developer/sdk/javascript)",
"[TypeScript](/en/developer/sdk/typescript)",
"[Golang](/en/developer/sdk/go)",
"[Other SDKs](/en/developer/sdk/other)"
]
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
16 changes: 8 additions & 8 deletions content/index.mdx → content/en/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ description: "Install RustFS on Linux, containers, Kubernetes, macOS, or Windows
for S3-compatible workloads. This documentation covers installation,
administration, security, and operations for RustFS clusters.
</div>
<a className="rustfs-install-overview" href="/installation">
<a className="rustfs-install-overview" href="/en/installation">
Review installation requirements
<ArrowRight aria-hidden="true" />
</a>
</div>

<div className="rustfs-install-grid">
<a className="rustfs-install-card" href="/installation/linux/quick-start">
<a className="rustfs-install-card" href="/en/installation/linux/quick-start">
<span className="rustfs-install-icon rustfs-install-icon--linux"><BrandLogo name="linux" /></span>
<span className="rustfs-install-copy">
<strong>Install on Linux</strong>
Expand All @@ -26,7 +26,7 @@ description: "Install RustFS on Linux, containers, Kubernetes, macOS, or Windows
<ArrowRight className="rustfs-install-arrow" aria-hidden="true" />
</a>

<a className="rustfs-install-card" href="/installation/container/docker">
<a className="rustfs-install-card" href="/en/installation/container/docker">
<span className="rustfs-install-icon rustfs-install-icon--docker"><BrandLogo name="docker" /></span>
<span className="rustfs-install-copy">
<strong>Install with Docker</strong>
Expand All @@ -35,7 +35,7 @@ description: "Install RustFS on Linux, containers, Kubernetes, macOS, or Windows
<ArrowRight className="rustfs-install-arrow" aria-hidden="true" />
</a>

<a className="rustfs-install-card" href="/installation/container/podman">
<a className="rustfs-install-card" href="/en/installation/container/podman">
<span className="rustfs-install-icon rustfs-install-icon--podman"><BrandLogo name="podman" /></span>
<span className="rustfs-install-copy">
<strong>Install with Podman</strong>
Expand All @@ -44,7 +44,7 @@ description: "Install RustFS on Linux, containers, Kubernetes, macOS, or Windows
<ArrowRight className="rustfs-install-arrow" aria-hidden="true" />
</a>

<a className="rustfs-install-card" href="/installation/cloud-native/helm-chart">
<a className="rustfs-install-card" href="/en/installation/cloud-native/helm-chart">
<span className="rustfs-install-icon rustfs-install-icon--helm"><BrandLogo name="helm" /></span>
<span className="rustfs-install-copy">
<strong>Install with Helm</strong>
Expand All @@ -53,7 +53,7 @@ description: "Install RustFS on Linux, containers, Kubernetes, macOS, or Windows
<ArrowRight className="rustfs-install-arrow" aria-hidden="true" />
</a>

<a className="rustfs-install-card" href="/installation/cloud-native/operator">
<a className="rustfs-install-card" href="/en/installation/cloud-native/operator">
<span className="rustfs-install-icon rustfs-install-icon--kubernetes"><BrandLogo name="kubernetes" /></span>
<span className="rustfs-install-copy">
<strong>Install with the Operator</strong>
Expand All @@ -62,7 +62,7 @@ description: "Install RustFS on Linux, containers, Kubernetes, macOS, or Windows
<ArrowRight className="rustfs-install-arrow" aria-hidden="true" />
</a>

<a className="rustfs-install-card" href="/installation/macos">
<a className="rustfs-install-card" href="/en/installation/macos">
<span className="rustfs-install-icon rustfs-install-icon--apple"><BrandLogo name="apple" /></span>
<span className="rustfs-install-copy">
<strong>Install on macOS</strong>
Expand All @@ -71,7 +71,7 @@ description: "Install RustFS on Linux, containers, Kubernetes, macOS, or Windows
<ArrowRight className="rustfs-install-arrow" aria-hidden="true" />
</a>

<a className="rustfs-install-card" href="/installation/windows">
<a className="rustfs-install-card" href="/en/installation/windows">
<span className="rustfs-install-icon rustfs-install-icon--windows"><BrandLogo name="windows" /></span>
<span className="rustfs-install-copy">
<strong>Install on Windows</strong>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ Use the Helm chart when you want Helm to manage one RustFS cluster. Use the [Rus

## Helm chart workflows

- [Install](./installation.md) covers requirements and standalone or distributed deployment.
- [Install](./installation.mdx) covers requirements and standalone or distributed deployment.
- [mTLS](./mtls.md) encrypts and authenticates traffic between RustFS Pods.
- [cert-manager](./cert-manager.md) issues and renews certificates for RustFS Ingress and mTLS.
File renamed without changes.
10 changes: 10 additions & 0 deletions content/en/installation/linux/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"title": "Linux",
"pages": [
"[Quick Start](/en/installation/linux/quick-start)",
"[Prerequisites & Service Setup](/en/installation/linux/prerequisites-and-service)",
"[Single Node Single Disk (SNSD)](/en/installation/linux/single-node-single-disk)",
"[Single Node Multiple Disk (SNMD)](/en/installation/linux/single-node-multiple-disk)",
"[Multiple Node Multiple Disk (MNMD)](/en/installation/linux/multiple-node-multiple-disk)"
]
}
Loading
Loading