master ohmu/fastfetch-openbsd / src / modules / locale / locale.c
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};