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
8 changes: 4 additions & 4 deletions ghost/i18n/locales/tr/ghost.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"Keep reading": "Okumaya devam et",
"Less like this": "Buna benzer daha az",
"Manage subscription": "Aboneliği yönet",
"Manage your preferences": "",
"Manage your preferences": "Tercihlerini yönet",
"Member since": "Üyelik tarihi",
"More like this": "Buna benzer daha çok",
"Name": "İsim",
Expand Down Expand Up @@ -68,7 +68,7 @@
"Thank you for subscribing to {siteTitle}.": "{siteTitle} abone olduğunuz için teşekkür ederiz",
"Thank you for subscribing to {siteTitle}. Tap the link below to be automatically signed in:": "{siteTitle} sitesine abone olduğun için teşekkürler. Otomatik olarak giriş yapmak için aşağıdaki bağlantıya tıkla:",
"Thank you for supporting {siteTitle}.": "{siteTitle} sitesine desteğiniz için teşekkürler.",
"Thank you for your support. Share the link below with whoever you'd like to gift them a {cadenceLabel} {tierName} membership to {siteTitle}.": "",
"Thank you for your support. Share the link below with whoever you'd like to gift them a {cadenceLabel} {tierName} membership to {siteTitle}.": "{siteTitle}’a desteğiniz için teşekkürler. Aşağıdaki bağlantıyı {cadenceLabel} {tierName} aboneliği hediye etmek istediğiniz kişiyle paylaşın.",
"Thanks for reading {siteTitle}.": "{siteTitle} sitesini okuduğunuz için teşekkürler.",
"The link expires on {expiresAt} and can only be redeemed once.": "Bağlantının süresi {expiresAt} tarihinde doluyor ve sadece bir kez kullanılabilir.",
"This email address will not be used.": "Bu e-posta adresi kullanılmayacak.",
Expand All @@ -93,8 +93,8 @@
"You just tried to access your account from a new device.": "Hesabınıza yeni bir cihazdan erişmeyi denediniz.",
"You will not be signed up, and no account will be created for you.": "Kayıt olmayacaksın ve senin için bir hesap oluşturulmayacak.",
"You will not be subscribed.": "Abone olmayacaksın.",
"You're one tap away from subscribing to {siteTitle} — please confirm your email address with this link:": "{siteTitle} sitesine abone olmaya bir tık uzaktasın — lütfen e-posta adresini bu bağlantıya tıklayarak onayla:",
"You're one tap away from subscribing to {siteTitle}!": "{siteTitle} abone olmanıza bir dokunuş kadar yakınsınız!",
"You're one tap away from subscribing to {siteTitle} — please confirm your email address with this link:": "{siteTitle} sitesine abone olmaya bir adım uzaktasın — lütfen e-posta adresini bu bağlantıya tıklayarak onayla:",
"You're one tap away from subscribing to {siteTitle}!": "{siteTitle} abone olmanıza bir adım daha yakınsınız!",
"You've been gifted a {duration}-month {tierName} membership to {siteTitle}": "{siteTitle} için {duration} aylık {tierName} aboneliği hediyeniz var",
"You've been gifted a {duration}-year {tierName} membership to {siteTitle}": "{siteTitle} için {duration} yıllık {tierName} aboneliği hediyeniz var",
"Your free trial ends on {date}, at which time you will be charged the regular price. You can always cancel before then.": "Ücretsiz denemeniz {date} tarihinde sona eriyor, bu tarihten sonra düzenli fiyat uygulanacaktır. O zamana kadar her zaman iptal edebilirsiniz.",
Expand Down
4 changes: 2 additions & 2 deletions ghost/i18n/locales/tr/portal.json
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@
"Get help": "Yardım al",
"Get in touch for help": "Yardım için iletişime geçin",
"Get notified when someone replies to your comment": "Birisi yorumuna cevap yazdığında bildirim al",
"Gift a membership": "Üyelik hediye et",
"Gift a membership": "Abonelik hediye et",
"Gift could not be redeemed": "Hediye kullanılamadı",
"Gift details": "Hediye detayları",
"Gift redeemed! You're all set.": "Hediye kullanıldı! İşlem tamam!",
Expand Down Expand Up @@ -197,7 +197,7 @@
"Sending login link...": "Giriş bağlantısı gönderiliyor...",
"Sending...": "Gönderiliyor...",
"Share": "Paylaş",
"Share a full membership to {siteTitle} with a friend or colleague": "Bir arkadaşınız veya iş arkadaşınızla {siteTitle} tam üyeliğini paylaşın.",
"Share a full membership to {siteTitle} with a friend or colleague": "Yakınlarınız için en havalı hediye, hem de mağaza gezme derdi olmadan.",

