Skip to content

Comments

Simplified and traditional Chinese translations#24868

Closed
ninghuilulu wants to merge 4 commits intoTryGhost:mainfrom
ninghuilulu:main
Closed

Simplified and traditional Chinese translations#24868
ninghuilulu wants to merge 4 commits intoTryGhost:mainfrom
ninghuilulu:main

Conversation

@ninghuilulu
Copy link

updated simplified Chinese translation. hope it's helpful.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 10, 2025

Walkthrough

This change updates multiple Chinese locale files (Simplified and Traditional): ghost/i18n/locales/zh/ghost.json, zh/portal.json, and several zh-Hant files (ghost.json, portal.json, comments.json, signup-form.json). No keys, JSON structure, or exported signatures were altered; only string values were added or refined. Many previously empty or placeholder translations are filled and terminology is standardized, preserving dynamic placeholders (e.g., {siteTitle}, {site}, {email}, {date}, {otc}, {postTitle}). Affected copy includes authentication/sign-in flows, verification emails, UI labels, newsletters/plans, subscription/billing messages, comments, and portal text.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10–15 minutes

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed The title "Simplified and traditional Chinese translations" accurately summarizes the primary change: a localization update affecting both Simplified (zh) and Traditional (zh-Hant) locale files, as shown by the provided summaries. It is concise, specific, and clear for a reviewer scanning PR history without adding extraneous detail. The title therefore correctly reflects the main intent of the changeset.
Description Check ✅ Passed The PR description ("updated simplified Chinese translation. hope it's helpful.") is related to the changeset but is minimal and slightly incomplete because the changes include both Simplified and Traditional Chinese updates across multiple locale files. The description is not off-topic, but its brevity reduces usefulness for reviewers who would benefit from a clearer summary of scope. It therefore passes the lenient relevance check.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.
✨ Finishing touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3635e57 and 6b5c222.

📒 Files selected for processing (1)
  • ghost/i18n/locales/zh-Hant/ghost.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • ghost/i18n/locales/zh-Hant/ghost.json

Tip

👮 Agentic pre-merge checks are now available in preview!

Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.

  • Built-in checks – Quickly apply ready-made checks to enforce title conventions, require pull request descriptions that follow templates, validate linked issues for compliance, and more.
  • Custom agentic checks – Define your own rules using CodeRabbit’s advanced agentic capabilities to enforce organization-specific policies and workflows. For example, you can instruct CodeRabbit’s agent to verify that API documentation is updated whenever API schema files are modified in a PR. Note: Upto 5 custom checks are currently allowed during the preview period. Pricing for this feature will be announced in a few weeks.

Please see the documentation for more information.

Example:

reviews:
  pre_merge_checks:
    custom_checks:
      - name: "Undocumented Breaking Changes"
        mode: "warning"
        instructions: |
          Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).

Please share your feedback with us on this Discord post.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 9

🧹 Nitpick comments (13)
ghost/i18n/locales/zh/ghost.json (6)

26-27: “More/Less like this” should describe feed tuning, not like/dislike.

Prefer phrasing that reflects recommendation intensity.

-"Less like this": "不喜欢",
+"Less like this": "减少此类内容",
-"More like this": "喜欢",
+"More like this": "更多类似内容",

Also applies to: 30-30


28-29: Prefer 订阅 over 会籍 across subscription strings.

“会籍” reads formal and inconsistent with other UI; Ghost commonly uses “订阅/会员订阅”.

-"Manage subscription": "管理会籍",
+"Manage subscription": "管理订阅",
-"Member since": "会籍自",
+"Member since": "会员自",
-"Your subscription has been canceled and will expire on {date}. You can resume your subscription via your account settings.": "您的会籍已取消,将于{date}到期。您可通过账户设置重新订阅。",
+"Your subscription has been canceled and will expire on {date}. You can resume your subscription via your account settings.": "您的订阅已取消,将于 {date} 到期。您可在账户设置中恢复订阅。",
-"Your subscription has expired.": "您的会籍已过期。",
+"Your subscription has expired.": "您的订阅已过期。",
-"Your subscription will expire on {date}.": "您的会籍将于{date}过期。",
+"Your subscription will expire on {date}.": "您的订阅将于 {date} 过期。",
-"Your subscription will renew on {date}.": "您的会籍将于{date}更新。",
+"Your subscription will renew on {date}.": "您的订阅将于 {date} 续订。",

Also applies to: 77-81


31-31: “Name” → “姓名”.

“称呼” ≠ “Name” in most forms; use “姓名”.

-"Name": "称呼",
+"Name": "姓名",

46-47: Consistent honorifics (use 您).

Most strings use 您. Align these two for tone consistency.

-"Someone just replied to your comment": "有人刚刚回复了你的评论",
+"Someone just replied to your comment": "有人刚刚回复了您的评论",
-"Someone just replied to your comment on {postTitle}.": "有人刚刚在{postTitle}回复了你的评论",
+"Someone just replied to your comment on {postTitle}.": "有人刚刚在 {postTitle} 回复了您的评论",

61-61: Remove extraneous punctuation.

UI labels typically avoid trailing “。”; and the long code message shouldn’t end with a colon.

-"View comments": "浏览评论。",
+"View comments": "浏览评论",
-"Welcome back! Here's your code to sign in to {siteTitle}. For your security, it's only valid for 24 hours": "欢迎回来!这是您登录{siteTitle}的验证码。出于安全考虑,该验证码仅在24小时内有效:",
+"Welcome back! Here's your code to sign in to {siteTitle}. For your security, it's only valid for 24 hours": "欢迎回来!这是您登录 {siteTitle} 的验证码。出于安全考虑,该验证码仅在 24 小时内有效。",

Also applies to: 65-65


13-13: Grammar tweak.

Add 的 and full-width punctuation.

-"Confirm your email update for {siteTitle}!": "确认您在 {siteTitle} 电子邮件的更新!",
+"Confirm your email update for {siteTitle}!": "确认您在 {siteTitle} 的电子邮件更新!",
ghost/i18n/locales/zh/portal.json (7)

18-18: Button text and pronoun: make it concise, formal.

-"Add a personal note": "留下你的话。",
+"Add a personal note": "添加个人备注",

86-86: Clarify verification failure message.

-"Failed to verify code, please try again": "验证码失败,请重试",
+"Failed to verify code, please try again": "验证码验证失败,请重试",

97-97: Prefer 订阅 over 会籍.

