This page is generated from the document Internationalization Best Practices for Spec Developers. It is just one of several techniques indexes, each of which focus on a particular type of user.

The checklist is currently still in development, and will be subject to regular changes. If you have a question or issue with some advice, please raise a Github issue.

Internationalization techniques:
Developing specifications

This page provides checklists for specification developers, editors and reviewers who want to take account of internationalization issues during the development of a spec. Where a checklist item is followed by a more link, click on that for more information. The page also lists links to useful resources on the W3C Internationalization Activity site and elsewhere that may help.

Use of this checklist doesn't remove the need for a formal review, but using it for a self-review can warn of potential issues and requirements, at an early stage, that might otherwise be overlooked. Therefore, the later review should yield few, if any, nasty surprises. It also provides a useful set of points for reviewers to follow.

Interactive checklists! If your spec is github based, you can now create a snapshot of the checklist items in markdown. If you add that to a github issue, you can check off items that are ok, and add comments while doing a self-review. Generate the code here.

Language basics
  • It should be possible to associate a language with any piece of natural language text that will be read by a user. more
  • Where possible, there should be a way to label natural language changes in inline text. more
  • Consider whether it is useful to express the intended linguistic audience of a resource, in addition to specifying the language used for text processing. more
  • A language declaration that indicates the text processing language for a range of text must associate a single language value with a specific range of text. more
  • Use the HTML lang and XML xml:lang language attributes where appropriate to identify the text processing language, rather than creating a new attribute or mechanism. more
  • It should be possible to associate a metadata-type language declaration (which indicates the intended use of the resource rather than the language of a specific range of text) with multiple language values. more
  • Attributes that express the language of external resources should not use the HTML lang and XML xml:lang language attributes, but should use a different attribute when they represent metadata (which indicates the intended use of the resource rather than the language of a specific range of text). more
How to's
Background reading
Defining language values
  • Values for language declarations must use BCP 47. more
  • Refer to BCP 47, not to RFC 5646. more
  • Be specific about what level of conformance you expect for language tags. The word "valid" has special meaning in BCP 47. Generally "well-formed" is a better choice.
  • Reference BCP47 for language tag matching.
Background reading
Declaring language at the resource level
  • The specification should indicate how to define the default text-processing language for the resource as a whole. more
  • Content within the resource should inherit the language of the text-processing declared at the resource level, unless it is specifically overridden.
  • Consider whether it is necessary to have separate declarations to indicate the text-processing language versus metadata about the expected use of the resource. more
  • If there is only one language declaration for a resource, and it has more than one language tag as a value, it must be possible to identify the default text-processing language for the resource. more
Background reading
Establishing the language of a content block
  • By default, blocks of content should inherit any text-processing language set for the resource as a whole. more
  • It should be possible to indicate a change in language for blocks of content where the language changes. more
Establishing the language of inline runs
  • It should be possible to indicate language for spans of inline text where the language changes. more
Text direction
Basic requirements
  • It must be possible to indicate base direction for each individual paragraph-level item of natural language text that will be read by someone. more
  • It must be possible to indicate base direction changes for embedded runs of inline bidirectional text for all natural language text that will be read by someone. more
  • Annotating right-to-left text must require the minimum amount of effort for people who work natively with right-to-left scripts. more
Background information
  • Do not assume that direction can be determined from language information. more
Base direction values
  • Values for the default base direction should include left-to-right, right-to-left, and auto. more
Handling direction in markup
  • The spec should indicate how to define a default base direction for the resource as a whole, ie. set the overall base direction. more
  • The default base direction, in the absence of other information, should be LTR. more
  • The content author must be able to indicate parts of the text where the base direction changes. At the block level, this should be achieved using attributes or metadata, and should not rely on Unicode control characters.
  • It must be possible to also set the direction for content fragments to auto. This means that the base direction will be determined by examining the content itself.
  • If the overall base direction is set to auto for plain text, the direction of content paragraphs should be determined on a paragraph by paragraph basis.
  • To indicate the sides of a block of text where relative to the start and end of its contained lines, you should use 'before' and 'after' (maybe block-start/block-end – the terminology is changing), rather than 'top' and 'bottom'.
  • To indicate the start/end of a line you should use 'start' and 'end' rather than 'left' and 'right'.
  • Provide dedicated attributes for control of base direction and bidirectional overrides; do not rely on the user applying style properties to arbitrary markup to achieve bidi control.