@coderabbitai coderabbitai Bot Jun 25, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Preserve {siteTitle} interpolation in this translation.

Line 200 drops {siteTitle}, but this key is rendered with {siteTitle} at runtime, so the localized string no longer matches the source message contract.

Suggested fix
-    "Share a full membership to {siteTitle} with a friend or colleague": "Yakınlarınız için en havalı hediye, hem de mağaza gezme derdi olmadan.",
+    "Share a full membership to {siteTitle} with a friend or colleague": "{siteTitle} için tam üyeliği bir arkadaşınızla veya iş arkadaşınızla paylaşın.",
📝 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
"Share a full membership to {siteTitle} with a friend or colleague": "Yakınlarınız için en havalı hediye, hem de mağaza gezme derdi olmadan.",
"Share a full membership to {siteTitle} with a friend or colleague": "{siteTitle} için tam üyeliği bir arkadaşınızla veya iş arkadaşınızla paylaşın.",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ghost/i18n/locales/tr/portal.json` at line 200, The translation for the key
in portal.json drops the required {siteTitle} placeholder, breaking the message
contract used at runtime. Update the localized string in the Turkish locale
entry for this message so it preserves the same {siteTitle} interpolation as the
source text, and verify the placeholder remains unchanged in the translation.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@selin-blip Why don't we need {siteTitle} here?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

key='Share a full membership to {siteTitle} with a friend or colleague'

echo "== Find exact key usage =="
rg -n -F "$key" .

echo
echo "== Outline likely portal i18n/usage files =="
fd -a 'gift|portal|i18n|translation|locale' apps ghost --max-depth 6 2>/dev/null | sed -n '1,200p'

echo
echo "== Search for siteTitle interpolation near gift/share UI =="
rg -n -C3 --glob '!ghost/i18n/locales/**' 'siteTitle|Gift a membership|friend or colleague|gift' apps ghost

Length of output: 243478


🏁 Script executed:

#!/bin/bash
set -euo pipefail

key='Share a full membership to {siteTitle} with a friend or colleague'

echo "== Exact matches for the key across the repo =="
rg -n -C2 -F "$key" .

echo
echo "== Narrow search for the gift purchase success/share UI in portal source =="
rg -n -C3 --glob '!ghost/i18n/locales/**' --glob '!**/test/**' \
  'Share a full membership|Send the link below to share it|siteTitle|gift-purchase-success|gift_token' \
  apps ghost

Length of output: 255827



@9larsons We do need {siteTitle} here.

I checked the runtime usage:

  • apps/portal/src/components/pages/gift-page.js Line 847 calls
    t('Share a full membership to {siteTitle} with a friend or colleague', {siteTitle})
  • ghost/i18n/locales/context.json Line 278 also documents this key and says {siteTitle} is the publication name.

So once Turkish provides a non-empty translation for that key, it should preserve the same placeholder contract. Dropping {siteTitle} won’t crash, but it does discard runtime data that the source string expects to show.

In other words:

  • empty translation → falls back to English, fine
  • translated value without {siteTitle} → loses the publication name, so the review comment still applies

🐇💭


🧠 Learnings used
Learnt from: cathysarisky
Repo: TryGhost/Ghost PR: 27188
File: ghost/i18n/locales/ar/portal.json:15-15
Timestamp: 2026-04-06T20:50:45.744Z
Learning: In TryGhost/Ghost, follow the i18n workflow for locale files: when introducing new i18n keys, allow a first PR to ship the feature while adding the new keys with empty/blank string values in the locale JSON files (e.g., under ghost/i18n/locales/...). In code review, do not flag empty string values in these locale JSON files as missing translations; expect the actual translated text to be provided in a subsequent follow-up PR.

Learnt from: sagzy
Repo: TryGhost/Ghost PR: 27840
File: ghost/core/core/server/services/gifts/gift-email-service.ts:75-80
Timestamp: 2026-05-13T11:28:15.780Z
Learning: In the TryGhost/Ghost monorepo’s `ghost/i18n` code/locales (using i18next v23.x), do not raise code review findings for “missing pluralization configuration.” i18next v23 automatically handles pluralization via the Intl API, so you should not expect/require an explicit `pluralSeparator` or manual pluralization rules. Locale JSON plural keys should use the `_one`/`_other` suffix convention (e.g., `"{count} year_one"` / `"{count} year_other"`), and calls like `t("{count} year", { count: n })` should be considered correct and should resolve plural forms.

"Show all": "Hepsini göster",
"Sign in": "Giriş yap",
"Sign out": "Çıkış yap",
Expand Down
Loading