VIEW THIS AS

Auto mode follows the Route Engine until you choose a viewpoint.

YOU ARE HERE

ROUTE CHECK

CONNECTED TO

WHAT NEXT

Use the canonical route for this room, or HELP if you are unsure.

How People Translate Quickly | Rails I18n YAML Translation QA: Locale Files, Interpolation, Plurals and Safe HTML

Three students study around open books and worksheets in a shared classroom.

The fastest reliable way to translate a Ruby on Rails application is to put the approved user-facing messages into locale files, keep their lookup keys stable, interpolate values with the exact names the application supplies, and test the translated output with the Rails I18n runtime. For the common YAML workflow, that means checking the top-level locale, the nested key tree, indentation, quoting, plural rules and request-level locale selection before calling the translation complete.

If you are searching for Rails I18n, how to translate Rails YAML files, Rails localization plurals, I18n.t interpolation or Rails translations not working, the immediate distinction is between three different problems: whether a key loads, whether the application chooses the intended locale, and whether the resulting sentence is correct for the reader. A YAML file can parse yet contain the wrong key. A perfect Spanish sentence can sit under a locale the application never selects. A technically valid message can reverse the meaning of an account-deletion warning. Testing all three layers is the basis of a dependable localization process.

This guide explains Rails I18n from actual lookup to release. It covers config/locales structure, explicit locale handling with I18n.with_locale, interpolation and reserved variables, pluralization, Active Record validation errors, human attribute names, HTML-safe translation conventions, YAML booleans and indentation, dates, currency, fallback, caching, translation memory and automated checks. The emphasis throughout is practical: identify the owner of an error and fix it once instead of making repeated changes to the wrong layer.

Translation series navigation: How People Translate Quickly index. Compare official Rails I18n YAML documentation with related guides: Angular XLIFF translation QA, Laravel PHP and JSON translation QA, Django gettext translation QA.

Start with one message and its actual lookup

Find a real button or error message that is currently displayed in English. Trace how Rails retrieves it. It may be called with I18n.t(“checkout.pay”) in application code, with the abbreviated t helper inside a view, or through a framework-generated validation message. Identify the lookup key, the resulting translated value and the effective locale in that request. Do not begin by exporting every string in the project.

A typical Rails locale file stores a language code at the top and a nested set of keys beneath it. For example, en can contain checkout, which contains pay, whose value is Pay now. A Spanish file can use es at the top with the same checkout.pay path and a natural Spanish value. The logical key structure stays aligned; the wording changes. That distinction is much more important than preserving the order of sentences in the file.

Run a small diagnostic in the Rails console or a test: request the same key with locale: :en and locale: :es, and inspect both results. If the Spanish lookup does not return the expected target, check the file load path, locale spelling, key nesting and fallback behavior before judging the translation. This ten-second experiment can prevent hours of unnecessary linguistic revisions.

Understand YAML as data rather than prose

YAML is convenient because a human can read a nested catalog without much punctuation. That convenience brings risks. Indentation establishes structure; colons distinguish keys and values; quotes can change how a scalar is interpreted; some unquoted tokens have special meaning under different YAML parsing rules. A translator who adjusts the indentation to make a sentence look tidy may move it to another key path.

Keep a machine-readable inventory of fully qualified keys, not just the strings shown next to them. A line reading Save is not enough information for a checker to identify which screen should display it. The inventory should say the locale, resource path, value type and any required interpolations. When a target import alters nesting, the report should identify the exact path lost or created.

Use a YAML parser that matches the application’s runtime assumptions. A generic online YAML beautifier may change quoting, special scalars or anchors in ways that are inappropriate for Rails. Before using a translation platform at scale, import and export a small catalog unchanged and compare the parsed key/value tree. The correct goal is semantic round-trip integrity, not visually identical whitespace.

Why keys such as yes, no, on and off need care

The Rails Internationalization Guide draws attention to YAML-looking boolean tokens used as keys. Depending on the YAML version and parser behavior, unquoted true, false, yes, no, on and off may be interpreted differently from ordinary string keys. That can turn a path intended to be something like success.on into an unexpected internal key and cause a translation lookup to fail.

The practical fix is to quote ambiguous scalar keys in the format expected by the project. Do not assume a translator or YAML formatter will notice that an everyday word has a technical role. If a UI contains On and Off options, it is perfectly natural to want those as translations; the problem is not the target language. The problem is that an unquoted key can be parsed in a way the application does not expect.