-"If you cancel your subscription now, you will continue to have access until {periodEnd}.": "如果现在取消订阅,当前会籍在{periodEnd}前依旧有效。",
+"If you cancel your subscription now, you will continue to have access until {periodEnd}.": "如果现在取消订阅,您的订阅在 {periodEnd} 前仍然有效。",
-"Your subscription will expire on {expiryDate}": "您的会籍将在{expiryDate}到期",
+"Your subscription will expire on {expiryDate}": "您的订阅将在 {expiryDate} 到期",
-"Your subscription will renew on {renewalDate}": "您的会籍将在{renewalDate}续费",
+"Your subscription will renew on {renewalDate}": "您的订阅将在 {renewalDate} 续订",
-"Your subscription will start on {subscriptionStart}": "您的会籍将于{subscriptionStart}开始"
+"Your subscription will start on {subscriptionStart}": "您的订阅将于 {subscriptionStart} 开始"

Also applies to: 220-222


100-104: Polish newsletter help copy.

-"If you're not receiving the email newsletter you've subscribed to, here are a few things to check.": "如果没有收到订阅了的新闻信,请检查以下事项。",
+"If you're not receiving the email newsletter you've subscribed to, here are a few things to check.": "如果您未收到已订阅的新闻信,请检查以下事项。",
-"In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "当尝试发送新闻信时遇到永久错误,向该账户的发送邮件的功能将被禁用。",
+"In the event a permanent failure is received when attempting to send a newsletter, emails will be disabled on the account.": "当尝试发送新闻信遇到永久性失败时,将禁用该账户的邮件功能。",

Also applies to: 102-102


112-112: Email domain restrictions phrasing.

Align with prior Ghost guidance; more natural Simplified wording.

-"Memberships from this email domain are currently restricted.": "来自此电子邮件域名的注册目前受到限制。",
+"Memberships from this email domain are currently restricted.": "目前不接受来自该邮件域的会员申请。",
-"Signups from this email domain are currently restricted.": "来自此电子邮件域名的注册目前受到限制。",
+"Signups from this email domain are currently restricted.": "目前不接受来自该邮件域的新会员注册。",

Also applies to: 148-148


176-176: Add missing “权限”.

-"This site is invite-only, contact the owner for access.": "此网站仅限邀请,联系网站所有者以获取访问",
+"This site is invite-only, contact the owner for access.": "此网站仅限邀请,请联系网站所有者以获取访问权限",

206-206: Use “退信” instead of “反弹” for bounce.

-"When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "收件箱无法接收邮件时称为“反弹”。大多数时候这是临时的。但是某些情况下,无效或者不存在的邮件地址反弹的邮件会被认定为永久错误。",
+"When an inbox fails to accept an email it is commonly called a bounce. In many cases, this can be temporary. However, in some cases, a bounced email can be returned as a permanent failure when an email address is invalid or non-existent.": "收件箱无法接收邮件时称为“退信”。多数情况下这是临时的;但若邮箱地址无效或不存在,退信会被视为永久性失败。",
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1661717 and 88c614a.

📒 Files selected for processing (2)
  • ghost/i18n/locales/zh/ghost.json (1 hunks)
  • ghost/i18n/locales/zh/portal.json (7 hunks)
🧰 Additional context used
🧠 Learnings (7)
📓 Common learnings
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/ghost.json:25-26
Timestamp: 2025-07-29T05:18:41.313Z
Learning: In Ghost's Traditional Chinese localization, when source English text is modified (such as removing words like "safely"), the corresponding Chinese translations should be updated to match. For example, if "safely" is removed from English security-related messages, the corresponding "放心" should also be removed from the Chinese translation to maintain translation accuracy.
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-01-29T15:27:29.391Z
Learning: When reviewing translation files in ghost/i18n/locales, translators should only modify the translated values and must not change the keys or placeholder styles (e.g., %%{status}%%, {site}, etc.) as they serve specific purposes like Mailgun string replacement.
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-05-20T21:08:21.026Z
Learning: In the Ghost project, translation files (ghost/i18n/locales/*/*.json) commonly have blank values for translations, and this is normal behavior that should not be flagged in reviews. These empty translations will be filled in separate PRs.
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/portal.json:107-108
Timestamp: 2025-07-29T05:24:43.780Z
Learning: In Ghost's Traditional Chinese localization for portal.json, when translating membership restriction messages, "目前不接受此 email 網域的會員申請" is preferred over "此 email 網域的註冊目前不接受會員登記" as it provides better sentence flow and uses more natural phrasing while maintaining the same meaning.
📚 Learning: 2025-07-29T05:18:41.313Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/ghost.json:25-26
Timestamp: 2025-07-29T05:18:41.313Z
Learning: In Ghost's Traditional Chinese localization, when source English text is modified (such as removing words like "safely"), the corresponding Chinese translations should be updated to match. For example, if "safely" is removed from English security-related messages, the corresponding "放心" should also be removed from the Chinese translation to maintain translation accuracy.

Applied to files:

  • ghost/i18n/locales/zh/ghost.json
  • ghost/i18n/locales/zh/portal.json
📚 Learning: 2025-01-29T15:27:29.391Z
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-01-29T15:27:29.391Z
Learning: When reviewing translation files in ghost/i18n/locales, translators should only modify the translated values and must not change the keys or placeholder styles (e.g., %%{status}%%, {site}, etc.) as they serve specific purposes like Mailgun string replacement.

Applied to files:

  • ghost/i18n/locales/zh/ghost.json
  • ghost/i18n/locales/zh/portal.json
📚 Learning: 2025-05-20T21:08:21.026Z
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-05-20T21:08:21.026Z
Learning: In the Ghost project, translation files (ghost/i18n/locales/*/*.json) commonly have blank values for translations, and this is normal behavior that should not be flagged in reviews. These empty translations will be filled in separate PRs.

Applied to files:

  • ghost/i18n/locales/zh/ghost.json
📚 Learning: 2025-07-29T05:28:28.664Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/portal.json:143-144
Timestamp: 2025-07-29T05:28:28.664Z
Learning: In Ghost's Traditional Chinese localization, when translating signup/registration restriction messages, it's important to consider the specific context (e.g., member signup vs. general signup) to choose the most appropriate terminology. For member signup contexts, "新會員註冊" (new member registration) is more contextually accurate than just "註冊" (registration).

Applied to files:

  • ghost/i18n/locales/zh/ghost.json
📚 Learning: 2025-07-29T05:24:43.780Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/portal.json:107-108
Timestamp: 2025-07-29T05:24:43.780Z
Learning: In Ghost's Traditional Chinese localization for portal.json, when translating membership restriction messages, "目前不接受此 email 網域的會員申請" is preferred over "此 email 網域的註冊目前不接受會員登記" as it provides better sentence flow and uses more natural phrasing while maintaining the same meaning.

Applied to files:

  • ghost/i18n/locales/zh/ghost.json
📚 Learning: 2025-04-30T16:27:03.542Z
Learnt from: cathysarisky
PR: TryGhost/Ghost#23070
File: ghost/i18n/locales/hu/comments.json:45-45
Timestamp: 2025-04-30T16:27:03.542Z
Learning: In the Ghost project, new translation string keys are intentionally added with empty values initially and will be translated in a separate PR. Do not report missing translations for entirely new string additions.

