Update theme asset builds#1031
Conversation
WalkthroughThe pull request extends the styling foundation with a comprehensive CSS reset applied to screen.css, introducing default styles for typography, form controls, layout primitives, and theme variants (light/dark modes). Minor property reordering occurs in global.css. A new locale context mapping file is introduced at locales/context.json that links UI strings to corresponding template file paths. Additionally, eleven new locale files are added for internationalization support: German (Germany and Switzerland), French, Irish, Scottish Gaelic, Dutch, Brazilian Portuguese, Swedish, Ukrainian, and Simplified Chinese, each containing partial translations of UI strings with many entries left empty for future completion. Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes 🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
🧹 Nitpick comments (2)
locales/sv.json (1)
52-52: Inconsistent partial translations in accessibility hints.Lines 52 and 64 mix Swedish and English within the same string:
"Nästa (arrow right)"— "arrow right" remains in English"Föregående (arrow left)"— "arrow left" remains in EnglishFor consistency, consider fully translating these accessibility hints (e.g., "Nästa (pil höger)" and "Föregående (pil vänster)") or keeping them entirely in English.
Suggested fix
- "Next (arrow right)": "Nästa (arrow right)", + "Next (arrow right)": "Nästa (pil höger)", ... - "Previous (arrow left)": "Föregående (arrow left)", + "Previous (arrow left)": "Föregående (pil vänster)",Also applies to: 64-64
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@locales/sv.json` at line 52, Partial translations in the accessibility hint strings are inconsistent: update the two entries that currently read "Next (arrow right)" and "Previous (arrow left)" (or their Swedish equivalents "Nästa (arrow right)" and "Föregående (arrow left)") so they are consistently fully translated into Swedish, e.g., change the parenthetical phrases to "pil höger" and "pil vänster" resulting in "Nästa (pil höger)" and "Föregående (pil vänster)".assets/built/screen.css (1)
1-1: This is generated build output.This file is the compiled/minified CSS output from the gulp build. The static analysis issues flagged (deprecated
grid-gap,word-break: break-word, vendor prefixes, etc.) originate in the source CSS files and should be addressed there rather than in the build output.Consider addressing these in the source files in a follow-up:
- Replace
grid-gapwithgap(5 occurrences)- Replace deprecated
word-break: break-wordwithoverflow-wrap: break-word- Fix
::not(.gh-content)pseudo-element syntax (should be:not(.gh-content))- Deduplicate
font-family: monospace, monospace🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/built/screen.css` at line 1, The flagged issues are in the compiled build CSS; fix them in the source Sass/CSS files (not the generated assets) by: replace any usages of grid-gap with gap (search for "grid-gap" across source styles), replace deprecated "word-break: break-word" with "overflow-wrap: break-word" in rules that intend to break long words (e.g., selectors currently using post-card, li, etc.), correct the malformed pseudo-selector "::not(.gh-content)" to ":not(.gh-content)" in the source where that selector is defined, and deduplicate the monospace font-family declaration (remove the duplicate "monospace" entry) so the compiled screen.css no longer contains these issues.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@assets/built/global.css`:
- Line 1: The CSS uses the invalid double-colon pseudo-element syntax
(::not(.gh-content) ...) which causes those selectors (e.g., ::not(.gh-content)
blockquote, ::not(.gh-content) dl, ::not(.gh-content) ol, ::not(.gh-content) p,
::not(.gh-content) ul) to be ignored; replace the double colon with a single
colon so the pseudo-class is :not(.gh-content) for each of those selectors to
restore the intended margin:0 0 1.5em rule.
In `@locales/en.json`:
- Around line 1-112: The en locale file contains 110 empty translation values
causing Ghost's {{t}} helper to render blank UI; populate critical keys (e.g.,
"Sign in", "Subscribe", "Account", "Menu", "Search posts, tags and authors",
"Read more", "Next", "Previous", "Subscribe to {sitetitle}", "Members only")
with their English strings or remove the en.json so Ghost falls back to keys;
update the same file entries referenced by templates like default.hbs (e.g., {{t
"Sign in"}}, {{t "Subscribe"}}, {{t "Account"}}) to ensure visible text in
navigation, CTAs and labels.
In `@locales/ga.json`:
- Line 6: The "% min read" translation uses the wrong placeholder "%m" causing
interpolation to fail; update the value for the "% min read" key to use "%"
(matching other locales) so it reads "Am léamha: %" instead of "Am léamha: %m".
In `@locales/nl.json`:
- Line 52: Replace the incorrect Dutch translation for the key "Next (arrow
right)" which currently reads "Volgende (pijl recht)" with the correct phrase
"Volgende (pijl rechts)" by updating the value for the "Next (arrow right)"
entry.
In `@locales/pt-BR.json`:
- Line 70: The translation for the key "Read more" currently contains a trailing
space ("Veja mais "), so remove the trailing whitespace from the value for the
"Read more" entry (update the translation string from "Veja mais " to "Veja
mais") to ensure consistent UI spacing and rendering.
---
Nitpick comments:
In `@assets/built/screen.css`:
- Line 1: The flagged issues are in the compiled build CSS; fix them in the
source Sass/CSS files (not the generated assets) by: replace any usages of
grid-gap with gap (search for "grid-gap" across source styles), replace
deprecated "word-break: break-word" with "overflow-wrap: break-word" in rules
that intend to break long words (e.g., selectors currently using post-card, li,
etc.), correct the malformed pseudo-selector "::not(.gh-content)" to
":not(.gh-content)" in the source where that selector is defined, and
deduplicate the monospace font-family declaration (remove the duplicate
"monospace" entry) so the compiled screen.css no longer contains these issues.
In `@locales/sv.json`:
- Line 52: Partial translations in the accessibility hint strings are
inconsistent: update the two entries that currently read "Next (arrow right)"
and "Previous (arrow left)" (or their Swedish equivalents "Nästa (arrow right)"
and "Föregående (arrow left)") so they are consistently fully translated into
Swedish, e.g., change the parenthetical phrases to "pil höger" and "pil vänster"
resulting in "Nästa (pil höger)" and "Föregående (pil vänster)".
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 476bfa35-40e4-4a26-8267-a2511dd9f6f1
⛔ Files ignored due to path filters (3)
assets/built/casper.js.mapis excluded by!**/*.mapassets/built/global.css.mapis excluded by!**/*.mapassets/built/screen.css.mapis excluded by!**/*.map
📒 Files selected for processing (15)
assets/built/casper.jsassets/built/global.cssassets/built/screen.csslocales/context.jsonlocales/de-CH.jsonlocales/de.jsonlocales/en.jsonlocales/fr.jsonlocales/ga.jsonlocales/gd.jsonlocales/nl.jsonlocales/pt-BR.jsonlocales/sv.jsonlocales/uk.jsonlocales/zh.json
| @@ -1,2 +1 @@ | |||
| a,abbr,acronym,address,applet,article,aside,audio,big,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}body{line-height:1}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}img{display:block;height:auto;max-width:100%}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box;font-family:sans-serif}*,:after,:before{box-sizing:inherit}a{background-color:transparent}a:active,a:hover{outline:0}b,strong{font-weight:700}dfn,em,i{font-style:italic}h1{font-size:2em;margin:.67em 0}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}mark{background-color:#fdffb6}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}kbd{background:#f6f8fa;border:1px solid rgba(124,139,154,.25);border-radius:6px;box-shadow:inset 0 -1px 0 rgba(124,139,154,.25);font-family:var(--font-mono);font-size:1.5rem;padding:3px 5px}@media (max-width:600px){kbd{font-size:1.3rem}}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{border:none;overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input:focus{outline:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:62.5%}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-moz-font-feature-settings:"liga" on;background:#fff;color:var(--color-darkgrey);font-family:var(--gh-font-body,var(--font-sans));font-size:1.6rem;font-style:normal;font-weight:400;letter-spacing:0;line-height:1.6em}::-moz-selection{background:#daf2fd;text-shadow:none}::selection{background:#daf2fd;text-shadow:none}hr{border:0;border-top:1px solid #f0f0f0;display:block;height:1px;margin:2.5em 0 3.5em;padding:0;position:relative;width:100%}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}::not(.gh-content) blockquote,::not(.gh-content) dl,::not(.gh-content) ol,::not(.gh-content) p,::not(.gh-content) ul{margin:0 0 1.5em}ol,ul{padding-left:1.3em;padding-right:1.5em}ol ol,ol ul,ul ol,ul ul{margin:.5em 0}ol,ul{max-width:100%}li{line-height:1.6em;padding-left:.3em}li+li{margin-top:.5em}dt{color:#daf2fd;float:left;font-weight:500;margin:0 20px 0 0;text-align:right;width:120px}dd{margin:0 0 5px;text-align:left}sub,sup{line-height:1}blockquote{border-left:#daf2fd;margin:1.5em 0;padding:0 1.6em}blockquote small{display:inline-block;font-size:.9em;margin:.8em 0 .8em 1.5em;opacity:.8}blockquote small:before{content:"\2014 \00A0"}blockquote cite{font-weight:700}blockquote cite a{font-weight:400}a{color:#15171a;text-decoration:none}h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;font-family:var(--gh-font-heading,var(--font-sans));font-weight:600;letter-spacing:-.01em;line-height:1.15;margin-top:0}h1{font-size:4.8rem;font-weight:700;letter-spacing:-.015em;margin:0 0 .5em}@media (max-width:600px){h1{font-size:2.8rem}}h2{font-size:2.8rem;font-weight:700;margin:1.5em 0 .5em}@media (max-width:600px){h2{font-size:2.3rem}}h3{font-size:2.4rem;font-weight:600;margin:1.5em 0 .5em}@media (max-width:600px){h3{font-size:1.7rem}}h4{font-size:2rem;margin:1.5em 0 .5em}@media (max-width:600px){h4{font-size:1.7rem}}h5{font-size:2rem}h5,h6{margin:1.5em 0 .5em}h6{font-size:1.8rem} | |||
| /*# sourceMappingURL=global.css.map */ No newline at end of file | |||
| a,abbr,acronym,address,applet,article,aside,audio,big,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}body{line-height:1}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}img{display:block;height:auto;max-width:100%}html{box-sizing:border-box;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,:after,:before{box-sizing:inherit}a{background-color:transparent}a:active,a:hover{outline:0}b,strong{font-weight:700}dfn,em,i{font-style:italic}h1{font-size:2em;margin:.67em 0}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}mark{background-color:#fdffb6}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}kbd{background:#f6f8fa;border:1px solid rgba(124,139,154,.25);border-radius:6px;box-shadow:inset 0 -1px 0 rgba(124,139,154,.25);font-family:var(--font-mono);font-size:1.5rem;padding:3px 5px}@media (max-width:600px){kbd{font-size:1.3rem}}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{border:none;overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input:focus{outline:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background:#fff;color:var(--color-darkgrey);font-family:var(--gh-font-body,var(--font-sans));font-size:1.6rem;font-style:normal;font-weight:400;letter-spacing:0;line-height:1.6em;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-moz-font-feature-settings:"liga" on}::-moz-selection{background:#daf2fd;text-shadow:none}::selection{background:#daf2fd;text-shadow:none}hr{border:0;border-top:1px solid #f0f0f0;display:block;height:1px;margin:2.5em 0 3.5em;padding:0;position:relative;width:100%}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}::not(.gh-content) blockquote,::not(.gh-content) dl,::not(.gh-content) ol,::not(.gh-content) p,::not(.gh-content) ul{margin:0 0 1.5em}ol,ul{padding-left:1.3em;padding-right:1.5em}ol ol,ol ul,ul ol,ul ul{margin:.5em 0}ol,ul{max-width:100%}li{line-height:1.6em;padding-left:.3em}li+li{margin-top:.5em}dt{color:#daf2fd;float:left;font-weight:500;margin:0 20px 0 0;text-align:right;width:120px}dd{margin:0 0 5px;text-align:left}sub,sup{line-height:1}blockquote{border-left:#daf2fd;margin:1.5em 0;padding:0 1.6em}blockquote small{display:inline-block;font-size:.9em;margin:.8em 0 .8em 1.5em;opacity:.8}blockquote small:before{content:"\2014 \00A0"}blockquote cite{font-weight:700}blockquote cite a{font-weight:400}a{color:#15171a;text-decoration:none}h1,h2,h3,h4,h5,h6{font-family:var(--gh-font-heading,var(--font-sans));font-weight:600;letter-spacing:-.01em;line-height:1.15;margin-top:0;text-rendering:optimizeLegibility}h1{font-size:4.8rem;font-weight:700;letter-spacing:-.015em;margin:0 0 .5em}@media (max-width:600px){h1{font-size:2.8rem}}h2{font-size:2.8rem;font-weight:700;margin:1.5em 0 .5em}@media (max-width:600px){h2{font-size:2.3rem}}h3{font-size:2.4rem;font-weight:600;margin:1.5em 0 .5em}@media (max-width:600px){h3{font-size:1.7rem}}h4{font-size:2rem;margin:1.5em 0 .5em}@media (max-width:600px){h4{font-size:1.7rem}}h5{font-size:2rem}h5,h6{margin:1.5em 0 .5em}h6{font-size:1.8rem}/*# sourceMappingURL=global.css.map */ | |||
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Find the source file containing the ::not bug
rg -l '::not\(' --type css --type scss
rg '::not\(' -C2Repository: TryGhost/Casper
Length of output: 50418
🏁 Script executed:
#!/bin/bash
# Find SCSS/CSS source files
find . -type f \( -name "*.scss" -o -name "*.sass" \) | head -20
# Also check for any source directories
fd -t f -e scss -e sass | head -20Repository: TryGhost/Casper
Length of output: 41
🏁 Script executed:
#!/bin/bash
# Check for build configuration
ls -la | grep -E "package.json|gulpfile|webpack|tsconfig|postcss"
# Look at directory structure
find . -maxdepth 2 -type d | head -20
# Check git log for SCSS files
git log --name-only --pretty=format: | grep -E "\.(scss|sass)$" | sort -u | head -10Repository: TryGhost/Casper
Length of output: 349
🏁 Script executed:
#!/bin/bash
# Check source CSS directory
ls -la assets/css/
# Check if ::not appears in source
rg '::not\(' assets/css/
# Also search for :not (single colon) to see what's correct
rg ':not\(' assets/css/ | head -5Repository: TryGhost/Casper
Length of output: 1060
🏁 Script executed:
#!/bin/bash
# Show the exact source code with context around ::not
head -50 assets/css/global.css | tail -20
# Show the valid :not syntax in screen.css
grep -n ':not(' assets/css/screen.css | head -3Repository: TryGhost/Casper
Length of output: 426
🏁 Script executed:
#!/bin/bash
# Show the problematic selector in source global.css
rg -B2 -A5 '::not\(' assets/css/global.css
# Show the line number
rg -n '::not\(' assets/css/global.cssRepository: TryGhost/Casper
Length of output: 364
🌐 Web query:
CSS :not() pseudo-class selector double colon vs single colon syntax specification
💡 Result:
:not()is defined as a pseudo-class (“The Negation (Matches-None) Pseudo-class::not()”), so its correct/standard syntax is single-colon::not(...). [1]- The double-colon
::syntax is for pseudo-elements, introduced to distinguish pseudo-elements from pseudo-classes (with legacy single-colon forms like:beforekept for backward compatibility). Therefore::not(...)is not valid CSS and should not be used. [2][3]
Use: a:not(.active) { ... }
Do not use: a::not(.active) { ... }
Sources:
[1] W3C Selectors Level 4 – §4.3 :not() https://www.w3.org/TR/selectors-4/
[2] MDN – :not() pseudo-class https://developer.mozilla.org/en-US/docs/Web/CSS/:not
[3] web.dev – pseudo-class vs pseudo-element (: vs ::) https://web.dev/learn/css/selectors
Fix ::not() to :not() in source CSS (pseudo-class uses single colon).
The source file assets/css/global.css (lines 324–328) contains invalid CSS syntax. :not() is a pseudo-class and must use a single colon, not double colon. The double-colon syntax :: is reserved for pseudo-elements. Browsers will silently ignore these selectors, preventing the margin: 0 0 1.5em rule from applying to blockquote, dl, ol, p, and ul elements.
Change:
::not(.gh-content) p,
::not(.gh-content) ul,
::not(.gh-content) ol,
::not(.gh-content) dl,
::not(.gh-content) blockquote {
To:
:not(.gh-content) p,
:not(.gh-content) ul,
:not(.gh-content) ol,
:not(.gh-content) dl,
:not(.gh-content) blockquote {
🧰 Tools
🪛 Biome (2.4.4)
[error] 1-1: Duplicate font names are redundant and unnecessary: monospace
(lint/suspicious/noDuplicateFontNames)
[error] 1-1: Unexpected unknown pseudo-elements: not(.gh-content)
(lint/correctness/noUnknownPseudoElement)
[error] 1-1: Unexpected unknown pseudo-elements: not(.gh-content)
(lint/correctness/noUnknownPseudoElement)
[error] 1-1: Unexpected unknown pseudo-elements: not(.gh-content)
(lint/correctness/noUnknownPseudoElement)
[error] 1-1: Unexpected unknown pseudo-elements: not(.gh-content)
(lint/correctness/noUnknownPseudoElement)
[error] 1-1: Unexpected unknown pseudo-elements: not(.gh-content)
(lint/correctness/noUnknownPseudoElement)
🪛 Stylelint (17.4.0)
[error] 1-1: Unexpected duplicate font-family name monospace (font-family-no-duplicate-names)
(font-family-no-duplicate-names)
[error] 1-1: Unexpected vendor-prefixed selector "::-moz-selection" (selector-no-vendor-prefix)
(selector-no-vendor-prefix)
[error] 1-1: Unexpected unknown pseudo-element selector "::not" (selector-pseudo-element-no-unknown)
(selector-pseudo-element-no-unknown)
[error] 1-1: Unexpected unknown pseudo-element selector "::not" (selector-pseudo-element-no-unknown)
(selector-pseudo-element-no-unknown)
[error] 1-1: Unexpected unknown pseudo-element selector "::not" (selector-pseudo-element-no-unknown)
(selector-pseudo-element-no-unknown)
[error] 1-1: Unexpected unknown pseudo-element selector "::not" (selector-pseudo-element-no-unknown)
(selector-pseudo-element-no-unknown)
[error] 1-1: Unexpected unknown pseudo-element selector "::not" (selector-pseudo-element-no-unknown)
(selector-pseudo-element-no-unknown)
[error] 1-1: Expected "optimizeLegibility" to be "optimizelegibility" (value-keyword-case)
(value-keyword-case)
[error] 1-1: Expected "optimizeLegibility" to be "optimizelegibility" (value-keyword-case)
(value-keyword-case)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@assets/built/global.css` at line 1, The CSS uses the invalid double-colon
pseudo-element syntax (::not(.gh-content) ...) which causes those selectors
(e.g., ::not(.gh-content) blockquote, ::not(.gh-content) dl, ::not(.gh-content)
ol, ::not(.gh-content) p, ::not(.gh-content) ul) to be ignored; replace the
double colon with a single colon so the pseudo-class is :not(.gh-content) for
each of those selectors to restore the intended margin:0 0 1.5em rule.
| { | ||
| " (Page %)": "", | ||
| " and ": "", | ||
| "% issues": "", | ||
| "% min": "", | ||
| "% min read": "", | ||
| "0 issues": "", | ||
| "1 issue": "", | ||
| "1 min": "", | ||
| "1 min read": "", | ||
| "A collection of 0 issues": "", | ||
| "A collection of 0 posts": "", | ||
| "A collection of 1 issue": "", | ||
| "A collection of 1 post": "", | ||
| "A collection of {numberOfIssues} issues": "", | ||
| "A collection of {numberOfPosts} posts": "", | ||
| "About": "", | ||
| "Access site": "", | ||
| "Account": "", | ||
| "Additional issues will be published soon.": "", | ||
| "All episodes": "", | ||
| "All episodes →": "", | ||
| "Already have an account?": "", | ||
| "Archive": "", | ||
| "Browse all issues": "", | ||
| "Browse archive": "", | ||
| "By {authors}": "", | ||
| "By {primaryAuthor}": "", | ||
| "Close (Esc)": "", | ||
| "Comments": "", | ||
| "Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.": "", | ||
| "Email sent": "", | ||
| "Enter your email": "", | ||
| "Featured": "", | ||
| "Go to the front page →": "", | ||
| "Latest": "", | ||
| "Latest episodes": "", | ||
| "Latest issue": "", | ||
| "Learn more": "", | ||
| "Listen on": "", | ||
| "Load more issues": "", | ||
| "Login": "", | ||
| "Member discussion:": "", | ||
| "Members": "", | ||
| "Members only": "", | ||
| "Menu": "", | ||
| "More": "", | ||
| "More issues": "", | ||
| "More links": "", | ||
| "Newer Posts": "", | ||
| "Next": "", | ||
| "Next (arrow right)": "", | ||
| "Next issue": "", | ||
| "Next post": "", | ||
| "Next →": "", | ||
| "Older Posts": "", | ||
| "Page {page} of {totalPages}": "", | ||
| "Paid": "", | ||
| "Paid-members only": "", | ||
| "Password": "", | ||
| "Powered by Ghost": "", | ||
| "Powered by {ghostlink}": "", | ||
| "Previous": "", | ||
| "Previous (arrow left)": "", | ||
| "Previous issue": "", | ||
| "Previous post": "", | ||
| "Published by:": "", | ||
| "RSS": "", | ||
| "Read latest issue": "", | ||
| "Read more": "", | ||
| "Read next": "", | ||
| "Recent posts": "", | ||
| "Recommendations": "", | ||
| "Search posts, tags and authors": "", | ||
| "Search this site": "", | ||
| "See all": "", | ||
| "Share": "", | ||
| "Show more": "", | ||
| "Sign in": "", | ||
| "Sign in.": "", | ||
| "Sign up now to get access to the library of members-only issues.": "", | ||
| "Stay tuned": "", | ||
| "Subscribe": "", | ||
| "Subscribe now": "", | ||
| "Subscribe to {sitetitle}": "", | ||
| "Theme errors": "", | ||
| "This page is for paying subscribers only": "", | ||
| "This page is for subscribers on the {tiers} only": "", | ||
| "This page is for subscribers only": "", | ||
| "This post is for paying subscribers only": "", | ||
| "This post is for subscribers on the {tiers} only": "", | ||
| "This post is for subscribers only": "", | ||
| "This site is private.": "", | ||
| "Toggle fullscreen": "", | ||
| "Toggle menu": "", | ||
| "Topic": "", | ||
| "Topics": "", | ||
| "Upgrade": "", | ||
| "Upgrade now": "", | ||
| "Upgrade to a paid account to get full access.": "", | ||
| "Upgrade your account": "", | ||
| "View all →": "", | ||
| "View project": "", | ||
| "Website": "", | ||
| "You might also like...": "", | ||
| "Zoom in/out": "", | ||
| "comment": "", | ||
| "comments": "", | ||
| "in {primaryTag}": "", | ||
| "jamie@example.com": "", | ||
| "← Previous": "" | ||
| } |
There was a problem hiding this comment.
Critical: Empty English translations will render blank UI text.
All 110 translation keys map to empty strings. Ghost's {{t}} helper renders the translation value directly—when empty, users see blank navigation buttons, CTAs, and labels instead of readable text.
Per the relevant code snippets, templates like default.hbs use {{t "Sign in"}}, {{t "Subscribe"}}, and {{t "Account"}}. With empty values, English-locale users will see invisible buttons.
Either populate English values (e.g., "Subscribe": "Subscribe") or remove en.json entirely so Ghost falls back to the key names.
Example fix for critical UI strings
- "Account": "",
+ "Account": "Account",
...
- "Sign in": "",
+ "Sign in": "Sign in",
...
- "Subscribe": "",
+ "Subscribe": "Subscribe",
...
- "Featured": "",
+ "Featured": "Featured",🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@locales/en.json` around lines 1 - 112, The en locale file contains 110 empty
translation values causing Ghost's {{t}} helper to render blank UI; populate
critical keys (e.g., "Sign in", "Subscribe", "Account", "Menu", "Search posts,
tags and authors", "Read more", "Next", "Previous", "Subscribe to {sitetitle}",
"Members only") with their English strings or remove the en.json so Ghost falls
back to keys; update the same file entries referenced by templates like
default.hbs (e.g., {{t "Sign in"}}, {{t "Subscribe"}}, {{t "Account"}}) to
ensure visible text in navigation, CTAs and labels.
| " and ": "", | ||
| "% issues": "", | ||
| "% min": "", | ||
| "% min read": "Am léamha: %m", |
There was a problem hiding this comment.
Placeholder format differs from other locales.
Same issue as gd.json: the translation uses %m instead of %. This should be consistent across locale files to ensure the i18n interpolation works correctly.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@locales/ga.json` at line 6, The "% min read" translation uses the wrong
placeholder "%m" causing interpolation to fail; update the value for the "% min
read" key to use "%" (matching other locales) so it reads "Am léamha: %" instead
of "Am léamha: %m".
| "More links": "", | ||
| "Newer Posts": "", | ||
| "Next": "", | ||
| "Next (arrow right)": "Volgende (pijl recht)", |
There was a problem hiding this comment.
Minor typo: "pijl recht" should be "pijl rechts".
In Dutch, directional "right" is "rechts" (not "recht" which means "straight" or "legal right").
Suggested fix
- "Next (arrow right)": "Volgende (pijl recht)",
+ "Next (arrow right)": "Volgende (pijl rechts)",📝 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.
| "Next (arrow right)": "Volgende (pijl recht)", | |
| "Next (arrow right)": "Volgende (pijl rechts)", |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@locales/nl.json` at line 52, Replace the incorrect Dutch translation for the
key "Next (arrow right)" which currently reads "Volgende (pijl recht)" with the
correct phrase "Volgende (pijl rechts)" by updating the value for the "Next
(arrow right)" entry.
| "Published by:": "", | ||
| "RSS": "", | ||
| "Read latest issue": "", | ||
| "Read more": "Veja mais ", |
There was a problem hiding this comment.
Trailing space in translation value.
The translation for "Read more" has a trailing space ("Veja mais "), which may cause inconsistent rendering or spacing in the UI.
🔧 Suggested fix
- "Read more": "Veja mais ",
+ "Read more": "Veja mais",📝 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.
| "Read more": "Veja mais ", | |
| "Read more": "Veja mais", |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@locales/pt-BR.json` at line 70, The translation for the key "Read more"
currently contains a trailing space ("Veja mais "), so remove the trailing
whitespace from the value for the "Read more" entry (update the translation
string from "Veja mais " to "Veja mais") to ensure consistent UI spacing and
rendering.
#2) * Updated date formatting ref DES-937 - updated the format to DD MMM YYYY which is the preferred format in Ghost * v5.8.1 * 2025 Co-authored-by: Hannah Wolfe github.erisds@gmail.com * Added support for additional social links (TryGhost#991) ref https://linear.app/ghost/issue/PLG-413/add-helpers-to-official-themes * Added support for all of the new social links in Ghost * Added icon classes to social icons so that we can display an icon for each link * Switched to using the new social_url helper for all social links as it is cleaner * Replaced Twitter with X logo so it's up to date * Update dependency gscan to v4.48.0 (TryGhost#980) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Updated `caniuse-lite` browser list (#22907) (TryGhost#992) - Running the yarn test command was logging a bunch of warnings because our browser list hadn't been updated in 6 months ``` Browserslist: browsers data (caniuse-lite) is 6 months old. Please run: npx update-browserslist-db@latest Why you should do it regularly: https://github.com/browserslist/update-db#readme ``` - This commit fixes the warnings by updating the browsers list by running `npx update-browserslist-db@latest` in the root of the repo, and committing the result. * Revert "Updated `caniuse-lite` browser list (#22907) (TryGhost#992)" - This reverts commit e151531. - This change results in further changes when running gulp build that will need verifying separately * v5.9.0 * Update dependency gscan to v4.49.1 * Fixed line height issue for sub and sup elements * Update dependency gscan to v5 (TryGhost#999) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update dependency postcss to v8.4.31 [SECURITY] (TryGhost#961) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update CSS preprocessors (TryGhost#885) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update dependency inquirer to v8.2.7 (TryGhost#905) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update dependency pump to v3.0.3 (TryGhost#983) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update dependency gulp to v5 (TryGhost#977) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update CSS preprocessors (TryGhost#932) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update dependency gulp-postcss to v10 (TryGhost#973) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update dependency gulp-zip to v6 (TryGhost#964) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update dependency inquirer to v13 (TryGhost#1008) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Lock file maintenance (TryGhost#814) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update dependency inquirer to v13.2.0 (TryGhost#1012) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Lock file maintenance (TryGhost#1013) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Lock file maintenance (TryGhost#1014) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * 2026 Co-authored-by: Hannah Wolfe <github.erisds@gmail.com> * Update dependency gscan to v5.2.4 (TryGhost#1015) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update dependency inquirer to v13.2.1 (TryGhost#1016) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update dependency inquirer to v13.2.2 (TryGhost#1017) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update dependency autoprefixer to v10.4.24 (TryGhost#1019) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Lock file maintenance (TryGhost#1020) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update README.md * Add translations section to README (TryGhost#1026) Added section on translations and contribution guidelines. * Update translation contribution guidelines (TryGhost#1027) Fixed error (wrong repo name - removed) * 🌐 Enable theme translations for Casper (TryGhost#1028) ref #23361 * add locale files (TryGhost#1030) * Updated gulpfile and dependencies for building i18n files (TryGhost#1029) ref TryGhost@63162e8 The above commit pushed the locales slightly ahead of this. Running the gulp file generates the locale files. * Update theme asset builds (TryGhost#1031) * update asset builds * Ship v5.10.0 - now with translations enabled! (TryGhost#1032) * fix Casper's postship (TryGhost#1033) * Initial plan --------- Co-authored-by: Sodbileg Gansukh <sodbileg.gansukh@gmail.com> Co-authored-by: John O'Nolan <john@onolan.org> Co-authored-by: Sanne de Vries <65487235+sanne-san@users.noreply.github.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Hannah Wolfe <github.erisds@gmail.com> Co-authored-by: Cathy Sarisky <42299862+cathysarisky@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Running gulp build after a bunch of renovate changes, to make the theme shippable again.