Add a fixture containing such keys to the translation pipeline. Parse it through the same loader Rails uses, ask for the precise lookup paths and confirm the returned values. If an imported file loses success.on while retaining something that resembles it visually, reject the import. Structural problems should surface as an actionable message rather than an unexplained English fallback.

Preserve the top-level locale and every nested key

In a Rails YAML catalog, the root usually identifies the locale. Under that root, nested keys identify namespaces, feature areas and messages. Translating the root locale code into a human language name does not provide a new supported locale; it breaks the contract. Similarly, translating account.password_reset.title into a target-language identifier does not help readers, because application code still requests the original key.

Protect these paths in the editor. A translator should see the context of account.password_reset.title while editing only its value. If the application changes a key name intentionally, developers should migrate the lookup and reconcile the catalog together. Otherwise old translations may be left behind and new lookups may silently fall back to English.

Nested dictionaries can be large. When reporting coverage, expand them into individual fully qualified paths and compare source and target inventories. That makes it clear whether a missing error message belongs to a whole untranslated namespace or one accidental typo. A raw count of YAML lines is not a meaningful translation-completeness metric.

Set the locale for the request, not for an unrelated user

Rails uses I18n.locale to determine translations when a call does not explicitly pass a locale. In a web application, the critical question is where and how that value is set. A user selecting French should see French within the relevant request and should not affect another user’s response. The Rails guide recommends I18n.with_locale for scoped request handling because a careless long-lived locale assignment can leak into later work on a reused thread or process.

A typical controller can wrap the action in I18n.with_locale and select a supported locale based on a user preference or explicit route parameter. Validate the requested locale against the application’s allowed set. Do not pass arbitrary unsanitized text directly into the locale contract simply because it arrived in a query string. Document precedence if the URL, account preference and browser language disagree.

Test sequential requests with different locales under the same test process. A Spanish request followed by an English request should return the intended language each time. Also test background jobs, mailers and asynchronous tasks, whose locale can be different from the current browser request. Correct translation files cannot compensate for a request lifecycle that chooses the wrong language.

Current locale, default locale and available locales do different jobs

The default locale is the fallback baseline when a request has not selected another one. The current locale is the value used by lookups in the current execution context. The available locales define which selections the application intends to accept. These are related configuration values but not synonyms.

Suppose the product offers English, Spanish and Malay. A user-supplied locale of unknown may need to fall back to the default or produce an explicit error depending on the product design. A malformed value should not quietly create a pretend locale that no translation catalog supports. The team should be able to answer exactly what readers will see when a preference is missing, expired or unsupported.

Write tests for explicit, absent and invalid language preferences. Check localized URLs, user account settings and email generation. If a supported language suddenly switches to the default mid-journey, look at the lookup context and selection policy before accusing translators of leaving segments incomplete.

Decide whether to store the locale in the URL

There is no universal correct way for a Rails site to choose language. It can use a route parameter, a subdomain, a persistent user preference or carefully interpreted browser preferences. Each carries consequences for navigation, caching and public discoverability. A marketing page with separately indexable language versions often benefits from stable URLs; an authenticated application may primarily use a saved preference.

If the locale is in the URL, propagate it through internal links where appropriate and prevent it from corrupting unrelated identifiers. The application should not generate a French destination that silently drops the locale and sends the reader back to English. Also decide whether a language change preserves the current page when the equivalent target exists.

For publicly indexed content, coordinate hreflang and canonical rules with SEO ownership. Search engines and users should be able to reach meaningful language variants, not hundreds of routes that all serve the same default-language text. Localization routing should strengthen clear navigation rather than inflate the number of URLs without delivering a different experience.

Rails interpolation uses named tokens with precise meaning

Rails I18n interpolation commonly uses placeholders such as %{name} in translated values. The application supplies a named value when calling I18n.t. The translator may move that expression within the sentence to follow target-language grammar, but must preserve the correct name when the caller still expects it. A message like Hello, %{name} can become a natural greeting with the name at the beginning or end without modifying the variable contract.

Make every placeholder understandable. A token called count might represent registered students, files, attempts or minutes. The target may need noun agreement or a different article based on that meaning. Provide sample values and context instead of simply locking a mysterious expression. When a placeholder carries a user-generated name, test long names, non-Latin characters and punctuation.

