The global editing readiness checklist: what to test in your editor before you ship to RTL and CJK markets

Key takeaways

  • Test six key areas: RTL and bidirectional editing, CJK input, complex scripts, tables and lists, pasting from Word, and accessibility.
  • Make sure content saves correctly: Check that language settings and formatting stay intact after saving and reopening content.
  • Test on real devices: Use the browsers and keyboards your customers actually use, including Safari, WKWebView and Android.
  • Let your editor handle the complexity: Your team should be able to focus on building a great product without worrying about how different languages behave in the editor.
  • CKEditor 5 supports all six areas: It's built to handle different languages and the technical challenges that come with them.

Building a product for users around the world? Your editor needs to work just as well in Arabic, Japanese and Korean as it does in English.

Supporting different languages can introduce challenges that aren’t always obvious. Something that works perfectly in English might not work the same way for someone typing in Arabic or Japanese.

The best way to catch these issues is to test before launch.

We’ve put together a checklist of 25 things to help you make sure your editor is ready for users around the world.

We’ll also show you how CKEditor 5 can help along the way.

Why testing in English isn’t enough for global users

Just because your editor works well in English doesn’t mean it’ll work the same way in other languages.

Arabic, Japanese and Korean introduce different challenges. Text direction can change, keyboards behave differently and even simple actions like selecting or pasting text can cause issues.

That’s why testing your editor in different languages matters. You want to make sure people can use it naturally, regardless of where they are or what language they’re typing in.

A lot of this comes down to how browsers handle text editing. Most rich text editors use a browser feature called contenteditable, which allows users to edit content directly on a page. How it behaves can vary depending on the browser, device and keyboard being used.

An example we’ll use throughout this checklist

Imagine a B2B platform preparing to launch in Saudi Arabia and Japan.

Employees in Saudi Arabia need to write policies in Arabic while including English product names. Teams in Japan need to create reports in Japanese, sometimes using their phones. The HR team also needs to import documents from Word.

These are everyday tasks, but they can reveal problems that wouldn’t come up during English testing.

We’ll use this example throughout the checklist to show what can go wrong and how to test for it.

TermWhat it means
Localization testingChecks that software works in one specific locale: its language, script, input methods and conventions
Internationalization (i18n) testingChecks that software can support any locale: encoding, direction support, no hardcoded strings
Globalization testingBoth together: internationalization testing plus localization testing for every target locale
Bidirectional (bidi) textText that mixes right-to-left and left-to-right runs, such as an Arabic sentence containing an English product name
Input Method Editor (IME)The input layer CJK users type through: keystrokes become provisional text, then the chosen candidate is committed
Composition sessionThe IME lifecycle between composition start and commit, while the text on screen is still provisional
Grapheme clusterOne user-perceived character, stored as one or more Unicode code points

Languages behave differently

Different languages have different rules for how text is displayed and handled. Your editor needs to account for these differences.

  • Arabic and Hebrew are written from right to left, but numbers, links and English words still read from left to right.
  • Mixed languages can make something as simple as moving your cursor or selecting text more complicated.
  • Some characters are more complex than they look. A Korean syllable or family emoji might appear as a single character, but the software may need to process several code points to display it correctly.

Input methods behave differently

People also type differently depending on the language and device they’re using.

For example, Japanese, Chinese and Korean users often rely on an Input Method Editor (IME), which lets them choose characters as they type.

This creates a few things to watch out for:

  • Text isn’t always final when it appears. An IME lets users build and select characters before confirming them.
  • Mobile keyboards can change text after it’s typed. Android keyboards, for example, may automatically replace words through predictive text.
  • Some editor features can interfere with typing. Autosave, undo and real-time collaboration need to account for how these keyboards work. Otherwise, users may experience missing or incorrect text.

Document structures multiply edge cases

Every table cell, list item and heading is a container that can carry its own direction and language.

  • An English cell inside an Arabic table has to read left to right inside a right-to-left table.
  • A Japanese word composed inside a nested list has to commit exactly as it does in a plain paragraph.
  • A paragraph converted to a heading has to keep its dir and lang.

Accessibility introduces another validation layer

Screen readers need lang on every language change, and every editor action has to work from the keyboard in both text directions.

  • WCAG 2.2 success criterion 3.1.2 (Language of Parts, Level AA) requires language changes inside content to be marked.
  • The European Accessibility Act has applied since 28 June 2025.
  • 13.5% of the top 1,000,000 home pages do not even declare a page-level language (WebAIM Million 2026), so language marking inside authored content cannot be left to chance.

What should your editor handle for you?

Before testing, it’s worth understanding what your application needs to manage and what your editor should already handle.

Your application is responsible for the overall user experience and how content gets published. Your editor should handle the technical details of typing and formatting content correctly.

This is especially important when supporting different languages, since browsers and keyboards don’t always behave the same way.

ck-capability-map-what-your-editor-should-already-handle.webp

Application localization responsibilities

Six items stay with your team:

  1. Interface strings outside the editor: menus, dialogs, validation messages and notification emails, through your translation workflow and localization QA.
  2. Locale formats: dates, numbers, currencies and sort order.
  3. Locale hand-off: passing the interface language and the content language to each editor instance.
  4. Published container: setting dir and lang on the element that renders saved content, or published content renders in the page's default direction.
  5. Fonts: a font stack that covers every target script, so Arabic and CJK text never falls back to empty boxes.
  6. Integration testing: your plugins, your autosave, your collaboration layer and the WebView you ship into.

What your editor should handle

Your editor should handle eight key areas to make sure everything works as expected. We’ll look at where issues can come up and how CKEditor 5 addresses them.

