gpt4 book ai didi

c - C 控制台应用程序中的双语程序

转载 作者:行者123 更新时间:2023-12-04 11:32:24 25 4
gpt4 key购买 nike

我一直在尝试实现一种使我的程序双语化的方法:用户可以选择程序是显示法语还是英语(在我的例子中)。我做了很多研究和谷歌搜索,但我仍然找不到一个很好的例子来说明如何做到这一点:/

我读到了有关 gettext 的内容,但由于这是针对学校的项目,我们不允许使用外部库(而且我必须承认,即使我尝试过,我也不知道如何让它工作!)

有人还建议我为每种语言使用一个数组,我绝对可以做到这一点,但我发现这个解决方案非常难看。

我想到的另一种方法是使用不同的文件,每行都有句子,这样我就可以在需要时为正确的语言检索正确的行。我认为我可以完成这项工作,但它似乎也不是最优雅的解决方案。

最后,一位 friend 说我可以为此使用 DLL。我已经对此进行了调查,它确实似乎是我能找到的最好的方法之一......问题是我能找到的关于这件事的大多数资源都是为 C# 和 C++ 编码的,我仍然不知道我会怎么做在 C:/中实现我可以理解它背后的想法,但不知道如何在 C 中处理它(完全不知道!我不知道如何创建 DLL,调用它,从中检索正确的东西或任何东西>_<)

有人能给我指出一些我可以使用的有用资源,或者写一段代码来解释事情的工作方式或应该完成的方式吗?这将是非常棒的!

提前致谢!

(顺便说一句,我使用 visual studio 2012 和 C 代码)^^

最佳答案

如果您不能使用第三方库,那么请编写您自己的库!不需要 dll。

基本思想是每个 locale 都有一个文件女巫包含文本资源的映射(键=值)。

文件名可以是这样的

resources_<locale>.txt

哪里<locale>可能类似于 en , fr , de

当您的程序启动时,它首先读取指定语言环境的资源文件。

您最好将每个键/值对存储在一个简单的 struct 中。 .

您的读取函数将所有键/值对读入 hash table女巫提供了非常好的访问速度。另一种方法是按 key 对包含键/值对的数组进行排序然后使用 binary search在查找时(不是最佳选择,但比每次都遍历所有条目要好得多)。

然后你必须写一个函数 get_text女巫将要查找的文本资源的键作为参数,并返回针对指定区域设置读取的相应文本。您必须处理没有映射的键,最简单的方法是返回键。

这是一些示例代码(使用 qsortbsearch ):

#include<stdio.h> 
#include<stdlib.h>
#include<string.h>

#define DEFAULT_LOCALE "en"
#define NULL_ARG "[NULL]"

typedef struct localized_text {
char* key;
char* value;
} localized_text_t;

localized_text_t* localized_text_resources = NULL;
int counter = 0;

char* get_text(char*);
void read_localized_text_resources(char*);
char* read_line(FILE*);
void free_localized_text_resources();
int compare_keys(const void*, const void*);
void print_localized_text_resources();


int main(int argc, char** argv)
{
argv++;
argc--;

char* locale = DEFAULT_LOCALE;

if(! *argv) {
printf("No locale provided, default to %s\n", locale);
} else {
locale = *argv;
printf("Locale provided is %s\n", locale);
}

read_localized_text_resources(locale);

printf("\n%s, %s!\n", get_text("HELLO"), get_text("WORLD"));
printf("\n%s\n", get_text("foo"));

free_localized_text_resources();

return 0;
}


char* get_text(char* key)
{
char* text = NULL_ARG;
if(key) {
text = key;
localized_text_t tmp;
tmp.key = key;
localized_text_t* result = bsearch(&tmp, localized_text_resources, counter, sizeof(localized_text_t), compare_keys);
if(result) {
text = result->value;
}
}
return text;
}

void read_localized_text_resources(char* locale)
{
if(locale) {
char localized_text_resources_file_name[64];
sprintf(localized_text_resources_file_name, "resources_%s.txt", locale);
printf("Read localized text resources from file %s\n", localized_text_resources_file_name);
FILE* localized_text_resources_file = fopen(localized_text_resources_file_name, "r");
if(! localized_text_resources_file) {
perror(localized_text_resources_file_name);
exit(1);
}
int size = 10;
localized_text_resources = malloc(size * sizeof(localized_text_t));
if(! localized_text_resources) {
perror("Unable to allocate memory for text resources");
}

char* line;
while((line = read_line(localized_text_resources_file))) {
if(strlen(line) > 0) {
if(counter == size) {
size += 10;
localized_text_resources = realloc(localized_text_resources, size * sizeof(localized_text_t));
}
localized_text_resources[counter].key = line;
while(*line != '=') {
line++;
}
*line = '\0';
line++;
localized_text_resources[counter].value = line;
counter++;
}
}
qsort(localized_text_resources, counter, sizeof(localized_text_t), compare_keys);
// print_localized_text_resources();
printf("%d text resource(s) found in file %s\n", counter, localized_text_resources_file_name);
}
}


char* read_line(FILE* p_file)
{
int len = 10, i = 0, c = 0;
char* line = NULL;

if(p_file) {
line = malloc(len * sizeof(char));
c = fgetc(p_file);
while(c != EOF) {
if(i == len) {
len += 10;
line = realloc(line, len * sizeof(char));
}
line[i++] = c;
c = fgetc(p_file);
if(c == '\n' || c == '\r') {
break;
}
}

line[i] = '\0';

while(c == '\n' || c == '\r') {
c = fgetc(p_file);
}
if(c != EOF) {
ungetc(c, p_file);
}

if(strlen(line) == 0 && c == EOF) {
free(line);
line = NULL;
}
}

return line;
}


void free_localized_text_resources()
{
if(localized_text_resources) {
while(counter--) {
free(localized_text_resources[counter].key);
}
free(localized_text_resources);
}
}


int compare_keys(const void* e1, const void* e2)
{
return strcmp(((localized_text_t*) e1)->key, ((localized_text_t*) e2)->key);
}


void print_localized_text_resources()
{
int i = 0;
for(; i < counter; i++) {
printf("Key=%s value=%s\n", localized_text_resources[i].key, localized_text_resources[i].value);
}
}

与以下资源文件一起使用

resources_en.txt

WORLD=World
HELLO=Hello

resources_de.txt

HELLO=Hallo
WORLD=Welt

resources_fr.txt

HELLO=Hello
WORLD=Monde

运行

(1) out.exe     /* default */
(2) out.exe en
(3) out.exe de
(4) out.exe fr

输出

(1) Hello, World!
(2) Hello, World!
(3) Hallo, Welt!
(4) Hello, Monde!

关于c - C 控制台应用程序中的双语程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16199678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com