Check expected versus actual placeholders by name, not only count. Two tokens, %{child} and %{teacher}, cannot be swapped without changing the meaning. A translation that retains two pairs of braces but misidentifies whose action is described may pass a simplistic structural check while misleading the user. Use a parser-aware validator and a rendered example with unmistakably different values.

Reserved interpolation variables and namespacing

The I18n translation API reserves some option names for its own behavior. The Rails guide documents reserved interpolation keys such as scope and default, alongside the special role played by count. A message contract should not casually invent variables using framework control names. It is better to choose descriptive business-oriented placeholders such as student_name or attempt_total.

This distinction is especially important when importing strings from another localization framework that uses different token conventions. A text segment containing {name} in one system is not automatically equivalent to %{name} in Rails. A translation memory import that normalizes all placeholder styles into one format can break interpolation even though the grammar is correct.

Keep format ownership visible in the extraction manifest. Mark Rails I18n patterns as such and identify any messages formatted later through a different Ruby or JavaScript function. A value that looks like a template may be literal documentation text. Protect only the syntax that the actual consumer interprets, not every brace in a technical tutorial.

Build pluralization around the target language

Rails I18n can choose different translated values based on a count. For common English behavior, one is used for the singular case and other for remaining counts, with an optional zero handling path in documented examples. But the grammar of Arabic, Russian and other languages does not follow the same two-form system. Target-locales may need additional pluralization rules and translated forms.

The Rails guide explains locale-specific backend rules and also points to rails-i18n as a source of broader locale support. Use a solution appropriate to the Rails and I18n versions installed in the product. Do not manually copy English plural entries into every language and declare the result complete. A valid YAML map with one and other does not guarantee natural output under the actual target-language rules.

Test real values through I18n.t with count: rather than selecting plural strings by hand. Include zero, one, two, five, eleven and values relevant to the target locale. Review the whole sentence; the counted noun, adjective and verb may change. A translator should see what the message means in the app, not only an isolated label named other.

Count zero is a product meaning as well as grammar

A dashboard displaying no saved documents can choose a message such as You have no saved documents, while a quota panel showing zero remaining uses a different tone and consequence. Both pass a count of zero but communicate different user situations. A special zero form is useful only when it preserves that situation accurately.

Before writing the translation, decide whether zero is a normal count, an empty state that invites an action, or an error condition. The language should reflect the user’s next step. A positive message such as Start your first saved search may suit a welcoming empty state but be wrong for a compliance statement about missing records.

Test the rendered result in context. A count passed as a string, fraction or unexpected negative number can reveal an application contract problem. Do not create exotic grammar rules to hide invalid counts. Validate the source data and the pluralization behavior separately so that each defect has a clear owner.

Know the difference between pluralization and inflection

Rails includes Active Support inflection utilities that handle word transformations such as singularize and pluralize. Those utilities are not the same thing as choosing a translated sentence through I18n pluralization. An English-oriented inflector cannot be used as a universal substitute for correct target-language grammar. It may produce a plausible noun ending while ignoring the agreement required by the rest of the sentence.

Use translated messages for user-facing content. When the application needs locale-specific inflection behavior in code, configure it deliberately and test the result with the same target-language reviewer who approves the full sentence. Keep a clear boundary between modifying a model name for code conventions and expressing a sentence to a human.

This matters for automated emails and validation errors. A template assembled from the English singular noun, a translated verb and an inflected ending can become unnatural or wrong in languages with grammatical cases. A complete localizable message is usually safer than concatenating fragments that assume English syntax.

Make model names and attribute names understandable

Rails I18n can localize Active Record model and attribute names. These names often appear in validation errors, forms and automatically generated interface text. A database attribute such as guardian_contact_number may be accurate for developers but confusing if displayed literally to a parent or student.

Define human-readable target labels through the appropriate Rails I18n paths and verify them where the application shows them. A field label, its validation message and its explanatory hint should use consistent terminology. If a student registration screen calls one field guardian number and an error calls it emergency phone, the user may think the messages refer to different data.

Review framework-generated strings in context. A correct translation of can’t be blank may still be awkward when automatically combined with an inflected attribute name. Languages vary in how they express missing input, gender agreement and polite instructions. Use locale-aware full error messages where the default compositional approach cannot produce a natural result.

Translate validation errors as corrective instructions

