نسخه فارسی برنامه باز می‌شود، همه صفحه‌ها Render می‌شوند و Smoke test سبز است؛ اما پیام زمان ارسال هنوز انگلیسی است، مبلغ بدون واحد پول نمایش داده می‌شود، Placeholder اضافی نام کاربر را وارد پیام امنیتی می‌کند و متن شبه‌بومی‌شده از پنج Container بیرون می‌زند. تست i18n و l10n باید این خطاهای خاموش را پیش از انتشار Locale آشکار کند، نه اینکه فقط نبود Crash را تأیید کند.

این راهنما، Internationalization و Localization را به یک Release system قابل آزمون تبدیل می‌کند: Locale Contract، Language Tag، resource schema، placeholder/plural/select، fallback، Unicode/Normalization/Bidi، format/parse، pseudo-localization، translation pipeline، linguistic QA، matrix، accessibility، SEO، monitoring و Release Gate. مثال‌ها به فارسی و RTL توجه دارند، اما صفحه مالک مهندسی انتشار چند Locale است؛ چک‌لیست عمیق فارسی در صفحه تخصصی خود باقی می‌ماند.

مرز ادعا: تست می‌تواند برای Locale، Build، resource bundle، platform و Scenario مشخص Evidence بسازد؛ پذیرش بازار، درآمد، وفاداری، احترام فرهنگی، نبود توهین، انطباق قانونی یا «محصول بی‌نقص جهانی» را تضمین نمی‌کند. زبان، لحن، Terminology، بازار، قانون، فرمت، Content و Risk باید توسط صاحبان صلاحیت همان محصول تعیین و نسخه‌دار شوند.

خلاصه عملی تست i18n و l10n

پرسششاهد ضعیفشاهد بهتر
آیا Locale آماده است؟برنامه Crash نکردkey/schema/placeholder/plural/fallback audit + functional/visual/linguistic evidence
آیا ترجمه کامل است؟در TMS صددرصد استbundle همان Build، همه Surfaceها، runtime keys و fallback telemetry بررسی شده‌اند
آیا RTL درست است؟کل صفحه mirror شدlayout direction، semantic icons، mixed content، Bidi isolation و task paths آزموده‌اند
آیا عدد/تاریخ محلی درست است؟ظاهر آشنا استcanonical value، locale/timezone/calendar/numbering system و parse policy trace می‌شوند
آیا متن خوب است؟Machine translation روان به نظر می‌رسدreviewer واجد Context، glossary/style/terminology، in-context evidence و sign-off دارد
آیا Release آماده است؟Base locale سبز استrisk-based locale/platform matrix، Unknownها، fallback و rollback/monitoring روشن‌اند

i18n، l10n، Translation و G11n را تفکیک کنید

مفهومتمرکزArtifact نمونهاشتباه رایج
Internationalization / i18nتوان مهندسی برای چند زبان/Localeresource API، Unicode، formatting، layoutکار یک‌باره ابتدای معماری
Localization / l10nتطبیق یک Release برای Locale/Market مشخصbundle، assets، formats، content، rulesفقط ترجمه رشته
Translationانتقال معنای متن میان زبان‌هاtarget messages و reviewمعادل کل Localization
Transcreationبازآفرینی هدف/لحن در Context مجازcampaign/content variantمجاز برای متن حقوقی یا فنی بدون approval
Globalization / g11nOperating model چندبازار/چندLocaleportfolio، governance، release calendarنام دیگری برای UI translation
Linguistic QAمعنا، grammar، terminology، tone در Contextfinding + reviewer decisionجایگزین functional testing

i18n پس از افزودن نخستین Locale تمام نمی‌شود. Feature جدید، library upgrade، component تازه، API یا متن runtime می‌تواند regression بسازد. l10n نیز برای هر تغییر محتوا، rule، asset، platform و بازار نیازمند impact analysis است؛ لازم نیست همه Testها همیشه تکرار شوند، اما تصمیم selection باید traceable باشد.

صفحه ۱۸۱۸ چه چیزی را مالک است؟

صفحه حاضر مالک مهندسی و Quality Gate انتشار چندLocale است: Source message→resource schema→translation→bundle→runtime selection→format/render/input→review→release/monitoring. راهنمای تست فارسی و RTL مالک جزئیات خاص فارسی، قلم، ارقام، تقویم، UI و چک‌لیست بومی است.

Compatibility، Accessibility، Usability، Privacy، Integration و Ecommerce ownerهای جدا دارند. در این مقاله فقط مرز اتصال آن‌ها با Locale release مشخص می‌شود تا یک چک‌لیست بی‌پایان و تکراری ساخته نشود.

Locale مساوی Language یا Country نیست

Language به زبان محتوا اشاره می‌کند؛ Script شیوه نوشتن؛ Region می‌تواند تفاوت کاربرد را مشخص کند؛ Locale در برنامه معمولاً مجموعه‌ای از ترجیحات و قواعد مانند زبان، script، region، numbering system، calendar، collation و formats است؛ Market نیز eligibility، قیمت، قانون و عملیات تجاری را می‌افزاید. این مفاهیم هم‌پوشان‌اند، اما قابل جایگزینی نیستند.

شناسهچه می‌گوید؟چه چیزی را لزوماً نمی‌گوید؟
`fa`زبان فارسیکشور، timezone، calendar، currency یا قانون
`fa-IR`فارسی با Region ایرانتنظیمات قطعی همه کاربران یا market eligibility
`sr-Latn-RS`صربی، script لاتین، Region صربستانترجیحات فردی دیگر
Asia/Tehranشناسه timezoneLanguage/Locale یا calendar
IRRکد Currency در Contract مربوطواحد نمایشی تومان یا price policy
Market=IRبرچسب داخلی بازار اگر تعریف شدهخودکار Language/Locale یا شمول قانونی

RFC 5646 / BCP 47 ساخت و معنای Language Tagها را تعریف می‌کند. Tag سفارشی مانند `fa_IR` را بدون Contract interchange نسازید؛ در BCP ۴۷ separator و subtags قواعد مشخص دارند. بااین‌حال BCP ۴۷ به‌تنهایی Locale runtime کامل محصول را تعیین نمی‌کند.

Locale Contract را نسخه‌دار کنید

Locale Contract
localeId:             internal canonical identifier
languageTag:          BCP 47 tag for content/language use
language / script / region: explicit subtags where relevant
textDirection:        ltr | rtl | context-dependent policy
fallbackChain:        exact ordered list + allowed surfaces
numberingSystem:      default/allowed options
decimal/grouping:     display and input policy
calendar/timezone:    display, parse and canonical-storage rules
currency/units:       market/business contracts, not guessed
collation/search:     versioned library/rules and expectations
names/addresses/phone: model and validation owners
resourceVersion:      source/bundle/schema/tool versions
marketEligibility:    independent decision/reference
contentOwners:        linguistic/legal/product/domain roles
platformScope:        web/iOS/Android/email/PDF/... 
knownLimitations:     unsupported or fallback paths
releaseOwner/expiry:  decision and review date

