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.

Translate Like a Pro | Localize MessagePack Maps, Strings, Binary Values, Extensions and Timestamps Without Changing Serialized Meaning

How can you translate MessagePack documentation, API examples and software messages into another language without accidentally changing the binary data that applications exchange? Begin by separating the value from its serialized representation. MessagePack can represent strings, numbers, arrays, maps, binary data and extension values compactly, but localization should change explanations and approved display labels rather than silently modifying program keys or typed values.

Readers looking for a MessagePack format guide, MessagePack versus JSON explanation, MessagePack string and binary types, MessagePack map keys, timestamp extension tutorial or multilingual MessagePack API documentation need precise answers. They want to know which objects survive an encode-decode cycle, why a decoded integer may behave differently in another programming language, and how translation affects UTF-8 strings without corrupting a payload.

This guide explains the format in an educational, world-facing way, with practical examples, encoding traps, implementation checks and a clear localization method. It focuses on MessagePack’s own type families and interoperability contract. It does not duplicate the separate guides to JSON Schema validation, Apache Avro schemas or CBOR’s tagged representation. The central rule is that fluency should improve the human instructions while machines continue to receive exactly the values they expect.

Understand the job MessagePack performs

MessagePack is a binary serialization format that can encode familiar structured data. A program constructs values, a serializer converts them into bytes and a decoder reconstructs the corresponding values. This resembles JSON interchange at the conceptual level, but the binary type system has additional distinctions.

MessagePack is not a translation engine, a database or a guarantee that two applications share the same business schema. It defines how values can be serialized. Applications must still agree on what keys, numbers, extension types and versioned fields mean.

An international user guide should say which layer it describes: a visible JSON-like example, the logical MessagePack value, an actual binary byte sequence or the application contract that interprets the result. Confusing those layers invites serious interoperability errors.

Imagine a delivery API sending a map with shipment_id, weight_grams and status_code. The app can translate the displayed status label for a customer. The map keys, numeric quantity and code values still have to match what the receiving service expects.

1. MessagePack is compact structured data, not encrypted text

MessagePack represents values in a binary format that can be more compact than a textual representation for many workloads. Compactness does not mean secrecy. A reader with the correct decoder can inspect the values, including personal information or business fields.

Translate the term binary serialization as representation in bytes, not as a protective security layer. A translated manual that suggests data is hidden or safe because it is unreadable in a text editor gives readers false confidence.

Compression and encryption are separate concerns. A MessagePack payload may be compressed or encrypted by surrounding systems, but the format alone does not provide those properties. Keep each guarantee attached to the component that supplies it.

An example can encode the same small object as JSON text and as MessagePack bytes. Explain the differences in representation without claiming that every object is smaller, faster or secure by default.

2. A type family tells the decoder how to interpret bytes

MessagePack organizes encoded values into type families: nil, Boolean, integer, floating-point, string, binary, array, map and extension. Each has one or more byte-level encodings. The type is part of the meaning a decoder reconstructs.

When translating documentation, retain type names or provide an exact bilingual glossary. Do not collapse binary and string into generic text or integer and floating-point into an undifferentiated number when the distinction matters for interoperability.

A readable code sample may omit the type prefix that exists in the serialized bytes. A guide should explain that the displayed object is a conceptual representation, not a literal dump of the wire format.

To teach the idea, compare the numeric value 7, the string “7” and a one-byte binary payload containing the byte for seven. They may look related to a beginner, but they are different types with different application consequences.

3. Fixint encodings optimize common small integers

The format includes compact encodings for many small integers, often called positive fixint and negative fixint. Larger values use encodings with additional bytes. A translated explanation should keep the distinction between the logical integer and its physical representation.

Avoid telling readers that every integer occupies a single byte. The compact case depends on the value’s range. Similarly, a byte prefix is not a digit written in an ordinary national number format.

Document numeric examples carefully. A negative sign in a human-facing example is semantic; the byte pattern representing a negative integer is format-specific. Do not rewrite hexadecimal bytes to match a localized decimal punctuation convention.

A practical exercise encodes several nearby values at format boundaries. It shows why a slightly larger integer may require additional bytes even though the application still sees the same kind of integer value.

4. Signed and unsigned integer ranges matter across languages

