存档: 标签: ‘Linux’

解决mplayer中文字幕显示乱码与ibus不能输入中文

没有评论 2009年12月30日

解决mplayer中文字幕显示乱码

忘记啥时候开始,我的mplayer显示中文字幕是乱码,其实也不完全叫做乱码就是所有字幕只显示一根横线偶尔能显示正确的数字,而我的mplayer的配置文件很久都没改动过了,配置文件的内容也是这种网上能找到的:
在mplayer得gui界面点击右键打开配置,字幕选项卡下设置Encoding为cp936;在字体选项卡下设置中文字体,并使用Encoding为Unicode。
当上面的方法无效时,请输入

locale

查看下LC_CTYPE是否为zh_CN.*,如果不是请打开”/etc/environment”,修改或添加

LC_CTYPE="zh_CN.UTF-8"

我也是在前段时间更换系统字体的时候,发现很多字体在全英文界面下表现很不错,这时我才反应过来,我使用的英文操作系统,虽然有中文语言包,但是locale的设置应该全是en_US.UTF-8,估计是LC_CTYPE的原因造成的,于是在/etc/environment里加了一段LC_CTYPE=”zh_CN.UTF-8″便解决中文字幕乱码(其实该说是横码)问题。

解决ibus不能输入中文

同时得以解决的是ibus拼音输入法有时不能输入中文的问题。之前ibus拼音输入法动不动就会“失灵”,没法输入中文,状态条直接消失不见。
我估计的原因是,ibus只是一个输入法框架,它会为各种语言输入提供一个基础,其中包括英文,所以LC_CTYPE为en_US.UTF-8的时候能启动ibus,但是在具体负责中文输入的还是ibus-pinyin这个模块,就是说最后中文输入法还是得和LC_CTYPE挂上勾,还是要设置为zh_CN.*。

为gtk程序实现国际化和本地化

1条评论 2009年12月22日

这是一个学习笔记,内容是在Linux系统下以一个简单的gtk程序为基础,为其添加对i18n和l10n的支持。从而了解怎么实现gtk程序的国际化和本地化。

基本的概念

  • 什么是i18n,i18n是internationalization的简称,指程序能提供不同语言显示的国际化支持。
  • 什么是l10n,l10n是localization的简称,指程序的能拥有某一特定语言支持的本地化。

更多的信息可以自行google或者参看一下这里 http://www.linuxforum.net/doc/i18n-new.html

  • 基本原则:标记代码中用户在程序使用过程可见的字符串。
  • 基本原理:整个过程是代码中使用 _()和N_()的方式来标记你需要翻译的字符串(即用户在使用过程可见的字符串),提取并翻译这些字符串后,将其单独格式化,存放到语言文件夹。

国际化

  1. 首先寻找你要翻译的字符串
  2. 然后gettext()函数将需要翻译的字符串进行标记
  3. 进行编译

本地化

  1. 提取被比较的字符串
  2. 进行翻译
  3. 格式化
  4. 将文件存放到本地文件夹

国际化具体过程

我们先来看看gtk程序的国际化。
首先是在需要提供国际化的程序代码里增加一些我们将要用到的库和申明。

//要包含一个头文件。
#include    <glib/gi18n.h>    //versions 2.4及更高版本使用

//同时需要一些基本的申明。
#define  GETTEXT_PACKAGE    "Hello_I18n" // 可以换成你需要的名字
#define  LOCALEDIR    "mo"        //定义本地语言文件存放路径

//以及对gettext()进行初始化
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);

现在可以对我们代码中需要翻译的字符串进行标记了。
例:
原代码如下

gtk_window_set_title(GTK_WINDOW(window),  "Hello I18n!");

需要标记的字符串为“Hello I18n!”,上面的语句说明了在程序的标题栏里要显示的字符串为“Hello I18n!”,那么需要将上面的语句改为下面这样:

gtk_window_set_title(GTK_WINDOW(window),  _("Hello I18n!"));

但是如果我们要对静态字符串进行标记的话,就要使用另一种方式N_().
例:

const char *warning = "The alien is behind you! \n";

我们需要将其改为:

const char *warning = N_("The alien is behind you! \n");

就这样我们完成了程序的国际化,你可以编译你的程序。

本地化具体过程

而做完国际化后,我们需要做的是本地化。
在终端下面通过xgettext命令,我们可以将我们代码test.c中标记的字符串提取出来并保存在test.po里:

xgettext -a -o test.po test.c

我们打开test.po可以看见一些信息
例如:

msgid "test.\n"
msgstr ""

那么我们本地化就是对这样的字符串根据不同的地区语言进行翻译,例如我们的中文:

msgid "test.\n"
msgstr "测试。\n"

并且修改

charset=CHARSET\n

charset=utf-8\n

然后保存。
接下来格式化文件:

msgfmt -o test.mo test.po

然后将test.mo文件复制到LOCALEDIR下面对应的文件夹里。例如,我们在前面的例子里定义LOCALEDIR为mo。

cp test.mo mo/zh_CN/LC_MESSAGES

现在如果我们的LC_ALL为zh_CN,那么我们如果执行这个程序,就可以看见中文了。而不是原来的英文或者其他语言。

一个国际化以后的简单例子:

#include    <gtk/gtk.h>
#include    <glib/gi18n.h>

#define GETTEXT_PACKAGE    "Test"
#define LOCALEDIR    "mo"

int main ( int   argc,
 char *argv[] )
{
 GtkWidget *frame;
 GtkWidget *label;

 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
 textdomain(GETTEXT_PACKAGE);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
 gtk_window_set_title(GTK_WINDOW(window),  _("Hello I18n!"));
 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
 g_signal_connect(G_OBJECT(window), "destroy",
 G_CALLBACK(gtk_main_quit),
 NULL);
 gtk_container_set_border_width(GTK_CONTAINER(window), 10);
 frame = gtk_frame_new(_("WARNING"));
 label = gtk_label_new(_("\n  The alien is behind you!\n"));
 gtk_container_add(GTK_CONTAINER(frame), label);
 gtk_container_add(window, frame);
 gtk_widget_show_all(window);
}

清理电脑里的文件时发现的笔记,写了有些年头了,而现在,似乎大家都用python在写gtk的程序了。
P.S 有时做一些贡献很简单,比如为自己喜欢的软件实现本地化。

当update时遇见GPG error

1条评论 2009年8月1日

在执行apt-get update(aptitude update)更新的时候,有时会出现类似这样的错误:

W: GPG error: http://ppa.launchpad.net testing Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 671D1AEFF1D58512
或者是
W: GPG error: http://ppa.launchpad.net testing Release: 由于没有公钥,下列签名无法进行验证: NO_PUBKEY 665F9AEFE1098513

如果是只想解决问题,请直接执行如下2条命令:

gpg --keyserver subkeys.pgp.net --recv-keys 671D1AEFF1D58512
gpg --armor --export 671D1AEFF1D58512 | apt-key add -

说明:
subkeys.pgp.net可以是keyserver.ubuntu.com或者www.keyserver.net等
–recv-keys后面的参数呢,就是你的NO_PUBKEY后面的值

然后就可以继续执行apt-get update(aptitude update)更新了。

如果想知道上面的命令是什么意思,可以简单地这样来说明:

gpg --keyserver subkeys.pgp.net --recv-keys 671D1AEFF1D58512
#从subkeys.pgp.net获取671D1AEFF1D58512的密钥

gpg --armor --export 671D1AEFF1D58512 | apt-key add -
#将671D1AEFF1D58512的密钥保存并添加到本地的apt的信任数据库里

解决ubuntu下u盘的无法自动挂载

没有评论 2009年7月8日

突然系统不自动挂载我的u盘了。其实不是不自动挂载,而是不识别usb了。

这里记录下解决不自动挂载的方法:

sudo rmmod ehci_hcd

重新插入u盘就会,发现u盘已经自动挂载上了。

记录下,方便自己以后查找。