اگر کاربر language را عوض می‌کند اما timezone یا currency ثابت می‌ماند، محصول باید این استقلال را مدل کند. «Locale switch» که همه تنظیمات را بی‌صدا تغییر می‌دهد می‌تواند تاریخ، مبلغ یا Content نامربوط نشان دهد.

Negotiation و Selection را تعیین‌پذیر کنید

Locale ممکن است از preference حساب، setting دستگاه، browser header، URL، cookie، market یا default بیاید. اولویت و persistence باید صریح باشد؛ در غیر این صورت یک redirect loop یا Locale ناخواسته ساخته می‌شود.

Locale Selection Contract
Inputs: URL, account preference, session, device/browser, market
Precedence: exact ordered decision table
Supported set: versioned locale registry
Matching: exact → defined parent/fallback → default
Persistence: account/session/device scope
Explicit user choice: must not be silently overridden
Unsupported tag: deterministic fallback + telemetry
URL/canonical: locale routing and indexability policy
API: Accept-Language/request field vs response Content-Language
Cache: locale included in key/Vary strategy where applicable
Logout/new device: expected reset/persistence
Privacy: no unnecessary location inference
ScenarioتزریقInvariant
Preference conflictURL=fa، account=en، browser=arprecedence documented and visible
Unsupported locale`fa-X-private` یا malformedsafe deterministic behavior؛ no crash/cache poison
Anonymous→loginguest fa، account enmerge/switch policy explicit
Two tabsLocale در Tab A عوض می‌شودscope/persistence طبق Contract
Cachesame URL، two Locale requestscontent mix/leak رخ ندهد
Deep linkصفحه Locale ناموجودroute/fallback بدون از دست‌رفتن context
Explicit choiceGeo/IP پیشنهاد دیگری می‌دهدuser choice silently overridden نشود

Resource Key را API پایدار ببینید

Key فقط نام فایل نیست؛ رابط میان Code، Source content، Translation memory، screenshots و Runtime است. تغییر یا reuse بی‌قاعده یک Key می‌تواند ترجمه قدیمی با معنای جدید را بدون خطا نمایش دهد. Key باید owner، context، lifecycle و source hash داشته باشد.

Message Resource Contract
key:               semantic stable identifier
sourceMessage:     approved base content
description:       intent, screen, actor, tone, constraints
placeholders:      name + type + example + sensitivity
plural/select:     categories/variables and examples
markup policy:     allowed tags/escaping/rich-text model
length/visual hint:informative, not a forced truncation target
owner/domain:      product/legal/security/marketing/... 
sourceVersion/hash:change detection
status:            draft/reviewed/approved/deprecated
screenshots/links: in-context references
fallbackAllowed:   yes/no and consequence
security/privacy:  secrets/PII prohibition or controls
  • Key گمشده، اضافی، duplicate و deprecated scan شوند.
  • Source تغییرکرده ترجمه قبلی را نیازمند review کند.
  • یک Key برای دو معنای متفاوت reuse نشود.
  • یک جمله به قطعات کوچک وابسته به ترتیب انگلیسی شکسته نشود.
  • Context، gender/plural/select و placeholder examples در TMS برسند.
  • HTML/Markdown/Rich text به‌صورت امن و ساختاری مدیریت شود.
  • Runtime-generated key بدون inventory/coverage پنهان نماند.

Placeholder را بخشی از Schema بدانید

Translator باید بتواند Placeholder را جابه‌جا کند، اما نباید نام، type یا تعداد آن را بی‌قاعده تغییر دهد. String concatenation ترتیب زبان مبدأ را تحمیل می‌کند و escaping یا Bidi را نیز سخت می‌سازد.

Failureمثال ساختگیGate
Missing placeholderBase `{amount} {currency}`، target فقط `{amount}`schema error
Extra placeholderTarget `{code}` و `{name}`، base فقط `{code}`schema/security review
Rename`{orderId}`→`{id}`compile/runtime validation fail
Type mismatchDate به Number formattertyped contract test
Unsafe markuptranslator-controlled tag/URLallowlist/escape fail
Secret placeholderToken/OTP در analytics یا screenshotdata policy violation
Concatenationنام + فعل + عدد از سه Keywhole-message redesign

Plural، Select و Grammar را از `count != ۱` نگیرید

زبان‌ها تعداد Category و رفتار یکسان ندارند؛ fractional value و visible trailing zero نیز ممکن است Category را تغییر دهند. CLDR Categoryها نام‌های `zero`، `one`، `two`، `few`، `many` و `other` دارند، اما هر Locale زیرمجموعه و Rule خودش را دارد.

صفحه رسمی CLDR Plural Rules توضیح می‌دهد Categoryها بر اساس تغییر لازم در عبارت انتخاب می‌شوند و اعداد صحیح/کسری باید آزمایش شوند. CLDR نسخه‌پذیر است؛ library/data version را pin کنید و Category را با intuition انگلیسی اختراع نکنید.

  • ۰، ۱، ۲، مرزهای rule، teenها و مقادیر بزرگ؛
  • ۱ در برابر ۱٫۰ و مقادیر کسری طبق Locale/formatter؛
  • negative، NaN/Infinity فقط اگر Domain اجازه دهد؛
  • `other` اجباری و fallback behavior؛
  • Ordinal در برابر Cardinal؛
  • Select برای gender/role/state فقط با مدل و Privacy مناسب؛
  • Nested select/plural و placeholder preservation؛
  • Upgrade CLDR و migration ترجمه‌ها.

Fallback را ویژگی پنهان نکنید

Fallback می‌تواند availability را حفظ کند، اما کیفیت و حتی ایمنی معنا را پنهان کند. پیام Marketing شاید بتواند موقتاً به English برگردد؛ متن Legal، Transaction authorization یا emergency instruction ممکن است اجازه نداشته باشد. Policy باید per-domain و per-key باشد.

Fallback Contract
Requested locale:      ___
Resolution chain:      exact ordered locales
Per-domain allowance:  UI / legal / security / transactional / help
Missing-key behavior:  fallback / placeholder / fail build / hold feature
Visual marker:         test-only or production behavior
Telemetry:             key, requested/resolved locale, build/bundle version
Alert thresholds:      by criticality, not global count only
Cache behavior:        requested and resolved locale identity
User disclosure:       if language mix affects understanding
Expiry/action:         owner and translation SLA

یک Smoke test که فقط `text.length > ۰` را می‌سنجد، Fallback ناخواسته را Pass می‌کند. Test باید requested locale و resolved resource source را جدا Assert کند.

Pseudo-localization را چند Mode اجرا کنید

Pseudo-localization ترجمه زبانی نیست و quality متن مقصد را نمی‌سنجد. یک Transformation deterministic روی Source است که hardcoded string، truncation، encoding، font، RTL و concatenation را زود آشکار می‌کند. یک Mode واحد همه Failureها را پیدا نمی‌کند.