MessagePack supports signed and unsigned integer representations with widths up to 64 bits. Not every programming language or runtime represents every such value with the same precision or native type. Serialization can expose those differences.

An international API guide should retain examples near important numeric limits and describe how the target language handles them. A large identifier must not be converted into a rounded floating-point value simply to make an example easy to display.

JavaScript number handling is a familiar caution because its ordinary Number type does not exactly represent all 64-bit integers. Libraries may expose special options or types for large values. The correct behavior depends on the implementation.

A transaction identifier encoded as an unsigned 64-bit integer might decode precisely in one language but require special care in another. Translate the explanation, preserve the value and test the exact library configuration.

5. Nil is a value, not the absence of a map entry

MessagePack has a nil value, often mapped to null in other systems. This is not identical to a map lacking a particular key. The difference can affect defaulting, update semantics and validation at the application layer.

An onboarding guide should teach presence separately from value. The map can contain a key with nil, contain a key with an empty string or omit the key entirely. Those three states may represent different user intentions.

Localizing nil as an empty field in prose can be misleading. Say what the API contract actually says: unknown, intentionally cleared, optional, not provided or something else. The serialization format alone does not assign the business meaning.

For a profile update, a missing nickname key might mean leave the value unchanged, whereas nickname set to nil might mean clear it. That distinction must come from the application contract and remain intact in every language.

6. Boolean values are not human words

MessagePack represents true and false as Boolean values. A localized interface may show the equivalent of Yes and No, but a program expecting a Boolean should not receive an arbitrary translated string instead.

The translation should separate displayed choices from serialized values. A UI may turn a selected switch into a Boolean; its label can change freely as long as the serialization remains what the API expects.

Also distinguish false from nil, zero and an empty container. Some programming languages treat such values differently in conditionals, but the data format does not make them interchangeable.

An example permission field called enabled can be false, true or absent depending on the API schema. A technical translation must not replace false with an ambiguous local phrase such as not available.

7. Floating-point values require numerical caution

MessagePack has encodings for 32-bit and 64-bit floating-point numbers. These are not arbitrary-precision decimal representations. Binary floating-point values can exhibit rounding behavior familiar from programming and numerical computing.

A translation should preserve exact numeric claims and avoid changing decimal separators inside executable code. Formatting a human-facing number for a locale is different from altering a program’s literal syntax or the serialized bytes.

Some runtimes handle NaN, positive infinity and negative infinity differently from JSON, database or UI layers. An application should explicitly define whether such values are allowed and how they are presented to end users.

An educational example can show why 0.1 plus 0.2 may not produce the exact decimal representation expected by a beginner. The lesson is numerical semantics, not a failure of one spoken language.

8. Strings use a specified text encoding

MessagePack string values are UTF-8 text. Translators can create strings containing many writing systems, but exact bytes change when the characters change. A hex dump created for an English example cannot be reused unchanged after substituting multilingual text.

Distinguish visible characters, Unicode code points and encoded bytes. The count of letters on a screen is not necessarily equal to the number of UTF-8 bytes. This matters because string-format variants are selected using byte lengths.

Do not translate a fixed-length byte illustration by replacing one short English word with a longer target-language phrase and keeping the original size header. Regenerate the payload with a genuine serializer.

A small example comparing an ASCII greeting with a Japanese or Arabic greeting makes the difference concrete. Both are valid text strings, but they need correctly calculated length information in their actual encoded representations.

9. Binary data is not text awaiting translation

MessagePack has a binary value family for arbitrary bytes. A binary payload can represent an image fragment, cryptographic material, compressed content or another application-specific format. It is not necessarily readable UTF-8.

A documentation editor should never pass a binary field through ordinary text translation. Doing so may replace bytes, normalize line endings or corrupt content that has no linguistic meaning. Translate the description of the field instead.

The distinction between str and bin is important even when a programming environment uses a broadly named bytes or buffer type. Specify what the application expects and which library option produces the correct MessagePack family.

In a file-upload example, a field named document_blob may contain binary bytes while document_title contains human text. The title might be translated as a sample string; the blob must remain an exact byte payload in a reproducible test.

10. Arrays preserve ordered elements

A MessagePack array is an ordered collection. Its elements can have different supported types unless an application schema restricts them. The ordering is part of the value and should not be rearranged merely to make a localized example read more naturally.

Explain the difference between an array’s element count and its total encoded byte length. A list of three short strings and a list of three large binary objects have the same number of elements but radically different payload sizes.

When an application uses positional arrays as records, positions can carry business meaning. Translators should be cautious because the surrounding code may not provide descriptive keys to make that meaning obvious.

An example array containing latitude, longitude and altitude is easy to break by swapping two positions. Translate the explanatory labels, not the order of numerical elements, and verify the decoded result against the contract.

11. Maps hold key-value pairs

A MessagePack map stores key-value pairs. Unlike JSON objects, the underlying MessagePack model is not restricted to string keys. Libraries and application conventions may impose narrower requirements, so documentation must name those restrictions.

Do not translate map keys used as protocol identifiers. An English-looking key such as error_code may be a fixed machine token. A displayed column label Error Code can be localized without changing that key.

Map ordering should not be relied upon as the basis of a business meaning unless the application explicitly defines such behavior. Treat names and values as the semantic content, not the order they happen to appear in a debugging viewer.

A product API with sku, quantity and unit_price has clear machine keys. The user-facing product name can be translated, but the program still needs sku to locate the same product and quantity to remain an exact count.

12. Non-string map keys complicate cross-language interchange

Some MessagePack maps contain integer or other supported keys. A target programming language may not naturally support every possible key type in its ordinary object type. Different libraries may therefore offer different mapping modes or restrictions.

A translated guide should not promise that any map can be treated as a JSON object without loss. Converting numeric keys to strings may create collisions or change how an application looks up entries.

Explain the distinction between a format capability and an application profile. A service may require UTF-8 string keys even though MessagePack itself permits more. That service rule should appear explicitly in the API’s documentation.

A case using keys 1 and “1” illustrates the danger. They are different MessagePack values, but an object conversion that stringifies keys may collapse them. Localization must preserve the distinction rather than hiding it.

13. Duplicate keys need a documented policy

A format-level map can contain entries that some applications may consider duplicates. Decoder behavior and application validation rules can vary. A robust protocol defines whether duplicates are rejected, ignored or handled under a specific rule.

Do not translate a description as if every decoder guaranteed last-value-wins behavior. That would invent a semantic promise that belongs to a particular library or application. Security and data correctness can depend on the exact rule.

In multilingual examples, avoid duplicating a key accidentally when adding a localized synonym alongside the original. Adding two keys with similar meanings is not a safe way to make a machine payload bilingual.

A better model carries one stable key and a separately named localization object or display-name map. The application then has clear ownership of what is data and what is presentation.

14. Extension types require application agreements

MessagePack has an extension family for application-specific typed data. The type identifier and payload bytes are not inherently self-explanatory. The communicating applications must agree on the extension’s meaning and decoding rules.

Translate the explanation of an extension, not its type identifier or raw payload. A decoder that does not recognize the extension may expose its raw bytes or reject it, depending on the library and configuration.

A document should record who owns each extension identifier, its payload definition, versioning rules and fallback behavior. Without that contract, two languages or client implementations may interpret the same bytes differently.

Imagine an extension representing a specialized geographical coordinate. The surrounding UI can describe the value in the reader’s language, but the extension structure still requires exact numerical and byte-level interpretation.

15. Timestamp is a defined extension family

MessagePack defines a timestamp extension using a reserved extension type identifier. It represents time using seconds and, where supported, nanoseconds. The standardized encodings include compact variants often described as timestamp 32, 64 and 96.

This is not a command to translate calendar names or select a timezone. A timestamp value and a user-facing formatted date-time are different layers. The application decides how to present a moment to people in different regions.

Some implementations may lose subsecond precision when converting to a language runtime’s native date type. A translated guide should mention that possibility rather than guaranteeing nanosecond accuracy end to end.

For an event timestamp, preserve the original instant and precision when feasible. The UI may show a local date and time; the technical reference should still explain the timestamp’s underlying seconds and nanoseconds.

16. Timezones are application presentation rules

A timestamp describing an instant is not the same as a string formatted in a named local timezone. MessagePack’s timestamp extension does not automatically carry every regional display convention a worldwide product might need.

Translate dates for end users using the approved locale and timezone policy. Avoid rewriting serialized timestamp seconds to make the visible clock look familiar. That would move the underlying event on the timeline.

A global customer-support product should also distinguish when a record stores a local wall-clock time rather than an instant. If the application uses a string for a local meeting time, its meaning depends on additional contextual rules.

A meeting reminder displayed for Tokyo and Toronto can show different clocks for the same instant. The guide should explain the conversion without implying the stored event has changed.

17. The reserved timestamp type must not be repurposed

The standard timestamp extension uses a reserved extension type value. Applications should not assign an unrelated private meaning to that same identifier and expect general decoders to interpret it correctly.

A localization glossary must keep reserved type identifiers and format-specific markers untouched. Replacing a numeric code with a translated word inside a code snippet can hide an incompatibility or produce invalid data.

When an API has several private extensions, list their identifiers and meanings separately from the standard timestamp extension. This helps prevent undocumented collisions during future system integrations.

An example extension registry can include a short prose description in several languages while retaining one exact numeric identifier and a versioned binary schema for each extension.

18. Serialization is not automatically self-framing across a network

One MessagePack value has its own internal structure, but an application may send several values over a byte stream. The surrounding transport still needs a clear rule for message boundaries, buffering and how incomplete data is handled.

A translated tutorial should distinguish serialization format from the network protocol carrying it. TCP, file streams and message queues may deliver bytes in chunks that do not correspond to whole application messages.

Do not claim that one network read always returns one complete MessagePack object. A streaming decoder or application framing layer may be necessary to assemble or iterate through values.

A teaching example sends two maps back to back. The receiver needs a decoder able to identify successive MessagePack values or an agreed framing method. Translating the network guide should preserve that requirement.

19. A format does not provide a business schema by itself

MessagePack can tell a decoder that a map contains a string and an integer. It does not automatically explain whether the integer is metres, cents, milliseconds or a product quantity. Applications must supply that semantic contract.

Translate data dictionaries and field descriptions with domain reviewers. A fluent phrase may still misstate a unit, status transition or financial definition. The serialization layer cannot detect those business errors.

Avoid suggesting that a MessagePack payload includes a universal schema-registry negotiation mechanism. Such behavior may exist in a system built around MessagePack, but it belongs to the surrounding application architecture.

A distance field containing 1500 could mean metres or millimetres. The API schema and documentation should say which one. A localizer should preserve the quantity, unit and naming convention.

20. MessagePack and JSON overlap without being identical

Both formats can represent many familiar structured values, but JSON text does not directly express every MessagePack type distinction. Binary data, extension types, non-string map keys and some numeric cases require special treatment in conversion.

A translated comparison should avoid saying that MessagePack is simply compressed JSON. It is a separate format with its own type families and byte encodings. Some transformations between representations can lose information.

Be cautious with a diagnostic tool that shows MessagePack as JSON-like text. The display may convert bytes to base64, stringify keys or represent extension payloads as custom objects. That visualization is not necessarily a lossless native JSON document.

If interoperability matters, test an encode-decode round trip that includes the difficult types, not only a simple map of strings and small numbers. That reveals assumptions before they appear in production.

21. MessagePack and CBOR are distinct binary formats

CBOR and MessagePack both represent structured data in binary form, but their type systems, framing and extension mechanisms differ. They are not mutually readable encodings with interchangeable headers.

A multilingual guide should identify which format the API actually uses. Do not copy CBOR major-type or tag terminology into a MessagePack-specific decoder explanation merely because the technologies appear near each other in a comparison article.

Each format has its own assumptions about numeric encodings, typed values and ecosystem conventions. A precise comparison can be useful, but a product’s wire contract must name the exact standard and library profile.

An application that expects MessagePack cannot decode CBOR simply because the high-level value resembles a map. The bytes are governed by different specifications; a deliberate conversion step would be necessary.

22. Strings and binary values can be confused in code libraries

Some languages use distinct string and byte-array types; others have flexible conversion rules. A MessagePack library may map these to str and bin differently based on options or source object type. Test the mapping actually in use.

A translation should preserve examples showing byte arrays versus text strings. A command that constructs a buffer is not interchangeable with a command that constructs Unicode text, even when their printed representations appear similar.

When localizing API code, protect exact identifiers and string literals used as protocol keys. Sample user-facing text can be changed with care, but rerun the encoder and decoder to confirm the type family remains correct.

A document field may intentionally contain UTF-8 text, while an image_hash field contains arbitrary bytes. Calling both strings in a translated manual would send readers toward the wrong decoding operations.

23. Normalize text only when the application requires it

Unicode allows visually similar text to have different code-point sequences. MessagePack stores string content; it does not promise to normalize every string into one canonical form before serialization or comparison.

A multilingual text pipeline should define normalization rules separately, especially when comparing names, search keys or identifiers. Applying a normalization step unexpectedly can change values that an application considers exact.

Do not alter case, accents or invisible characters inside identifiers merely because they are unfamiliar in the target language. If normalization is required, describe where it occurs and how equality is evaluated.

A test could include two visually similar strings built from different Unicode sequences. It shows why display appearance is not enough to prove byte equality or identical search behavior.

24. Version the application schema independently of the format

MessagePack’s standardized encoding rules do not eliminate application versioning. A service may add fields, rename keys or introduce new extension values over time. Clients need a documented compatibility policy.

An update can be safe for one client and breaking for another. A translated release note should preserve which versions accept which fields, and distinguish an optional addition from a replacement of an existing required field.

Do not silently rename an English-looking field during translation. A change from invoice_id to a localized key changes the payload contract unless readers explicitly accept the new name.

A global product can maintain stable wire keys and localize help text in parallel. That reduces friction for developers who read different languages but integrate with the same API.

25. Decoder limits are part of reliable operations

A decoder may impose limits on nesting depth, array size, map size or total payload length. These protect resources and can differ across implementations. A format specification’s possible ranges are not the same as a specific library’s configured limits.

Translate error messages about resource limits without overstating the reason for failure. A payload rejected for exceeding a configured maximum is not necessarily malformed according to the format, and a valid format is not necessarily safe to process without limits.

A public service should apply sensible size limits, input validation and authentication according to its threat model. MessagePack does not make untrusted input harmless merely because it is binary.

For troubleshooting, record the relevant limit, actual input size and library version, and test with redacted data. Do not recommend turning off safety limits simply to make a translated example succeed.

26. Never mistake successful decoding for trusted content

A decoder can reconstruct a map faithfully while the map still contains malicious, false or unauthorized values. Parsing success addresses syntax and type reconstruction, not business truth, authorization or policy compliance.

Documentation should distinguish parsing, schema validation, semantic validation and permission checks. Translating all of them as ‘verification’ can obscure which control actually protects an operation.

For international products, maintain consistent risk language. If a field is accepted only after server-side validation, do not translate the statement into one that suggests clients may supply any value they choose.

An order submitted with an impossible quantity might be perfectly valid MessagePack but invalid business data. The receiving service must reject it according to rules outside the serializer.

27. Debugging requires both readable views and original bytes

A readable MessagePack inspector can help analysts understand maps and arrays. But some inspectors convert extension payloads or large integers into strings or implementation-specific objects. A printed view is only one interpretation of the bytes.

Keep original samples when diagnosing cross-language differences, with sensitive data removed. Compare hexadecimal bytes, decoded type families and application values. The three perspectives reveal different possible failures.

Translate annotations on the inspection report while preserving literal field names, type identifiers and quoted error outputs where exact matching is necessary. Add a localized explanation beside each technical token.

For a timestamp bug, a useful report includes the raw extension value, the decoded seconds and nanoseconds, the runtime’s displayed date and the expected time zone. That evidence avoids blaming translation for a precision issue.

28. Design examples for international learners

A good guide begins with a small visible map, shows its encoded role and then adds one difficult feature at a time. Start with short strings and integers; move to binary fields, nullable values, large numbers and extension types.

Readers benefit from comparison tables that distinguish safe-to-translate labels from protected wire keys. Keep formatting accessible for scripts with different widths and reading directions without changing code syntax or encoded bytes.

Avoid culture-bound examples that require knowledge of one country’s tax or identity system. Use general cases such as package tracking, online bookings, inventory and time-stamped events, then define all units and codes.

Invite learners to explain why the decoded values should match even when the documentation language changes. That simple question tests whether they understand the boundary between language and serialization.

29. Build a disciplined localization glossary

List type names, logical meanings, program identifiers and user-facing terms in separate columns. Include nil, bin, str, map, array, extension, timestamp, signed integer, unsigned integer, bytes and UTF-8.

For each term, note common false equivalents. Binary data is not always text. Map is not a geography chart. Null is not zero. An integer range is not a display-format preference. Timestamp is not necessarily a local clock string.

A glossary may preserve original technical words in code and provide clear local explanations in prose. This helps readers connect a translated guide to the official specification and library documentation.

A glossary succeeds when two developers using different interface languages can discuss the same payload and recognize identical keys, types, values and expected behaviors.

30. Validate a full multilingual round trip

Create a reference object containing a non-ASCII string, a binary byte array, a nil value, a large unsigned integer, an array, a map and a timestamp extension. Encode it with the intended MessagePack library.

Decode the payload in every supported runtime and compare values and types. Where a runtime uses a special integer or date representation, document the conversion and check that no important precision is lost.

Now localize the tutorial and user-facing display labels without changing the reference payload. Verify that all code snippets still run and that any intentionally translated string examples have newly generated byte lengths.

This test is stronger than checking a rendered web page alone. It tests the claims a developer will rely on when moving from instructional text into actual serialized data.

Worked case: an international package-tracking API

A shipping platform sends MessagePack maps between services. Each map contains shipment_id, status_code, weight_grams, scanned_at and optional attachment_bytes. The client displays localized tracking messages to customers in many countries.

The wire keys remain fixed. The displayed status label is produced from a translation table keyed by the stable status code. The weight value stays measured in grams until a documented display conversion changes units for the user.

The scanned_at timestamp is decoded according to its representation and shown in the customer’s selected timezone. A document attachment remains binary; it is not passed through text translation. A large numeric tracking identifier is handled without precision loss.

A release check compares decoded maps in two runtimes, validates statuses against the application contract and confirms UI translations. This separates the technical exchange from the human-facing experience while keeping both reliable.

Practical checklist for writing a MessagePack guide

First, identify the exact library and configuration used to encode and decode values. Inventory its mappings for strings, bytes, integers, timestamps, extension values and map keys. Do not rely only on how one debug print looks.

Second, preserve machine-sensitive information. Keep wire field names, extension IDs, numeric limits, code fragments and example bytes unchanged unless a deliberate transformation is described and tested. Translate descriptions and approved UI labels.

Third, check every comparison claim. MessagePack is not encrypted JSON; it is a distinct binary format. It does not supply a universal business schema, guaranteed compression or automatic compatibility across every language runtime.

Finally, use representative reference vectors and review them with a developer who supports the target runtime. Have a language specialist verify clarity for local readers and a domain specialist verify the business meanings and units.

Frequently asked questions about MessagePack localization

Can I translate map keys in a public API?

Not as a routine localization edit. A key may be a stable protocol identifier. Translate display labels and help text instead, unless the service explicitly supports alternative machine keys under a versioned API contract.

Is MessagePack exactly the same as JSON in binary form?

No. They share many high-level concepts but differ in available types and encodings. MessagePack supports binary values and extensions and may preserve distinctions that a simple JSON conversion cannot represent without conventions.

Why does my multilingual string change the byte count?

MessagePack string content uses UTF-8. Different characters can occupy different numbers of bytes, so the encoded length must reflect the actual bytes. Generate binary examples through a serializer rather than editing their hex dumps.

Does nil mean the field was not sent?

No. Nil is a value. A key can explicitly contain nil, or the key can be absent. The application determines how those two cases are interpreted.

Can I treat a timestamp as a local date string?

A timestamp extension represents time information; the application formats it for the reader. Preserve its instant and precision when decoding, then apply a documented timezone and locale policy for display.

What is the safest translation quality check?

Round-trip a reference payload containing all important types using the actual implementation. Compare decoded types and values, preserve exact machine identifiers and independently review human-facing labels for meaning.

Official references and further reading

The MessagePack project explains the format and its type families at https://msgpack.org/. Its format specification is maintained at https://github.com/msgpack/msgpack/blob/master/spec.md. Consult the library documentation used by your application for mapping options and precision behavior.

Use reference vectors that include large integers, UTF-8 strings, binary payloads and extension values. They provide a better foundation for international developer documentation than a single easy example containing only short English strings.

A reliable translation makes MessagePack understandable to a broader audience without changing what the decoder reconstructs. Human language can travel; identifiers, typed values and agreed application meanings must remain precise.