HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0321
ゆうやん多言語の対応11解決


ゆうやん

リンク

2020/3/21(Sat) 17:26:06|NO.89774

HSPで多言語対応のソフトを作ろうと考えています。
例えば、
Windows 日本語版の場合、日本語表記に
Windows 英語版の場合、英語表記に
Windows 中国語版の場合、中国語表記に
Windows 韓国語版の場合、韓国語表記に
といったソフトを作ることは可能ですか?

可能であれば、スクリプトを載せてもらえれば幸いです。



この記事に返信する


あらや

リンク

2020/3/21(Sat) 19:01:43|NO.89777

ザックリやるとこんな感じでしょうか

#uselib "kernel32.dll" #cfunc GetUserDefaultUILanguage "GetUserDefaultUILanguage" langcode = GetUserDefaultUILanguage(); if( langcode == 0x0409 ) { // 英語(アメリカ) mes "English(USA)"; } if( langcode == 0x0809 ) { // 英語(イギリス) mes "English(England)"; } if( langcode == 0x0404 ) { // 中国語(台湾) mes "台灣"; } if( langcode == 0x0804 ) { // 中国語(中華人民共和国) mes "中國"; } if( langcode == 0x0411 ) { // 日本語 mes "日本語"; } if( langcode == 0x0412 ) { // 韓国語 mes "한국"; }

実際にはそれぞれの言語でファイルを用意し
言語に応じたファイルを開くとした方が良いでしょうね。

<日本語ファイル>
開く
閉じる
開始する
終了する

<英語ファイル>
Open
Close
Start
Finish

<中国語ファイル>
打开
關閉
開工
終止

このようにそれぞれ意味と行を合わせて
使用に応じてメモリーノートパッドを使うとか、

行で分けるのではなく区切り記号を入れてsplit命令で取り出すなどすれば
多言語に対応できるかと思います。



リンク

2020/3/22(Sun) 00:03:12|NO.89780

もう一つ注意しないといけないと思うのは、文字コードですかね。
通常ランタイムを使うと、おそらく中国語やスペイン語などの表示がぶっ壊れます。というか、その言語特有の文字を使うものは全部ぶっ壊れます。
UTF-8のランタイムが、今メモリノートパッドも含めてUTF-8にちゃんと対応できているか、私は調査してないので分からないのですが、作り始める前に、そのへんがちゃんと表示できることをテストするほうが安心できそうです。



MIZUSHIKI

リンク

2020/3/22(Sun) 19:53:46|NO.89789

HSP3.6β2から strexchange という多言語に対応するための命令が追加されているようです。
https://www.onionsoft.net/hsp/v36/doclib/update36.htm#STREXCHANGE
マニュアルとサンプルを一度見てみると良いと思います。

スクリプトソースに手を加えることなく、多言語への文字列置き換えが可能な利点があるようです。
// ただ、ちょっと分かりづらいかも・・・?

あらや さんの使用言語の取得と合わせて使うと良いと思います。



ゆうやん

リンク

2020/3/23(Mon) 17:34:29|NO.89800

皆さん回答ありがとうございます。
hsp3utfとGetUserDefaultUILanguageとstrexchangeを併用することってできませんよね?
hsp3utfでないと、文字化けするみたいなので・・・。



あらや

リンク

2020/3/23(Mon) 22:30:37|NO.89802

strexchangeはまだよくわかりませんが、
GetUserDefaultUILanguageはただのAPIなのでhsp3utfでも使えるはずですよ。



あらや

リンク

2020/3/24(Tue) 00:08:03|NO.89803

追記:
挨拶だけですが、hsp3utfを使用した上で各言語ファイルを用意したところ
『GetUserDefaultUILanguage』も『strexchange』も問題なく使えました。

フォントに"Microsoft JhengHei UI"を使っているのは
中国語や韓国語を表示するためです。


// muitilang.hsp #include "hsp3utf.as" #uselib "kernel32.dll" #cfunc GetUserDefaultUILanguage "GetUserDefaultUILanguage" langcode = GetUserDefaultUILanguage(); if( (langcode == 0x0409) || (langcode == 0x0809) ) { // English strexchange "muitilang_en.strmap" } if( (langcode == 0x0404) || (langcode == 0x0804) ) { // Chinese strexchange "muitilang_cn.strmap" } if( langcode == 0x0411 ) { // Japan strexchange "" } if( langcode == 0x0412 ) { // Korea strexchange "muitilang_ko.strmap" } font "Microsoft JhengHei UI" mes "***こんにちは***"



下記は各言語ファイル準備のソースです(ほぼサンプルそのまま)

