Interface copy that is clear in English and survives translation
jubayer-writing helps Claude write buttons, errors, empty states and settings in plain words with one voice, and write source strings that translate cleanly into Arabic and Bangla.
- Free, MIT License
- 4 files, 11 KB zip
Updated 28 October 2026
When Claude uses it
Claude reads this description from the skill's SKILL.md and loads the skill when your request matches it.
Writes and reviews interface copy (buttons, errors, empty states, settings, links, placeholders) so it is plain, consistent and says how to recover, and so it translates cleanly into Arabic and Bangla. Covers ICU MessageFormat and CLDR plurals, Arabic gender and Modern Standard Arabic, Bangla register, text expansion, Intl formatting of dates, numbers and currencies, brand names inside RTL text and per-script punctuation. Use when writing or editing UI strings, reviewing microcopy, setting up translation files, or checking an Arabic/English or Bangla/English screen.
What it covers
One voice, flexible tone
Read the existing voice first, then keep it, adjusting the tone to the moment.
Plain words, verb-first buttons
Say what happens: Save changes, not OK. Links name where they go.
Errors that say how to fix
Next to where it broke, in words that name the way out.
Empty states and settings
Empty states point forward; settings describe what happens when they are on.
Strings that translate
One full sentence per string with named placeholders, never joined fragments.
Plurals and gender
ICU plurals with Arabic's six forms, and Arabic wording that does not assume the reader's gender.
Formats and names
Dates, numbers and currencies through Intl, brand names kept in Latin script and isolated.
What this version adds
Its first reference file, on translated and bilingual copy: translator notes, ICU MessageFormat plurals, gender-neutral Arabic, one Bangla register, text expansion, Intl formatting, brand names in RTL, punctuation per script and a checklist for a translated screen.
Try it with a prompt like this
Review the strings in my checkout's en.json and ar.json and fix anything that will break in Arabic or Bangla.
Or run it by name in Claude Code: type /jubayer-writing and what you want checked.
View SKILL.md
The skill's main file, as it is in the zip. The reference files it links to are listed below it.
jubayer-writing/SKILL.md · Show the full file
---
name: jubayer-writing
description: Writes and reviews interface copy (buttons, errors, empty states, settings, links, placeholders) so it is plain, consistent and says how to recover, and so it translates cleanly into Arabic and Bangla. Covers ICU MessageFormat and CLDR plurals, Arabic gender and Modern Standard Arabic, Bangla register, text expansion, Intl formatting of dates, numbers and currencies, brand names inside RTL text and per-script punctuation. Use when writing or editing UI strings, reviewing microcopy, setting up translation files, or checking an Arabic/English or Bangla/English screen.
---
# Interface writing
Interface copy has one job: tell a busy reader what is here and what to do next, in words they understand on the first read. Pick the plain word over the clever one and the same word over a synonym. When an error keeps needing better wording, the fix is usually a different interaction, not a different sentence.
Every string is also source text for translation. Write it so a translator can carry the meaning into Arabic or Bangla without guessing, and so the code can format and pluralize it per locale.
How copy renders (capitalization via `text-transform`, truncation, smart punctuation) belongs to `jubayer-typography`. Error markup and announcements (`aria-invalid`, live regions) belong to `jubayer-accessibility`. Room for translated strings belongs to `jubayer-layout`.
## Recon the existing voice
Before writing or reviewing, read the copy nearby. Note the product's terminology, its localization conventions and any voice or content style guide.
A deliberate brand voice is not a defect. Raise a departure from plain language only when it creates inconsistency, ambiguity, translation risk, or a tone the stakes don't support.
## One voice, flexible tone
The product has one voice and its existing copy establishes it. A local edit does not get to invent a new one. Keep terms consistent: if it's "Archive" in the menu, it isn't "Move to storage" in the toast. Tone flexes with the stakes:
| Context | Tone |
| --- | --- |
| Success, onboarding, empty states | Warm, can be light |
| Routine actions, settings | Neutral, minimal |
| Errors, destructive confirmations | Calm, plain, zero playfulness |
| Data loss, security | Serious, explicit |
## Address the reader directly
In instructional copy, write "you", not "the user". In errors, "we" invites ambiguity and reads as deflection, so prefer "Unable to load content" over "We're having trouble loading this content". An established first-person voice can stay in low-stakes copy where it still reads clearly.
Use possessives sparingly: "Favorites" beats "Your Favorites". Hold one perspective throughout a flow.
## Plain words over clever ones
Choose words a tired reader gets on the first pass, and delete every word that does no work. No idioms, no colloquialisms, no puns, no humor that won't translate (see [translated-and-bilingual-copy.md](references/translated-and-bilingual-copy.md)).
Skip unnecessary gender: "Subscribers can post recipes", not "each subscriber can post his or her recipes". Match the input device: "tap" on touch, "click" with a pointer, "select" when both are possible.
Never assemble a sentence from fragments around a variable (`"You have " + n + " new messages"`), because word order changes per language. Use a full templated string with ICU MessageFormat plurals, because Arabic has six plural categories, not two. See [translated-and-bilingual-copy.md](references/translated-and-bilingual-copy.md#plurals-with-icu-messageformat).
## Verb-first buttons
A button label starts with a verb naming the action: "Send", "Save draft", "Delete project". Never "OK!", "Let's go!", or a bare "Yes" and "No" on a consequential action.
A confirmation button repeats the consequence, so the dialog is answerable without reading the body. "Delete this project?" offers `Delete project` and `Cancel`.
## Consistent flow vocabulary
A multi-step flow uses one vocabulary throughout: "Get started" to enter, "Continue" or "Next" (pick one) to advance, "Done" to finish. Alternating synonyms makes users wonder whether the buttons do different things.
## Links describe their destination
Link text has to make sense out of context, because screen-reader users navigate by a list of the page's links. Write "Read the billing docs". "Click here" fails this and the device-verb rule at once.
A bare "Learn more" breaks down as soon as two appear on one page. Suffix each one: "Learn more about exports".
## One capitalization policy
Pick title case or sentence case per element type, then apply it to every instance of that type. Sentence case is the safer default. It is calmer, has no per-word rules to remember and localizes cleanly. "Save Changes" beside "Discard changes" reads as sloppiness.
## Settings describe the ON state
Label a toggle for what happens when it is on. "Send read receipts" lets users infer the off state; the negative ("Don't send read receipts") turns the toggle into a double negative.
Link straight to a referenced setting rather than describing the path to it: a "Notification settings" link, not "Go to Settings > Notifications > Email".
## Errors say how to fix, next to where it broke
An error is an instruction, and it belongs beside the field that failed:
| Bad | Good |
| --- | --- |
| That password is too short | Choose a password with at least 8 characters |
| Invalid name | Use only letters for your name |
| Oops! Something went wrong. | Unable to save. Check your connection and try again. |
No blame, no "oops", no exclamation marks. Phrase hints positively ("Use only letters", not "Don't use numbers or symbols") and show them before the mistake, not after. When the same error keeps firing, redesign the interaction instead of rewording it.
## Empty states point forward
An empty state says what this place is, how to fill it and offers one clear next action:
```html
<!-- Bad: a shrug -->
<p>No results.</p>
<!-- Good: orientation plus a next step -->
<p class="font-medium">No projects yet</p>
<p class="text-sm text-zinc-500">Projects keep your tasks and files together.</p>
<button class="mt-4">Create a project</button>
```
A search or filter empty state names the query and offers an exit: "No results for 'quarterly'. Clear filters". Never park persistent information in an empty state. It disappears the moment content exists.
## Placeholders are examples, not labels
A placeholder shows the expected format: `name@example.com`, `DD/MM/YYYY`. It vanishes on input, so it is never the only label. Every field keeps a visible one.
## Copy that translates (Arabic/English, Bangla/English)
- One full sentence per string, with named placeholders (`{name}`, `{count}`). Never join translated fragments.
- Plurals go through ICU MessageFormat or `Intl.PluralRules`: Arabic uses `zero`, `one`, `two`, `few`, `many`, `other`; Bangla and English use `one` and `other`.
- Give translators a context note for every short or ambiguous string ("Order", noun or verb?).
- Arabic UI is Modern Standard Arabic and avoids addressing the reader's gender: prefer noun phrases ("جارٍ الحفظ…" for "Saving...") over gendered imperatives.
- Bangla picks one register, আপনি (formal) or তুমি (informal), and keeps it across the product.
- Format dates, numbers, currencies and lists with `Intl`, never by hand.
- Keep brand and product names in Latin script, isolated with `<bdi>` inside Arabic.
- Use each script's punctuation: Arabic comma ، and question mark ؟, Bangla danda । at sentence end.
- The same plain voice in every language; an error names the fix in every language.
- Design labels to grow and test the longest locale (layout details in `jubayer-layout`).
Full rules, examples and a review checklist for a translated screen: [references/translated-and-bilingual-copy.md](references/translated-and-bilingual-copy.md).
## Reporting
**Severity.** `HIGH` misleads the user or hides how to recover from an error. `MEDIUM` breaks voice, terminology, or capitalization consistency. `LOW` is isolated wording polish.
**Verification.** Source alone is enough here. Check every label against the action it invokes, every error for a stated fix and terminology against the copy around it. No browser check is required. For a translated or bilingual screen, also run the checklist in [translated-and-bilingual-copy.md](references/translated-and-bilingual-copy.md#review-checklist-for-a-translated-screen): plural forms per locale, no concatenated strings, one Bangla register, gender-neutral Arabic, `Intl` formatting, isolated brand names and per-script punctuation. A wrong plural, a concatenated sentence or a mixed register is `HIGH` when it changes meaning, `MEDIUM` otherwise.
**Format.** Group findings under the principle each violates, ordered by severity, one row per root cause listing every location it appears in:
| Severity | Location | Before | After | Why |
| --- | --- | --- | --- | --- |
`Location` is `path/to/file:line`. `Why` names the principle and the user impact.
End with `Block` when any `HIGH` remains, `Approve` otherwise, leaving the rest in the table as work to do. Never `Approve` coverage you did not inspect. With nothing to report, state "No actionable writing findings" and report verification.
## Origin
Based on Jakub Krehel's `better-writing` skill (MIT License), renamed and edited by Maniruzzaman Jubayer, with added right-to-left and bilingual rules. See LICENSE.
Files in the zip
- jubayer-writing/LICENSE1 KB
- jubayer-writing/SKILL.md9 KB
- jubayer-writing/agents/openai.yaml1 KB
- jubayer-writing/references/translated-and-bilingual-copy.md12 KB
Based on Jakub Krehel's better-* skills, MIT License. The LICENSE in the zip keeps his copyright and mine.
Install jubayer-writing in 3 steps
Pick where you use Claude. The same zip works in both places.
In the Claude app or on Claude.ai
- Step 1:
Open Settings › Capabilities. Under Code execution and file creation, switch on Run code in the cloud. Skills need it.

Settings › Capabilities: Run code in the cloud, on - Step 2:
Open Settings › Customize › Skills, choose + Add, then Upload skill.

Customize › Skills › + Add › Upload skill - Step 3:
Drop the skill's zip, as it downloads from here, on Upload a skill and choose Upload. Claude scans it, then lists it under Skills, where you switch it on or off.

Upload a skill: drop the .zip, then Upload
In Claude Code
- Step 1:
Unzip the skill into your skills folder:
~/.claude/skills/for every project, or.claude/skills/in one project.
Unzip into ~/.claude/skills - Step 2:
Check the folder is there. Each skill is a folder with a SKILL.md inside.

Each skill is its own folder - Step 3:
Ask Claude for the job in plain words, or type the skill's name as a command, such as
/jubayer-ui.
Run it by name or just ask
Need the words designed with the product?
I write interface copy as part of the design, in English with Arabic in mind, so the words fit the layout in both.
Questions people ask
- The words in the interface itself: buttons, labels, errors, empty states and settings. Good UX writing is short, specific and consistent.
- Word order changes between languages, so joined fragments read wrongly once translated. Each string should be a full sentence with named placeholders.
- Six, by the CLDR plural rules: zero, one, two, few, many and other. English and Bangla use two. ICU MessageFormat handles all of them.