ModeTransformationکشف احتمالیمحدودیت
AccentedASCII letters→accented Unicodeencoding/font/hardcodedCJK/complex shaping را مدل نمی‌کند
Expansionpadding proportional + bracketsfixed width/truncationدرصد جهانی برای همه رشته‌ها نیست
RTL pseudodirection/context transformationlayout/mirroring/Bidi issuesزبان RTL واقعی نیست
Bracketing`[!! message !!]`truncation/missing resourcevisual only
Placeholder stresslong/mixed-dir sample valuesschema/Bidi/overflowproduction data distribution نیست
Missing-resource modedisable fallback/mark missingcoverage gapproduction policy ممکن است متفاوت باشد
  • Placeholders، markup و escape sequence دست‌نخورده بمانند.
  • Transformation با seed/version ثابت و Artifact قابل بازتولید باشد.
  • Screenshot diff با masks و baseline owner همراه شود.
  • Hardcoded scanner exceptionها owner/expiry داشته باشند.
  • Backend، Email، PDF، Push و validation message نیز پوشش داده شوند.
  • False positive از Product name، SKU یا user content طبقه‌بندی شود.

Unicode را مساوی UTF-۸ ندانید

UTF-۸ یک encoding رایج برای Unicode است؛ درست بودن آن به‌تنهایی grapheme، normalization، collation، case، width، emoji، Bidi یا security را حل نمی‌کند. Text باید در database، API، queue، cache، search index، log، export و file round-trip آزموده شود.

ناحیهFixtureOracle
Encoding round-tripچند Script، combining marks، emojicode points/graphemes preserved per contract
Lengthemoji sequence/combining markUI/user limit بر grapheme؛ storage limit بر bytes/code units طبق policy
Truncationmulti-code-point graphemeنیمه glyph/invalid sequence ساخته نشود
Search/equalitycanonically equivalent stringsnormalization policy consistent
Identifierconfusable/mixed scriptssecurity/domain policy؛ no blind normalization
Export/importCSV/JSON/PDF/filenameencoding/declaration/round-trip روشن
Logscontrol/newline/bidi charssafe rendering and forensic integrity

Normalization را بر اساس Domain انتخاب کنید

Unicode چند نمایش canonically equivalent دارد. NFC/NFD equivalence را حفظ می‌کنند؛ NFKC/NFKD برخی تفاوت‌های compatibility را از بین می‌برند و نباید کورکورانه روی متن دلخواه اعمال شوند. Identifier، Password، Search، Display و Signature نیاز یکسان ندارند.

Unicode Standard Annex #15 چهار Normalization Form و محدودیت Compatibility normalization را تعریف می‌کند و مجموعه Conformance test دارد. Product باید تعیین کند کجا normalize، کجا preserve و کجا compare می‌کند؛ QA نتیجه را با همان Contract می‌سنجد.

  • ورودی normalized و unnormalized نتیجه Business یکسان یا متفاوت طبق policy؛
  • concatenation پس از normalization دوباره بررسی شود؛
  • database uniqueness و search index policy هم‌راستا باشند؛
  • امضا/hash/token روی representation دقیق و بدون mutation ناخواسته؛
  • Compatibility folding برای شناسه فقط با threat/domain review؛
  • ی/ی و ک/ک replacement را با Unicode normalization رسمی یکی نگیرید؛ این mapping بومی جداست.

Bidi و RTL: نمایش بصری با ترتیب منطقی فرق دارد

متن فارسی می‌تواند SKU، URL، Email، شماره، Currency و کد LTR داشته باشد. Unicode Bidirectional Algorithm ترتیب نمایشی را تعیین می‌کند، اما component و markup باید context مناسب بدهند. تغییر رشته ذخیره‌شده برای «درست‌کردن ظاهر» می‌تواند copy/paste، search یا signature را بشکند.

Unicode Standard Annex #9 الگوریتم Bidi جاری را تعریف می‌کند. در HTML/XML، راهنمای W3C درباره Bidi markup و controls استفاده از markup و isolation برای محدوده‌های با جهت متفاوت را توضیح می‌دهد. Control character را بدون visibility/security policy در داده تزریق نکنید.

ComponentMixed content fixtureبررسی
Order reference`سفارش ORD-SYN-۴۲`isolation، visual/copy order
Amount`۱۲۰۰۰۰ IRR` در جمله فارسیsign/currency/number grouping
URL/EmailLTR identifier + punctuationclick target، copy/paste، truncation
Code/OTPdigits+letterslogical order، no secret log
BreadcrumbRTL labels + directional separatorsnavigation meaning, not blind mirror
IconBack/Play/Refresh/Brandsemantic mirroring per icon
Inputcursor/select/delete in mixed textlogical editing behavior

همه‌چیز را Mirror نکنید

Reading order، navigation placement و directional affordance ممکن است Mirror شوند؛ اما لوگو، media controls، clock، chart axis، map، mathematical notation، device image و بعضی iconها context خاص دارند. Mirroring matrix را component-level و با Design owner بسازید.

دستهرفتار نمونهOracle owner
Layout flowاغلب direction-awareDesign system/i18n
Back/Forward arrowsبه navigation semantics وابستهUX/platform
Play/Volume/Refreshمعمولاً universal orientationDesign/accessibility
Brand/logoبدون تغییر مگر asset مصوبBrand
Chart/timelinedata semantics تعیین می‌کندDomain/data visualization
Number/formula/codelogical LTR segments often isolatedDomain/i18n
Image with textlocalized asset یا حذف embedded textContent/design

Format و Parse را از Storage جدا کنید

Storage و API بهتر است canonical contract داشته باشند؛ UI می‌تواند Locale-aware format کند. Parse ورودی سخت‌تر است: چند separator، digit set یا calendar ممکن است ambiguous باشند. «هر چیزی را قبول کن» داده اشتباه می‌سازد؛ policy باید accepted formats، ambiguity و error را تعیین کند.

نوعCanonicalDisplay/Input contextخطر
Numbertyped numeric valuegroup/decimal/digits`1,234` ambiguous
Moneyamount+currency+scalesymbol/name/order/digitssymbol alone ambiguous
InstantUTC/offset-aware timestamptimezone/calendar/patternlocal time ambiguity
Date-onlydomain date valuecalendar and locale displayUTC conversion shifts date
Unitvalue+unit codelocalized name/symbol/spacingconversion/rounding
Percentratio or percent contractsymbol/scale/order×100 mismatch
Phone/addressstructured domain modelmarket-specific input/displaycountry assumptions

Date، Timezone و Calendar را سه مفهوم بدانید

Locale تاریخ را نمایش می‌دهد، timezone instant را به زمان محلی تبدیل می‌کند و calendar شیوه نام‌گذاری/محاسبه تاریخ را تعیین می‌کند. `fa-IR` به‌تنهایی نگفته کاربر حتماً Asia/Tehran یا یک Calendar خاص می‌خواهد. محصول باید default و انتخاب‌ها را مشخص کند.

  • instant نزدیک نیمه‌شب در چند timezone؛
  • date-only بدون تبدیل ناخواسته به UTC؛
  • DST تاریخی/آینده طبق tzdata نسخه‌دار، حتی اگر بازار جاری DST ندارد؛
  • ambiguous/nonexistent local time در zoneهای مربوط؛
  • relative time و boundary «امروز/دیروز»؛
  • calendar conversion، leap/boundary و round-trip طبق library/contract؛
  • server job، notification و report cut-off مستقل از display؛
  • tzdata/CLDR/library upgrade impact و regression.

