홈 / Skills / 웹·UI 디자인 / UI 국제화 (UI Internationalization)
웹·UI 디자인

UI 국제화 (UI Internationalization)

AIBarsMITSkill 언어: 영어
라이선스 확인됨스크립트 없음낮은 위험
데모실행 기록 · claude-sonnet-5-5 · 2026년 10월
Using the ui-internationalization skill, review and plan the work to add German, Japanese and Arabic to an English-only React dashboard. Facts: strings are inline in components; dates are formatted as MM/DD/YYYY by hand; buttons and tabs have fixed pixel widths; the CSS uses margin-left and text-align:left; plurals are done with count === 1; there is no language switcher.
Skill: ui-internationalization

I haven't opened the code, so this review is based only on the facts you gave. I can't cite files or line numbers yet, and step 1 of the plan is a code audit to find them.

Assumptions to confirm

  • Languages: German (de), Japanese (ja) and Arabic (ar), plus English. Arabic means RTL has to be built in from the start.
  • Arabic region: The choice affects the calendar, numerals and currency. For example, ar-SA defaults to the Islamic calendar, while ar-EG and ar-AE use Gregorian. I recommend ar-AE or ar-EG with Latin digits unless the product team says otherwise.
  • Currency and time zone: These should stay independent of language.
  • Translations: I'm assuming they come from people or a vendor, so the catalog needs translator context.
  • Charts: I don't know if the dashboard has charts, and I'd check. Axes, legends and tooltips would need RTL handling too.

Review findings

Hard-coded text

  • Inline strings in components. Every label, placeholder, tooltip, aria-label, error message and page title needs a catalog key. Fix: adopt a library (react-intl or i18next with ICU), use stable keys, and add a translator description for each key.
  • count === 1 plurals. This is wrong for Arabic, which has six plural categories (zero, one, two, few, many, other). It is also wrong for Japanese, which has only "other". Fix: use ICU {count, plural, ...} messages. Arabic needs all six forms written out.
  • Likely string concatenation. Inline strings usually come with count + " items in " + name patterns. Fix: whole messages with named placeholders. I'd grep for + " and template literals in JSX.
  • Ambiguous one-word labels. Words like "Open" or "Filter" can be a verb or a noun. Fix: separate keys per meaning.

Formatting

  • Hand-written MM/DD/YYYY. This is wrong for all three new languages. Fix: Intl.DateTimeFormat(locale, options), with dates stored as ISO or timestamps. Check whether the data layer holds already-formatted strings.
  • Numbers, currency, percentages. These are probably formatted by hand too. Fix: use Intl.NumberFormat, with currency as an explicit code and not derived from the language.
  • Other formatters. Relative time ("3 days ago"), lists, and sorting should use Intl.RelativeTimeFormat, Intl.ListFormat and Intl.Collator.
  • Language and region. Keep these as separate settings.

Layout and truncation

  • Fixed pixel widths on buttons and tabs. German will overflow them and clip. Fix: remove the widths and use min-width, padding and flex or grid with gap. Where truncation is unavoidable, use an ellipsis plus a tooltip or accessible name.
  • Fixed heights. Check for these as well, since text will wrap to more lines.
  • Verification. Use pseudo-localization (about 40% longer, accented, in brackets) to find every clipped element before real translations exist.

Scripts and fonts

  • No lang on the document. Set <html lang> per locale. This is needed for Japanese glyph selection, since the Han characters render differently under ja.
  • Font stack. Add Japanese and Arabic fallbacks; a Latin-only stack will give inconsistent system fallbacks. Check that the bold weights exist for those scripts.
  • Typography.
    • Give Japanese more line-height.
    • Remove any italic emphasis, any forced uppercase, and any letter-spacing on Arabic. Letter spacing breaks Arabic joining.
    • Don't truncate strings by character index; use Intl.Segmenter if any code does.

RTL

  • margin-left and text-align: left. These will break the Arabic layout. Fix: switch to margin-inline-start, padding-inline, text-align: start, inset-inline-* and border-inline-*. Do this by codebase-wide search and replace, then review each hit. Also check for float, left: / right:, and translateX.
  • dir. Set dir="rtl" on the root for Arabic.
  • Icons. Audit them one by one. Mirror chevrons, back and next arrows, and progress bars. Don't mirror logos, play/pause icons, clocks or numerals.
  • Mixed-direction content. Wrap user-generated or unknown-direction text in <bdi>. Give email, URL and code fields dir="ltr".
  • Charts. If there are any, decide deliberately whether to mirror the time axis. Numerals and axis values stay LTR.

