使用gettext本地化文本

时间:2010-12-29 10:06:26

标签: ubuntu localization gtk gnome

我有一个英文文本,我想把它转换成法文。

我遵循的顺序如下:

  1. 使用终端中的xgettext命令生成所有文本,创建.pot文件
  2. 从.pot文件创建.po文件
  3. 从.po文件创建.mo文件
  4. 我已将.mo文件复制到“/ usr / share / locale / fr / LC_MESSAGES”

    这是我的main.c文件代码:

    int main()
    
    {
    
        setlocale(LC_ALL,"");
        bindtextdomain("main","/usr/share/locale");
        textdomain("main");
        printf( gettext("Hello world\n"));
        return (0);
    }
    

    当我执行程序时,文本的法语版本不会在终端中打印。 这个问题可能是什么原因?

    这是我的fr.po文件

    # French translations for GNU main package.
    # Copyright (C) 2010 THE GNU main'S COPYRIGHT HOLDER
    # This file is distributed under the same license as the GNU main package.
    #
    msgid ""
    msgstr ""
    "Project-Id-Version: GNU main 0.1\n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2010-12-29 10:14+0530\n"
    "PO-Revision-Date: 2010-12-29 12:21+0530\n"
    "Last-Translator: Lenin\n"
    "Language-Team: French\n"
    "Language: fr\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=ASCII\n"
    "Content-Transfer-Encoding: 8bit\n"
    "Plural-Forms: nplurals=2; plural=(n > 1);\n"
    
    #: main.c:29
    #, c-format
    msgid "Hello world\n"
    msgstr "Bonjour tout le monde\n"
    

    这是我从当前目录调用msgfmt:

    msgfmt -c -v -o main.mo fr.po
    

1 个答案:

答案 0 :(得分:3)

您无需触摸系统文件/目录。如果你正在发展,你不应该碰他们。

我尝试了以下代码:

#include <stdio.h>
#include <locale.h>
#include <libintl.h>

int main(int argc, char **argv)
{
    setlocale(LC_ALL, "");
    bindtextdomain("main", ".");
    textdomain("main");
    printf(gettext("Hello world\n"));
    return (0);
}

这与您的代码非常相似,只是我在我的开发目录(当前版本)中测试本地化。

创建翻译模板

$ xgettext -o main.pot main.c

使用模板创建要翻译的文件:

$ msginit --no-translator -l es -o es.po -i main.pot
Created es.po.
$ msginit --no-translator -l fr -o fr.po -i main.pot 
Created fr.po.

编辑和翻译文件。将 Project-Id-Version 设置为 main 并翻译行。在这种情况下,根据我的源代码第23行。

为翻译创建目标目录:

$ mkdir -p es/LC_MESSAGES
$ mkdir -p fr/LC_MESSAGES

编译并安装翻译:

$ msgfmt -o es/LC_MESSAGES/main.mo es.po 
$ msgfmt -o fr/LC_MESSAGES/main.mo fr.po 

编译程序:

$ make main
cc     main.c   -o main

运行程序:

$ LANGUAGE=C ./main 
Hello world
$ LANGUAGE=es ./main
Hola mundo
$ LANGUAGE=fr ./main
Bonjour tout le monde

那就是。

您可能希望在翻译之前编译程序并修复错误。