Applied to files:

  • ghost/i18n/locales/zh/ghost.json

"By {authors}": "",
"Comment": "",
"Become a paid member of {site} to get access to all premium content.": "成为{site}的付费会员,即可畅享所有付费内容。",
"By {authors}": "",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Placeholder lost for authors; restore {authors}.

Current value drops the {authors} token and changes meaning. Keep the placeholder per Ghost i18n rules.

Apply:

-"By {authors}": "文",
+"By {authors}": "作者:{authors}",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"By {authors}": "",
"By {authors}": "作者:{authors}",
🤖 Prompt for AI Agents
In ghost/i18n/locales/zh/ghost.json around line 5 the translation for "By
{authors}" has dropped the {authors} placeholder ("文"); restore the placeholder
by replacing the value with a correct Chinese string that includes the {authors}
token (for example use a natural phrasing such as "由 {authors} 撰写" or
"作者:{authors}"), ensuring the {authors} token remains exactly as-is to comply
with Ghost i18n rules.

💡 Verification agent

🧩 Analysis chain

Automated checks for placeholders and label colons.

Run to validate JSON and ensure key placeholders/colons are preserved.

Also applies to: 15-15, 17-17, 67-68


🏁 Script executed:

#!/bin/bash
set -euo pipefail
f="ghost/i18n/locales/zh/ghost.json"

# 1) JSON validity
jq . "$f" >/dev/null

# 2) Ensure {authors} placeholder retained
echo 'By {authors} ->' "$(jq -r '."By {authors}"' "$f")"
jq -r '."By {authors}"' "$f" | grep -q '{authors}' || { echo "Missing {authors} in translation"; exit 1; }

# 3) Label colons present
for k in "Device:" "When:" "Where:"; do
  v=$(jq -r --arg k "$k" '.[$k]' "$f")
  echo "$k -> $v"
done

# 4) Scan for formal “会籍” usage to review consistency
rg -n '会籍' "$f" || true

Length of output: 50


Restore the {authors} placeholder in the Chinese translation

  • The value for "By {authors}" is currently "文", which omits the {authors} placeholder; update it to include {authors} (e.g. "由 {authors}").
🤖 Prompt for AI Agents
In ghost/i18n/locales/zh/ghost.json around lines 5 to 5 the translation for "By
{authors}" incorrectly omits the `{authors}` placeholder ("文"); update the value
to include the `{authors}` placeholder (for example "由 {authors}") so the author
names are rendered correctly, preserving spacing and punctuation consistent with
Chinese localization.

"Device:": "",
"Email": "",
"For security verification, enter the code below to sign in to {siteTitle}:": "",
"Device:": "设备",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Label translations missing/incorrect colons (“Device:”, “When:”, “Where:”).

  • “Device:” lost the colon.
  • “When:”/“Where:” translated as “自/从”, which is incorrect for labels.
-"Device:": "设备",
+"Device:": "设备:",
-"When:": "自",
+"When:": "时间:",
-"Where:": "从",
+"Where:": "地点:",

Also applies to: 67-68

🤖 Prompt for AI Agents
In ghost/i18n/locales/zh/ghost.json around lines 15 and 67-68, the translations
for the labels have lost or incorrect colons and wrong words: restore the colon
on "设备" to "设备:" and replace the incorrect "自"/"从" translations for "When:" and
"Where:" with appropriate label translations such as "时间:" for "When:" and "地点:"
(or "何地:"/"在哪里:") for "Where:", ensuring the colon is present in each translated
string.

"For security verification, enter the code below to sign in to {siteTitle}:": "",
"Device:": "设备",
"Email": "电子邮件",
"For security verification, enter the code below to sign in to {siteTitle}:": "为了安全验证,请输入下方的验证码以登陆{siteTitle}",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Unify 登录 and fix punctuation.

Use 登录 (not 登陆) and add a full-width colon for the code prompt.

-"For security verification, enter the code below to sign in to {siteTitle}:": "为了安全验证,请输入下方的验证码以登陆{siteTitle}",
+"For security verification, enter the code below to sign in to {siteTitle}:": "为安全验证,请输入下方验证码以登录 {siteTitle}:",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"For security verification, enter the code below to sign in to {siteTitle}:": "为了安全验证,请输入下方的验证码以登陆{siteTitle}",
"For security verification, enter the code below to sign in to {siteTitle}:": "为安全验证,请输入下方验证码以登录 {siteTitle}",
🤖 Prompt for AI Agents
In ghost/i18n/locales/zh/ghost.json around line 17, the translation uses 登陆 and
an ASCII colon; change 登陆 to 登录 and replace the ASCII colon with a full-width
colon (:) so the string becomes consistent and uses correct punctuation for
Chinese UI text.

Comment on lines +18 to +22
"Add a personal note": "留下你的话。",
"After a free trial ends, you will be charged the regular price for the tier you've chosen. You can always cancel before then.": "免费试用结束后,您将被收取所选套餐的标准价格。在此之前,您可以随时取消。",
"Already a member?": "已经是会员了?",
"An email has been sent to your inbox. Use the link inside or enter the code below.": "",
"An error occurred": "",
"An email has been sent to your inbox. Use the link inside or enter the code below.": "邮件已发送到您的收件箱。请点击邮件中的链接或输入下方代码。",
"An error occurred": "发送错误",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Quick sanity checks (placeholders, JSON, typical pitfalls).

Run to validate JSON and surface common issues introduced in this patch.

Also applies to: 52-53, 62-67, 86-86, 95-95, 112-112, 148-148, 176-176, 190-190, 206-206, 220-222


🏁 Script executed:

#!/bin/bash
set -euo pipefail
f="ghost/i18n/locales/zh/portal.json"

# 1) JSON validity
jq . "$f" >/dev/null

# 2) Spot-check placeholder preservation in changed strings
placeholders=('{periodEnd}' '{expiryDate}' '{renewalDate}' '{subscriptionStart}' '{senderEmail}' '{memberEmail}' '{newsletterName}')
for p in "${placeholders[@]}"; do
  rg -nP "$p" "$f" || echo "WARN: placeholder $p not found (ensure not dropped where expected)"
done

# 3) Flag mistranslated 'session' -> '对话'
rg -n '对话' "$f" || true

# 4) Find “会籍” usage for consistency review
rg -n '会籍' "$f" || true

# 5) Ensure domain restriction strings updated
rg -n '邮件域|电子邮件域名|email 域' "$f" || true

Length of output: 2542