An error message should help the user recover. Saying is invalid may describe a failed constraint but not explain what a parent should enter. When business rules permit, a better localized message tells the reader whether a field is required, a date is outside range or a verification code has expired. This requires the translator to understand the underlying validation rule.

Rails’ I18n error system can provide generic validation messages and overrides scoped to particular models or attributes. Use the appropriate level for the problem. A generic missing value message may be fine for many text inputs but confusing for a checkbox requiring an affirmative consent. Avoid changing a generic string to solve one exceptional screen if that change worsens hundreds of other errors.

Test validation with realistic incorrect values, including empty input, overly long data, invalid formats and mixed scripts. Confirm that the localized field name, requirement and next step make sense together. A grammar review of the error catalog without reproducing the validation states can miss the most important usability issues.

HTML-safe translation keys require deliberate review

The Rails Internationalization Guide documents conventions under which certain translation keys ending in _html or named html can be treated as HTML safe when retrieved through relevant helpers. This is convenient for translated content with approved markup, but it is not a general permission to insert arbitrary HTML into locale files. The special key name changes a rendering contract.

A translator might see welcome_html and assume the suffix is decorative. It is not. The application may use that result in a view without escaping the approved markup in the same way as ordinary text. Preserve the identifier and review the allowed tags carefully. Do not let machine translation rewrite element names, attributes or event-like code as if they were words.

Test with dynamic user input as well. Rails’ helper behavior includes escaping for interpolated untrusted values under its supported conventions, but only when the application uses the proper safe path. A developer who calls raw on arbitrary translated text or bypasses sanitization can create a security issue. Localization review should maintain the host application’s HTML safety boundary.

Preserve clickable language without fixing English word offsets

A terms-and-conditions sentence might contain a link. In another language, the linked phrase could belong earlier in the sentence or need a different case. A view that identifies the link by taking characters 20 through 40 from the English sentence will not survive that change. This is an interface architecture problem, not a bad translation.

Use safe components or approved markup that allows the link to move without changing its target or identity. The sentence should remain whole enough to let a translator write natural grammar. Avoid splitting it into Before link, Link, After link fragments when the target language cannot assemble those in the same order.

Test the interaction with keyboard navigation and a screen reader. Does the right phrase receive focus? Does the link lead to the promised destination? Is the accessible name meaningful? A translation can be semantically faithful as text while failing to support the task the text asks the user to perform.

Localize dates and times with I18n.l and appropriate formats

Rails I18n provides localization of dates and times through I18n.l and format definitions. A translated sentence can still confuse a reader if it embeds an English-formatted date or an ambiguous numerical month/day order. The human sentence and the formatted data need to be designed together.

Use locale-appropriate formats where they belong, and give translators enough context to know whether a date means a deadline, an appointment or an activity timestamp. An appointment confirmation should distinguish the time zone when required, rather than relying on a date formatter to resolve a business rule. A date range should not reverse its endpoints during grammatical reordering.

Test edge cases such as a month whose name has different grammatical forms, a midnight boundary, a leap-day date and a time converted between zones. The locale file may govern format labels, while the underlying timestamp and time-zone conversion belong to application logic. Keeping those concerns separate prevents translation edits from accidentally changing facts.

Currency and numbers are more than punctuation

A shopping cart might display a subtotal, tax and total. The surrounding words may be translated correctly while the numbers use unfamiliar separators or the currency symbol is ambiguous. The app must know whether a value represents Singapore dollars, euros or another currency. It must not infer that changing interface language changes the actual transaction currency.

Use a defined numeric formatting policy and localize display conventions without altering amounts or identifiers. A transaction reference often needs exact ASCII reproduction for support, while a monetary value may use locale-specific grouping and separators. The translator needs to know which is which.

Review assembled examples with both small and very large values, negative adjustments, zero balances and decimal precision. This catches errors that normal text-only translation memory cannot detect. It also prevents the misuse of a localization file as a substitute for financial calculation or currency conversion logic.

Handle source-language fallback transparently

Some Rails applications use fallback behavior through configuration or additional I18n backend support. The app may return an English string when the target locale lacks one. Fallback can keep the interface functioning, but it creates a false sense of completion if tests merely verify that a nonempty string appears.