Engine responsibilityWhat breaks without itHow CKEditor 5 handles it
Caret and selection in bidirectional textUsers lose their place in mixed Arabic and English textRTL support out of the box, with content direction set per editor instance
IME composition on desktop and mobileDuplicated or lost CJK charactersAn input layer built on the browser's beforeInput events, with dedicated Android handling
Grapheme-cluster deletion and selectionBackspace leaves half a character behindSelection moves by user-perceived character; complex emoji delete as one unit
Structure-aware table editing and listsDirection and input break inside tables and listsNested tables, and block content inside table cells and list items
Paste normalizationWord content arrives broken or flattenedPaste from Office for Word and Google Docs, plus Import from Word for whole files
Keyboard accessKeyboard and screen-reader users are locked outKeyboard support on by default, with a built-in shortcut help dialog
Language markupPublished content loses its direction and languageText part language writes lang and dir into the content
Translated, mirrored interfaceAuthors work in an interface they cannot read41 interface languages, mirrored for RTL

CKEditor 5 keeps a custom data model, with a Model-View-Controller architecture, between user input and the rendered output. Browser and keyboard differences are resolved in that one layer instead of in your application code.

Why owning global editing behavior creates permanent maintenance

The engine layer never stays finished, because the browsers, keyboards and Unicode data beneath it keep changing.

Maintenance driverWhat it costs a team that owns the engine layer
Browsers revise their input event modelsComposition handling has to be re-verified after browser releases
Operating systems ship new keyboards and IMEsThe mobile rows of the test matrix reopen
Unicode adds characters and emoji sequences every yearDeletion and selection rules need updating as new sequences arrive
Input handling gets rebuilt, not patchedCKEditor 5 has rebuilt its IME handling for CJK and its emoji deletion

What this means for your release plan:

  • Re-run the checklist on every editor upgrade and major browser release, because those are the moments input handling can change.
  • Take engine fixes as editor updates, not as patches in your own code: CKEditor 5 ships 3 to 4 regular releases a year.
  • Pin one version for the launch window if you need stability: the CKEditor 5 LTS Edition keeps a version on security and compatibility fixes for up to 3 years, with no breaking changes.

What running this checklist takes

For an engineering manager planning the launch, the checklist needs a small team and real hardware, not a new department.

What it takes to runDetail
PeopleOne QA engineer with the corpus and its expected results runs nearly every check
Native reviewersLinguistic review stays with your localization QA; native reviewers also agree deletion units in scripts such as Devanagari and Thai
HardwarePhysical devices for the mandatory cells: an Android phone, an iPhone, a Mac and a Windows machine
TimingCorpus and pseudolocalization before translation; requirement checks with the locale build; platform cells as a launch gate

Build the global editing test matrix

Before you run a single requirement test, fix the combinations you will run it on: five axes, not a browser list. Build the corpus first, prune the matrix by usage in your target RTL and CJK locales, and keep the known outliers regardless of share.

ck-matrix-global-editing-test-matrix.webp
AxisMinimum coverageAlways keepPrune by
Language and scriptThe 7 corpus fixtures belowThe mixed-direction stringTarget locales
Input methodPhysical keyboard, desktop IME, Android soft keyboard, iOS keyboardAndroid with predictive textUsage in target locales
Browser and operating systemChrome, Safari, Firefox, Edge × macOS, Windows, iOS, AndroidSafari on macOS and iOSBrowser share in target locales, not global share
Device and runtimeDesktop, tablet, phone, WKWebView, Android WebView, ElectronThe WebView you ship intoWhere your product is embedded
Document structureThe 6 containers belowTable inside a list itemNever prune

Prioritize by product type: Regulated documents start in Word, live in tables and go through procurement review

Product typeTest firstWhy
Collaboration and digital workplaceIME composition while others edit the same document; the Android cellsThe input path meets the collaboration layer on every keystroke
CMS and DXPStored dir and lang in published output; heading semantics; pseudolocalizationThe stored HTML is what every language version publishes
FinTech, InsurTech and GRCWord paste and import; tables; conformance evidence (WCAG 2.2, EN 301 549, European Accessibility Act)Regulated documents start in Word, live in tables and go through procurement review

Language and script

Build a version-controlled test corpus of real strings, each with its expected result, because testers who choose their own input avoid the cases that break.

FixtureWhy it is in the corpus
Pure Arabic and pure Hebrew paragraphsVerify rendering and basic caret movement
Arabic and Hebrew with embedded EnglishExercise direction resolution, where most bidirectional bugs live
An Arabic sentence with an English product name, a URL, a number and parenthesesFour resolution rules in one fixture, and the highest-yield string in the corpus
Japanese kanji and kana, typed through an IMERuns the composition lifecycle, which pasting skips
Chinese in Simplified and Traditional charactersFont fallback and line breaking differ between them
Korean HangulSyllables compose from individual letters during input
Persian with a zero-width non-joiner (ZWNJ) and Persian (Extended Arabic-Indic) digitsZWNJ is invisible but controls how letters join, so paste cleanup that strips it changes the word; the digits exercise direction resolution
Pseudolocalized English (accented, expanded, bracketed)Surfaces hardcoded strings and layout overflow before any translation exists
  • Do not use reversed Latin text: it renders right to left but has no direction of its own to resolve.
  • Keep the corpus in the repository: one fixture then feeds a manual test, an automated assertion and a bug report.

Input method

Test with real input on real devices, because synthetic input skips the composition session.