Handling base direction for strings
  • Provide metadata constructs that can be used to indicate the base direction of any natural language string. more
  • Specify that consumers of strings should use heuristics, preferably based on the Unicode Standard first-strong algorithm, to detect the base direction of a string except where metadata is provided. more
  • Where possible, define a field to indicate the default direction for all strings in a given resource or document. more
  • Do NOT assume that a creating a document-level default without the ability to change direction for any string is sufficient. more
  • If metadata is not available due to legacy implementations and cannot otherwise be provided, specifications MAY allow a base direction to be interpolated from available language metadata. more
  • Specifications MUST NOT require the production or use of paired bidi controls. more
Setting base direction for inline or substring text
  • It must be possible to indicate spans of inline text where the base direction changes. If markup is available, this is the preferred method. Otherwise your specification must require that Unicode control characters are recognized by the receiving application, and correctly implemented.
  • It must be possible to also set the direction for a span to auto. This means that the base direction will be determined by examining the content itself. A typical approach here would be to set the direction based on the first strong directional character outside of any markup. more
  • If users use Unicode bidirectional control characters, the isolating RLI/LRI/FSI with PDI characters must be supported by the application and recommended (rather than RLE/LRE with PDF) by the spec.
  • Use of RLM/LRM should be appropriate, and expectations of what those controls can and cannot do should be clear in the spec. more
  • For markup, provide dedicated attributes for control of base direction and bidirectional overrides; do not rely on the user applying style properties to arbitrary markup to achieve bidi control.
  • For markup, allow bidi attributes on all inline elements in markup that contain text.
  • For markup, provide attributes that allow the user to (a) create an embedded base direction or (b) override the bidirectional algorithm altogether; the attribute should allow the user to set the direction to LTR or RTL or the aforementioned Auto in either of these two scenarios.
Choosing a definition of 'character'
  • Specifications SHOULD use specific terms, when available, instead of the general term 'character'. more
  • When specifications use the term 'character' the specifications MUST define which meaning they intend, and SHOULD explicitly define the term 'character' to mean a Unicode code point. more
  • Specifications, software and content MUST NOT require or depend on a one-to-one relationship between characters and units of physical storage. more
  • Specifications, software and content MUST NOT require or depend on a one-to-one correspondence between characters and the sounds of a language. more
  • Specifications, software and content MUST NOT require or depend on a one-to-one mapping between characters and units of displayed text. more
  • Specifications and software MUST NOT require nor depend on a single keystroke resulting in a single character, nor that a single character be input with a single keystroke (even with modifiers), nor that keyboards are the same all over the world. more
Defining a Reference Processing Model
  • Textual data objects defined by protocol or format specifications MUST be in a single character encoding. more
  • All specifications that involve processing of text MUST specify the processing of text according to the Reference Processing Model described by the rest of the recommendations in this list. more
  • Specifications MUST define text in terms of Unicode characters, not bytes or glyphs. more
  • For their textual data objects specifications MAY allow use of any character encoding which can be transcoded to a Unicode encoding form. more
  • Specifications MAY choose to disallow or deprecate some character encodings and to make others mandatory. Independent of the actual character encoding, the specified behavior MUST be the same as if the processing happened as follows: (a) The character encoding of any textual data object received by the application implementing the specification MUST be determined and the data object MUST be interpreted as a sequence of Unicode characters - this MUST be equivalent to transcoding the data object to some Unicode encoding form, adjusting any character encoding label if necessary, and receiving it in that Unicode encoding form, (b) All processing MUST take place on this sequence of Unicode characters, (c) If text is output by the application, the sequence of Unicode characters MUST be encoded using a character encoding chosen among those allowed by the specification. more
  • If a specification is such that multiple textual data objects are involved (such as an XML document referring to external parsed entities), it MAY choose to allow these data objects to be in different character encodings. In all cases, the Reference Processing Model MUST be applied to all textual data objects. more
