blob: 12301be39435587cc624cc3ce104d490057305f7 [file] [log] [blame] [view]
# Lookup API
Two main questions arise from the discussion around [message
translation](message_translation.md):
1. What does the _concrete_ interface to the `[Lookup]` service look like in
the programmer's language of choice? And,
1. How do translations make their way to my program so that they are available
to use?
We will answer these in turn.
## Lookup API
The Lookup API library is used to obtain translated strings. A simplified view
of the Lookup API in C++ is as follows:
```cpp
class Lookup {
public:
enum class Status {
// No error.
OK = 0,
// The resource was unavailable as requested.
UNAVAILABLE = 1,
};
static fpromise::result<std::unique_ptr<Lookup>, Lookup::Status>
New(const std::vector<std::string>& locale_ids);
fpromise::result<std::string_view, Lookup::Status> String(uint64_t message_id);
};
```
> For the time being, the Lookup API is a C++ API only. There are no conceptual
> issues with extending it to support other languages.
The actual API can be seen in the file
<code>[lookup.h](/src/lib/intl/lookup/cpp/lookup.h)</code>, and is essentially
the same as shown above, except that it contains documentation, construction
and testing overhead. At the time of this writing, only a high level C++ API
is available for use. We will be adding high level APIs in other languages as
need arises. A [low-level C API](/src/lib/intl/lookup/rust/lookup.h) is
available as a basis for writing [FFI
bindings](https://en.wikipedia.org/wiki/Foreign_function_interface) to this
functionality in other languages. As a special case,
[rust](https://www.rust-lang.org/) does not need the FFI bindings since the
low-level implementation is in rust and can be interfaced with directly; but an
actual rust API has not been formulated yet.
A basic usage of the Lookup API looks like this:
```cpp
std::vector<std::string> locale_ids = {"nl-NL"};
auto result = Lookup::New(locale_ids);
if (result.is_error()) {
return;
}
auto lookup = result.value();
auto lookup_result = lookup.string(42);
if (lookup_result.is_error()) {
// handle error
return;
}
std::string_view message = lookup_result.value();
// Use `message`.
```
The example is taken from the [`lookup.h`
documentation](/src/lib/intl/lookup/cpp/lookup.h#10). Knowing the API, this
example is fairly straightforward, save for one thing: the call
<code>lookup.string(...)</code> uses a magic number <code>42</code> to look up
a message. It is fair of you as a programmer to ask where this number comes
from. The next section addresses this question.