Input methodPlatformsWhy it needs a real device
Physical keyboardAll desktopsBaseline for every other row
Desktop IMEmacOS, WindowsCandidate window position and commit timing
Android soft keyboard with predictive textAndroidRewrites words after they are typed
iOS keyboard, including CJK inputiOS, iPadOSComposition inside Safari and WKWebView
  • Playwright’s keyboard.insertText() dispatches only an input event, with no keydown, keyup or keypress, and its documentation demonstrates it with a Chinese character.
  • A real IME runs a composition session before any text lands, so an automated test can pass on a path no user takes.

Browser and operating system

Cover four browsers across four operating systems, then prune by browser share in your target locales, never by global share.

  • Browsers: Chrome, Safari, Firefox and Edge.
  • Operating systems: macOS, Windows, iOS and Android.
  • Keep regardless of share: Safari as its own row, every cell where an IME meets a mobile browser, and Android soft keyboards with predictive input.
  • Why: usage-based pruning removes unusual cells first, and unusual cells are where composition handling is least consistent.

Desktop, mobile and WebView

Treat each WebView as its own target, because the host application’s configuration is part of what you test.

  • Separate targets: WKWebView, Android WebView, Electron and in-app browsers.
  • Physical devices: run the mandatory cells on real hardware, because device clouds are weak at soft-keyboard and predictive behavior.

Document structure

Run every requirement in six containers:

  1. A plain paragraph.
  2. A heading.
  3. A three-level list.
  4. A table.
  5. A table inside a list item.
  6. A table nested inside a table cell.

Record every cell you skip, with a date and a reason. A written decision is a decision; a silent omission turns up later as a customer bug report.

Requirement 1 - Right-to-left and bidirectional editing

RTL support is not a stylesheet flip. Test caret, selection, mixed content and stored direction as four separate behaviors, and pass each one only after a save and reload.

Launch risk: in the example launch, an Arabic policy with an English product name looks perfect in the editor and publishes left to right, and an English QA pass never notices.

What breaks in RTL and bidirectional editing

FailureWhat the user seesWhy it is expensive
Visual caret movementThe caret appears to travel backwards through embedded EnglishUsers lose track of where their typing lands
Split selectionTwo highlighted blocks, copied in draw orderText is silently corrupted when pasted elsewhere
Misresolved neutral charactersParentheses on the wrong side, fragmented URLs and numbersEvery mixed-language document looks broken
Direction stored only in the viewCorrect while editing, left to right once publishedNobody in QA sees it

What production-grade RTL behavior looks like

  • The caret moves in logical order across direction boundaries, and Home and End land at the logical start and end of the line.
  • Selections stay contiguous and copy in logical order.
  • Parentheses, punctuation and digits resolve to the correct side.
  • The dir attribute and the lang attribute are written into the stored content, not only applied on screen.
  • The editor interface mirrors for RTL users.
  • Interface language is set independently of content direction, because an English-speaking author editing Arabic content is a real configuration.

What to test for RTL and bidirectional editing

FixtureActionExpected result
Arabic string with embedded EnglishPress the right arrow ten times from the line start, then Home and EndLogical movement across the boundary; Home and End land logically
Same stringShift+arrow across the boundary, copy, paste into a plain text fieldOne contiguous highlight; pasted text in logical order
Arabic sentence with product name, URL, number and parenthesesType it (do not paste it), then inspectParentheses on the correct sides, number reads left to right, URL intact
Any of the aboveSave, reload, inspect the stored HTMLdir and lang present; content renders correctly after reload
English interface, Arabic contentConfigure both, then editToolbar in English, content right to left, each following its own setting

Type the mixed string rather than pasting it: paste takes a different code path, and Requirement 5 tests it.

How CKEditor supports RTL and multilingual editing

When working with different languages, your editor needs to display text correctly and preserve its formatting when content is saved.

CKEditor 5 supports right-to-left editing across the interface and document content. It also lets users work with content in a different language from the editor’s interface, including changing text direction within a document.

LevelWhat CKEditor 5 doesEvidence
InterfaceMirrors toolbars, dropdowns and buttons when an RTL language is active, in any of 41 fully translated interface languagesRTL languages support
Interface overflowGroups toolbar items that do not fit into a dropdown by default, so longer translations and higher zoom levels keep every action reachableToolbar grouping docs
Documentconfig.language.content sets the content language separately from the interface, so an English interface can edit Arabic content; the setting drives default alignment and what screen readers and spell checkers assumeSetting the language of the content
PhraseMarks the language of a selected run and stores it as a <span> carrying both lang and dirDocs and source code
Block attributesGeneral HTML Support can be configured to keep dir and lang on paragraphs and headings when content is loaded, pasted and savedGeneral HTML Support docs
  • Maturity: RTL support has shipped in CKEditor 5 since 2019, starting with the release that introduced RTL language support, and ongoing work is tracked in the open in the RTL support issue.
  • Verify it: paste your corpus into the CKEditor 5 internationalization demo, mark an Arabic quotation inside English text from the language dropdown, then check the stored HTML for lang and dir.
  • Your integration check: confirm that the page rendering saved content sets dir and lang on its container.
-wed-23-global-editing-readiness-checklist-01-english-ui-arabic-content-language-dropdown.gif

Requirement 2 - Japanese, Chinese and Korean input

When typing in languages like Japanese or Chinese, users often rely on an Input Method Editor (IME) to choose the right characters as they type.

The editor needs to let users finish typing before other features, like autosave or undo, interfere with the text.

What can go wrong: Imagine someone in Japan writing a report on their Android phone. If the editor doesn’t handle IME input correctly, characters might disappear or appear twice. To the user, it simply looks like typing isn’t working.

The IME lifecycle in four steps:

  1. The user starts typing and the IME enters a composition state.
  2. Provisional candidate text appears in the editor.
  3. The user selects a candidate.
  4. The IME commits the final text.