Including and excluding character ranges
  • Specifications SHOULD NOT arbitrarily exclude code points from the full range of Unicode code points from U+0000 to U+10FFFF inclusive. more
  • Specifications MUST NOT allow code points above U+10FFFF. more
  • Specifications SHOULD NOT allow the use of codepoints reserved by Unicode for internal use. more
  • Specifications MUST NOT allow the use of surrogate code points. more
  • Specifications SHOULD exclude compatibility characters in the syntactic elements (markup, delimiters, identifiers) of the formats they define. more
  • Specifications SHOULD allow the full range of Unicode for user-defined values. more
Using the Private Use Area
  • Specifications MUST NOT require the use of private use area characters with particular assignments. more
  • Specifications MUST NOT require the use of mechanisms for defining agreements of private use code points. more
  • Specifications and implementations SHOULD NOT disallow the use of private use code points by private agreement. more
  • Specifications MAY define markup to allow the transmission of symbols not in Unicode or to identify specific variants of Unicode characters. more
  • Specifications SHOULD allow the inclusion of or reference to pictures and graphics where appropriate, to eliminate the need to (mis)use character-oriented mechanisms for pictures or graphics. more
Choosing character encodings
  • Specifications MUST either specify a unique character encoding, or provide character encoding identification mechanisms such that the encoding of text can be reliably identified. more
  • When designing a new protocol, format or API, specifications SHOULD require a unique character encoding. more
  • When basing a protocol, format, or API on a protocol, format, or API that already has rules for character encoding, specifications SHOULD use rather than change these rules. more
  • When a unique character encoding is required, the character encoding MUST be UTF-8, UTF-16 or UTF-32. more
  • Specifications SHOULD avoid using the terms 'character set' and 'charset' to refer to a character encoding, except when the latter is used to refer to the MIME charset parameter or its IANA-registered values. The term 'character encoding', or in specific cases the terms 'character encoding form' or 'character encoding scheme', are RECOMMENDED. more
  • If the unique encoding approach is not taken, specifications SHOULD require the use of the IANA charset registry names, and in particular the names identified in the registry as 'MIME preferred names', to designate character encodings in protocols, data formats and APIs. more
  • Character encodings that are not in the IANA registry SHOULD NOT be used, except by private agreement. more
  • If an unregistered character encoding is used, the convention of using 'x-' at the beginning of the name MUST be followed. more
  • If the unique encoding approach is not chosen, specifications MUST designate at least one of the UTF-8 and UTF-16 encoding forms of Unicode as admissible character encodings and SHOULD choose at least one of UTF-8 or UTF-16 as required encoding forms (encoding forms that MUST be supported by implementations of the specification). more
  • Specifications that require a default encoding MUST define either UTF-8 or UTF-16 as the default, or both if they define suitable means of distinguishing them. more
Background reading
  • What is the 'Document Character Set' for XML and HTML, and how does it relate to the encodings I use for my documents?

Identifying character encodings
  • Specifications MUST NOT propose the use of heuristics to determine the encoding of data. more
  • Specifications MUST define conflict-resolution mechanisms (e.g. priorities) for cases where there is multiple or conflicting information about character encoding. more
Designing character escapes
  • Specifications should provide a mechanism for escaping characters, particularly those which are invisible or ambiguous. more
  • Specifications SHOULD NOT invent a new escaping mechanism if an appropriate one already exists. more
  • The number of different ways to escape a character SHOULD be minimized (ideally to one). more
  • Escape syntax SHOULD require either explicit end delimiters or a fixed number of characters in each character escape. Escape syntaxes where the end is determined by any character outside the set of characters admissible in the character escape itself SHOULD be avoided. more
  • Whenever specifications define character escapes that allow the representation of characters using a number, the number MUST represent the Unicode code point of the character and SHOULD be in hexadecimal notation. more
  • Escaped characters SHOULD be acceptable wherever their unescaped forms are; this does not preclude that syntax-significant characters, when escaped, lose their significance in the syntax. In particular, if a character is acceptable in identifiers and comments, then its escaped form should also be acceptable. more
Storing text
  • Protocols, data formats and APIs MUST store, interchange or process text data in logical order. more
  • Independent of whether some implementation uses logical selection or visual selection, characters selected MUST be kept in logical order in storage. more
  • Specifications of protocols and APIs that involve selection of ranges SHOULD provide for discontiguous logical selections, at least to the extent necessary to support implementation of visual selection on screen on top of those protocols and APIs. more
