// Phase 3 of the error system (docs/en/reference/errors.md), optional: an author may give
// an error's message in other languages. The program chooses a language
// from a locale value it passes in, never from global state: here the
// locale of its environment (SULTANC_LANG, LC_ALL, LC_MESSAGES, LANG) and
// the locale of an HTTP Accept-Language header, as a server would per
// request. Run it with SULTANC_LANG=en or SULTANC_LANG=ar.
import std.error.failure;
import std.text.language;
import std.text.system_language;
import std.io.println;
def load_settings(): result int, Error {
let empty: mutable Error = error_with_kind("settings", "فارغ", "ملف الإعدادات فارغ");
error_add_language_version(&mutable empty, "en", "the settings file is empty");
let failure: mutable Error = error_caused_by("تعذر تحميل الإعدادات", empty);
error_add_language_version(&mutable failure, "en", "could not load the settings");
return result.err(failure);
}
def main(): int {
match load_settings() with
| result.ok(_) -> { return 0; }
| result.err(failure) -> {
// The program's own language.
let locale: Locale = locale_from_environment();
error_print_in(&failure, &locale);
// A request's language: French is preferred but has no version, so
// the lookup moves on to English.
let header: string = "fr-CH, fr;q=0.9, en;q=0.8, ar;q=0.5";
let request: Locale = locale_from_accept_language(&header);
let ignored: result int, int = println(error_describe_in(&failure, &request));
return 1;
};
}// المرحلة الثالثة من نظام الأخطاء (docs/en/reference/errors.md)، وهي اختيارية: للمؤلف أن
// يضيف رسالة الخطأ بلغات أخرى. يختار البرنامج اللغة من قيمة لغة يمررها، لا من
// حالة عامة: هنا لغة بيئته (SULTANC_LANG وLC_ALL وLC_MESSAGES وLANG) ولغة
// ترويسة Accept-Language في HTTP، كما يفعل خادم لكل طلب. شغله مع
// SULTANC_LANG=en أو SULTANC_LANG=ar.
استورد المكتبة.أخطاء.failure;
استورد المكتبة.نصوص.language;
استورد المكتبة.نصوص.system_language;
استورد المكتبة.دخ.println;
عرف حمل_الإعدادات(): نتيجة عدد, فشل {
دع فارغ: متغير فشل = فشل_بهوية(«settings», «فارغ», «ملف الإعدادات فارغ»);
أضف_نسخة_لغة(&متغير فارغ, «en», «the settings file is empty»);
دع الفشل: متغير فشل = فشل_بسبب(«تعذر تحميل الإعدادات», فارغ);
أضف_نسخة_لغة(&متغير الفشل, «en», «could not load the settings»);
أرجع نتيجة.خطأ(الفشل);
}
عرف الرئيسية(): عدد {
طابق حمل_الإعدادات() مع
| نتيجة.نجح(_) -> { أرجع 0; }
| نتيجة.خطأ(الفشل) -> {
// لغة البرنامج نفسه.
دع اللغة: لغة = لغة_من_البيئة();
اطبع_فشل_بلغة(&الفشل, &اللغة);
// لغة طلب: الفرنسية مفضلة ولا نسخة لها، فينتقل البحث إلى الإنجليزية.
دع الترويسة: نص = «fr-CH, fr;q=0.9, en;q=0.8, ar;q=0.5»;
دع الطلب: لغة = لغة_من_قبول_اللغة(&الترويسة);
دع تجاهل: نتيجة عدد, عدد = اطبع_سطر(صف_فشل_بلغة(&الفشل, &الطلب));
أرجع 1;
};
}
Run it
With the interpreter, without compiling:
./build/sultanc run examples/en/errors/languages.snOr compile it to an executable:
./build/sultanc examples/en/errors/languages.sn -o build/example && ./build/example