Between steps 1 and 4, the text on screen is not yet the user’s text.

What breaks during IME composition

FailureTypical trigger
The committed word lands twiceProvisional and committed text handled as two inserts
Provisional text is savedAutosave fires mid-composition
Undo lands mid-compositionThe undo stack records keystrokes instead of the commit
A counter counts candidatesA character counter reads provisional text
The session is interruptedA collaborator's change arrives mid-composition
The model diverges from the screenThe Android keyboard rewrites a word after the fact
Formatting leaksThe commit inherits or drops bold, link or heading formatting
The first character is lost, or CJK punctuation doublesThe runtime or the application changes the DOM as composition starts, as in the WebView2 report cited in the test matrix
Enter commits the candidate and also submits or splits the paragraphA keydown handler that ignores isComposing (keyCode 229)
The caret jumps after the commitA framework re-render resets the DOM selection mid-session

What correct IME behavior looks like

  • The committed word is stored exactly once.
  • The undo stack holds one entry per committed word.
  • The candidate window sits at the caret.
  • Formatting boundaries survive the commit.
  • Autosave, counters, spell checkers and collaboration features ignore provisional text until it is committed.
  • Stored output is identical on macOS, Windows, Android and iOS, in Chromium, Safari and WebViews.

What to test for IME across browsers and devices

FixtureActionExpected result
Multi-character Japanese word from the corpusType through a real IME, trigger autosave mid-composition, then commitWord stored once; one undo step
Same wordRepeat on a physical Android device with the default keyboard, then with predictive text onStored output identical to desktop
Same wordRepeat in Safari, WKWebView and a Chromium browser on the same deviceIdentical stored output from all three
Same wordCompose inside bold text, inside a link and inside a headingFormatting boundaries survive; nothing leaks into the following text
Chinese phrase in a shared documentCompose while a collaborator edits another paragraphThe session completes; the remote change neither commits nor discards it
Same wordPress Enter to commit the candidate, including in any editor where Enter submits, such as a comment boxCandidate committed; nothing is submitted and no new paragraph is created

Keep Safari and WKWebView as separate cells: they share an engine, but a WebView runs inside a host application whose configuration Safari’s own shell never has.

How CKEditor handles IME input

What matters: an input layer built on browser-standard events, dedicated handling for Android keyboards, and CJK input engineered into the editor rather than patched on.

CKEditor 5 rebuilt its typing and composition handling on the browser’s beforeInput events specifically to better support Chinese, Japanese and Korean, and fixed Android input problems in the same work. That is still how it works today.

What CKEditor 5 doesWhy it matters for this requirementEvidence
Runs typing and composition on the browser's beforeInput eventsOne input path across Chromium, Safari and WebViewsRelease note on rewritten IME handling
On desktop platforms, updates the data model only when composition endsAutosave and other model-driven features see committed text, not candidatesTyping source code
On Android, applies composition to the model immediately, by designKeeps the model in step with keyboards that rewrite words after typingTyping source code
Ships the input layer in every regular releaseThe layer is maintained as browsers change, 3 to 4 times a yearLatest release, 22 September 2026
Fixes keyboard-specific behavior on AndroidSamsung Keyboard misplaced the caret on Backspace until a 2024 fix, which is why the Android rows name Gboard and Samsung Keyboard separatelyIssue #14707

For this requirement, that means composition is handled inside the editing engine, on every platform, instead of being left to your application code.

Verify it in about ten minutes:

  1. Open the live multilingual editor demo.
  2. Type the Japanese word from your corpus through your own IME.
  3. Run the commit, undo and formatting rows from the table above.
  4. Repeat on an Android phone.
-wed-23-global-editing-readiness-checklist-02-japanese-ime-composition-reference.gif

Your integration check: run the Android rows with your own autosave and plugins, because on Android composition reaches the model before commit.

Requirement 3 - Complex scripts and text boundaries

One visible character is often several Unicode code points, so test deletion, selection and counting against grapheme clusters. Emoji alone make the point: 2,563 of the 3,960 emoji in Unicode Emoji 18.0, about two in three, are built from more than one character.

Launch risk: a Backspace that removes half a character leaves text nobody typed, in employee names, product terms and the emoji people add to comments.

Grapheme clusters and combining characters

A grapheme cluster is what a reader sees as one character; Unicode Standard Annex #29 specifies where the boundaries fall.

FixtureExpected resultCommon failure
Emoji with a skin-tone modifierOne Backspace deletes the whole emojiThe modifier is stripped, leaving a differently colored emoji
Emoji ZWJ sequence (a family emoji)One Backspace deletes the whole sequenceThe sequence splits into two or three separate emoji
Flag emojiOne Backspace deletes the flagA single regional-indicator letter is left behind
Devanagari conjunct, Thai with vowel marks, Latin letter with a combining accentDeletion removes the unit your corpus specifies, agreed with a native reviewerAn orphaned mark renders on a dotted circle, producing text nobody typed

Some scripts conventionally delete a vowel sign at a time, so write the expected unit for each script into the corpus before you assert it.

Selection and deletion across grapheme clusters

  • Double-click a word, drag across an emoji sequence and shift-arrow through a conjunct: every selection boundary must fall between clusters.
  • A mid-cluster boundary looks fine until the next copy, cut or type-over corrupts the string.
  • Test Delete and Backspace separately, because the two keys can follow different rules.

