En program v več jezikih: besedila iz katalogov po jezikih, vrstice napolnjene po jeziku, postavitev od desne proti levi.
Program v glavi app navede jezike, v katerih izide. Besedila se preselijo v en katalog na jezik, jezik obiskovalca pa izbere, kateri se prikaže.
app greeting "1.0.0"
"A greeting in three languages."
locales [en, ar, sl]en je obvezen. Za vsak jezik je ob programu ploski katalog JSON v locales/<locale>/<app>.json:
▼{
"hello": "Hello from Orb",
"cities": "{{n}} cities, seeded in your language"
}▼(render-ui main { type: stack, direction: vertical, gap: sm, children: [
{ type: typography, content: (i18n/t "hello"), variant: h3 },
{ type: typography, content: (i18n/t "cities" { n: (array/len ?data) }), variant: small }
] })(i18n/t "key") in @locale delujeta ob prikazu: sodita v render-ui, nikoli v pogoj, set ali oddajanje. orb validate kataloge primerja s klici: ključ, ki manjka v katerem od navedenih jezikov, nadomestki, ki se ne ujemajo s parametri, in ključi, ki jih nič ne uporablja, so sporočeni. Ključi ob prevajanju dobijo predpono z imenom aplikacije, zato se katalogi številnih uvoženih vedenj združijo brez trkov.
Entiteta, shranjena v brskalniku, lahko za vsak jezik napolni drugačne vrstice:
Greeting
on City · states: 2 · transitions: 41app std-orb-docex-greeting "1.0.0"
2"std-orb-docex-greeting — one program in three languages: copy from per-locale catalogs, records seeded per locale."
3locales [en, ar, sl]
4
5orbital GreetingOrbital {
6 entity City [persistent: docex_cities, local] {
7 id : string!
8 name : string!
9 instances [
10 { id: "C-1", name: "Ljubljana" },
11 { id: "C-2", name: "Riyadh" }
12 ]
13 instances ar [
14 { id: "C-1", name: "ليوبليانا" },
15 { id: "C-2", name: "الرياض" }
16 ]
17 instances sl [
18 { id: "C-1", name: "Ljubljana" },
19 { id: "C-2", name: "Rijad" }
20 ]
21 }
22
23 trait Greeting -> City [interaction, collection] {
24 initial: loading
25
26 state loading {
27 INIT -> loading
28 (fetch City { emit: { success: CitiesLoaded, failure: CitiesFailed } })
29 CitiesLoaded -> ready
30 (emit MOVED { event: "CitiesLoaded" })
31 (render-ui main { type: stack, direction: vertical, gap: sm, children: [
32 { type: typography, content: (i18n/t "hello"), variant: h3 },
33 { type: typography, content: (i18n/t "cities" { n: (array/len ?data) }), variant: small, color: muted },
34 { type: data-list, entity: ?data, fields: [{ name: "name", label: (i18n/t "city"), variant: h4 }] }
35 ] })
36 CitiesFailed -> ready
37 (emit MOVED { event: "CitiesFailed" })
38 (render-ui main { type: alert, variant: error, message: ?error })
39 }
40
41 state ready {
42 INIT -> loading
43 (emit MOVED { event: "INIT" })
44 (fetch City { emit: { success: CitiesLoaded, failure: CitiesFailed } })
45 }
46
47 emits {
48 CitiesLoaded {
49 data : [City]
50 }
51 CitiesFailed {
52 error : string
53 }
54 MOVED -> external {
55 event : string!
56 }
57 @description "Each move names the event it took, so the diagram beside the demo can follow it."
58 }
59 }
60
61 page "/greeting" -> Greeting
62}instances hrani vrstice privzetega jezika; ko napišeš eno kocko instances <locale>, jo potrebuje vsak drug navedeni jezik. Vsak jezik dobi svojo bazo v brskalniku, zato obiskovalčevi zapisi ostanejo v enem jeziku.
Spletišče običajno vsak jezik streže pod predpono: /, /ar, /sl. Stran se prikaže v jeziku, ki ga imenuje njena pot, jeziki od desne proti levi, kot je arabščina, pa za celo stran nastavijo dir="rtl". Daljše besedilo, na primer članek ali ta dokumentacija, se napiše enkrat na jezik kot samostojno vedenje, ne kot ključi kataloga.
Ključne besede, oznake in operatorji jezika obstajajo tudi v arabščini in slovenščini, zato lahko program napišeš v svojem jeziku. Tvoja imena (entitete, lastnosti, stanja, dogodki) se nikoli ne prevajajo, zato se program v tvojem jeziku in njegov angleški dvojček prevedeta v isti .orb. orb i18n vocab izpiše besedišče.
Vodniki se začnejo s celotnim orbitalom.