2012年11月13日火曜日

Garmin etrex 30を購入しました

まずは、VLGothicを入れてみた。

次にメニューを日本語化しようとして、Garminのサイトに行き、日本語版ファームを解凍し、
Japanese.gttを入手。
gttはxmlでグロッサリが記述されている。
utf-8でBOMつき、改行コードはCRLF、しかもなぜかアトリビュートは777だった。
喜び勇んで、そのままetrex 30に入れたのだが、動かなかった。
やっぱ日本語版 etrex 30J とは何か違うのか?
etrex30内部のSpanish.gttを見ると、項目が増えているように見える。
これらも入れてやらないと動かないってことだろうか?

こういうときに自分が使うのはperlだ。(Python でもいいと思うけど)
今回はxmlを使うので、cpan使ってXML::DOMとかXML::XPathを入れた。
(ちなみにmacでやってる。)

etrex 30に入っていたSpanish.gtt(別にGerman.gttでもいいんだけど)に対して、
etrex 30J用のファームを解凍して手に入れたJapanese.gttを当てていこうと、
以下のようにコーディング

【使い方】

入手したJapanese.gttはJapanese.gtt.orgへ変更しておく


./conv.pl > Japanese.gtt
とやってリダイレクトする

【注意】
お約束だけど、個人責任でよろしく
できあがったものはutf-8だけど、BOMなし、改行コードはLFのみになる。
アトリビュートは手動で変更したが、必要かどうかわからない。

--- conv.pl ---


#!/usr/bin/perl

use utf8;
use XML::DOM;
use XML::DOM::XPath;

my $parser = new XML::DOM::Parser;
my $jDoc = $parser->parsefile("Japanese.gtt.org");
my $sDoc = $parser->parsefile("Spanish.gtt");
my $jTags;

#日本語からtagstrの組を覚える
foreach $node($jDoc->findnodes("//gtt/str/*")){
$tag = $node->getTagName;
if($tag =~ /tag/){
$tagvalue = $node->getFirstChild->getNodeValue();
# print "$tagvalue\n";
}
# Garmin さん、XMLなのに順番に依存する作りは良くないよ
if($tag =~ /txt/){
$txtvalue = $node->getFirstChild->getNodeValue();
$jTags{$tagvalue} = $txtvalue;
# print "$txtvalue\n";
}
}

#スパニッシュのヘッダを書き換える
foreach $node($sDoc->findnodes("//gtt/hdr/*")){
$tag = $node->getTagName;
if ($tag =~ /lang/){
$node->getFirstChild->setNodeValue("Japanese");
}
if ($tag =~ /desc/){
$node->getFirstChild->setNodeValue("Japanese");
}
if ($tag =~ /cpage/){
$node->getFirstChild->setNodeValue("Japanese");
}
}

#スパニッシュのtagを読んで、Japanesestrを吐き出す
foreach $node($sDoc->findnodes("//gtt/str/*")){
$tag = $node->getTagName;
if ($tag =~/tag/){
$tagvalue = $node->getFirstChild->getNodeValue();
# print "$tagvalue\n";
}
if ($tag =~/txt/){
$txtvalue = $node->getFirstChild->getNodeValue();
if($jTags{$tagvalue} ne ""){
$txtvalue = $jTags{$tagvalue};
}
$node->getFirstChild->setNodeValue($txtvalue);
# print "$txtvalue\n";
}
}

print $sDoc->toString();



---- end ----

【ぼやき】
なんか巷のサイトを見ると、xmlをファイルから読み込むのに面倒くさい事してたり、
getElementsByTagNameでXPathも使わずに読み込んでたり、
どうも自分の感性と違う使い方をしてらっしゃる。

今回入手したGarmin のXMLもひどいもんだ。

こんな感じになってるんだけど
<str>
    <tag>TXT_NANTARA</tag>
    <txt>なんたら</txt>
</str>

<str>
    <tag>TXT_KANTARA</tag>
    <txt>かんたら</txt>
</str>


自分ならこうする
<str id="TXT_NANTARA">なんたら</str>

<str id="TXT_KANTARA">かんたら</str>


理由は上記スクリプトの中の文句を見れば、わかってもらえると思う。