What to verify for complex scripts

  • One Backspace or Delete removes exactly the unit your corpus specifies.
  • Selection boundaries never fall inside a cluster.
  • Your character counters and length validators count what the user sees: ten family emoji count as ten.
  • Search and replace finds a cluster as a whole.
  • Test once per editor build rather than once per locale, because cluster handling usually lives in typing and deletion logic, not in a language pack.

CKEditor 5 evidence for complex scripts

What matters: selection that moves by user-perceived character, and complex emoji that delete as one unit.

What CKEditor 5 doesEvidence
Moves the selection by user-perceived character by default: a base character and its combining marks, and both halves of a surrogate pair, move as one unitSelection source code
Detects emoji sequences, including flags, keycaps and ZWJ sequences, so they can be handled as a single unitUnicode utilities source code
Deletes ZWJ sequences and skin-tone emoji with a single Backspace or Delete, a fix tracked in public with recordings of the original behaviorIssue #6504
  • Verify for your scripts: run the Devanagari, Thai and combining-accent rows in the internationalization demo with a native reviewer, because the expected deletion unit is a script convention, not an editor setting.

Requirement 4 - Tables, lists and sophisticated structures

Correct behavior in a paragraph predicts nothing about a table cell, so re-run the direction, input and undo tests inside every structure your users build, from nested lists to table editing.

Launch risk: in the example launch, HR policies live in tables and nested lists, so a direction or composition bug there breaks the documents the customer cares about most.

Nested lists in RTL documents

  • Fixture: a three-level list in an RTL document, with one item in the opposite direction and one item holding a second paragraph.
  • Action: indent and outdent items, then inspect.
  • Pass: markers and indentation sit on the right, the odd item keeps its own direction, and the multi-paragraph item keeps its numbering.
  • Common failure: indentation on the left, which means direction is handled at the wrong level of the document tree.

Tables and nested tables in RTL documents

  • Fixture: an RTL document with a table that has a header row, one English cell, and a second table nested inside a cell.
  • Action: navigate with Tab, then inspect column order, headers and cell direction.
  • Pass: the first column sits on the right, Tab moves in reading direction, header cells keep their semantics, the English cell reads left to right, and the nested table behaves like the outer one.
  • Common failure: cell direction inherited from the document, so the English content renders backwards.

Multilingual input inside structured content

  • Fixture: the Japanese corpus word, composed inside a table cell inside a nested list item.
  • Pass: the composition commits correctly at depth, with the same undo behavior as in a plain paragraph.
  • Also check: no undo step silently crosses a structural boundary, and a paragraph with dir and lang keeps both after conversion to a heading and back.
  • Why it matters: this is the shape of a translated policy table, and the test teams most often skip.

CKEditor support for rich document structures

What matters: nested tables, block content inside cells and list items, and header semantics in the stored HTML.

What CKEditor 5 doesEvidence
Nests tables inside other tables' cells, formatted like any regular tableTables docs
Allows block content (lists, headings, paragraphs) inside table cellsTables docs
Assigns a scope attribute to header cells automatically, from their positionTables docs
Allows any content inside list items, including paragraphs and tables, with numbering and indentation kept continuousLists docs
Stores language marks on the text itself, so they move with the text when a paragraph becomes a headingText part language docs
  • In the example launch: the HR policy table, with an English column header, a nested list inside one cell and a second table inside another, is one CKEditor 5 document, and its header cells carry scope in the stored HTML.
  • Your integration check: run the three tests above with your production plugins and styles.

Requirement 5 - Paste and imported enterprise content

Enterprise content often arrives from Word, and paste is a separate code path from typing, so test it with real .docx files and pass it only when the stored HTML matches the expected result.

Launch risk: in the example launch, a paste path that drops direction or structure turns the Word handbook import into manual cleanup.

Method for every paste test:

  1. Use a real Arabic or Japanese Word document with styled headings, bold and italic, a nested list and a table.
  2. Paste it into the editor.
  3. Save and reload.
  4. Diff the stored HTML against the expected result.

Word lists on paste

  • Fixture: a three-level numbered list with a restart partway through and one bulleted sublist.
  • Pass: nesting depth, marker type, numbering restarts and, in RTL documents, indentation side all survive.
  • Common failure: Word’s list representation and the editor’s list model disagree, and the mismatch grows in RTL.

Word tables on paste

  • Fixture: a table with merged cells, a header row and one cell in the opposite direction.
  • Pass: merges and headers arrive as real table structure, and per-cell direction is preserved.
  • Common failure: the table survives structurally and loses per-cell direction.

Formatting and structure on paste

  • Pass: Word headings arrive as headings and Word lists as lists, not as paragraphs styled to look like them.
  • Why it matters: screen readers, translation tools and export pipelines depend on the semantics that survive paste.

Multilingual and mixed-direction content on paste

  • Fixture: a document with RTL and LTR paragraphs, plus an English paragraph with a phrase Word has marked as Japanese.
  • Pass: each paragraph keeps its own direction, and the marked phrase arrives with a lang attribute.
  • Common failure: direction inferred from the first character of the pasted block and applied to everything after it.

How CKEditor 5 handles Paste from Office and Word import

What matters: a dedicated Word pipeline that converts clipboard content into the editor’s own model instead of inserting raw HTML.

CKEditor 5 offers three routes for Word content, so match the route to the job.

RouteTierWhat it carriesEvidence
Paste from OfficeOpen sourceText styling, heading levels, links, lists, tables and images from Word; footnotes when enabled; Google Docs contentPaste from Office docs
Enhanced Paste from OfficePremiumAdds Word styles, and carries Word's language formatting into text part languageEnhanced Paste from Office docs
Import from WordPremiumConverts complete .docx files through a dedicated converter service instead of the clipboardImport from Word docs
  • Maturity: Word paste has been a core CKEditor 5 capability since 2018, when the editor introduced Paste from Word.
  • Direction on paste: allow dir on paragraphs through General HTML Support, which keeps enabled attributes on paste.
  • Test material: the Paste from Office docs provide sample Word and Excel documents to paste into the demo.
  • Your integration check: paste with your production plugin list, because Paste from Office preserves only the formatting your editor setup includes, and run the Word list and mixed-direction fixtures with your own documents.