Number، Currency و Unit را با CLDR و Business Contract ترکیب کنید

Locale data می‌تواند pattern، symbol و نام localized بدهد؛ اما مبلغ، Currency مجاز، scale، rounding، واحد تجاری و conversion را Product/Finance تعیین می‌کنند. Symbol `$` یا `ریال` بدون Currency code/context ممکن است ambiguous باشد.

  • positive/negative/zero و sign placement؛
  • grouping/decimal separator و non-breaking spaces؛
  • Latin/Persian/Arabic-Indic digit systems طبق Contract؛
  • Currency code/symbol/name و narrow symbol؛
  • IRR canonical در برابر تومان نمایشی با conversion صریح؛
  • large/small/rounding boundary و screen-reader output؛
  • unit name plural/abbreviation و conversion precision؛
  • copy/paste/parse/CSV/PDF consistency.

برای Journey مالی و Ecommerce، Money Contract و Ledger guide و راهنمای تست فروشگاه اینترنتی ownerهای محاسبه و Order lifecycle هستند. Locale formatting جای صحت مبلغ یا Price source را نمی‌گیرد.

Collation، Search و Case Folding را نسخه‌دار کنید

Sort و Search به زبان، strength، accent/diacritic، punctuation، digit، normalization و library/version وابسته‌اند. ترتیب Unicode code point معمولاً ترتیب انسانی مطلوب نیست. در عین حال «طبیعی» بودن ترتیب باید برای محصول و Dataset تعریف شود.

ناحیهFixtureOracle
Sortحروف/اعداد/diacritics/mixed scriptscollator config/version + expected order
Searchی/ی، ک/ک، نیم‌فاصله، normalizationquery policy + relevance owner
Case-insensitivelocale-sensitive case mappingslibrary behavior per locale
Prefixgrapheme/combining sequencesuser-visible boundary policy
Identifiermixed/confusable scriptssecurity policy, not linguistic fuzziness
Index upgradenew ICU/CLDR/collation versionreindex + golden query diff

نام، آدرس و تلفن را قالب انگلیسی ندانید

همه افراد first/middle/last ثابت ندارند؛ همه Addressها State/ZIP یکسان ندارند و Phone display با E.۱۶۴ storage یکی نیست. Model و validation را بر بازارهای واقعی Scope طراحی کنید، اما داده تست را ساختگی و غیرقابل تماس نگه دارید.

  • تک‌نام، چندبخشی، طولانی، apostrophe/hyphen/space و چند Script؛
  • display order و salutation بدون حدس gender/title؛
  • Address fieldهای optional/required per market؛
  • multi-line، RTL/LTR mixed، postal code formats و label print؛
  • Phone country code، national display، extension و non-mobile؛
  • Normalization برای search/display جدا از authoritative original؛
  • validation service unavailable و manual override با audit؛
  • عدم استفاده از نام/نشانی/شماره واقعی در Test.

Input، Keyboard و IME را فراموش نکنید

Paste کردن Text با تایپ از IME یکسان نیست. Composition eventها، dead key، autocorrect، virtual keyboard، hardware layout، selection، cursor و validation-on-input می‌توانند داده را خراب کنند یا کاربر را پیش از تکمیل composition رد کنند.

ScenarioبررسیFailure نمونه
IME compositionvalidation پس از composition boundaryکاراکتر نیمه‌ساخته reject می‌شود
Pastenormalization/length/sanitizegrapheme قطع یا control پنهان
Mixed direction editcursor/select/backspaceحذف segment اشتباه
Mobile keyboardinput type/action/autofillکیبورد نامناسب یا Enter بی‌اثر
Shortcutphysical layout مستقلshortcut با letter locale خراب
Voice/dictationاگر در Scope و platformpunctuation/locale mismatch
Max lengthbytes/code units/graphemes contractemoji یا combining mark نصف می‌شود

Font، Shaping و Fallback را با متن واقعی بسنجید

وجود glyph در یک فونت به معنای خوانایی، shaping صحیح یا metric سازگار نیست. Fallback می‌تواند وزن/ارتفاع/spacing را عوض و layout را بشکند. Webfont failure، subset ناقص، variable axis، combining mark و emoji sequence را در platformهای واقعی تست کنید.

  • coverage scripts و glyphهای لازم؛
  • Arabic joining، combining marks و diacritics placement؛
  • ligature و shaping engine/platform differences؛
  • font fallback chain و mixed-font line metrics؛
  • bold/italic/weight availability و synthetic style؛
  • font load timeout، FOIT/FOUT و offline/cached behavior؛
  • PDF/print/email embedding و licensing؛
  • zoom/reflow و accessibility readability.

Layout Resilience را به درصد ثابت محدود نکنید

ادعای «ترجمه همیشه ۳۰٪ بلندتر است» قانون نیست؛ رشته کوتاه ممکن است چند برابر شود و رشته بلند کمتر تغییر کند. Component باید با range واقعی، pseudo expansion، longest approved translations، dynamic values، zoom و narrow viewport آزموده شود.

ComponentStress inputInvariant
Buttonlong label + 200% zoomtext readable، action reachable
Tabsmany long labelswrap/scroll/overflow policy usable
TableRTL + long headers + numbersassociation/alignment remains clear
Modallong legal/validation contentfocus/action not clipped
Toast/statusplural + identifierscomplete and announced as designed
Chartlocalized axis/legenddata semantics and labels visible
Notificationplatform truncationcritical meaning survives or opens safely
PDF/printpage break/font fallbackno lost fields/signatures/references

Accessibility را با Language و Direction پیوند دهید

Screen reader و Browser برای pronunciation و processing به language metadata نیاز دارند. W3C توصیه می‌کند زبان پیش‌فرض HTML با `lang` روی عنصر `html` اعلام شود و بخش‌های با زبان متفاوت نیز markup مناسب داشته باشند. `dir` برای direction مسئله جداست.

راهنمای W3C برای اعلام زبان در HTML استفاده از Language Tag و `lang` را توضیح می‌دهد. برای چک‌لیست کامل Keyboard، Focus، Name/Role/Value، Status message، Reflow و معیارهای WCAG ۲.۲ به راهنمای تست دسترس‌پذیری مراجعه کنید.

  • `lang` page و nested foreign-language spans؛
  • `dir` و isolation برای mixed content؛
  • accessible name/description ترجمه‌شده و non-empty؛
  • validation/status announcement در Locale صحیح؛
  • keyboard order پس از RTL layout؛
  • zoom/reflow با expansion و font metrics؛
  • Alt/caption/transcript locale ownership؛
  • Voice/speech output numbers, dates, abbreviations and code segments.

Translation Pipeline را Build Artifact کنید

Source code/content
  → extract messages + schema + context
  → validate keys/placeholders/markup
  → send versioned job to TMS
  → translate + review + terminology checks
  → import target resources
  → compile/validate bundles
  → pseudo + locale functional/visual tests
  → linguistic in-context review
  → signed locale release manifest
  → deploy/canary/monitor/fallback or rollback