Fix translation inconsistencies in zh portal.json

  • JSON is valid and all placeholders ({periodEnd}, {expiryDate}, {renewalDate}, {subscriptionStart}, {senderEmail}, {memberEmail}, {newsletterName}) are preserved.
  • Lines 52 and 190: “session” is translated as “对话” (dialogue); use the technical term “会话” instead.
  • Lines 85, 97, 220–222: “subscription” is rendered as “会籍”; replace with “订阅” or “会员资格” to match “会员” in nearby entries.
  • Lines 112 and 148: domain restriction strings (“来自此电子邮件域名的注册目前受到限制。”) are correct and consistent.

"An email has been sent to your inbox. Use the link inside or enter the code below.": "",
"An error occurred": "",
"An email has been sent to your inbox. Use the link inside or enter the code below.": "邮件已发送到您的收件箱。请点击邮件中的链接或输入下方代码。",
"An error occurred": "发送错误",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Wrong meaning (“发送错误”). Should be “发生错误”.

-"An error occurred": "发送错误",
+"An error occurred": "发生错误",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"An error occurred": "发送错误",
"An error occurred": "发生错误",
🤖 Prompt for AI Agents
In ghost/i18n/locales/zh/portal.json around line 22, the Chinese translation for
"An error occurred" is incorrect ("发送错误"); replace it with the correct phrase
"发生错误" to convey the intended meaning. Update the JSON value to "发生错误" ensuring
proper quotes and comma remain valid JSON.

"Continue": "继续",
"Continue subscription": "继续订阅",
"Could not create stripe checkout session": "",
"Could not create stripe checkout session": "无法创建Stripe结账对话",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

“checkout session” ≠ “对话”. Use “会话”.

-"Could not create stripe checkout session": "无法创建Stripe结账对话",
+"Could not create stripe checkout session": "无法创建 Stripe 结账会话",
-"Unable to initiate checkout session": "无法启动结账对话",
+"Unable to initiate checkout session": "无法启动结账会话",

Also applies to: 190-190

🤖 Prompt for AI Agents
In ghost/i18n/locales/zh/portal.json around lines 52 and 190, the translation
uses “对话” for “checkout session” which is incorrect; replace “对话” with “会话” in
both entries so the string reads "无法创建Stripe结账会话" (and update the other instance
at line 190 similarly).

Comment on lines +62 to 67
"Email newsletter": "发送新闻信",
"Email newsletter settings updated": "已更新新闻信发信设定",
"Email preferences": "电子邮件偏好设置",
"Email preferences updated.": "",
"Email preferences updated.": "电子邮件偏好已更新",
"Emails": "电子邮件列表",
"Emails disabled": "关闭电子邮件列表",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Email/newsletter labels need accuracy.

-"Email newsletter": "发送新闻信",
+"Email newsletter": "邮件新闻信",
-"Email newsletter settings updated": "已更新新闻信发信设定",
+"Email newsletter settings updated": "新闻信设置已更新",
-"Emails": "电子邮件列表",
+"Emails": "电子邮件",
-"Emails disabled": "关闭电子邮件列表",
+"Emails disabled": "电子邮件已禁用",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"Email newsletter": "发送新闻信",
"Email newsletter settings updated": "已更新新闻信发信设定",
"Email preferences": "电子邮件偏好设置",
"Email preferences updated.": "",
"Email preferences updated.": "电子邮件偏好已更新",
"Emails": "电子邮件列表",
"Emails disabled": "关闭电子邮件列表",
"Email newsletter": "邮件新闻信",
"Email newsletter settings updated": "新闻信设置已更新",
"Email preferences": "电子邮件偏好设置",
"Email preferences updated.": "电子邮件偏好已更新",
"Emails": "电子邮件",
"Emails disabled": "电子邮件已禁用",
🤖 Prompt for AI Agents
In ghost/i18n/locales/zh/portal.json around lines 62 to 67, the Chinese
translations use inconsistent or imprecise terms for "Email"/"newsletter" (e.g.
"发送新闻信", "新闻信发信设定") — update them to accurate, consistent phrases: use "电子邮件通讯"
or "电子报" for "Email newsletter" (pick one consistent term across the file),
change "Email newsletter settings updated" to "电子邮件通讯设置已更新", change "Email
preferences" to "电子邮件偏好" (remove redundant "设置"), change "Email preferences
updated." to "电子邮件偏好已更新。", change "Emails" to "电子邮件", and change "Emails
disabled" to "电子邮件已禁用"; keep existing punctuation and JSON formatting, and
ensure the chosen term for "newsletter" is used consistently elsewhere in this
locale.

"Help! I'm not receiving emails": "求助!我没有收到电子邮件",
"Here are a few other sites you may enjoy.": "以下是您或许会感兴趣的其他网站。",
"If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "如果有快报被标记为垃圾邮件,则自动拒绝该地址的邮件以确保后续不再接收不想要的消息。",
"If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "如如果某份新闻信被标记为垃圾邮件,系统将自动禁用该地址的邮件接收功能,确保您不再收到任何不需要的消息。",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Typo: duplicated “如”.

-"If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "如如果某份新闻信被标记为垃圾邮件,系统将自动禁用该地址的邮件接收功能,确保您不再收到任何不需要的消息。",
+"If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "如果某份新闻信被标记为垃圾邮件,系统将自动禁用该地址的邮件接收功能,确保您不再收到任何不需要的消息。",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "如如果某份新闻信被标记为垃圾邮件,系统将自动禁用该地址的邮件接收功能,确保您不再收到任何不需要的消息。",
"If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "如果某份新闻信被标记为垃圾邮件,系统将自动禁用该地址的邮件接收功能,确保您不再收到任何不需要的消息。",
🤖 Prompt for AI Agents
In ghost/i18n/locales/zh/portal.json around line 95, the translation contains a
duplicated character "如如果"; remove the extra "如" so the sentence starts with
"如果某份新闻信被标记为垃圾邮件,系统将自动禁用该地址的邮件接收功能,确保您不再收到任何不需要的消息。" and keep the rest of the
string unchanged.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (15)
ghost/i18n/locales/zh-Hant/comments.json (2)

11-11: Use wording that invites providing background (per prior guideline).

"增加你的專業背景" reads as “increase.” Prefer inviting the user to provide info.

-"Add your expertise": "增加你的專業背景",
+"Add your expertise": "提供你的專業背景",

62-63: Use 「回覆」 (reply) rather than 「留言」 (comment) for reply counters.

These two lines mix comment vs reply terminology.

-"Show {amount} more replies": "顯示後續 {amount} 則留言",
-"Show 1 more reply": "顯示下一則留言",
+"Show {amount} more replies": "顯示後續 {amount} 則回覆",
+"Show 1 more reply": "顯示下一則回覆",
ghost/i18n/locales/zh-Hant/signup-form.json (1)

3-8: Signup flow translations read naturally and preserve meaning.

All four updates look correct. Minor consistency note: zh-Hant usually prefers 「收件匣」 over 「收件箱」; consider aligning across zh-Hant files.

ghost/i18n/locales/zh-Hant/ghost.json (3)