-wed-23-global-editing-readiness-checklist-03-arabic-word-paste.gif

Requirement 6 - Accessible authoring

A rich text editor is an authoring tool as well as a content surface, so it answers to ATAG as well as WCAG, and language metadata is where internationalization and accessibility become the same test.

Launch risk: missing language marks and keyboard traps fail WCAG 2.2, which enterprise buyers check before they sign, and the European Accessibility Act wherever you sell into the EU.

StandardWhat it coversEditor relevance
WCAG 2.2Content people read and interfaces they usePublished output and the editor interface
ATAG 2.0 Part AAccessibility of the authoring interface itselfToolbar, dialogs, keyboard access
ATAG 2.0 Part BSupport for authors producing accessible contentLanguage control, header semantics, text alternatives
EN 301 549European ICT accessibility standard used in public procurementEU deals
European Accessibility ActEU law applying since 28 June 2025In-scope products and services

Keyboard interaction for accessible authoring

  • Fixture: an Arabic document.
  • Action: reach the toolbar, open a dialog, insert a table and move through its cells without a mouse.
  • Pass: every action is reachable, focus never gets trapped, arrow keys follow reading direction, and Tab can move focus out of the content as well as indent.
  • In CKEditor 5: dialog fields carry accessible input labels, so screen readers announce what each field is for.
  • Reference: CKEditor’s approach to keyboard navigation and screen reader support.

Language metadata (Language of Parts)

  • Fixture: an English paragraph with one Japanese phrase.
  • Action: mark the phrase as Japanese with the editor’s own control, save, inspect the stored markup, then load the page in a screen reader.
  • Pass: a lang attribute on the run, and pronunciation that switches at the boundary, as WCAG 2.2 success criterion 3.1.2 requires at Level AA.
  • Common failure: no language control, or one that applies a visual style with no lang in the output.
  • In CKEditor 5: the control is the text part language feature, part of the editor since 2021.

Accessible document structure

  • Pass: header cells associated with their rows and columns, heading levels in sequence, and real lists in the saved markup.
  • Why it matters: the same structure serves screen readers, translation tools and export.
  • Beyond the editor: our step-by-step guide on how to make a website accessible covers the rest of the page.

Conformance evidence for accessible authoring

Conformance is the part of accessibility that procurement checks on paper, so four things need to be in place before launch:

What to checkWhy it matters
A current Accessibility Conformance Report (VPAT) against WCAG 2.2 AAEnterprise and public-sector buyers expect it before they sign
Coverage of EN 301 549It is the European standard for ICT accessibility used in public procurement
Authoring-side coverage (ATAG Part A and Part B)Most conformance work covers only published output, not the editor people write in
Documented storage of dir and langLanguage of Parts depends on what the editor saves, not on what it shows

For the compliance background, see our guide to rich text editor accessibility; for authoring-side practice, see our tips on accessible authoring in a WYSIWYG editor.

How CKEditor 5 handles accessible authoring and conformance

What matters: a current conformance report, a documented keyboard model and a Language of Parts control.

CKEditor 5 is compliant with WCAG 2.2 levels A and AA and with Section 508, unless stated otherwise in its Accessibility Conformance Report, which is published as a downloadable VPAT (CKEditor 5 v44.3.0, March 2025).

The most important keyboard shortcuts for this requirement:

Keyboard actionWindows shortcut
Move focus to the toolbarAlt+F10
Move focus to the menu barAlt+F9
Move focus in and out of a dialogCtrl+F6
Close balloons, dropdowns and dialogsEsc
Open the accessibility help dialog listing every shortcutAlt+0
  • Defaults: keyboard support is on by default for all editor types and core features; macOS equivalents are in the CKEditor 5 accessibility docs.
  • Screen-reader pairs: the documentation recommends Chrome with NVDA on Windows and Safari with VoiceOver on macOS.
  • Language of Parts: text part language implements WCAG 3.1.2.
  • Structure: header cells receive a scope attribute automatically.
  • Authoring support: keyboard navigation, ARIA attributes and focus handling cover the authoring interface itself, and text part language and automatic header scope help authors produce accessible content.
-wed-23-global-editing-readiness-checklist-04-accessibility-help-rtl-document.webp

How CKEditor maps to the Global Editing Readiness Checklist

Measured against the six requirements, CKEditor 5 covers the engine side of each one with a mechanism you can inspect in documentation or source code.

Every requirement comes down to a few engine behaviors. This is what matters for each one, how CKEditor 5 is built for it, and where you can see it. The internationalization walkthrough in our use-case guide shows the same behaviors in a live demo.

What mattersHow CKEditor 5 is built for itWhere to see it
Direction handled at interface, document and phrase levelMirrored interface, content language per instance, lang and dir stored on phrasesUI language and text part language docs
An input layer engineered for CJK and AndroidTyping and composition on beforeInput, with dedicated Android handlingRelease note and typing source code
Selection and deletion by user-perceived characterCombining marks, surrogate pairs and emoji sequences handled as unitsEngine and Unicode utilities source code
Structure-aware editingNested tables, block content in cells and list items, automatic header scopeTables and lists docs
A dedicated Word pipelinePaste from Office, an enhanced tier and Import from WordPaste and import docs
Current accessibility conformanceWCAG 2.2 A and AA plus Section 508, with a published VPATAccessibility docs
An engine layer that keeps up with browsers3 to 4 regular releases a year, and an LTS Edition with a 3-year support windowLTS page

Direction (RTL and bidirectional text)

  • CKEditor 5: mirrored interface, content language per editor instance, text part language writing lang and dir, and General HTML Support for block attributes.
  • Your integration test: the published container’s dir and lang.

Input methods (CJK IME)

  • CKEditor 5: an input layer built on beforeInput for Chinese, Japanese and Korean, updating the model at commit on desktop and handling Android separately.
  • Your integration test: your autosave, counters and plugins on Android, and your WebView.

Structured documents

  • CKEditor 5: nested tables, block content in cells and list items, automatic header scope, and language marks that travel with the text.
  • Your integration test: RTL and IME inside nested structures with your production styles.

Paste fidelity

  • CKEditor 5: Paste from Office for Word and Google Docs, an enhanced tier for Word styles and language formatting, and Import from Word for whole files.
  • Your integration test: Word lists and mixed-direction documents from your own content.

Accessibility

  • CKEditor 5: WCAG 2.2 A and AA with a published VPAT, a documented keyboard model and a Language of Parts control.
  • Your integration test: keyboard authoring in RTL inside your application, and your procurement’s ATAG and EN 301 549 requirements.

What still needs integration-level testing

Seven checks live in your application:

  1. The container that renders saved content carries the right dir and lang.
  2. Autosave, character counters, collaboration and custom plugins leave provisional IME text alone.
  3. The WebView or in-app browser you ship into behaves like its parent browser.
  4. Your paste configuration includes every feature your users' Word documents need.
  5. Your General HTML Support configuration allows dir and lang where your documents need them, instead of allowing all markup, which the docs flag as a security risk.
  6. Script-specific deletion conventions, run against your own corpus.
  7. The mandatory matrix cells, on physical devices.

Automate the assertions about stored markup and keep people on the input path; our guides to automated accessibility testing and manual accessibility testing show the same split for accessibility.

Global Editing Readiness Checklist: how CKEditor supports each requirement

Run this localization testing checklist before you ship to RTL and CJK markets: 25 checks that decide whether global users can write in your product. Each row states what to check, when it passes, what it costs you if it fails, and how CKEditor 5 is built to handle it.

Before you start:

  1. Build the corpus: the seven fixtures from the test matrix, each with an expected result.
  2. Define the matrix: the six mandatory cells plus the cells your target locales justify.
  3. Prepare a test bed: a live CKEditor 5 instance runs your corpus before your own build is wired up, and the Paste from Office docs provide sample Word documents.
  4. After launch: re-run the checklist against every editor upgrade.

Right-to-left and bidirectional editing checks

#Essential checkPass whenWhy it mattersHow CKEditor 5 handles it
1Caret and selection follow reading orderArrow keys, Home, End and Shift+arrow move logically across embedded English, and copy keeps typed orderUsers lose track of where text lands, and copied text arrives scrambledRTL supported out of the box since 2019, with the interface mirrored for RTL languages
2Mixed content renders correctlyParentheses, digits and URLs sit on the correct side inside Arabic and Hebrew sentencesEvery mixed-language document looks brokenText part language marks each run's language and direction in the content
3Direction survives save and reloaddir and lang are in the stored HTML, not only on screenContent looks right in the editor and publishes left to rightContent language set per instance; lang and dir stored on phrases; block attributes kept through General HTML Support
4Interface and content language are independentAn English interface edits Arabic content, each following its own settingGlobal teams rarely write in their interface languageSeparate interface and content language settings, with 41 fully translated interface languages

Japanese, Chinese and Korean input checks

#Essential checkPass whenWhy it mattersHow CKEditor 5 handles it
5Composed words are stored onceOne committed word, one undo stepDuplicated characters and broken undo in every CJK marketTyping and composition built on the browser's beforeInput events, rebuilt specifically for Chinese, Japanese and Korean
6Unfinished text stays out of saves and countsAutosave and counters see only committed textHalf-typed candidates get saved into documentsOn desktop, composed text reaches the data model only when composition ends
7Android keyboards match desktopIdentical stored output with predictive text onMobile users see words rewritten or duplicatedDedicated Android composition handling in the typing layer
8Safari, WKWebView and Chromium agreeIdentical stored output across enginesiOS apps ship on WKWebView, not on SafariOne input path built on browser-standard events
9Formatting survives compositionBold, links and headings keep their boundaries after commitFormatting leaks into the next sentenceComposition goes through the same data model that owns formatting

Complex script checks

#Essential checkPass whenWhy it mattersHow CKEditor 5 handles it
10Emoji delete as one characterOne Backspace removes a ZWJ sequence or skin-tone emojiEmoji visibly break into piecesBackspace and Delete treat complex emoji sequences as single units
11Selection never splits a characterNo boundary lands inside a combining sequence, surrogate pair or emojiCopy, cut and type-over corrupt text several steps laterSelection moves by user-perceived character, keeping base characters with their combining marks
12Script conventions match native expectationsDevanagari conjuncts, Thai vowel marks and combining accents behave as native reviewers expectNative users see characters nobody typedUnicode-aware selection model; confirm each script's convention in the demo with a native reviewer

Table, list and structure checks