TMS source of collaboration است، نه لزوماً source of truth برای Build. Release باید دقیقاً بگوید کدام resource snapshot، source hash، translation memory/glossary/style version و reviewer approvals وارد Artifact شده‌اند.

Stage GateCheckFailure behavior
Extractdynamic/hardcoded/missing contextfail or reviewed exception
Schemakeys/placeholders/plurals/markupfail build for critical mismatch
Translatestatus, glossary, source-change freshnesshold/fallback per policy
Importencoding/escaping/file syntaxreject bundle
Compileruntime formatter compatibilityfail artifact
Visualpseudo/approved targets/platformsfinding + severity/owner
Linguisticin-context meaning/tone/terminologyreview decision
Releasemanifest/evidence/unknown/rollbackGo/Conditional/Hold

Machine Translation و AI را ابزار، نه Sign-off، بدانید

Machine translation می‌تواند draft یا پیشنهاد بسازد؛ کیفیت آن به language pair، domain، prompt/context، glossary، model/version و text type وابسته است. گزاره «همیشه کافی نیست» یا «هرگز نباید استفاده شود» نیز بدون Context مطلق است. Risk و review depth را بر content class تنظیم کنید.

Content classRisk نمونهPipeline نمونه
Internal low-risk draftبرداشت نادرست محدودMT + user disclosure/review as needed
General UItask confusion/terminology driftMT suggestion + linguistic/in-context review
Transactionalamount/state/action misunderstandingdomain review + functional evidence
Security/authunsafe action or secret exposuresecurity/content approval + exact placeholders
Legal/regulatedrights/obligation mismatchqualified legal process per jurisdiction
Marketing/brandtone/cultural/reputationbrand/local market review or transcreation
  • داده حساس، secret و unreleased content به ابزار نامجاز ارسال نشود.
  • Model/provider/version و prompt/context در حد policy ثبت شوند.
  • Glossary و do-not-translate terms enforce شوند.
  • Hallucinated placeholder/markup/key با schema gate رد شود.
  • Reviewer AI output را مستقل ارزیابی کند، نه فقط post-edit سطحی.
  • MT provenance و disclosure بر اساس policy/market حفظ شود.

Linguistic QA را قابل‌ردگیری کنید

«Native speaker گفت خوب است» Evidence کافی نیست. Native بودن هم expertise حوزه، مهارت QA یا نمایندگی همه کاربران را تضمین نمی‌کند. Reviewer باید نقش، Locale competence، domain context، guideline، conflict path و independence مناسب داشته باشد.

Linguistic Finding
findingId / locale / build / resourceVersion
screen/journey / key / source / target
category: meaning / terminology / grammar / style / truncation / functional / legal...
observation: what is present, without interpretation mixed in
impact/context: actor and task
reference: glossary/style/domain rule/version
suggested correction: if authorized
alternatives/uncertainty: dialect or product ambiguity
severity/priority: defined scale, not personal preference
owner/decision: accepted/fixed/rejected/deferred
retest evidence: changed artifact and screenshot/log
privacy: synthetic content only

Terminology و Style Guide را Testable کنید

Glossary فقط دو ستون word/translation نیست. Term باید concept، context، part of speech، approved/forbidden variants، capitalization، inflection، product names، owner و effective version داشته باشد. Style guide نیز tone، address، punctuation، digits، quotation، date/number choices و accessibility language را مشخص کند.

  • exact forbidden term scan و false-positive exceptions؛
  • concept-level review برای inflection و compounds؛
  • do-not-translate Product/SKU/API names؛
  • consistent action verbs در Button، Menu و Help؛
  • approved formal/informal address و pronouns؛
  • punctuation/space/numbering rules؛
  • inclusive/plain-language guidance با owner؛
  • version diff و impact روی translation memory.

Screenshot و Visual Regression را با احتیاط به‌کار ببرید

Screenshot diff می‌تواند overflow، overlap و direction regression را بیابد، اما pixel difference برابر defect نیست. Font rasterization، animation، dynamic date، network image و platform تفاوت می‌سازند. همچنین screenshot معنای ترجمه، keyboard flow یا screen-reader output را نمی‌سنجد.

کنترلهدفمحدودیت
Pinned font/platform/viewportکاهش noiseplatform coverage محدود
Deterministic data/clockثبات dynamic textreal variability را مدل نمی‌کند
Region masksحذف animation/adsممکن است defect را پنهان کند
Component baselinestriage کوچک‌ترend-to-end context ندارد
OCR/text extractionmissing/truncation hintsOCR error/language support
Human reviewsemantic visual judgmentsample/subjectivity
Accessibility checksnon-visual interactionجدا از pixels

Functional Regression را Locale-aware اما کم‌تکرار طراحی کنید

اجرای تمام E2E tests روی تمام Localeها معمولاً پرهزینه و کم‌اطلاع است؛ اجرای فقط Base locale نیز Locale-specific defects را جا می‌اندازد. Coverage را لایه‌ای و بر Risk/Change بسازید.

لایهCoverageنمونه
Static/schemaهمه key/Localeها در هر Buildmissing/extra/placeholder/plural/markup
Unit/propertyformatters و message functionsnumbers/dates/plurals/normalization
Pseudoهمه Components/critical routeshardcoded/overflow/RTL
Representative localesscript/direction/format clustersLTR Latin، RTL Arabic-script، CJK، complex shaping
Target locale smokeهر Release Localeselection/bundle/critical journeys
Linguistic samplingchanged/high-risk contentcontext/terminology/tone
Full journeycritical market/platform combinationssignup/pay/order/security/legal

برای انتخاب Browser/OS/device/engine و گزارش unsupported/unknown از راهنمای Compatibility Matrix استفاده کنید. Representative locale جای target-locale linguistic review را نمی‌گیرد.

Locale Matrix را بر Dimension بسازید، نه پرچم کشور

Locale Coverage Dimensions
Language family and grammar complexity
Script and shaping engine
Direction: LTR / RTL / mixed
Text expansion/compactness
Plural/ordinal categories
Numbering system and separators
Calendar/timezone/relative time
Collation/case/search behavior
Input method/keyboard/IME
Font/glyph/fallback
Market-specific business/legal content
Platform/browser/device/rendering engine
Traffic/revenue/risk/support data
Change impact and prior defect history

پرچم برای Locale selector نیز اغلب مبهم است: یک زبان چند کشور دارد و یک کشور چند زبان. Label را با نام زبان در خود زبان و در صورت نیاز region/script روشن طراحی کنید؛ انتخاب UX و accessibility را با کاربران و ownerهای مربوط بررسی کنید.

Email، Push، SMS، PDF و Export را خارج از UI نگذارید

Localization defectهای جدی در Surfaceهایی رخ می‌دهند که Component library اصلی ندارند. Template engine، provider، client و printer هر کدام محدودیت دارند. Artifact و Locale باید از Event/recipient context بیاید، نه Locale اپراتور یا server.

