Added basic locale support
This commit is contained in:
@ -26,6 +26,7 @@ add_subdirectory(assert)
|
|||||||
add_subdirectory(display)
|
add_subdirectory(display)
|
||||||
add_subdirectory(entity)
|
add_subdirectory(entity)
|
||||||
add_subdirectory(item)
|
add_subdirectory(item)
|
||||||
|
add_subdirectory(locale)
|
||||||
add_subdirectory(physics)
|
add_subdirectory(physics)
|
||||||
add_subdirectory(ui)
|
add_subdirectory(ui)
|
||||||
add_subdirectory(util)
|
add_subdirectory(util)
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "npc.h"
|
#include "npc.h"
|
||||||
|
|
||||||
#include "ui/uitextbox.h"
|
#include "ui/uitextbox.h"
|
||||||
|
#include "locale/language.h"
|
||||||
|
|
||||||
void npcInit(entity_t *entity) {
|
void npcInit(entity_t *entity) {
|
||||||
|
|
||||||
@ -18,10 +18,11 @@ void npcUpdate(entity_t *entity) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void npcInteract(entity_t *player, entity_t *self) {
|
void npcInteract(entity_t *player, entity_t *self) {
|
||||||
uiTextboxSetText(
|
// uiTextboxSetText(
|
||||||
"Hello World how are you today? Hope things are going well for you! I am "
|
// "Hello World how are you today? Hope things are going well for you! I am "
|
||||||
"having a great day, hope you are too. Did I ever tell you about the tragedy "
|
// "having a great day, hope you are too. Did I ever tell you about the tragedy "
|
||||||
"of Darth Plagueis the Wise? He was a dark lord of the Sith, "
|
// "of Darth Plagueis the Wise? He was a dark lord of the Sith, "
|
||||||
"so powerful and so wise he could use the Force to influence the midichlorians"
|
// "so powerful and so wise he could use the Force to influence the midichlorians"
|
||||||
);
|
// );
|
||||||
|
uiTextboxSetText(languageGet("meta.language.name"));
|
||||||
}
|
}
|
10
src/dusk/locale/CMakeLists.txt
Normal file
10
src/dusk/locale/CMakeLists.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Copyright (c) 2025 Dominic Masters
|
||||||
|
#
|
||||||
|
# This software is released under the MIT License.
|
||||||
|
# https://opensource.org/licenses/MIT
|
||||||
|
|
||||||
|
# Sources
|
||||||
|
target_sources(${DUSK_TARGET_NAME}
|
||||||
|
PRIVATE
|
||||||
|
language.c
|
||||||
|
)
|
47
src/dusk/locale/language.c
Normal file
47
src/dusk/locale/language.c
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2025 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "language.h"
|
||||||
|
#include "assert/assert.h"
|
||||||
|
|
||||||
|
language_t LANGUAGE;
|
||||||
|
|
||||||
|
void languageInit(void) {
|
||||||
|
LANGUAGE.current = LANGUAGE_EN;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char_t * languageGet(const char_t *key) {
|
||||||
|
assertNotNull(key, "Key cannot be NULL");
|
||||||
|
assertTrue(LANGUAGE.current < LANGUAGE_COUNT, "Invalid language index");
|
||||||
|
|
||||||
|
int16_t keyIndex = -1;
|
||||||
|
for(uint16_t i = 0; i < LANGUAGE_COUNT; i++) {
|
||||||
|
if(strcmp(LANGUAGE_KEYS[LANGUAGE.current][i], key) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
keyIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
assertTrue(keyIndex != -1, "Key not found in language");
|
||||||
|
return LANGUAGE_VALUES[LANGUAGE.current][keyIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t langaugeGetLength(const char_t *key) {
|
||||||
|
assertNotNull(key, "Key cannot be NULL");
|
||||||
|
assertTrue(LANGUAGE.current < LANGUAGE_COUNT, "Invalid language index");
|
||||||
|
|
||||||
|
int16_t keyIndex = -1;
|
||||||
|
for(uint16_t i = 0; i < LANGUAGE_COUNT; i++) {
|
||||||
|
if(strcmp(LANGUAGE_KEYS[LANGUAGE.current][i], key) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
keyIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
assertTrue(keyIndex != -1, "Key not found in language");
|
||||||
|
return strlen(LANGUAGE_VALUES[LANGUAGE.current][keyIndex]);
|
||||||
|
}
|
39
src/dusk/locale/language.h
Normal file
39
src/dusk/locale/language.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2025 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "locale/language/languages.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t current;
|
||||||
|
} language_t;
|
||||||
|
|
||||||
|
extern language_t LANGUAGE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the language system.
|
||||||
|
*
|
||||||
|
* This function sets up the language system, loading the default language
|
||||||
|
* and preparing any necessary resources for language handling.
|
||||||
|
*/
|
||||||
|
void languageInit(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a language string by its key.
|
||||||
|
*
|
||||||
|
* @param key The key for the language string.
|
||||||
|
* @return The language string associated with the key.
|
||||||
|
*/
|
||||||
|
const char_t * languageGet(const char_t *key);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the length of a language string by its key.
|
||||||
|
*
|
||||||
|
* @param key The key for the language string.
|
||||||
|
* @return The length of the language string associated with the key.
|
||||||
|
*/
|
||||||
|
uint16_t langaugeGetLength(const char_t *key);
|
@ -77,7 +77,7 @@ for jsonFile in jsonFiles:
|
|||||||
|
|
||||||
f.write(f"#define LANGUAGE_{langUpper}_CODE \"{languageName}\"\n")
|
f.write(f"#define LANGUAGE_{langUpper}_CODE \"{languageName}\"\n")
|
||||||
f.write(f"#define LANGUAGE_{langUpper}_NAME \"{keyValues['meta.language.name']}\"\n")
|
f.write(f"#define LANGUAGE_{langUpper}_NAME \"{keyValues['meta.language.name']}\"\n")
|
||||||
f.write(f"#define LANGUAGE_{langUpper}_COUNT_KEYS {len(keyValues)}\n\n")
|
f.write(f"#define LANGUAGE_{langUpper}_COUNT {len(keyValues)}\n\n")
|
||||||
|
|
||||||
# Write keys
|
# Write keys
|
||||||
f.write(f"static const char_t *LANGUAGE_{langUpper}_KEYS[] = {{\n")
|
f.write(f"static const char_t *LANGUAGE_{langUpper}_KEYS[] = {{\n")
|
||||||
@ -113,24 +113,35 @@ with open(mainOutputFile, 'w', encoding='utf-8') as f:
|
|||||||
f.write(f'#include "locale/language/{lang.lower()}.h"\n')
|
f.write(f'#include "locale/language/{lang.lower()}.h"\n')
|
||||||
f.write("\n")
|
f.write("\n")
|
||||||
|
|
||||||
f.write(f"#define LANGUAGES_COUNT {len(languages)}\n\n")
|
f.write(f"#define LANGUAGE_COUNT {len(languages)}\n\n")
|
||||||
|
|
||||||
f.write("static const char_t *LANGUAGE_CODES[] = {\n")
|
index = 0
|
||||||
|
for lang in languages:
|
||||||
|
f.write(f"#define LANGUAGE_{lang} {index}\n")
|
||||||
|
index += 1
|
||||||
|
f.write("\n")
|
||||||
|
|
||||||
|
f.write("static const char_t* LANGUAGE_CODES[] = {\n")
|
||||||
for lang in languages:
|
for lang in languages:
|
||||||
f.write(f' LANGUAGE_{lang}_CODE,\n')
|
f.write(f' LANGUAGE_{lang}_CODE,\n')
|
||||||
f.write("};\n\n")
|
f.write("};\n\n")
|
||||||
|
|
||||||
f.write("static const char_t *LANGUAGE_NAMES[] = {\n")
|
f.write("static const char_t* LANGUAGE_NAMES[] = {\n")
|
||||||
for lang in languages:
|
for lang in languages:
|
||||||
f.write(f' LANGUAGE_{lang}_NAME,\n')
|
f.write(f' LANGUAGE_{lang}_NAME,\n')
|
||||||
f.write("};\n\n")
|
f.write("};\n\n")
|
||||||
|
|
||||||
f.write("static const char_t *LANGUAGE_KEYS[] = {\n")
|
f.write("static const char_t** LANGUAGE_KEYS[] = {\n")
|
||||||
for lang in languages:
|
for lang in languages:
|
||||||
f.write(f' LANGUAGE_{lang}_KEYS,\n')
|
f.write(f' LANGUAGE_{lang}_KEYS,\n')
|
||||||
f.write("};\n\n")
|
f.write("};\n\n")
|
||||||
|
|
||||||
f.write("static const char_t *LANGUAGE_VALUES[] = {\n")
|
f.write("static const int LANGUAGE_COUNTS[] = {\n")
|
||||||
|
for lang in languages:
|
||||||
|
f.write(f' LANGUAGE_{lang}_COUNT,\n')
|
||||||
|
f.write("};\n\n")
|
||||||
|
|
||||||
|
f.write("static const char_t** LANGUAGE_VALUES[] = {\n")
|
||||||
for lang in languages:
|
for lang in languages:
|
||||||
f.write(f' LANGUAGE_{lang}_VALUES,\n')
|
f.write(f' LANGUAGE_{lang}_VALUES,\n')
|
||||||
f.write("};\n\n")
|
f.write("};\n\n")
|
Reference in New Issue
Block a user