54-54: Prefer consistent term 「電子郵件地址」 over “email”.

-"This email address will not be used.": "此 email 將不會被使用。",
+"This email address will not be used.": "此電子郵件地址不會被使用。",

62-62: Natural phrasing for “View in browser”.

-"View in browser": "用瀏覽器打開",
+"View in browser": "在瀏覽器中檢視",

3-3: Punctuation/nit: finalize tone and end marks.

-"All the best!": "一切順利",
+"All the best!": "祝一切順利!",

-"See you soon!": "很快再見!",
+"See you soon!": "很快再見!",  // optional, already fine

-"You're one tap away from subscribing to {siteTitle} — please confirm your email address with this link:": "您離訂閱{siteTitle}只差一步 — 請透過此連結確認您的電子郵件地址",
+"You're one tap away from subscribing to {siteTitle} — please confirm your email address with this link:": "您離訂閱 {siteTitle} 只差一步 — 請透過此連結確認您的電子郵件地址:",

Also applies to: 39-39, 75-75

ghost/i18n/locales/zh-Hant/portal.json (9)

14-14: Unify zh-Hant mailbox terminology to 「收件匣」.

-"A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "登入連結已經發送到您的收件箱。如果在 3 分鐘內未收到,請務必檢查您的垃圾郵件。",
+"A login link has been sent to your inbox. If it doesn't arrive in 3 minutes, be sure to check your spam folder.": "登入連結已發送至您的收件匣。若 3 分鐘內未收到,請檢查垃圾郵件。",

-"An email has been sent to your inbox. Use the link inside or enter the code below.": "一封電子郵件已發送至您的收件匣。請點擊郵件內的連結,或輸入以下驗證碼。",
+"An email has been sent to your inbox. Use the link inside or enter the code below.": "一封電子郵件已發送至您的收件匣。請點擊郵件內的連結,或輸入下方驗證碼。",

-"Check with your mail provider": "請向您的電子郵件服務提供商確認",
+"Check with your mail provider": "請向您的電子郵件服務提供商確認",

-"Now check your email!": "立即檢查您的電子郵件",
+"Now check your email!": "請立即檢查您的收件匣!",

Also applies to: 21-21, 35-35, 123-123


70-70: Complete the phrase with 「地址」.

-"Enter your email address": "輸入你的電子郵件",
+"Enter your email address": "輸入你的電子郵件地址",

135-135: "Recommendations" should just be 「推薦」 (not “所有推薦”).

-"Recommendations": "所有推薦",
+"Recommendations": "推薦",

109-109: Confirm product semantics for tuning buttons.

If these are preference-tuning controls, “喜歡/不喜歡” may be okay. If they literally mean content quantity (“More/Less like this”), consider:

-"Less like this": "不喜歡",
-"More like this": "喜歡",
+"Less like this": "較少此類內容",
+"More like this": "更多此類內容",

Also applies to: 116-116


90-90: Avoid PRC phrasing; keep source meaning.

-"Get in touch for help": "聯繫我們,獲取幫助",
+"Get in touch for help": "聯絡我們以取得協助",

-"Memberships unavailable, contact the owner for access.": "無法存取你的會員資訊,請聯絡客服或是網站所有人。",
+"Memberships unavailable, contact the owner for access.": "目前無法使用會員功能,請聯絡網站所有者以取得存取權限。",

Also applies to: 113-114


103-104: Tighten wording; use standard zh-Hant terms.

-"In your email client add {senderEmail} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "在您的電子郵件系統中將 {senderEmail} 加入您的聯絡人列表中。如此一來,您的電子郵件系統就會知道可以信任從該地址發送的郵件。",
+"In your email client add {senderEmail} to your contacts list. This signals to your mail provider that emails sent from this address should be trusted.": "請在您的電子郵件用戶端中將 {senderEmail} 加入通訊錄,讓服務提供商知道此寄件地址值得信任。",

-"Invalid email address": "無效的電子郵件地址",
+"Invalid email address": "無效的電子郵件地址",  // ok; included here for context only

170-170: Fix PRC words and punctuation.

-"The email address we have for you is {memberEmail} — if that's not correct, you can update it in your <button>account settings area</button>.": "您的電子郵件地址是 {memberEmail} - 如果該郵箱不正確,您可以在<button>帳戶設置區域</button>中更新它。",
+"The email address we have for you is {memberEmail} — if that's not correct, you can update it in your <button>account settings area</button>.": "我們為您所記錄的電子郵件地址是 {memberEmail} —— 若不正確,您可以在<button>帳戶設定區域</button>中更新。",

202-203: Use zh-Hant terms for “email address” and “contact”.

-"We couldn't unsubscribe you as the email address was not found. Please contact the site owner.": "我們無法取消您的訂閱,因為找不到該電子郵箱地址。請聯繫網站所有者。",
+"We couldn't unsubscribe you as the email address was not found. Please contact the site owner.": "我們無法取消您的訂閱,因為找不到該電子郵件地址。請聯絡網站所有者。",

219-219: Keep original meaning: your input influences published content.

-"Your input helps shape what gets published.": "您的建議將使我們變得更好。",
+"Your input helps shape what gets published.": "您的回饋將影響我們發佈的內容。",
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 88c614a and 3635e57.

📒 Files selected for processing (4)
  • ghost/i18n/locales/zh-Hant/comments.json (3 hunks)
  • ghost/i18n/locales/zh-Hant/ghost.json (1 hunks)
  • ghost/i18n/locales/zh-Hant/portal.json (6 hunks)
  • ghost/i18n/locales/zh-Hant/signup-form.json (1 hunks)
