ohmu
·
2026-10-15
1#include "common/printing.h"
2#include "common/jsonconfig.h"
3#include "detection/locale/locale.h"
4#include "modules/locale/locale.h"
5
6bool ffPrintLocale(FFLocaleOptions* options) {
7 FF_STRBUF_AUTO_DESTROY locale = ffStrbufCreate();
8
9 const char* error = ffDetectLocale(&locale);
10 if (error) {
11 ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Locale), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", error);
12 return false;
13 }
14
15 if (options->moduleArgs.outputFormat.length == 0) {
16 ffPrintLogoAndKey(FF_MODULE_GET_DISPLAY_NAME(Locale), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
17 ffStrbufPutTo(&locale, stdout);
18 } else {
19 FF_PRINT_FORMAT_CHECKED(FF_MODULE_GET_DISPLAY_NAME(Locale), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, ((FFformatarg[]) { FF_ARG(locale, "result") }));
20 }
21
22 return true;
23}
24
25void ffParseLocaleJsonObject(FFLocaleOptions* options, yyjson_val* module) {
26 yyjson_val *key, *val;
27 size_t idx, max;
28 yyjson_obj_foreach (module, idx, max, key, val) {
29 if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) {
30 continue;
31 }
32
33 ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Locale), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key));
34 }
35}
36
37[[gnu::cold]]
38void ffGenerateLocaleJsonConfig(FFLocaleOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
39 ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs);
40}
41
42bool ffGenerateLocaleJsonResult([[maybe_unused]] FFLocaleOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
43 FF_STRBUF_AUTO_DESTROY locale = ffStrbufCreate();
44
45 const char* error = ffDetectLocale(&locale);
46
47 if (error) {
48 yyjson_mut_obj_add_str(doc, module, "error", error);
49 return false;
50 }
51
52 if (locale.length == 0) {
53 yyjson_mut_obj_add_str(doc, module, "error", "No locale found");
54 return false;
55 }
56
57 yyjson_mut_obj_add_strbuf(doc, module, "result", &locale);
58
59 return true;
60}
61
62void ffInitLocaleOptions(FFLocaleOptions* options) {
63 ffOptionInitModuleArg(&options->moduleArgs, "");
64}
65
66void ffDestroyLocaleOptions(FFLocaleOptions* options) {
67 ffOptionDestroyModuleArg(&options->moduleArgs);
68}
69
70FFModuleBaseInfo ffLocaleModuleInfo = {
71 .name = "Locale",
72 .description = "Print system locale name",
73 .displayName = {
74 .en = "Locale",
75 .ar = "اللغة",
76 .cs = "Národní prostředí",
77 .de = "Sprachraum",
78 .es = "Configuración regional",
79 .fi = "Alueasetus",
80 .fr = "Paramètres régionaux",
81 .gl = "Configuración rexional",
82 .he = "לוקאל",
83 .id = "Lokal",
84 .it = "Impostazioni locali",
85 .ja = "ロケール",
86 .ko = "로케일",
87 .pl = "Ustawienia regionalne",
88 .pt = "Configuração regional",
89 .ru = "Локаль",
90 .tr = "Yerel Ayar",
91 .uk = "Локаль",
92 .vi = "Bản địa",
93 .zh_CN = "语言环境",
94 .zh_TW = "語言環境",
95 },
96 .initOptions = (void*) ffInitLocaleOptions,
97 .destroyOptions = (void*) ffDestroyLocaleOptions,
98 .parseJsonObject = (void*) ffParseLocaleJsonObject,
99 .printModule = (void*) ffPrintLocale,
100 .generateJsonResult = (void*) ffGenerateLocaleJsonResult,
101 .generateJsonConfig = (void*) ffGenerateLocaleJsonConfig,
102 .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) {
103 { "Locale code", "result" },
104 })),
105 .defaultOrder = 54,
106};