SurfaceریسکEvidence
Emaildir/lang/CSS/client/font/template variablesraw MIME + representative clients
SMSencoding/segment count/truncation/Bidilocal sink + segment calculation
Pushplatform length/action/localized app namedevice notification capture
PDFfont embedding/shaping/page break/copyrender + text extraction + print
CSVencoding/delimiter/decimal/formula injectionround-trip in supported consumers
Filenamenormalization/path/device compatibilitydownload/upload/filesystem matrix
Log/supportlocalized error hinders correlationstable error code + localized message

API و Integration Contract باید Locale را صریح حمل کند

API بهتر است machine-readable code و canonical typed data بدهد؛ localized message برای display می‌تواند افزوده شود، اما client logic نباید متن ترجمه‌شده را parse کند. Locale، timezone و currency Context در boundaryهای لازم صریح و authenticated/authorized باشند.

  • stable error code مستقل از localized message؛
  • requested/resolved Locale در response/debug evidence؛
  • Content-Language و language metadata طبق protocol Contract؛
  • Accept-Language cache/Vary و fallback؛
  • canonical number/date در payload، localized string فقط با contract؛
  • Partner unsupported locale و mapping/version؛
  • Event recipient Locale snapshot در زمان لازم؛
  • retry پس از تغییر preference deterministic طبق policy.

برای Contract، component و end-to-end boundaries به راهنمای تست یکپارچه‌سازی مراجعه کنید. ترجمه response بدون error code پایدار، automation و support را شکننده می‌کند.

SEO چندزبانه را از UI Locale جدا کنید

صفحه localized وب به URL، canonical، alternate/hreflang policy، sitemap، indexability، lang، title/meta، structured data و internal links نیاز دارد. Client-side switch بدون URL مستقل ممکن است برای Crawl/Share/Analytics مبهم باشد. راهبرد دقیق به سایت و Search owner مربوط است.

CheckInvariantادعای ممنوع
Locale URLstable/shareable/return correct contentURL خاص رتبه را تضمین می‌کند
Canonicalطبق duplicate/variant strategyهمه Locales یک canonical واحد لازم دارند
hreflang/alternatesreciprocal/valid/supported mapping per strategytraffic guaranteed
lang/diractual content metadataSearch market targeting کامل
Title/metalocalized, unique, non-fallback where requiredCTR guaranteed
Structured datacontent/value consistencyrich result guaranteed
Internal linksLocale route consistency/no loopsهر لینک باید ترجمه مستقل داشته باشد

Security و Privacy: Unicode و Locale ورودی قابل اعتماد نیستند

Locale header، language tag، translated markup، filename و user content می‌توانند malformed یا adversarial باشند. Confusable identifiers، Bidi controls، log spoofing، path traversal در resource key، unsafe HTML، translation injection و cache poisoning را Threat model کنید.

  • supported-locale allowlist و safe parsing؛
  • resource path با user input ساخته نشود یا canonical/allowlisted باشد؛
  • translation markup allowlist و context-aware escaping؛
  • placeholder type و sensitivity schema؛
  • Bidi/control characters در identifiers/logs policy و visible diagnostics؛
  • confusable/mixed-script detection فقط در Domain لازم و با false-positive review؛
  • Cache key شامل Locale Context لازم؛
  • TMS/vendor least privilege، export، retention و incident plan؛
  • PII/secret در screenshot、MT prompt، linguistic ticket یا analytics حذف شود.

برای Threat model و validation از راهنمای تست امنیت و برای data flow، vendor، retention و legal applicability از راهنمای تست حریم خصوصی استفاده کنید. Localization به‌خودی‌خود شمول قانونی نمی‌سازد یا رفع نمی‌کند.

Performance و Bundle Delivery را اندازه بگیرید

افزودن Locale می‌تواند bundle، font، format library، server render، cache cardinality و first interaction را تغییر دهد. همه Resourceها را eager load نکنید مگر design و budget چنین می‌خواهد. Locale-specific performance را با Artifact و network واقعی بسنجید.

MetricSliceCorrectness companion
bundle/font byteslocale/platform/cache staterequired glyph/resources present
load/parse/compile timecold/warmresolved bundle version
SSR/format latencylocale/message complexitycorrect plural/date/number
cache hitrequested/resolved localeno cross-locale content mix
layout shiftfont and expansioncontent readable/action stable
translation API dependencyif runtime use is authorizedtimeout/fallback/privacy
PDF/report generationscript/font/page countcomplete fields/text

Production Monitoring را به Locale Resolution وصل کنید

Error rate کلی ممکن است با یک Locale خراب سبز بماند. Signalها را به requested/resolved Locale، bundle version، platform، journey و key/domain slice کنید؛ بااین‌حال Locale می‌تواند داده حساس یا cohort کوچک بسازد، پس privacy و حداقل‌سازی لازم است.

SignalCounter-signalAction
missing key countcriticality/unique keys/usersbundle/feature hold or fallback owner
fallback rateallowed vs forbidden domaintranslation/import investigation
formatter exceptionsinput type/library versioncontract/data fix
locale switch failuresselection source/route/cachenegotiation trace
truncation/overflow reportscomponent/platform/fontvisual reproduction
support ticketsterminology/journey/severitylinguistic/product triage
bundle skewcode/resource version mismatchrollback/cache purge
conversion/task metrictechnical/market confoundershypothesis، نه اثبات localization cause

Release Manifest و Gate بسازید

Locale Release Manifest
code/build/image digest:       ___
supported locale registry:     ___
BCP 47/locale/fallback config: ___
source resource schema/hash:   ___
target bundle hashes/status:   ___
CLDR/ICU/tzdata/font versions: ___
glossary/style/content versions:___
platform/browser artifacts:    ___
pseudo/static/schema results:  ___
functional/visual/a11y results:___
linguistic/legal approvals:    ___
known fallback/limitations:    ___
monitoring/rollback owner:     ___
evidence pack/checksum:        ___
Locale Release Memo
Scope and change impact:       ___
Critical journeys/content:     ___
Missing/extra/schema findings: ___
Fallback and bundle freshness: ___
Unicode/Bidi/format evidence:  ___
Platform/visual evidence:      ___
Linguistic/domain approvals:   ___
Security/privacy/a11y refs:    ___
Blocked/inconclusive/stale:    ___
Open defects and user exposure:___
Rollback/feature flags:        ___
Production monitors:           ___
Recommendation: Go / Conditional / Hold
Authorized decision and expiry:___

آزمایش بازتولیدپذیر: Smoke سبز، Locale Gate قرمز

Fixture `fictional-locale-release-v1` شامل پنج Source message ساختگی انگلیسی و Bundle فارسی عمدیِ ناقص است. `shipping.eta` وجود ندارد؛ `legacy.extra` اضافی است؛ پیام پرداخت Placeholder واحد پول را حذف کرده؛ پیام کد یک Placeholder نام اضافه دارد؛ دو رشته UI hardcoded هستند؛ و پنج Container ساختگی ظرفیت کوتاه دارند.

Naive smoke
- برای هر Base key: target message یا fallback English را Render کن
- فقط non-empty بودن خروجی را Assert کن