Routing and switching

  • No language switcher. Add one labeled in each language's own name (English, Deutsch, 日本語, العربية), with no flags.
  • Locale order. Use saved choice, then URL, then browser Accept-Language, then default. Don't force a redirect.
  • Persistence. Remember the choice.
  • URLs and SEO. If the dashboard is public, use a path prefix per language with hreflang, x-default and canonical URLs. If it's behind a login, a saved preference may be enough, but I'd confirm.
  • Fallback. Missing translations fall back to English and log the gap. Raw keys should never show.

Plan

  1. Audit (about 1–2 days). Grep for hard-coded strings, count ===, manual date code, width: in px, and left/right/margin-left. This gives a real inventory and effort estimate. Confirm the Arabic region and numeral choice, the translation source, and whether the app has charts or is public.
  2. Foundation.
    • Pick the i18n library and set up the message catalog, with the en catalog as the source.
    • Add a locale provider, a lang/dir setter and the switcher.
    • Add the font stacks and a pseudo-locale.
    • Add a lint rule against literal JSX text (e.g. eslint-plugin-i18next).
  3. Layout and CSS (can run in parallel with step 4). Remove fixed widths and convert to logical properties. Make buttons and tabs flexible, and audit icons for mirroring. Verify with the pseudo-locale and with Arabic under dir="rtl".
  4. Extract strings. Move them component by component into the catalog, with translator notes and ICU plurals. Replace concatenation with whole messages.
  5. Formatting layer. Make one helper module wrapping Intl.* for dates, numbers, currency, lists and relative time. Replace every manual format and store dates as ISO or timestamps.
  6. Translation. Send the catalog to translators with context, including the six Arabic plural forms. Flag legal text, examples and region-specific content for review.
  7. QA and verification. Run every screen in en, de, ja, ar at phone and desktop widths. Test plurals with counts of 0, 1, 2, 5 and a large number (Arabic needs 0, 1, 2, 3–10, 11–99 and 100+ to cover all forms). Compare dates and numbers across two regions. Check lang and dir in the DOM. Search again for leftover hard-coded strings.

Order and risk: the CSS conversion (step 3) and string extraction (step 4) are the largest pieces of work. RTL is the riskiest because it touches every component, so do it early and not at the end.

Not checked: I haven't looked at the codebase, run anything, or tested any real RTL or translated text. All of the above comes from the facts you listed.

If you'd like, I can start with step 1 once you point me at the project directory. The working directory appears to be empty.

Real run in an isolated folder with only this skill installed. Only the Skill and Read tools were enabled, so no command was run and no file was written. The scenario is fictional and the model had no access to the code. The model proposed a plan and listed what it could not check.

하는 일

국제화(UI가 현지화될 수 있는 상태)와 현지화(번역 자체)를 구분하고 앞의 것을 다룹니다. 규칙은 여섯 가지입니다. 화면에 보이는 글자를 코드에 쓰지 않는다(이름 있는 자리표시자가 든 완전한 메시지를 쓰고, 조각을 이어 붙이지 않으며, 복수형은 count === 1이 아니라 표준 방식으로). 날짜, 숫자, 통화, 목록, 상대 시간은 로케일 인식 Intl API로 서식화한다. 논리적 CSS 속성과 의사 현지화로 길이가 다른 글자에도 버티는 레이아웃을 만든다. 문자 체계, 글꼴, 줄바꿈을 다룬다(lang, zh-Hans와 zh-Hant, 글꼴 대체, CJK 동작). 오른쪽에서 왼쪽 레이아웃을 지원한다(dir, 뒤집어야 할 것과 아닌 것, 양방향 텍스트 격리). 언어 전환, 로케일 결정 순서, URL, hreflang, 대체 방식을 설계한다.

함께 다루는 것

언어, 지역, 통화, 시간대를 서로 독립적으로 두기, 날짜를 타임스탬프로 저장하기, 유연한 이름·주소 양식, 메시지 키에 번역자용 맥락 제공, 끝났다고 말하기 전에 확인할 체크리스트.

이런 때 좋습니다

두 번째 언어 추가, 영어만 있는 제품에 독일어·일본어·아랍어 추가, '번역하면 깨지는' UI 검토.

참고 및 위험

낮은 위험:스크립트가 없는 지침 패키지로, 네트워크 접속이나 파일 쓰기가 없습니다. 번역은 하지 않으며 번역 품질도 평가하지 않습니다. 기계 번역이나 검수되지 않은 번역은 해당 언어에 능숙한 사람의 검토가 필요하고, 법률·의료·지역 특화 콘텐츠는 현지 검토가 필요합니다. 사용자의 코드를 볼 수도 실행할 수도 없으므로 실제 오른쪽에서 왼쪽 렌더링 등 확인하지 못한 항목을 밝힙니다. 일부 `Intl` 기능은 대상 브라우저의 지원 여부를 확인해야 합니다. AIBars가 만든 오리지널(MIT). 가상의 React 대시보드로 한 번 시험 실행했습니다.