🧰 Additional context used
🧠 Learnings (8)
📓 Common learnings
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/ghost.json:25-26
Timestamp: 2025-07-29T05:18:41.313Z
Learning: In Ghost's Traditional Chinese localization, when source English text is modified (such as removing words like "safely"), the corresponding Chinese translations should be updated to match. For example, if "safely" is removed from English security-related messages, the corresponding "放心" should also be removed from the Chinese translation to maintain translation accuracy.
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-01-29T15:27:29.391Z
Learning: When reviewing translation files in ghost/i18n/locales, translators should only modify the translated values and must not change the keys or placeholder styles (e.g., %%{status}%%, {site}, etc.) as they serve specific purposes like Mailgun string replacement.
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-05-20T21:08:21.026Z
Learning: In the Ghost project, translation files (ghost/i18n/locales/*/*.json) commonly have blank values for translations, and this is normal behavior that should not be flagged in reviews. These empty translations will be filled in separate PRs.
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/portal.json:107-108
Timestamp: 2025-07-29T05:24:43.780Z
Learning: In Ghost's Traditional Chinese localization for portal.json, when translating membership restriction messages, "目前不接受此 email 網域的會員申請" is preferred over "此 email 網域的註冊目前不接受會員登記" as it provides better sentence flow and uses more natural phrasing while maintaining the same meaning.
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/comments.json:45-46
Timestamp: 2025-07-29T05:08:05.874Z
Learning: For Traditional Chinese localization in Ghost's comments.json, "Oldest" should be translated as "最早" (not "最初") when used in comment sorting selectors, as "最早" better conveys the temporal sorting context.
📚 Learning: 2025-07-29T05:28:28.664Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/portal.json:143-144
Timestamp: 2025-07-29T05:28:28.664Z
Learning: In Ghost's Traditional Chinese localization, when translating signup/registration restriction messages, it's important to consider the specific context (e.g., member signup vs. general signup) to choose the most appropriate terminology. For member signup contexts, "新會員註冊" (new member registration) is more contextually accurate than just "註冊" (registration).

Applied to files:

  • ghost/i18n/locales/zh-Hant/signup-form.json
📚 Learning: 2025-07-29T05:24:43.780Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/portal.json:107-108
Timestamp: 2025-07-29T05:24:43.780Z
Learning: In Ghost's Traditional Chinese localization for portal.json, when translating membership restriction messages, "目前不接受此 email 網域的會員申請" is preferred over "此 email 網域的註冊目前不接受會員登記" as it provides better sentence flow and uses more natural phrasing while maintaining the same meaning.

Applied to files:

  • ghost/i18n/locales/zh-Hant/signup-form.json
  • ghost/i18n/locales/zh-Hant/ghost.json
📚 Learning: 2025-07-29T05:18:41.313Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/ghost.json:25-26
Timestamp: 2025-07-29T05:18:41.313Z
Learning: In Ghost's Traditional Chinese localization, when source English text is modified (such as removing words like "safely"), the corresponding Chinese translations should be updated to match. For example, if "safely" is removed from English security-related messages, the corresponding "放心" should also be removed from the Chinese translation to maintain translation accuracy.

Applied to files:

  • ghost/i18n/locales/zh-Hant/signup-form.json
  • ghost/i18n/locales/zh-Hant/portal.json
  • ghost/i18n/locales/zh-Hant/comments.json
  • ghost/i18n/locales/zh-Hant/ghost.json
📚 Learning: 2025-07-29T04:57:10.163Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/comments.json:11-11
Timestamp: 2025-07-29T04:57:10.163Z
Learning: In Ghost's Traditional Chinese localization, the "Add your expertise" label appears as a link in comments when expertise is not yet provided, specifically to request additional professional background information from commenters. The translation should reflect this context of inviting additional information rather than just adding new information.

Applied to files:

  • ghost/i18n/locales/zh-Hant/comments.json
📚 Learning: 2025-07-29T05:08:05.874Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/comments.json:45-46
Timestamp: 2025-07-29T05:08:05.874Z
Learning: For Traditional Chinese localization in Ghost's comments.json, "Oldest" should be translated as "最早" (not "最初") when used in comment sorting selectors, as "最早" better conveys the temporal sorting context.

Applied to files:

  • ghost/i18n/locales/zh-Hant/comments.json
📚 Learning: 2025-01-29T15:27:29.391Z
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-01-29T15:27:29.391Z
Learning: When reviewing translation files in ghost/i18n/locales, translators should only modify the translated values and must not change the keys or placeholder styles (e.g., %%{status}%%, {site}, etc.) as they serve specific purposes like Mailgun string replacement.

Applied to files:

  • ghost/i18n/locales/zh-Hant/ghost.json
📚 Learning: 2025-05-20T21:08:21.026Z
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-05-20T21:08:21.026Z
Learning: In the Ghost project, translation files (ghost/i18n/locales/*/*.json) commonly have blank values for translations, and this is normal behavior that should not be flagged in reviews. These empty translations will be filled in separate PRs.

Applied to files:

  • ghost/i18n/locales/zh-Hant/ghost.json
🔇 Additional comments (3)
ghost/i18n/locales/zh-Hant/comments.json (3)

45-46: "Oldest" = 「最早」 is correct.

Matches prior guidance for comment sorting labels. "Newest" → 「最新」 also looks good.


65-65: "Sign in" → 「登入」 LGTM.


73-73: Refined target recipient LGTM.

“網站所有者” is clearer than the previous “所有者”.

"Failed to verify code, please try again": "",
"Failed to verify code, please try again": "驗證碼驗證失敗,請再試一次",
"Forever": "永久",
"Free Trial – Ends {trialEnd}": "免費試用──於 {trialEnd} 结束",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Simplified character in zh-Hant.

“结束” should be 「結束」.

-"Free Trial – Ends {trialEnd}": "免費試用──於 {trialEnd} 结束",
+"Free Trial – Ends {trialEnd}": "免費試用──於 {trialEnd} 結束",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"Free Trial – Ends {trialEnd}": "免費試用──於 {trialEnd} 结束",
"Free Trial – Ends {trialEnd}": "免費試用──於 {trialEnd} 結束",
🤖 Prompt for AI Agents
In ghost/i18n/locales/zh-Hant/portal.json around line 88, the translation uses
the Simplified Chinese character "结束"; replace it with the Traditional Chinese
character "結束" so the entry becomes "免費試用──於 {trialEnd} 結束", preserving the
exact spacing and placeholder {trialEnd} formatting.

@cathysarisky cathysarisky changed the title updated many simplified chinese translaiton. Simplified and traditional Chinese translations Sep 14, 2025
@cathysarisky cathysarisky self-assigned this Sep 14, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
ghost/i18n/locales/zh-Hant/ghost.json (2)

33-34: Fix localized placeholder and improve phrasing

Use the original placeholder {siteTitle}; also align wording with existing "留言" usage.

-"New reply to your comment on {siteTitle}": "對你在 {網站標題} 上的評論的新回覆",
+"New reply to your comment on {siteTitle}": "您在 {siteTitle} 上的留言有新回覆",

1-83: Fix translated placeholder and formal-pronoun usage in zh-Hant locale

  • Critical: placeholder was translated inside braces — ghost/i18n/locales/zh-Hant/ghost.json line 33 currently contains "對你在 {網站標題} 上的評論的新回覆"; revert {網站標題} → {siteTitle}.
  • Tone: informal "你/你的" appears in user-facing transactional strings — replace with formal "您/您的" where appropriate (lines 33, 69, 77–81). Check greetings at lines 21–22 ("你好,"/"你好!") for intended informality.
  • Verification note: your second rg pattern ({網站|網站標題}) is an invalid regex; use a plain alternation search like rg -n "網站|網站標題" to re-run checks.
🧹 Nitpick comments (12)
ghost/i18n/locales/zh-Hant/ghost.json (12)

15-15: Preserve colon and prefer “裝置” for zh‑Hant

Match Line 72’s “新裝置” and keep the trailing colon.

-"Device:": "設備",
+"Device:": "裝置:",

36-36: Use “付費” for membership status, not “已付款”