Contract audit
- missing/extra key
- exact placeholder schema
- requested vs resolved locale/fallback
- hardcoded UI inventory
- deterministic pseudo expansion vs container contract
Gateنتیجهیافته
Naive render smokePASS؛ ۵/۵ non-emptyیک fallback انگلیسی پنهان ماند
Key auditFAIL۱ missing: `shipping.eta`؛ ۱ extra: `legacy.extra`
Placeholder auditFAIL۲ mismatch: missing `currency` و extra `name`
Hardcoded scanFAIL`Cancel` و `SKU: SKU-SYN-A`
Pseudo layoutFAIL۵/۵ container در مدل طولی overflow
Contract release gateHOLDتا triage/owner decision
{
  "fixture": "fictional-locale-release-v1",
  "naiveSmoke": {
    "rendered": 5,
    "nonEmpty": 5,
    "pass": true,
    "fallbackUsed": 1
  },
  "contractAudit": {
    "missingKeys": ["shipping.eta"],
    "extraKeys": ["legacy.extra"],
    "placeholderMismatches": ["checkout.pay", "auth.code"],
    "fallbackUsed": ["shipping.eta"],
    "hardcodedUiStrings": ["Cancel", "SKU: SKU-SYN-A"],
    "pseudoOverflows": 5,
    "releaseGate": "HOLD"
  }
}

محدودیت‌ها: این Script فقط String/Key mechanics را روی Fixture دست‌نویس و عمداً خراب می‌سنجد. ترجمه فارسی، grammar، plural، Bidi، font، screenshot، accessibility، Browser، device، TMS، API، عملکرد، فرهنگ یا بازار واقعی را بررسی نمی‌کند. Container length مدل pixel layout نیست؛ پنج Overflow نتیجه حدهای دلخواه Fixture است، نه benchmark یا درصد Expansion عمومی. HOLD الگوریتم انتشار عمومی نیست.

درس محدود: non-empty render باید با schema، provenance/fallback، hardcoded inventory و visual/pseudo evidence تکمیل شود. Audit static نیز جای Linguistic و functional review را نمی‌گیرد.

سناریوی بومی: انتشار فارسی آفلاین و ساختگی

یک اپ آزمایشی با Localeهای `en` و `fa-IR`، داده `SYN-*` و Clock ثابت بسازید. هیچ نام، شماره، Email، Address، Payment، OTP، Token، حساب یا سرویس ترجمه واقعی در آن نیست. Bundleها و Fontها محلی‌اند و Egress محیط بسته است. این Lab درباره بازار، قانون یا ترجیح همه کاربران ایران ادعایی ندارد.

ریسکتزریق ساختگیInvariantEvidence
Bundle completenessیک key فارسی حذفfallback forbidden key Gate را Hold کندschema/telemetry
Placeholder`{currency}` حذفcompile/import rejectcontract audit
Unicodeی/ی، ک/ک، combining، emojipolicy-specific normalize/preserveround-trip/query
Bidiفارسی + `ORD-SYN-۴۲` + `۱۲۰۰۰۰ IRR`isolation، logical copyrender/edit/copy
Digits۰۱۲/۰۱۲/۰۱۲display/input per contractformat/parse
TimeUTC، Asia/Tehran، شمسی displayinstant unchanged; view correctAPI/UI/export
RTL layoutpseudo RTL + long stringssemantic components usablescreenshots/tasks
No egressEmail/PDF/MT requestlocal sink/fail closednetwork policy

نقش‌ها و Decision Rights

نقشمسئولیت نمونهنباید به‌تنهایی ادعا کند
i18n Engineeringresource/runtime/format/Bidi architectureکیفیت زبانی یا market fit
Localization managerpipeline/vendor/schedule/statusfunctional correctness
Translator/Linguistic reviewermeaning/grammar/terminology/toneامنیت، قانون یا همه کاربران
Product/Domain/Legalcontent intent/rule/approval/applicabilityimplementation behavior بدون evidence
Design/UX/A11ylayout/component/task/accessibilitygrammar یا business correctness
QA/Testcontracts، scenarios، evidence/limitationsتضمین بازار/اعتماد/درآمد
Security/PrivacyUnicode/TMS/data/vendor threat controlsLocalization quality کامل
Release/Risk ownerresidual risk، deploy/rollback decisionپنهان‌کردن Unknown/fallback

برنامه ۳۰روزه Pilot

هفتهخروجیکارمعیار اتمام
۱: ContractLocale registry/contract/fallbackدو Locale، یک Journey، owners، versionsselection/formats/fallback روشن‌اند
۲: Pipelineresource schema و pseudo buildextract، keys، placeholders، plural، hardcodedstatic gates reproducible‌اند
۳: Evidencelocale matrix test packUnicode/Bidi/format/input/visual/linguisticfindings به key/build trace می‌شوند
۴: Releasemanifest، memo و monitorscanary/fallback/rollback و Unknown reviewowner/decision/expiry ثبت شده‌اند
  • یک Journey حساس و دو Locale متفاوت انتخاب کنید.
  • Locale Contract و exact fallback chain بنویسید.
  • همه Source/Target keyها و Placeholderها را Gate کنید.
  • Accented، expansion و RTL pseudo build بسازید.
  • Critical formats و mixed-direction identifiers را اجرا کنید.
  • Reviewer زبانی را با screenshot/context و glossary مجهز کنید.
  • requested/resolved Locale و fallback را در Canary monitor کنید.

ضدالگوهای رایج تست Localization

ضدالگومشکلاصلاح
i18n یک‌بار انجام می‌شودfeature/library regression نادیدهcontinuous gates/change impact
l10n فقط ترجمه استformat/input/assets/rules جا می‌ماندLocale contract
Locale=Countrylanguage/script/timezone/currency حدسindependent explicit dimensions
TMS=Production bundleversion/skew پنهانsigned release manifest
Non-empty=translatedfallback English سبزrequested/resolved source assertion
String concatenationgrammar/order/Bidi محدودwhole structured message
`count != 1` pluralLocale rules غلطCLDR-pinned categories
همه متن‌ها ۳۰٪ بلندترrange واقعی جا می‌ماندpseudo + real longest strings
Mirror everythingicon/chart/media semantics می‌شکندcomponent mirroring matrix
UTF-8 solves Unicodenormalization/grapheme/Bidi نادیدهdomain-specific Unicode tests
NFKC everywheresemantic distinctions حذفnormalization contract
Native speaker=complete QAdomain/test/representation gapsdefined reviewer role/protocol
MT forbidden or sufficient universallyrisk/context حذفcontent-class pipeline
Screenshot diff=qualitymeaning/a11y/function غایبmixed evidence
All E2E × all Localescost/noise بالاlayered risk matrix
Production data in TMS/ticketsprivacy/secret leaksynthetic/minimized context
Base locale gate onlytarget bundle defectsper-locale manifest/smoke/review
Fallback hides incidentmixed/unsafe content silentdomain policy/telemetry/owner