// 言語ファイル準備用 #include "hsp3utf.as" #include "hspcmp.as" ;hspcmp.dllを呼び出して、HSPスクリプト->strmap出力を行います ;必ずHSP3.6β2以上のhspcmp.dllを使用してください sdim mesbuf,$10000 sdim rtname,256 fname="muitilang" hspname=fname+".hsp" ; スクリプトファイル名 objname=fname+".strmap" ; strmapファイル名 hsc_ini hspname hsc_objname objname hsc_comp 8 ; strmap出力 res=stat:if res!=0 : dialog "ERROR" : end mes objname+" write done." exist objname if strsize>0 { notesel mesbuf noteload objname } objmode 1 mesbox mesbuf,636,446,5 stop



各言語ファイル
<英語>
〜省略〜
***Hello***

<中国語>
〜省略〜
***你好***

<韓国語>
〜省略〜
***여보세요***



ゆうやん

リンク

2020/3/24(Tue) 20:40:46|NO.89811

あらやさん 回答ありがとうございます。
やってみたのですが、"***.strmap"の内容が文字化けしてできませんでした・・・。
エディタがUnicodeなのが原因でしょうか?



あらや

リンク

2020/3/24(Tue) 21:26:07|NO.89813

忘れていました。。。

先述のソース自体はSJISで書きました。

しかし言語ファイル準備用のソースで出力されたファイルは
hsp3utfを使ったせいなのかUTF-8で保存されています。

ソースは通常のHSPエディタ
言語ファイルの編集はUTF-8が読み書きできるエディタでするのが良いかと。



ゆうやん

リンク

2020/3/24(Tue) 23:11:21|NO.89820

あらやさん 回答ありがとうございます。
その方法しかないみたいですね…。
Unicodeのエディタでないと、ソースに環境依存文字が使えないため、不便です。



MIZUSHIKI

リンク

2020/3/25(Wed) 07:23:57|NO.89822

エディタでの制限があるとなると、多言語への変換を自作してしまったほうが早いかもしれませんね。
下記は以前私が英語版対応をしたときに使ったモジュール(を多言語化してみました)です。

私はUnicode対応のHSPエディタを持っておらず、中国語、韓国語への対応が出来ているかはちょっと分からないので使用する場合は確認願います。
(HSP標準エディタではUnicodeが扱えないので「打开」等の文字が「?」になってしまいます。)

#module lang #uselib "kernel32.dll" #define GetLocaleInfo GetLocaleInfoA #func GetLocaleInfoA "GetLocaleInfoA" sptr,sptr,sptr,sptr #func GetLocaleInfoW "GetLocaleInfoW" wptr,wptr,wptr,wptr #deffunc langInit sdim lpLCData,64 GetLocaleInfo $800/*LOCALE_USER_DEFAULT*/, $1/*LOCALE_ILANGUAGE*/, varptr(lpLCData), 64 return // a=英語(アメリカ), e=英語(イギリス), t=中国語(台湾), c=中国語(中華人民共和国), k=韓国語 #define q if word= #define a if(lpLCData= 0x0409 ){ return #define e if(lpLCData= 0x0809 ){ return #define t if(lpLCData= 0x0404 ){ return #define c if(lpLCData= 0x0804 ){ return #define k if(lpLCData= 0x0412 ){ return #define _ }else: // ここに多言語対応したい単語(文字列)を登録する。 // ・変換前(日本語)を q"": で括り、他言語を a""_ 等で括ります。 詳細は上記ソースを参照ください。 // ・いっぱい書き換えるため、簡単な表記に出来るようにしているだけです。 #defcfunc w str word q"開く" : a"OPEN"_ c"打开"_ e"Open"_ k"열다"_ q"閉じる" : a"CLOSE"_ c"關閉"_ e"Close"_ k"닫기"_ q"開始する" : a"START"_ c"開工"_ e"Start"_ k"스타트"_ q"終了する" : a"FINISH"_ c"終止"_ e"Finish"_ k"끝"_ return word #global langInit // // ↑ ここまでモジュール // #include "hsp3utf.as" // ↓を変更して、強制的に他の言語になったつもりにしてみる lpLCData@lang = 0x0409 mes "<< "+w("開く")+" >>" mes ">> "+w("閉じる")+" <<" mes "-- "+w("開始する")+" ->" mes "xx "+w("終了する")+" xx"



ゆうやん

リンク

2020/3/25(Wed) 16:26:39|NO.89830

MIZUSHIKIさん 回答ありがとうございます。
UTF-8で、strmapではダメみたいなので、MIZUSHIKIのスクリプトの方法で代用してみようと思います。
ほかの皆さんも回答ありがとうございました!

>私はUnicode対応のHSPエディタを持っておらず、
エディタのUnicode版はここからダウンロードできると思います。
hsed3u8.exeだけをHSPインストールフォルダに入ればOK。
https://ux.getuploader.com/tds12_hsp/download/1



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.89774への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2018(c) All rights reserved.