“paid” here is a plan/status label.

-"paid": "已付款",
+"paid": "付費",

38-38: Tighten copy

More natural and concise.

-"Secure sign in link for {siteTitle}": "為{siteTitle}準備的安全登入連結",
+"Secure sign in link for {siteTitle}": "{siteTitle} 的安全登入連結",

47-47: Add “上” and spacing for clarity

Align with “on {postTitle}”.

-"Someone just replied to your comment on {postTitle}.": "有人剛剛在{postTitle}回覆了您的留言",
+"Someone just replied to your comment on {postTitle}.": "有人剛剛在 {postTitle} 上回覆了您的留言",

62-62: Use native zh‑Hant phrasing

“In browser” → “在瀏覽器中開啟”.

-"View in browser": "用瀏覽器打開",
+"View in browser": "在瀏覽器中開啟",

69-69: Formal tone and punctuation

Prefer 您; add comma; keep spacing style consistent with rest of file.

-"You are receiving this because you are a <strong>%%{status}%% subscriber</strong> to {site}.": "你會收到此封電子報因為你是{site}的<strong>%%{status}%% 訂閱者</strong>。",
+"You are receiving this because you are a <strong>%%{status}%% subscriber</strong> to {site}.": "您會收到此封電子報,因為您是{site}的<strong>%%{status}%% 訂閱者</strong>。",

75-75: Restore trailing colon

Source ends with a colon; needed before the link.

-"You're one tap away from subscribing to {siteTitle} — please confirm your email address with this link:": "您離訂閱{siteTitle}只差一步 — 請透過此連結確認您的電子郵件地址",
+"You're one tap away from subscribing to {siteTitle} — please confirm your email address with this link:": "您離訂閱{siteTitle}只差一步 — 請透過此連結確認您的電子郵件地址:",

77-77: Consistent honorific and smoother style

Switch 你→您; minor readability tweaks.

-"Your free trial ends on {date}, at which time you will be charged the regular price. You can always cancel before then.": "你的免費試用將會在{date}結束,結束後你將會被收取標準價格。你可以在試用期結束前取消。",
+"Your free trial ends on {date}, at which time you will be charged the regular price. You can always cancel before then.": "您的免費試用將於{date}結束,屆時將收取標準價格。您可在試用期結束前隨時取消。",

13-13: Remove stray space around placeholder

Match nearby strings’ style (no spaces around {siteTitle}).

-"Confirm your email update for {siteTitle}!": "確認您在{siteTitle} 的電子郵件變更!",
+"Confirm your email update for {siteTitle}!": "確認您在{siteTitle}的電子郵件變更!",

82-82: Unify spacing around placeholders

Consistent with lines 7, 8, 63.

-"Your verification code for {siteTitle}": "您在 {siteTitle} 的驗證碼"
+"Your verification code for {siteTitle}": "您在{siteTitle}的驗證碼"

32-32: Consistency: use “留言” and add “在 … 有”

Align with “留言” elsewhere.

-"New comment on {postTitle}": "{postTitle}有新評論",
+"New comment on {postTitle}": "在 {postTitle} 有新留言",

3-3: Add terminal punctuation

Match tone used elsewhere.

-"All the best!": "一切順利",
+"All the best!": "一切順利!",
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3635e57 and 699b6ad.

📒 Files selected for processing (1)
  • ghost/i18n/locales/zh-Hant/ghost.json (1 hunks)
🧰 Additional context used
🧠 Learnings (8)
📓 Common learnings
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/ghost.json:25-26
Timestamp: 2025-07-29T05:18:41.313Z
Learning: In Ghost's Traditional Chinese localization, when source English text is modified (such as removing words like "safely"), the corresponding Chinese translations should be updated to match. For example, if "safely" is removed from English security-related messages, the corresponding "放心" should also be removed from the Chinese translation to maintain translation accuracy.
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-01-29T15:27:29.391Z
Learning: When reviewing translation files in ghost/i18n/locales, translators should only modify the translated values and must not change the keys or placeholder styles (e.g., %%{status}%%, {site}, etc.) as they serve specific purposes like Mailgun string replacement.
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-05-20T21:08:21.026Z
Learning: In the Ghost project, translation files (ghost/i18n/locales/*/*.json) commonly have blank values for translations, and this is normal behavior that should not be flagged in reviews. These empty translations will be filled in separate PRs.
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/portal.json:107-108
Timestamp: 2025-07-29T05:24:43.780Z
Learning: In Ghost's Traditional Chinese localization for portal.json, when translating membership restriction messages, "目前不接受此 email 網域的會員申請" is preferred over "此 email 網域的註冊目前不接受會員登記" as it provides better sentence flow and uses more natural phrasing while maintaining the same meaning.
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/comments.json:45-46
Timestamp: 2025-07-29T05:08:05.874Z
Learning: For Traditional Chinese localization in Ghost's comments.json, "Oldest" should be translated as "最早" (not "最初") when used in comment sorting selectors, as "最早" better conveys the temporal sorting context.
Learnt from: cathysarisky
PR: TryGhost/Ghost#23070
File: ghost/i18n/locales/hu/comments.json:45-45
Timestamp: 2025-04-30T16:27:03.542Z
Learning: In the Ghost project, new translation string keys are intentionally added with empty values initially and will be translated in a separate PR. Do not report missing translations for entirely new string additions.
📚 Learning: 2025-07-29T05:18:41.313Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/ghost.json:25-26
Timestamp: 2025-07-29T05:18:41.313Z
Learning: In Ghost's Traditional Chinese localization, when source English text is modified (such as removing words like "safely"), the corresponding Chinese translations should be updated to match. For example, if "safely" is removed from English security-related messages, the corresponding "放心" should also be removed from the Chinese translation to maintain translation accuracy.

Applied to files:

  • ghost/i18n/locales/zh-Hant/ghost.json
📚 Learning: 2025-01-29T15:27:29.391Z
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-01-29T15:27:29.391Z
Learning: When reviewing translation files in ghost/i18n/locales, translators should only modify the translated values and must not change the keys or placeholder styles (e.g., %%{status}%%, {site}, etc.) as they serve specific purposes like Mailgun string replacement.

Applied to files:

  • ghost/i18n/locales/zh-Hant/ghost.json
📚 Learning: 2025-05-20T21:08:21.026Z
Learnt from: cathysarisky
PR: TryGhost/Ghost#0
File: :0-0
Timestamp: 2025-05-20T21:08:21.026Z
Learning: In the Ghost project, translation files (ghost/i18n/locales/*/*.json) commonly have blank values for translations, and this is normal behavior that should not be flagged in reviews. These empty translations will be filled in separate PRs.

Applied to files:

  • ghost/i18n/locales/zh-Hant/ghost.json