چک‌لیست نهایی تست i18n و l10n

  • i18n، l10n، translation، transcreation و linguistic QA مرز روشن دارند.
  • Language، script، region، Locale، timezone، currency و market یکی فرض نشده‌اند.
  • Language Tagها BCP ۴۷ و Locale ID داخلی نسخه‌دارند.
  • Locale selection precedence، persistence، cache و user choice تعریف شده‌اند.
  • Fallback chain per-domain، observable و ownerدار است.
  • Resource key/source/context/owner/hash/status lifecycle دارد.
  • Missing/extra/duplicate/deprecated/hardcoded keyها Gate می‌شوند.
  • Placeholder name/type/count/markup/sensitivity schema دارد.
  • String concatenation حساس حذف و structured message استفاده شده است.
  • Plural/ordinal/select با CLDR/library version و boundary values آزموده‌اند.
  • Pseudo modes accented/expansion/RTL/missing-resource اجرا شده‌اند.
  • Encoding round-trip، grapheme، truncation، emoji و export بررسی شده‌اند.
  • Normalization policy per identifier/search/display/signature روشن است.
  • Bidi mixed content، isolation، copy/edit و control chars آزموده‌اند.
  • Mirroring component-level است و icon/chart/media context دارد.
  • Number/money/date/timezone/calendar/unit format و parse جدا از storage‌اند.
  • Collation/search/case/index version و golden query evidence دارند.
  • Name/address/phone models بازارمحور و data ساختگی‌اند.
  • IME، paste، keyboard، cursor و length boundary آزموده‌اند.
  • Font coverage/shaping/fallback/load/PDF و platform differences بررسی شده‌اند.
  • Layout با pseudo، longest targets، zoom و narrow viewport resilient است.
  • `lang`/`dir`، accessible names/statuses و screen-reader paths صحیح‌اند.
  • Translation pipeline source→TMS→bundle→artifact قابل trace است.
  • MT/AI بر اساس content risk، privacy و independent review کنترل می‌شود.
  • Linguistic findings به key/build/reference/decision/retest وصل‌اند.
  • Glossary/style guide concept، owner و version دارند.
  • Visual regression deterministic است و محدودیت pixels را می‌پذیرد.
  • Locale coverage لایه‌ای و مبتنی بر script/direction/format/risk است.
  • Email/SMS/Push/PDF/CSV/filename در Scope آزموده‌اند.
  • API code/canonical data را از localized message جدا کرده است.
  • SEO URL/canonical/alternates/lang/meta/internal links policy دارد.
  • Unicode/TMS/resource/markup/cache Threatها و Privacy کنترل شده‌اند.
  • Bundle/font/cache/render performance per-locale سنجیده شده است.
  • Production missing/fallback/formatter/bundle-skew signals دارد.
  • Release manifest Code/Resource/CLDR/ICU/tzdata/font/content را pin می‌کند.
  • Blocked/Inconclusive/Stale/Unreviewed به‌عنوان Unknown در Gate می‌آیند.

سؤالات متداول تست i18n و l10n

تفاوت تست i18n و l10n چیست؟

تست i18n قابلیت مهندسی مشترک—resource، Unicode، format، direction و layout—را برای پشتیبانی از چند Locale می‌سنجد. تست l10n Artifact و تجربه یک Locale/Market مشخص را از نظر bundle، محتوا، formats، assets، functional behavior و review بررسی می‌کند. هر دو با تغییر محصول تکرار می‌شوند و یکی جای دیگری نیست.

آیا `fa-IR` یعنی باید تومان، تقویم شمسی و Asia/Tehran استفاده شود؟

نه به‌صورت خودکار. `fa-IR` Language Tag فارسی با Region ایران است، اما Currency، display unit، calendar، timezone و market rule ابعاد مستقل محصول‌اند. Locale Contract باید default، انتخاب کاربر، storage canonical و display policy هر کدام را مشخص کند.

Pseudo-localization چه چیزی را پیدا نمی‌کند؟

معنا، grammar، tone، terminology، cultural fit و قانون Locale واقعی را نمی‌سنجد؛ حتی RTL pseudo نیز زبان RTL واقعی یا همه platformها را مدل نمی‌کند. برای hardcoded text، expansion، encoding، layout و direction signal سریع می‌دهد و باید با target-locale functional/visual/linguistic evidence ترکیب شود.

آیا Machine Translation برای Localization کافی است؟

به content class، language pair، domain، risk و review بستگی دارد. MT می‌تواند draft مفید باشد، اما schema، placeholder، terminology، privacy و in-context review همچنان لازم‌اند. متن Transactional، Security، Legal یا برند معمولاً فرایند تخصصی‌تر می‌خواهد؛ تصمیم مطلق برای همه محتوا درست نیست.

برای شروع کدام Localeها را تست کنیم؟

Localeهای واقعی بازار را با Risk و Change پوشش دهید و برای لایه فنی، نماینده Dimensionهای متفاوت مانند LTR/RTL، script/shaping، plural، formats، input و expansion انتخاب کنید. Representative locale جای review زبان مقصد را نمی‌گیرد. برای Pilot، Base، یک RTL مثل فارسی و یک Locale ساختاری متفاوت کافی است اگر Scope محدود باشد.

جمع‌بندی: Locale یک Release Artifact است

تست جهانی‌سازی و بومی‌سازی با بازکردن صفحه ترجمه‌شده تمام نمی‌شود. Locale Contract انتخاب و fallback را روشن می‌کند؛ resource schema از Key و Placeholder محافظت می‌کند؛ CLDR/Unicode/BCP ۴۷ داده و الگوریتم‌های استاندارد را فراهم می‌کنند؛ pseudo و static gates خطا را زود می‌یابند؛ target-locale testing و linguistic review معنا و Context را می‌سنجند؛ و Release Manifest نسخه Code، Bundle، Library، Font و Content را به Evidence متصل می‌کند.

پرسش مفید «آیا ترجمه ۱۰۰٪ است؟» نیست. بپرسید: برای کدام Locale و Build، چه Bundle و Fallbackی resolve شد؟ Placeholder و plural schema سالم‌اند؟ عدد، تاریخ و Bidi چه Contractی دارند؟ چه Surface و platformی اجرا نشده، چه Reviewerی محتوا را دیده و کدام Unknown با چه Ownerی باقی مانده است؟

روش تدوین و منابع

این راهنما با بازبینی انتقادی نسخه قبلی، حذف وعده‌های بازار/درآمد/وفاداری/اعتماد/کاهش قطعی هزینه و جداسازی intent از صفحه فارسی/RTL تدوین شد. آزمایش با Node.js ۲۴.۱۸.۰، بدون dependency، deterministic و با Messageهای کاملاً ساختگی اجرا شد.

  • RFC ۵۶۴۶ / BCP ۴۷: Language Tagها.
  • Unicode UAX #۱۵: Normalization Forms و Conformance tests.
  • Unicode UAX #9: Bidirectional Algorithm.
  • Unicode CLDR Plural Rules و LDML/Locale data؛ نسخه library/data باید pin شود.
  • W3C Internationalization: Language declaration و Bidi markup/controls.

بازبینی محتوایی: مرداد ۱۴۰۵. Unicode، CLDR، tzdata، Browser/platform، Font، Language guidance، TMS/MT و قانون تغییر می‌کنند؛ نسخه و Applicability محصول را پیش از Release تأیید کنید.

دیدگاهتان را بنویسید