Openbox - 共通事項 - メニュー - obmenu-generator - アイテム名日本語化

 クラウディア
1. 概要
2. ファイルリスティング
3. アイテム名日本語化
4. 実行

1. 概要

 これは、

/usr/share/applications/
 配下を

~/.local/share/applications/
 へまるまるコピーして

Name=
 の内容へ

Name[ja]=
 の中身をまるまる写しちゃうというものです。

2. ファイルリスティング

 まず、ファイルをリストする、サブモジュールを作成します。

vi ~/FileList.pm
 以下を記述します。
#
package FileList;

=encoding utf8

=head1 NAME - 名称

FileList - ファイルリストクラス

=head2 SYNOPSIS - 使い方

use FileList;

$list = FileList->new();

$filelist = $list->get(ディレクトリ, 拡張子);

=head1 更新履歴

新規:2018-01-09 ShowKit

=head2 Copyright

Copyright (C) 2018-01-09 Show.Kit by SingNet

=cut

use strict;

sub new
{
    my ($class) = @_;
    my $self = {};
    return bless($self, $class);;
}

sub get
{
    my ($self, $root, $ext, $filelist) = @_;
    opendir(DIR, $root) or die("Can't get directory.:$root($!)");

    my @list = grep /^[^\.]/, readdir DIR;
    closedir DIR;

    foreach my $file (@list)
    {

        if (-d "$root$file")                        #   ディレクトリの場合は再帰検索を行う
        {
            $filelist = $self->get("$root$file/", $ext, $filelist);
            next;
        }

        if ($file =~ /$ext$/)                       #   ファイルの場合は指定した拡張子と一致するならばリストする
        {
            push @$filelist, "$root$file";
        }
    }

    return $filelist;
}

1;

3. アイテム名日本語化

 「.desktop」のコピー、日本語化、「obmenu-generator」の実行まで一気にやっちゃいます。

vi ~/obmenu-japanize.pl
 以下を記述します。
#!/usr/bin/perl

BEGIN
{
    use lib './';
};

use strict;
use FileList;

my $ext = 'desktop';
my $from = '/usr/share/applications/';
my $to   = $ENV{HOME}.'/.local/share/applications/';

sub main
{
    my @argv = @_;

    #   システムファイルをユーザローカルにコピー

    system('cp '. $from .'*.desktop '. $to .'.');
    system('chmod 644 '. $to .'*.desktop');

    my $list = FileList->new();
    my $filelist = $list->get($to, $ext);               #   .desktop をリストする

    foreach my $name (sort(@$filelist))                 #   全 .desktop ファイルを処理
    {
        my $fh   = IO::File->new();
        my @read = undef;

        if (substr($name, -26, 26) eq 'thunar-bulk-rename.desktop')
        {
        	next;
        }

        if ($fh->open("< $name"))                       #   全行読込
        {
            @read = <$fh>;
            $fh->close;
        }
        else
        {
            next;
        }

        my $item   = undef;
        my $janame = undef;

        for my $line (@read)                            #   Name= 取り出し
        {
            my ($title, $itemname) = split(/=/, $line);

            if ($title eq 'Name')                       #   Name=
            {
                if ($item == undef)
                {
                    $janame = $itemname;
                }
            }

            if ($title eq 'Name[ja]')                   #   Name[ja]=
            {
                $janame = $itemname;

                if (substr($janame, 0, 4) eq 'GIMP')
                {
                    $janame = 'GIMP';
                }
                last;
            }
        }

        my @write = undef;                              #   書込み内容

        for my $line (@read)                            #   Name= 取り出し
        {
            my ($title, $itemname) = split(/=/, $line);

            if ($title eq 'Name')                       #   Name=
            {
                if (defined($janame))
                {
                    push(@write, "Name=$janame");
                }
                else
                {
                    push(@write, $line);
                }
            }
            else                                        #   Name= 以外はそのまま出力
            {
                push(@write, $line);
            }
        }

        if ($fh->open("> $name"))                       #   書き込みオープン
        {
            print $fh @write;                           #   書き込み
            $fh->close;
        }
        else
        {
            next;
        }
    }

    system('obmenu-generator -i -s -c');
}

main(@ARGV);

 ちょっとメモを残しておきます。  基本的に、「*.desktop」をコピーして、「Name=」の文字列を「Name[ja]=」の文字列に置き換えているだけです。  13行目は、当初

my $to   = '~/.local/share/applications/';
 と記述しておりましたが、「perl」で、「~」はシンボル展開されないので、上記の記述に改めました。  32~35行は、「thunar-bulk-rename.desktop」は、日本語化すると文字化けするので、日本語化しないようにしています。  66~69行は、「GIMP」の名称が長ったらしいので、短くしています。

4. 実行

 2つのモジュール

FileList.pm
obmenu-japanize.pl
 は、例では、ユーザホームの直下に置いていますが、2つを同じ位置に置いておくならば、どこに置いていても構いません。  グラフィックログインしたユーザで、端末を開いて、モジュールを配置したディレクトリで

perl obmenu-japanize.pl
 とすれば、メニューを更新できます。  新規にアプリケーションをインストールした場合は、毎回これを実行します。
バリューコマース
リクルートエージェント
 
 
カウンタバックグラウンド