Defining 'string'
  • Specifications SHOULD NOT define a string as a 'byte string'. more
  • The 'character string' definition SHOULD be used by most specifications. more
Referring to Unicode characters
  • Use U+XXXX syntax to represent Unicode code points in the specification. more
Referencing the Unicode Standard
  • Since specifications in general need both a definition for their characters and the semantics associated with these characters, specifications SHOULD include a reference to the Unicode Standard, whether or not they include a reference to ISO/IEC 10646. more
  • A generic reference to the Unicode Standard MUST be made if it is desired that characters allocated after a specification is published are usable with that specification. A specific reference to the Unicode Standard MAY be included to ensure that functionality depending on a particular version is available and will not change over time. more
  • All generic references to the Unicode Standard MUST refer to the latest version of the Unicode Standard available at the date of publication of the containing specification. more
  • All generic references to ISO/IEC 10646 MUST refer to the latest version of ISO/IEC 10646 available at the date of publication of the containing specification. more
Choosing text units for segmentation, indexing, etc.
  • The character string is RECOMMENDED as a basis for string indexing. more
  • Grapheme clusters MAY be used as a basis for string indexing in applications where user interaction is the primary concern. more
  • Specifications that define indexing in terms of grapheme clusters MUST either: (a) define grapheme clusters in terms of extended grapheme clusters as defined in Unicode Standard Annex #29, Text Boundaries [UTR #29], or (b) define specifically how tailoring is applied to the indexing operation. more
  • The use of byte strings for indexing is NOT RECOMMENDED. more
  • A UTF-16 code unit string is NOT RECOMMENDED as a basis for string indexing, even if this results in a significant improvement in the efficiency of internal operations when compared to the use of character string. more
  • Specifications that need a way to identify substrings or point within a string SHOULD consider ways other than string indexing to perform this operation. more
  • Specifications SHOULD understand and process single characters as substrings, and treat indices as boundary positions between counting units, regardless of the choice of counting units. more
  • Specifications of APIs SHOULD NOT specify single characters or single 'units of encoding' as argument or return types. more
  • When the positions between the units are counted for string indexing, starting with an index of 0 for the position at the start of the string is the RECOMMENDED solution, with the last index then being equal to the number of counting units in the string. more
Matching string identity for identifiers and syntactic content
  • String identity matching for identifiers and syntactic content should involve the following steps: (a) Ensure the strings to be compared constitute a sequence of Unicode code points (b) Expand all character escapes and includes (c) Perform any appropriate case-folding and Unicode normalization step (d) Perform any additional matching tailoring specific to the specification, and (e) Compare the resulting sequences of code points for identity. more
  • The default recommendation for matching strings in identifiers and syntactic content is to do no normalization (ie. case folding or Unicode Normalization) of content. more
  • 'ASCII case fold' and 'Unicode canonical case fold' approaches should only be used in special circumstances. more
  • A 'Unicode compatibility case fold' approach should not be used. more
  • Specifications of vocabularies MUST define the boundaries between syntactic content and character data as well as entity boundaries (if the language has any include mechanism). more
Working with Unicode Normalization
  • Specifications SHOULD NOT specify a Unicode normalization form for encoding, storage, or interchange of a given vocabulary. more
  • Implementations MUST NOT alter the normalization form of syntactic or natural language content being exchanged, read, parsed, or processed except when required to do so as a side-effect of text transformation such as transcoding the content to a Unicode character encoding, case folding, or other user-initiated change, as consumers or the content itself might depend on the de-normalized representation. more
  • Specifications SHOULD NOT specify compatibility normalization forms (NFKC, NFKD). more
  • Specifications MUST document or provide a health-warning if canonically equivalent but disjoint Unicode character sequences represent a security issue. more
  • Where operations can produce denormalized output from normalized text input, specifications MUST define whether the resulting output is required to be normalized or not. Specifications MAY state that performing normalization is optional for some operations; in this case the default SHOULD be that normalization is performed, and an explicit option SHOULD be used to switch normalization off. more
  • Specifications that require normalization MUST NOT make the implementation of normalization optional. more
  • Normalization-sensitive operations MUST NOT be performed unless the implementation has first either confirmed through inspection that the text is in normalized form or it has re-normalized the text itself. Private agreements MAY be created within private systems which are not subject to these rules, but any externally observable results MUST be the same as if the rules had been obeyed. more
  • A normalizing text-processing component which modifies text and performs normalization-sensitive operations MUST behave as if normalization took place after each modification, so that any subsequent normalization-sensitive operations always behave as if they were dealing with normalized text. more
Case folding
  • Specifications and implementations that define string matching as part of the definition of a format, protocol, or formal language (which might include operations such as parsing, matching, tokenizing, etc.) MUST define the criteria and matching forms used. These MUST be one of: (a) case-sensitive (b) Unicode case-insensitive using Unicode full case-folding (c) ASCII case-insensitive.
  • Case-sensitive matching is RECOMMENDED for matching syntactic content, including user-defined values. more
  • Specifications that define case-insensitive matching in vocabularies that include more than the Basic Latin (ASCII) range of Unicode MUST specify Unicode full casefold matching. more
  • Specifications that define case-insensitive matching in vocabularies limited to the Basic Latin (ASCII) subset of Unicode MAY specify ASCII case-insensitive matching. more
  • If language-sensitive case-sensitive matching is specified, Unicode case mappings SHOULD be tailored according to language and the source of the language used for each tailoring MUST be specified. more
  • Specifications that define case-insensitive matching in vocabularies SHOULD NOT specify language-sensitive case-insensitive matching. more
Truncating or limiting the length of strings
  • Specifications SHOULD NOT limit the size of data fields unless there is a specific practical or technical limitation.
  • Specifications that limit the length of a string MUST specify which type of unit (extended grapheme clusters, Unicode code points, or code units) the length limit uses.
  • Specifications that limit the length of a string SHOULD specify the length in terms of Unicode code points.
  • If a specification sets a length limit in code units (such as bytes), it MUST specify that truncation can only occur on code point boundaries.
  • If a specification specifies a length limit, it SHOULD specify that any string that is truncated include an indicator, such as ellipses, that the string has been altered.
  • When specifying a length limitation in code units (such as bytes), specifications SHOULD set the maximum length in a way that accommodates users whose language requires multibyte code unit sequences.
Specifying sort and search functionality
  • Software that sorts or searches text for users SHOULD do so on the basis of appropriate collation units and ordering rules for the relevant language and/or application. more
  • Where searching or sorting is done dynamically, particularly in a multilingual environment, the 'relevant language' SHOULD be determined to be that of the current user, and may thus differ from user to user. more
  • Software that allows users to sort or search text SHOULD allow the user to select alternative rules for collation units and ordering. more
  • Specifications and implementations of sorting and searching algorithms SHOULD accommodate text that contains any character in Unicode. more
Resource identifiers
  • Resource identifiers must permit the use of characters outside those of plain ASCII. discussion
  • Specifications MUST define when the conversion from IRI references to URI references (or subsets thereof) takes place, in accordance with Internationalized Resource Identifiers (IRIs). more
Markup & syntax
Defining elements and attributes
  • Do not define attribute values that will contain user readable content. Use elements for such content. more
  • If you do define attribute values containing user readable content, provide a means to indicate directional and language information for that text separately from the text contained in the element.
  • Provide a way for authors to annotate arbitrary inline content using a span-like element or construct. more
Defining identifiers
  • Identifiers should be case-sensitive.
Working with plain text
  • Avoid natural language text in elements that only allow for plain text and in attribute values.
  • Provide a span-like element that can be used for any text content to apply information needed for internationalization. more
Typographic support
Text decoration
  • Text decoration such as underline and overline should allow lines to skip ink.
  • It should be possible to specify the distance of overlines and underlines from the text. more
Vertical text
  • It should be possible to render text vertically for languages such as Japanese, Chinese, Korean, Mongolian, etc.
  • Vertical text must support line progression from LTR (eg. Mongolian) and RTL (eg. Japanese)
  • By default, text decoration, ruby, and the like in vertical text where lines are stacked from left to right (eg. Mongolian) should appear on the same side as for CJK vertical text. Placement should not rely on the before and after line locations.
  • Vertical writing modes that are equivalent to the vertical- values in CSS (only) should use UTR50 to apply default text orientation of characters. (This does not apply to writing modes that are equivalent to sideways- in CSS.)
  • By default, glyphs of scripts that are normally horizontal should run along a line in vertical text such that the top of the character is toward the right side of the vertical line, but there should also be a mechanism to allow them to progress down the line in upright orientation. Such a mechanism should use grapheme clusters as a minimum text unit, but where necessary allow syllabic clusters to be treated as a unit when they involve more than one grapheme cluster.
  • Upright Arabic text in vertical lines should use isolated letter forms and the order of text should read top to bottom.
  • It should be possible for some sequences of characters (particularly digits) to run horizontally within vertical lines (tate chu yoko).
  • Writing modes should provide values like sideways-lr and sideways-rl in CSS to allow for vertical rotation of lines of horizontal script text. UTR50 is not applicable for these cases.
Setting box positioning coordinates when text direction varies
  • Box positioning coordinates must take into account whether the text is horizontal or vertical. more
Ruby text annotations
  • 'Ruby' style annotations alongside base text should be supported for Chinese, Japanese, Korean and Mongolian text, in both horizontal and vertical writing modes.
  • Ruby implementations should support zhuyin fuhao (bopomofo) ruby for Traditional Chinese.
  • Ruby implementations should support a tabular content model (such that ruby contents can be arranged in a sequence approximating to rb rb rt rt).
  • Ruby implementations should make it possible to use an explicit rb tag for ruby bases.
  • Ruby implementations should allow annotations to appear on either or both sides of the base text.
Background reading
  • Line heights must allow for characters that are taller than English.
  • Box sizes must allow for text expansion in translation.
  • Line wrapping should take into account the special rules needed for non-Latin scripts. more
  • Avoid specifying presentational tags, such as b for bold, and i for italic. more
Local dates, times and formats
Working with time
  • When defining calendar and date systems, be sure to allow for dates prior to the common era, or at least define handling of dates outside the most common range.
  • When defining time or date data types, ensure that the time zone or relationship to UTC is always defined.
  • Provide a health warning for conversion of time or date data types that are "floating" to/from incremental types, referring as necessary to the Time Zones WG Note. more
  • Allow for leap seconds in date and time data types. more
  • Use consistent terminology when discussing date and time values. Use 'floating' time for time zone independent values.
  • Keep separate the definition of time zone from time zone offset.
  • Use IANA time zone IDs to identify time zones. Do not use offsets or LTO as a proxy for time zone.
  • Use a separate field to identify time zone.
  • When defining rules for a "week", allow for culturally specific rules to be applied. more
  • When defining rules for week number of year, allow for culturally specific rules to be applied.
  • When non-Gregorian calendars are permitted, note that the "month" field can go to 13 (undecimber).
Working with personal names
  • Check whether you really need to store or access given name and family name separately. more
  • Avoid placing limits on the length of names, or if you do, make allowance for long strings. more
  • Try to avoid using the labels 'first name' and 'last name' in non-localized contexts. more
  • Consider whether it would make sense to have one or more extra fields, in addition to the full name field, where users can provide part(s) of their name that you need to use for a specific purpose. more
  • Allow for users to be asked separately how they would like you be addressed when someone contacts them. more
  • If parts of a person's name are captured separately, ensure that the separate items can capture all relevant information. more
  • Be careful about assumptions built into algorithms that pull out the parts of a name automatically. more
  • Don't assume that a single letter name is an initial. more
  • Don't require that people supply a family name. more
  • Don't forget to allow people to use punctuation such as hyphens, apostrophes, etc. in names. more
  • Don't require names to be entered all in upper case. more
  • Allow the user to enter a name with spaces. more
  • Don't assume that members of the same family will share the same family name. more
  • It may be better for a form to ask for 'Previous name' rather than 'Maiden name' or 'née'. more
  • You may want to store the name in both Latin and native scripts, in which case you probably need to ask the user to submit their name in both native script and Latin-only form, as separate items. more
Designing forms
  • When defining email field validation, allow for EAI (smtputf8) names.
Working with numbers
  • When parsing user input of numeric values, allow for digit shaping (non-ASCII digits).
  • When formatting numeric values for display, allow for culturally sensitive display, including the use of non-ASCII digits (digit shaping).

You can link to this page and open specific items by using the open parameter in the URL. For example, developing-specs.en?open=characters&open=char_choosing will automatically open the sections Characters and Choosing character encodings. The necessary parameter values are shown to the right of each heading. These are links, to help you create a URL for sharing. The query ?open=all expands all sections.