📚 Learning: 2025-07-29T05:24:43.780Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/portal.json:107-108
Timestamp: 2025-07-29T05:24:43.780Z
Learning: In Ghost's Traditional Chinese localization for portal.json, when translating membership restriction messages, "目前不接受此 email 網域的會員申請" is preferred over "此 email 網域的註冊目前不接受會員登記" as it provides better sentence flow and uses more natural phrasing while maintaining the same meaning.

Applied to files:

  • ghost/i18n/locales/zh-Hant/ghost.json
📚 Learning: 2025-07-29T05:28:28.664Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/portal.json:143-144
Timestamp: 2025-07-29T05:28:28.664Z
Learning: In Ghost's Traditional Chinese localization, when translating signup/registration restriction messages, it's important to consider the specific context (e.g., member signup vs. general signup) to choose the most appropriate terminology. For member signup contexts, "新會員註冊" (new member registration) is more contextually accurate than just "註冊" (registration).

Applied to files:

  • ghost/i18n/locales/zh-Hant/ghost.json
📚 Learning: 2025-02-15T16:00:03.347Z
Learnt from: cathysarisky
PR: TryGhost/Ghost#21982
File: ghost/i18n/locales/hu/portal.json:207-207
Timestamp: 2025-02-15T16:00:03.347Z
Learning: In Hungarian translations for Ghost, ensure that all variables like {{title}} are preserved in the translated strings and not omitted.

Applied to files:

  • ghost/i18n/locales/zh-Hant/ghost.json
📚 Learning: 2025-07-29T05:08:05.874Z
Learnt from: kasnol
PR: TryGhost/Ghost#24523
File: ghost/i18n/locales/zh-Hant/comments.json:45-46
Timestamp: 2025-07-29T05:08:05.874Z
Learning: For Traditional Chinese localization in Ghost's comments.json, "Oldest" should be translated as "最早" (not "最初") when used in comment sorting selectors, as "最早" better conveys the temporal sorting context.

Applied to files:

  • ghost/i18n/locales/zh-Hant/ghost.json

Copy link
Member

@cathysarisky cathysarisky left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📋 My AI helper 🤖 and coderabbit left you a few comments. I always believe the human over the AI, so feel free to disregard them after you take a careful look!

Leave me a comment when you're satisfied with everything, please. :)


Drafted with my new i18n tooling - feedback welcome

"Add context to your comment, share your name and expertise to foster a healthy discussion.": "為您的留言補充背景,說明您的稱呼與專業背景都有助於健康的討論氛圍。",
"Add reply": "回覆",
"Add your expertise": "",
"Add your expertise": "增加你的專業背景",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI: In zh-Hant tone, we’ve used 您的 elsewhere (e.g. “輸入您的稱呼”). Here you have “增加你的專業背景”. Is it intentional to use 你的 instead of 您的? Please consider using 您的 for consistency.

"Or use this link to securely sign in": "",
"Or, skip the code and sign in directly": "",
"New comment on {postTitle}": "{postTitle}有新評論",
"New reply to your comment on {siteTitle}": "對你在 {網站標題} 上的評論的新回覆",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI: It looks like the placeholder {siteTitle} was translated to “{網站標題}”. Please keep the original variable {siteTitle} rather than translating it.

"You will not be signed up, and no account will be created for you.": "系統不會為您註冊或建立任何帳號。",
"You will not be subscribed.": "系統不會為您訂閱任何內容。",
"You're one tap away from subscribing to {siteTitle} — please confirm your email address with this link:": "您離訂閱{siteTitle}只差一步 — 請透過此連結確認您的 email:",
"You're one tap away from subscribing to {siteTitle} — please confirm your email address with this link:": "您離訂閱{siteTitle}只差一步 — 請透過此連結確認您的電子郵件地址",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI: The original string ends with a colon (“…link:”), but the translation is missing the colon at the end. Please add “:” to match the original punctuation.

"By {authors}": "",
"Comment": "",
"Become a paid member of {site} to get access to all premium content.": "成为{site}的付费会员,即可畅享所有付费内容。",
"By {authors}": "",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI: The placeholder {authors} was omitted in the translation. Please include the variable, for example “作者:{authors}”.

"For security verification, enter the code below to sign in to {siteTitle}:": "",
"Device:": "设备",
"Email": "电子邮件",
"For security verification, enter the code below to sign in to {siteTitle}:": "为了安全验证,请输入下方的验证码以登陆{siteTitle}",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI: The original ends with a colon (:), but the translation “为了安全验证,请输入下方的验证码以登陆{siteTitle}” is missing the colon at the end. Please add “:” for punctuation consistency.

"Help! I'm not receiving emails": "求助!我没有收到电子邮件",
"Here are a few other sites you may enjoy.": "以下是您或许会感兴趣的其他网站。",
"If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "如果有快报被标记为垃圾邮件,则自动拒绝该地址的邮件以确保后续不再接收不想要的消息。",
"If a newsletter is flagged as spam, emails are automatically disabled for that address to make sure you no longer receive any unwanted messages.": "如如果某份新闻信被标记为垃圾邮件,系统将自动禁用该地址的邮件接收功能,确保您不再收到任何不需要的消息。",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI: The translation reads “如如果某份新闻信被标记…”, using both “如” and “如果”. Please remove the extra “如” to start naturally with “如果”.

@cathysarisky
Copy link
Member

Hello @ninghuilulu , thanks for this contribution! I've updated the title to reflect that it contains both traditional Chinese (zh-Hant) and simplified (zh).

I've provided an AI-based review, and there are also comments from coderabbit to look over. While sometimes the AI reviews are just wrong, other times they catch typographical errors. So please have a look. Making changes in your fork and then committing them will update the PR.

Please check the places that are using variables (surrounded by { } ) - variable names should NOT be translated, and should remain in the translation exactly as they are.

@kasnol, @imgarylai , would either of you have time to review these translations?

We do not have many active translators for either traditional or simplified Chinese. If you have a colleague who might be willing to look your submissions over for accuracy, that'd be great.

@ErisDS ErisDS added the community [triage] Community features and bugs label Sep 17, 2025
@heybran
Copy link

heybran commented Sep 28, 2025

Hello @ninghuilulu,

In my opinion, it would be easier for others to review once the feedbacks picked up by the AI bot are updated, as at the moment, the AI message is kind of getting in the way of a human review, at least for me.

@imgarylai
Copy link
Contributor

Hi @cathysarisky I will take a look.

"Please confirm your email address with this link:": "請透過此連結確認您的電子郵件地址:",
"Secure sign in link for {siteTitle}": "為{siteTitle}準備的安全登入連結",
"See you soon!": "再見!",
"See you soon!": "很快再見!",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The word "soon" is not necessary to be translated. It is pretty strange to have it in the translation. I would suggest keep "再見".

@cathysarisky
Copy link
Member

Closing in favor of #25030

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

affects:i18n community [triage] Community features and bugs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants