gRPC Internationalization
=========================

As a universal RPC framework, gRPC needs to be fully usable within/across different international environments. 
This document describes gRPC API and behavior specifics when used in a non-english environment.

## API Concepts

While some API elements need to be able to represent non-english content, some are intentionally left as ASCII-only
for simplicity & performance reasons.

### Method name (in RPC Invocation)
Method names are ASCII-only and may only contain characters allowed by HTTP/2 text header values. That should not
be very limiting as most gRPC services will use protobuf which only allows method names from an even more restricted ASCII subset.
Also, handling method names is a very hot code path so any additional encoding/decoding step is to be avoided.

Recommended representation in language-specific APIs: string type.

### Host name (in RPC Invocation)
Host names are punycode encoded, but the user is responsible for providing the punycode-encoded string if she wishes to use an internationalized host name.

Recommended representation in language-specific APIs: string/unicode string.

NOTE: overriding host name when invoking RPCs is only supported by C-core based gRPC implementations.

### Status detail/message (accompanies RPC status code)

Status messages are expected to contain national-alphabet characters.
Allowed values are unicode strings (content will be percent-encoded on the wire).

Recommended representation in language-specific APIs: unicode string.

### Metadata key
Allowed values are defined by HTTP/2 standard (metadata keys are represented as HTTP/2 header/trailer names).

Recommended representation in language-specific APIs: string.

### Metadata value (text-valued metadata)
Allowed values are defined by HTTP/2 standard (metadata values are represented as HTTP/2 header/trailer text values).

Recommended representation in language-specific APIs: string.

### Channel target (in channel creation)

TBD