Build a coverage report against required keys for each locale, with separate treatment for deliberately shared terms. A critical privacy notice that falls back to English is a higher concern than a developer-only diagnostic. Record whether the current runtime returns a target value, a default-locale value or a missing translation marker.

When a reader reports a mixed-language screen, inspect the key and the effective locale first. The root cause could be an absent target key, incorrect nesting, a missing file on the load path or an explicit application fallback. Each requires a different repair. Changing a fluent Spanish sentence will not make Rails load a resource it cannot find.

YAML anchors, aliases and import safety

YAML can support aliases and shared structures, but projects differ in how parsers and safe loading permit them. A translation platform that expands aliases, removes anchors or serializes the result differently may alter references without changing the displayed text in an editor. The safest production approach is to test the chosen parser and avoid clever structural sharing where it makes vendor handoff unreliable.

Also review what data the importer is allowed to load. Untrusted YAML should not be processed with unsafe object deserialization merely because it arrived as a translation file. The translation pipeline should use controlled parsers and known schemas, and should not accept arbitrary executable Ruby values from an external language provider.

If a project legitimately uses Ruby locale files for advanced behavior, separate those resources from ordinary translated YAML prose. A linguist should not be asked to edit lambdas, classes or code-level callbacks. Engineers can own the executable part while language specialists supply reviewed target strings through a predictable interface.

Translation memory reuse needs the Rails key and screen

The English word Profile may be a page title, a user data object or a verb in a developer workflow. A translation memory match based only on the source letters can return the wrong target. Rails keys help establish context, but they may also be too generic if a project names everything title or submit.

Add the fully qualified key, screenshot, audience, message type and important variables to each segment’s metadata. Restrict automatic reuse for legal or safety-critical messages when the product intent changed. A translation that fit an old school-registration policy may be inappropriate after a new consent requirement, even if the wording is very similar.

When a term is corrected, update its concept definition and identify related keys. Avoid indiscriminate search-and-replace inside target YAML because the same word may carry different grammatical roles. Consistency should protect the same concept, not erase natural differences between sentences.

Detect stale keys and changed interpolation contracts

As features evolve, Rails locale files collect entries that no longer correspond to active code. They also lose new entries when developers add screens without updating every target. A structural audit can compare key inventories, but it should account for dynamic lookups and framework-generated resource paths that may not be visible to a naive static search.

The most important changes are not always missing keys. A message may keep the same key while the source gains a new placeholder, changes a negative into a positive instruction or refers to a different person. Track changed source values and message contracts alongside key additions. These changes need a renewed language review even if old target text still loads.

A successful import should produce a report: added keys, removed keys, missing target keys, changed variable inventories, suspicious duplicates and approved exceptions. Give the report to both developers and linguists. It focuses attention on meaningful deltas instead of requiring everyone to reread the entire catalog after every release.

A diagnostic case: the Spanish value exists but displays English

Imagine a registration form whose Spanish locale file contains a correct translation for guardian_contact_number, but the form label remains English. Trace the view and find the exact key it requests. It may use a framework-generated human_attribute_name lookup rather than the custom label path the translator updated.

Inspect I18n.available_locales, the current request locale and the loaded translation inventory. If the key exists under a different namespace, move or alias it through an approved structural change. If the app is using another locale, repair its selection logic. If a view hardcodes English instead of using I18n, change the code.

Add a regression test at the level that failed. Testing a console lookup is useful for resource presence; a rendered form test is needed to prove the page actually uses that resource. Do not confuse one with the other.

A diagnostic case: a placeholder becomes a literal name

A message says Welcome, %{student_name}, and the translator replaces the placeholder with Amelia because a screenshot shows that name. The resulting target sentence is grammatically correct in the vendor preview but personalizes every account with the same example name. Technical QA should catch the missing named interpolation before the target is deployed.

Restore the exact token and document what it represents. Run the sentence through I18n.t with two different test names, including a very long or non-Latin name. Check the resulting punctuation and word order. A target language may require the name to move, but it must remain the runtime-supplied value.

This defect is preventable. Protect interpolation tokens in the editing environment, show variables with readable labels, and use automated checks that compare the source and target token names. Translators should spend their energy on the proper greeting, not on manually reconstructing broken syntax.

A diagnostic case: a zero count chooses the wrong phrase

An inbox displays a strange grammatical form when there are no messages. The target YAML file has one and other entries, but the product expects a special empty state. Before editing, inspect the count passed to I18n.t, the configured pluralization backend and the actual branch selected for that locale.

If the product requires a zero-specific message and the runtime supports that decision, provide the appropriate form through a documented rule. If zero should be treated through the locale’s normal category behavior, use that form instead. A string selected for English zero is not automatically the correct branch for every target locale.

Test a matrix of counts and save it as a regression fixture. The first successful zero output is not the end of the review; make sure one, two and larger values still work. Grammar is a function of the actual input and target-language rules, not a single translation row.

Build a disciplined test pipeline

Start with YAML parsing and resource shape validation. Check that locale roots and required keys exist, that string values have the intended types, and that reserved or ambiguous YAML keys are quoted properly. Next compare placeholder inventories and plural branch structures appropriate to each locale. Flag missing target keys while allowing justified, documented differences.

Then run Rails runtime tests that explicitly select locales. Retrieve representative keys, interpolate sample values and render model validation errors. Exercise the actual controller or mailer where the message appears. Finally, perform target-language review of real user journeys, including sensitive actions and accessible labels.

Reports should identify file, locale, full key path, issue class, source content, target content and observed output. Separate hard failures from review prompts. A malformed YAML file or a missing required interpolation can block release. A longer sentence or different punctuation may be correct and needs human judgment rather than automatic rejection.

An editorial checklist for every locale

Before a release, confirm that the source catalog reflects the current application and that translations were reviewed against that version. Verify the allowed locale list, request scoping, file load paths and expected fallbacks. Check ambiguous YAML keys, nested resources, pluralization, named interpolations, model and attribute labels, and time and number formatting.

Review the screens that make real decisions. Can a parent understand an enrollment condition? Can a student identify an incomplete field? Does an account holder know whether a deletion is permanent? Does the target-language form remain clear when a person’s name, number or date is inserted? A structurally perfect translation that changes these decisions is not ready.

Keep a concise evidence pack: translated files, source revision, test results, known exceptions, screenshots and review approval. The next release should be able to reuse that knowledge instead of restarting from guesswork. That is how fast translation becomes repeatable quality rather than an emergency at every deadline.

Frequently asked questions about Rails localization

Where do Rails translations go? Commonly under config/locales in YAML or Ruby files, with additional paths configured through the I18n load path. Check the actual project’s conventions rather than assuming a file in an arbitrary folder will load.

How do I translate dynamic values? Use the interpolation syntax and named arguments expected by Rails I18n, such as %{name}. Keep the variable identity and move it within the sentence only when needed for natural target-language grammar.

Why does I18n.t return translation missing? The key may be absent, nested differently, in a file that is not loaded or in another locale. Inspect the full lookup path and actual runtime locale before changing text.

Are Rails pluralization rules the same for every language? No. English default behavior is not universal. Review available pluralization support for the target locale and test real counts.

Are _html translation keys ordinary text? No. Certain helpers apply HTML-safe conventions to appropriately named keys. Preserve the contract and review markup and interpolated data with security in mind.

How do I keep one user’s locale from affecting another request? Scope locale selection deliberately. Rails documents I18n.with_locale as a safer pattern than leaving a globally set locale active through later request handling.

Official references and a useful first test

The Rails Internationalization Guide is the primary reference for locale files, interpolation, pluralization, date and time localization, HTML-safe keys and locale handling: https://guides.rubyonrails.org/i18n.html . For testing, use the project’s actual Rails version and the I18n backend installed in the running application.

The wider translation system can be explored at https://edukatesg.com/how-people-translate-quickly-series-index/ and https://edukatesg.com/2026/09/18/master-art-of-translation-complete-system-moving-meaning-between-languages/ . Related structural guides include https://edukatesg.com/2026/09/19/how-people-translate-quickly-missing-localization-keys-qa/ , https://edukatesg.com/2026/09/19/how-people-translate-quickly-duplicate-localization-key-qa/ and https://edukatesg.com/2026/09/19/how-people-translate-quickly-localization-build-validation/ .

Pick five messages from a Rails application: a label, a validation error, a greeting with a named placeholder, a plural notice and a date-bearing confirmation. Translate them into one target locale, test their exact keys through I18n, render their screens, and verify that a second request returns to its own correct language. Once that route is sound, expand the tested workflow across the rest of the catalog.

Discover more from eduKate Singapore

Subscribe now to keep reading and get access to the full archive.

Continue reading