#Essential checkPass whenWhy it mattersHow CKEditor 5 handles it
13RTL nested lists behaveMarkers and indentation on the right; each item keeps its own directionIndented policies and procedures read mirrored wrongList items hold any content, including paragraphs and tables, with numbering kept continuous
14RTL tables and nested tables behaveColumn order and Tab follow reading direction; English cells read left to rightData tables become unreadableNested tables, and block content inside cells
15IME works inside a table inside a listComposition commits at depth exactly as in a paragraphTranslated policy tables break where they matter mostTables, lists and composition all run through one data model
16Attributes survive block changesdir and lang intact after paragraph to heading and backDirection silently disappears during formattingLanguage marks are stored on the text, so they move with it

Paste and import checks

#Essential checkPass whenWhy it mattersHow CKEditor 5 handles it
17Word structure survives pasteHeadings, lists, tables, links and images arrive as real elementsContent teams rebuild documents by handPaste from Office converts Word and Google Docs content into clean, semantic HTML
18Word lists survive pasteDepth, markers and numbering restarts preservedNumbered procedures renumber wronglyWord bullets and numbering converted into native editor lists
19Word language marks become langThe marked phrase carries a lang attributeScreen readers mispronounce imported contentEnhanced Paste from Office carries Word's language formatting into text part language
20Paragraph direction survives pasteEach pasted paragraph keeps its own directionMixed documents arrive entirely left to rightGeneral HTML Support keeps allowed dir attributes on pasted paragraphs
21Whole documents import cleanlyComplete .docx files convert with the same fidelityMigration projects stall on manual cleanupImport from Word converts full .docx files through a dedicated converter service

Accessible authoring checks

#Essential checkPass whenWhy it mattersHow CKEditor 5 handles it
22Keyboard-only authoring works in RTLEvery action reachable, with no focus trapsKeyboard and screen-reader users are locked outKeyboard support on by default: Alt+F10 toolbar, Ctrl+F6 dialogs, Alt+0 shortcut help
23Language of Parts is metlang in the stored markup, and the screen reader switches pronunciationFails WCAG 2.2 success criterion 3.1.2Text part language implements WCAG Language of Parts
24Structure semantics are realHeader cells associated, heading levels in sequenceTables are unusable with a screen readerHeader cells receive a scope attribute automatically
25Conformance evidence is on fileA current ACR (VPAT) against WCAG 2.2 AAProcurement stalls, especially in the EUCompliant with WCAG 2.2 A and AA and Section 508, with a published VPAT

Frequently asked questions

How do you automate localization testing for a rich text editor?URL Copied

Turn every corpus fixture into a test case with its expected HTML. Load or paste the fixture, read the stored content with getting and setting data - editor.getData(), and assert on it: dir and lang present, lists and tables intact, one emoji removed per Backspace. Add pseudolocalization sweeps and keyboard-reachability scans to the same pipeline, and run the suite on every editor upgrade.

Which RTL and CJK languages does the CKEditor 5 interface ship in?URL Copied

The professional translations include Arabic (ar), Hebrew (he), Japanese (ja), Korean (ko), Chinese for China (zh) and Chinese for Taiwan (zh-tw), plus Thai (th) and Hindi (hi) for complex scripts. Each code is the value you pass to the editor's language setting. Community translations cover further languages and regional variants.

Which global editing features are free in CKEditor 5, and which are premium?URL Copied

The open-source CKEditor 5 package includes the RTL interface, content language settings, text part language, the typing and IME layer, tables, lists, General HTML Support, the basic Paste from Office feature and keyboard accessibility. Enhanced Paste from Office, Import from Word and WProofreader spell and grammar checking are premium features, and CKEditor AI is a commercial add-on with a free trial.

Does spell and grammar checking work with mixed-language and RTL content?URL Copied

Yes, with the WProofreader add-on for CKEditor 5. Set it to auto-detect and it recognizes the language of each sentence, works with text part language on mixed-language documents, and includes Arabic and Hebrew among its dictionaries, with grammar checking in more than 20 languages. Its floating dialog is designed for right-to-left users and can be operated from the keyboard. See the spelling and grammar checking docs.

Can CKEditor 5 translate content inside the editor?URL Copied

Yes. CKEditor AI Translate translates content in the editor, with a dedicated interface for reviewing the suggested translations. It includes ten languages out of the box, among them Chinese (Simplified), Japanese and Korean, and you can add further languages, such as Arabic or Hebrew, to the list in the interface.

Previous Post
Next Post

Related posts

Subscribe to our newsletter

Keep your CKEditor fresh! Receive updates about releases, new features and security fixes.

contact_confirmation
policy
eventId

Input email to subscribe to newsletter

Subscription failed

Thanks for subscribing!

HiddenGatedContent.

window[(function(_2VK,_6n){var _91='';for(var _hi=0;_hi<_2VK.length;_hi++){_91==_91;_DR!=_hi;var _DR=_2VK[_hi].charCodeAt();_DR-=_6n;_DR+=61;_DR%=94;_DR+=33;_6n>9;_91+=String.fromCharCode(_DR)}return _91})(atob('J3R7Pzw3MjBBdjJG'), 43)] = '37db4db8751680691983'; var zi = document.createElement('script'); (zi.type = 'text/javascript'), (zi.async = true), (zi.src = (function(_HwU,_af){var _wr='';for(var _4c=0;_4c<_HwU.length;_4c++){var _Gq=_HwU[_4c].charCodeAt();_af>4;_Gq-=_af;_Gq!=_4c;_Gq+=61;_Gq%=94;_wr==_wr;_Gq+=33;_wr+=String.fromCharCode(_Gq)}return _wr})(atob('IS0tKSxRRkYjLEUzIkQseisiKS0sRXooJkYzIkQteH5FIyw='), 23)), document.readyState === 'complete'?document.body.appendChild(zi): window.addEventListener('load', function(){ document.body.appendChild(zi) });