以下、本発明の実施の形態を、図面を参照して詳細に説明する。
図1は、プログラム自動生成装置で生成するプログラムの定義ファイル群、翻訳文字列の対象となるリソースファイルを抽出するプログラム、プログラム生成部の構成の一例を示す図である。
アプリケーション定義ファイル記憶部110は、図3で後述するアプリケーション定義GUI(グラフィカルユーザインタフェース)で定義された、アプリケーションプログラムを自動生成するための定義を格納するための記憶部である。すなわち、アプリケーションを生成するための定義であるアプリケーション定義ファイルをアプリケーション定義ファイル記憶手段に登録する。
図1の例では、3つのアプリケーションの定義が格納されている。1つのアプリケーション定義111(a〜c)は、1または複数の入出力定義ファイル112、メッセージ定義ファイル113、その他定義ファイル(104)等から構成されており、定義ファイルの種類毎に、異なるフォルダに格納されている。また、例えば1つの入出力定義ファイル112においては、アプリケーションのGUIと、当該画面で入出力されるデータベースのデータ項目との対応などが定義されている。
例えばアプリケーションの定義は、クライアント端末で開発者が図3のGUIを操作することで行い、アプリケーションプログラムの生成まで当該クライアント端末で行っても良い。その場合、当該クライアント端末にプログラムのファイル群が格納されても良い。また、クライアント端末からの指示によりアプリケーションプログラム自動生成のためのサーバにプログラムのファイル群が格納されても良い。以下、クライアント端末、アプリケーション自動生成サーバ(装置)のいずれの場合であっても、情報処理装置100として説明する。
リソーステンプレート生成部120は、後述するリソースファイル記憶部141に格納されるファイルのうち、オリジナル言語に対応するファイルを、リソーステンプレートとして出力するための機能ブロック図である。これらの処理は図6から図12を用いて詳述する。
リソーステンプレート出力先指定部121(図6の600にて説明)は、マルチ言語化する1つのアプリケーションを指定し、そのアプリケーションに関連する定義ファイルから翻訳対象となる文字列を抽出するファイルの出力先を指定するGUIである。
定義ファイル解析部122(図9、図10のフローチャートで説明)は、指定されたアプリケーションの定義ファイルを解析する。具体的には、定義ファイル(例えばXMLの階層データで記載されている)を解析して、必要な情報を抽出する。抽出した結果は、例えば図11のようにメモリ上に展開される。
リソースキー生成部123、リソース値取得部124、リソーステンプレート出力部125(いずれも図12のフローチャートで説明)は、定義ファイル解析部122で解析した結果(例えば図11のメモリ上に展開した情報)から、リソースキーとリソース値を生成し、対応付けてリソーステンプレート(ファイル)に出力される。なお、原言語(例えば、本実施形態ではアプリケーション定義ファイルで定義に使用している「日本語」)は、リソーステンプレート出力部125(リソースファイル生成部)で出力した結果が、そのまま原言語(日本語)のリソースファイルとなる。
なお、リソースキー生成部123は、重複管理部126を含む。重複管理部126は、同一のリソース値が割り当てられるリソースキーを検出(リソース値の重複を検出)するための、条件を管理する箇所である。また、重複検出を行うか否かについての設定も行う。なお、重複については後述の第二の実施形態において説明を行う。
リソーステンプレートファイルは、図3のアプリケーション定義GUIで定義された入出力定義ファイル112、メッセージ定義ファイル113におけるリソース値(例えば日本語での表示文字列)を含む。そのファイルを日本語のリソースファイル142とする。
日本語のリソースファイル142、および必要に応じて人手により翻訳した他の言語リソースファイル(図1の例では、英語、中国語、韓国語など)をアプリケーションサーバ140のリソースファイル記憶部141に配置する。
プログラム生成部130は、アプリケーション定義ファイル記憶部110に記憶された入出力定義ファイル112、メッセージ定義ファイル113、その他定義ファイル114に基づき、アプリケーション143を生成する。その際に、生成されるプログラムにおけるリソース値(文字列)のかわりに、対応するリソースキーを埋め込む。詳細は図16および図17で説明する。
アプリケーション143は、アプリケーションサーバ140に配置された後、リソースファイル記憶部141に配置されたリソースファイル142を参照する。アプリケーション143が実行される際には、リソースファイル142から指定の言語のものを選択し、リソースキーは、対応するリソース値(文字列)に置き換えられて実行される。また必要に応じてリソースファイル142(言語)は切り替えられる。詳細は図13および図18で説明する。
図2は、本発明の実施形態に係わる情報処理装置、アプリケーションサーバのハードウェア構成の一例を示すブロック図である。
図2に示すように、情報処理装置100、アプリケーションサーバ140は、システムバス204を介してCPU(Central Processing Unit)201、RAM(Random Access Memory)202、ROM(Read Only Memory)203、入力コントローラ205、ビデオコントローラ206、メモリコントローラ207、通信I/Fコントローラ208等が接続された構成を採る。 CPU201は、システムバス204に接続される各デバイスやコントローラを統括的に制御する。
また、ROM203あるいは外部メモリ211には、CPU201の制御プログラムであるBIOS(Basic Input/Output System)やOS(Operating System)や、各サーバあるいは各PCが実行する機能を実現するために必要な後述する各種プログラム等が記憶されている。また、本発明を実施するために必要な情報が記憶されている。なお外部メモリはデータベースであってもよい。
RAM202は、CPU201の主メモリ、ワークエリア等として機能する。CPU201は、処理の実行に際して必要なプログラム等をROM203あるいは外部メモリ211からRAM202にロードし、ロードしたプログラムを実行することで各種動作を実現する。
また、入力コントローラ205は、キーボード(KB)209や不図示のマウス等のポインティングデバイス等からの入力を制御する。
ビデオコントローラ206は、ディスプレイ210等の表示器への表示を制御する。尚、表示器は液晶ディスプレイ等の表示器でもよい。これらは、必要に応じて管理者が使用する。
メモリコントローラ207は、ブートプログラム、各種のアプリケーション、フォントデータ、ユーザファイル、編集ファイル、各種データ等を記憶する外部記憶装置(ハードディスク(HD))や、フレキシブルディスク(FD)、あるいは、PCMCIA(Personal Computer Memory Card International Association)カードスロットにアダプタを介して接続されるコンパクトフラッシュ(登録商標)メモリ等の外部メモリ211へのアクセスを制御する。
通信I/Fコントローラ208は、ネットワーク104を介して外部機器と接続・通信し、ネットワークでの通信制御処理を実行する。例えば、TCP/IP(Transmission Control Protocol/Internet Protocol)を用いた通信等が可能である。
尚、CPU201は、例えばRAM202内の表示情報用領域へアウトラインフォントの展開(ラスタライズ)処理を実行することにより、ディスプレイ210上に表示することが可能である。また、CPU201は、ディスプレイ210上のマウスカーソル(図示しない)等によるユーザ指示を可能とする。
本発明を実現するための後述する各種プログラムは、外部メモリ211に記録されており、必要に応じてRAM202にロードされることによりCPU201によって実行されるものである。さらに、上記プログラムの実行時に用いられる定義ファイルおよび各種情報テーブル等も、外部メモリ211に格納されており、これらについての詳細な説明についても後述する。
図3は、開発者がアプリケーションを開発する際に、各種定義(入出力定義ファイル、メッセージ定義ファイルなど)を行うためのアプリケーション定義GUIの一例を示す図である。
図3のアプリケーション定義GUI300においては、例としてアプリケーションがフォルダ、APPLY_SYSYTEMにて開発されている(アプリケーションID「APPLY_APP」、アプリケーション名「交通費申請アプリ」)。また、定義フォルダ表示欄301においては、定義フォルダが例えば「io 入出力」、「msg メッセージ」などの定義ファイルの種類毎に用意されている。図3の例では、「io 入出力」の中から「交通費申請リスト」の定義ファイル「APPLY_LIST」が選択されているが、定義ファイルは1つの画面に相当するものであり詳細は、詳細はファイル定義欄303に表示される。本実施形態の説明では、主に入出力定義ファイル「APPLY_LIST」を例として説明を進める。
ファイル定義欄303には、項目タイプ304、項目コード305、名前306などのデータ項目が表示されている。縦方向に複数行のデータが定義されているが、これらは1つの画面を構成する要素である。
項目タイプ304は、(該当する1行で定義される)データのタイプを表す。具体的には、アプリケーションのユーザにより入力される「入力」(I)、文字列を表示するための「出力」(O)、何らかの処理を実行するためのボタンなどを示す「アクション」(A)などがある。
項目コード305は、「交通費申請リスト」の定義ファイル「APPLY_LIST」の中で該当する1行を一意的に特定するためのコードである。
名前306は、該当する行により定義される項目が「交通費申請リスト」画面において表示される際の文字列を定義する。例えば入力項目として「ステータス」(307)が表示されるように定義されている。
さらに、図3の例では、「ステータス」(307)の行がフォーカスされており、ファイル定義欄303の下側に、選択行詳細定義画面308が表示されている。選択行詳細定義画面308における選択リスト固定値309に選択肢を記載すると、対応する行はドロップダウンリストとなる。「ステータス」(307)の例では、「:すべて|wait_approve:承認待ち|closed:完了」が指定されている。この定義は、デフォルトでは「すべて」(対応する項目コードなし)が表示されており、ユーザが「承認待ち」(対応する項目コードはwait_approve)、「完了」(対応する項目コードはclosed)を選択可能であることを示している。
以上で、図3のアプリケーション定義GUI300の構成と定義項目の内容についての説明を完了する。
図4は、プログラム自動生成装置で生成されたアプリケーションの一例として交通費申請リストの表示状態を示す図である。
交通費申請リスト画面400は、画面のタイトル(401)、ドロップダウンリスト及び関連する項目(402)、データ項目の名前(403:「申請ID」〜「理由」など)、申請した交通費のデータ(403の下側の各行)から構成されている。
さらにドロップダウンリスト及び関連する項目(402)は、ドロップダウンリストのタイトルとなる文字列「ステータス」、ドロップリスト本体(デフォルトで「すべて」が表示されている)、ドロップダウンリストから項目選択後に押下するボタン(アクション「絞込み」)から構成されている。
また、Application List画面410は、交通費申請リスト画面400の英語版である。後述する方法でアプリケーション定義ファイルから、リソースファイルを生成し、人手により各国語に翻訳し、そのうちの日本語版(400)、英語版(410)を表示したものが図4である。
図5は、アプリケーション定義ファイルの定義内容を説明するために使用する定義ファイルの一例である。本実施形態では、例としてXML形式で構成されるが、あくまで一例であり他の形式で構成されていても良い。図3で説明した「io 入出力」の中から「交通費申請リスト」に対応する入出力定義ファイル112に相当する。また、図4で説明した交通費申請リスト画面400に相当する。図面の都合によりデータ項目およびデータ項目の内容のうち、一部を省略している。
502で囲まれた部分は、図3の「io 入出力」のタイトル「交通費申請リスト」を定義する部分である。また図4の401に対応する。
また、図4の402(ドロップダウンリスト及び関連する項目)に対応する部分は、503、504で囲まれた部分で定義されている。ドロップダウンリストのタイトルとなる文字列「ステータス」は、503の「io−item」の「ステータス」(nameタグ)、ドロップダウンリスト本体は「choice−list」タグ内の「fixed」タグに記載された選択項目、ドロップダウンリストから項目選択後に押下するボタン(アクション「絞込み」)は504による。
さらに、505、506は、それぞれ図3の1行のデータ、図4の403の「申請ID」、「ステータス」に対応する項目の表示文字列の定義である。
以上で、定義ファイルの一例として、「交通費申請リスト」に対応する入出力定義ファイル112の一部について説明した。
図6は、翻訳文字列の対象となるリソースファイルを抽出するプログラムのメインGUI(リソーステンプレート出力先指定GUI)の一例を示す図である。
対象アプリケーション601として、アプリケーションID「APPLY_APP」、アプリケーション名「交通費申請アプリ」を指定している。具体的には、特定のアプリケーション(本例では「交通費申請アプリ」)として、図3の定義フォルダ表示欄301で一覧表示されている定義フォルダ群および定義フォルダ群に含まれる定義ファイル群を指定している。
また、出力先フォルダ602には、翻訳対象となるリソースキーとリソース値のペアを出力するリソーステンプレートファイルの出力先を指定する。出力先フォルダ602に出力ファイル名まで指定するようにしても良いし、フォルダだけ指定してファイル名はデフォルト値として生成されても良い。
図7は、リソースキーとリソース値のペアが出力されたリソーステンプレートのファイル一例を示す図である。図3の302、図4、図5で示すAPPLY_LISTは、700の部分に相当する。
アプリケーションの各種定義ファイル(入出力定義ファイル、メッセージ定義ファイルなど)が日本語で記載されているため、リソーステンプレートのファイルも日本語であり、そのまま日本語リソースファイルとして、アプリケーション実行時に使用される。
図8は、リソース値が、英語に翻訳された英語リソースファイルの一例を示す図である。図7の700の部分は、例えば800のように翻訳される。
<第一の実施形態>
次に図9から図12を用いて、リソーステンプレート生成部120の処理と生成されるリソーステンプレートファイルの構造(図11)について説明する。
図9は、本発明の実施形態に係わる翻訳対象となり得るリソースキーとリソース値(文字列)を取得するリソーステンプレート生成部120のフローチャートである。図9のフローチャートの各ステップは、情報処理装置100上のCPU201で実行される。
S901においては、アプリケーションの定義フォルダ(例えば図3の301で一覧されるフォルダ群のすべて)を取得し、RAM202における定義フォルダリスト記憶部(不図示)に格納する。
S902からS907における繰り返し処理では、前述の定義フォルダリスト記憶部に記憶された全定義フォルダに対する処理を繰り返す。
S903においては、定義フォルダリスト記憶部に記憶された全定義フォルダのうち、1つの定義フォルダに着目する。
S904においては、着目した定義フォルダが、翻訳対象となるリソースキーとリソース値(文字列)を取得する対象となるフォルダか否かを判定する。具体的には、定義フォルダに含まれる定義ファイルが翻訳対象となるかどうかであるが、フォルダ名が例えば図3の301の一覧のうち「io 入出力」、「msg メッセージ」などの定義フォルダが翻訳対象となる定義ファイルを含む。「bp ビジネスプロセス」、「dm データモデル」などの定義フォルダには、翻訳対象となる定義ファイルを含まない。
いずれの定義フォルダが対象となるかは、リソーステンプレート生成部120のプログラムにロジックとして組み込まれていてもよいし、また翻訳対象定義フォルダ記憶部(不図示)に、翻訳対象となる定義フォルダ、あるいはならない定義フォルダの一覧として記憶されていても良い。着目中の定義フォルダが翻訳対象である場合(YESの場合)には、S905に進む。翻訳対象でない場合(NOの場合)には、S907に進む(次の定義フォルダがあればそのフォルダに対する処理を行う。なければ繰り返し処理を終了する)。
S905においては、定義フォルダ内の各々の定義ファイルから翻訳対象となるリソースキーとリソース値(文字列)を取り出して、定義フォルダリソース一覧を生成する。例えば、図3の定義フォルダ表示欄301の定義フォルダ「io 入出力」には、「交通費申請フォーム」、「交通費申請リスト」など6つの定義ファイルが含まれるが、定義フォルダリソース一覧は、図11の1120のようになる。更なる例として、定義フォルダ「msg メッセージ」の部分は、図11の1140のようになる。詳細は、図10のフローチャートにより説明する。
S906においては、定義フォルダリソース一覧を、アプリケーションリソース一覧(図11の1100に対応)に格納する。この場合、図11の1120の定義フォルダリソース一覧の各要素「APPLY_FORM」、「APPLY_LIST」を、アプリケーションリソース一覧1100にコピー(あるいは移動)などを行うことを想定しているが、もともと定義フォルダリソース一覧(1120など)とアプリケーションリソース一覧1100が同一のRAM202上の記憶部であり、S906の処理が不要であるようにしても良い。
S908においては、アプリケーションリソース一覧1100に格納した情報(翻訳対象となるリソースキーとリソース値(文字列))をファイルに出力する(詳細は図12のフローチャートを用いて説明する)。出力するファイルは、図6のリソーステンプレート出力先指定GUI600の出力先フォルダ602で指定されたファイルである(図6の説明を参照)。
以上で、図9のフローチャートの処理の説明を完了する。
図10は、定義フォルダ内の各々の定義ファイルから翻訳対象となるリソースキーとリソース値(文字列)を取り出して、定義フォルダリソース一覧を生成する処理を説明するフローチャートである。図10のフローチャートの各ステップは、情報処理装置100上のCPU201で実行される。
S1001からS1012の繰り返し処理では、図9のS903にて着目した1つの定義フォルダに含まれる各々の定義ファイルに対して、処理を繰り返す。
S1002においては、1つの定義ファイルに着目して内容を読み取る。ここで定義ファイルとは、例えば「io 入出力」には、「交通費申請フォーム」、「交通費申請リスト」(図3の302)などであり、その内容は、図5のXMLファイル(「交通費申請リスト」:APPLY_LISTに対応する)のように定義されるものである。
S1003においては、前述のS1002において読み取った定義ファイル(本例ではXMLファイル)を解析する。例えば、本実施形態におけるXMLファイルの場合には、各情報に対応する要素はXMLタグ要素として階層的に定義されているが、その構造を木構造(不図示)などでRAM202上に記憶する。以降、定義ファイルがXMLファイルであり、各情報に対応する要素はXMLタグ要素として階層的に定義されているとして説明するが、これはあくまで一例であり、同様の意味を定義できる構造であれば、例えば定義ファイルが表形式ファイルであって、RAM202上ではリスト形式などで格納するなど、任意の構造であって良い。
S1004からS1010の繰り返し処理では、XMLの先頭のタグ要素から最後のタグ要素まで、全てのタグ要素に対する繰り返し処理を行う。
S1005においては、1つのタグ要素に着目する。以下、定義ファイルとして「APPLY_LIST」(図5のファイル)を例として説明を進める。また、以下の説明において、RAM202上に記憶される定義フォルダリソース一覧、定義ファイルリソース一覧、リソースキー、リソース値(文字列)について図11を用いてあわせて行う。
S1006においては、着目中のタグ要素が翻訳対象となるタグ要素であるか否かを解析する。具体例を図5のXMLファイル(APPLY_LISTの定義ファイル)を参照し、幾つか挙げて説明する。
まず、リソース値(文字列)となるのは、nameタグに設定された値である。ioタグ(501)の直下にあるタグを先頭から順に着目する。第1の例(点線(502)で囲まれた部分)においては、nameタグ(値は「交通費申請リスト」)が翻訳対象となるタグ要素であるかどうかを確認する。この場合には、同じくioタグの直下にあるio−typeタグの値を参照する。この値が、「IO」、「A」、「I」のいずれかであれば、nameタグの値「交通費申請リスト」は翻訳対象となる。ここでは、io−typeの値が「IO」なので翻訳対象となる。nameタグ要素は、定義ファイル名およびルートタグから当該nameタグ要素に至るまでのタグ要素の階層により、一意的に「位置」を特定される。
第2の例(点線(503)で囲まれた部分)においては、ioタグ(501)直下のio−itemタグの内容を確認する。nameタグ(値は「ステータス」)のitem−typeタグの値を参照し、値が、「IO」、「A」、「I」のいずれかであれば、nameタグの値「ステータス」は翻訳対象となる。ここでは、io−itemタグの値は「I」なので翻訳対象となる。同様に、nameタグの値、「絞込み」(504)、「申請ID」(505)、「ステータス」(506)も翻訳対象となる。
第3の例(点線(503)で囲まれた部分)においては、io−itemタグ、choice−listタグ、fixedタグ内の文字列(“|”で区切られた文字から“:”を除く「すべて」、「承認待ち」、「完了」)も翻訳対象となる。io−itemタグ内のio−itemタグの値が「I」である場合、その階層下にあるchoice−listタグ、fixedタグの中の文字列が翻訳対象になることによる。
これらの規則は、あくまで一例であり他の規則で指定されても良い。またこれらの規則は、リソーステンプレート生成部120のプログラムに組み込まれていてもよいし、あるいは規則記憶部に定義されており、その中に翻訳対象となる文字列にたどり着くまでのタグの階層が記載されていても良い。
例えば、翻訳対象の文字列を示すタグの階層構造については、プログラムロジックとして記述しても良いし、図14に示すようにタグ階層構造を示すテーブルで管理しても良いこととする。この例のテーブルではレコードにある階層の組み合わせが翻訳対象となる。なお、図14の1401は翻訳対処となるタグの階層構造を管理するIDであり、1402は第一階層であるタグの値、1403は第二階層であるタグの値、1404は第三階層であるタグの値、1405は第四階層であるタグの値が入る項目となる。
図15は翻訳対象となるタグ要素であるか否かを判定するフローチャートである。
S1501ではXMLで記載されたアプリケーション定義ファイル(画面である場合は入出力定義)をプログラムで扱いやすいように定義オブジェクトリストの形に変換して、メモリ上に読み込む。
S1502からS1505は、定義オブジェクトリストが存在する分の繰り返し処理を行う。
S1502では定義オブジェクトを階層化して、タグとして階層情報に変換する。
S1503では、図14の翻訳対象テーブルを参照し、階層情報とテーブル内のレコードが一致するか確認する。S1503で一致すると判定した場合は、S1504へ処理を進める。S1503で一致すると判定しなかった場合、次の定義オブジェクトリストの処理を行うため、S1502に処理を戻す。また、タグの階層の位置およびタグの種別により、指定した言語の文字列に置き換えて表示する翻訳対象文字列を特定する。
S1504では特定の定義値が条件を満たすか確認する。例えば、nameタグと同階層にある、io−itemやitem−typeタグの値が「IO」(入出力項目)、「A」(ボタンなどのアクション項目)、「I」(入力項目)であるかどうかで判定する。S1504で条件を満たすと判定した場合、S1505へ処理を進める。S1504で条件を満たすと判定しなかった場合、次の定義オブジェクトリストの処理を行うため、S1502に処理を戻す。
例えば、図5の点線(502)で囲まれた部分は、S1504においては、図14の翻訳対象テーブルでいうと、IDが1のレコード(第一階層が「io」、第二階層が「name」)に合致がする。また、S1504においては、io−typeタグの値が「IO」であるため、翻訳対象となる。すなわち、ソースプログラムの動作時に翻訳対象となる翻訳対象文字列をアプリケーション定義ファイルから特定する。
S1505では、S1503とS1504の条件を満たす定義オブジェクトを翻訳対象定義オブジェクトのリスト(図11に対応)に格納する。
以上の処理を行うことによって、翻訳対象定義オブジェクトのリストを確認すれば、翻訳対象の定義を読み出すことができる。
以上で、リソース値(文字列)として翻訳対象になるか否かの解析について説明した。
S1007においては、S1006における解析の結果、着目中のタグ要素が翻訳対象であるか否かを判断する。具体的には、S1006で詳細に説明したようにnameタグと同一階層にあるio−typeタグ、またはitem−typeタグの値が「IO」、「A」、「I」であるか否かにより判定する。また、choice−listタグ、fixedタグに含まれる値(文字列)は、1つ上位のio−itemタグ内のio−itemタグの値により同様に判定する。判定の結果、nameタグの値が翻訳対象である場合(YESの場合)には、S1008に進む。翻訳対象でない場合(NOの場合)には、S1010に進む。
S1008においては、翻訳対象となるリソース値に至までのXMLのタグ要素の階層を、RAM202上などの記憶部である定義ファイルリソース一覧に追加する。具体例として、上記S1006で解析され翻訳対象と判定された3つの例を用いて説明する。
第1の例の値「交通費申請リスト」の場合においては、codeタグの値「APPLY_LIST」と同一階層にあるため、まず、定義ファイルリソース一覧に「APPLY_LIST」を追加(1123)する。その後、ioタグを「APPLY_LIST」に結合する(1124)。「APPLY_LIST」は、ioタグの直下にあり以降の処理ではタグ要素を結合するためのルート要素となる。
第2の例の値「ステータス」の場合においては、同一階層(「ステータスを値とするnameタグと同じio−itemタグの中に定義された)codeタグの値が「INPUT」であるため、前述の「APPLY_LIST」(1124)に、「io−item」(1126)、「INPUT」(1127)を順に結合する。「絞込み」については、前述の「APPLY_LIST」(1124)、「io−item」(1126)が既にあるため新たに作成せず、「io−item」(1126)に、対応するcodeタグの値「FILTER」を結合する。
同様に、「申請ID」については、「io−item」(1126)に、対応するcodeタグの値「ID」を、「ステータス」については、「io−item」(1126)に、対応するcodeタグの値「STATUS」を結合する。第2の例ではioタグに対応する要素は結合しなかったが、最終的にリソース値が一意に特定できるように記憶されればよい。従って、図11はあくまで例であって、一意的にリソース値の位置を特定可能な範囲で異なる構造であっても良い。第1の例、第2の例においても同様である。以上により、第2の例の説明を完了する。
第3の例の場合には、choice−listタグ、fixedタグの階層下にある文字列として、リソース値はドロップダウンリストなどの文字列であると判断される(図4の402の中央の項目)。fixedタグがINPUTタグと同一階層のタグよりも1つ下の階層にあるため、図11の「INPUT」(1127)に「fixed」(1129)を結合する。
「fixed」(1129)の階層化にはfixedタグ内の文字列で“|”で区切られた文字から“:”を除く「すべて」、「承認待ち」、「完了」をそれぞれ翻訳対象とするため、ドロップダウンリストの各選択要素となる「すべて」、「承認待ち」、「完了」を特定するためのタグを生成する。具体的には、“|”で区切った後、「タグ:リソース値」となるようにする。「すべて」に対しては、“:”よりも前のタグがないため、「null」(1130)というタグを生成し、「fixed」(1129)に結合する。同様に、「wait_approve:承認待ち」から「wait_approve」を、「closed:完了」から「closed」を抽出して、「fixed」(1129)に結合する。以上により第3の例の説明を完了する。また、S1008の説明を完了する。
S1009においては、S1008で結合したタグ要素の階層の末端に対応するnameタグの値をリソース値(文字列)として結合する。
なお、メッセージ要素については、各メッセージを特定するタグがあるため、そのタグを定義ファイルリソース一覧に格納し、そこに「msg」、末端にメッセージ本体を結合する。例として、図11の点線(1140)における「INSERT_FAIL」により特定されるタグ(1141)、「msg」(1142)、「申請ID:{1}申請失敗しました。」(1143)を結合する。なお、1143における「{1}」は、動作時の状態において異なる文字列が代入されるための定義である。
S1011においては、定義ファイルリソース一覧(APPLY_LISTの例では図11の1122に対応)を、定義フォルダリソース一覧(「io 入出力」フォルダの例として図11の1120に対応)に格納する。この場合、図11の1122の定義ファイルリソース一覧の各要素を、定義フォルダリソース一覧1120にコピー(あるいは移動)などを行うことを想定しているが、もともと定義ファイルリソース一覧1122と定義フォルダリソース一覧1120が同一のRAM202上の記憶部であり、S1011の処理が不要であるようにしても良い。
以上で、図10のフローチャートの処理の説明を完了する。また、以上で、図9、図10のフローチャートの処理(S908の詳細を除く)と、当該処理で生成される図11の構成についての説明を完了する。
図12は、メモリ上に構成されたリソースキーとリソース値(文字列)を対応付けてリソーステンプレートファイルに出力するフローチャートの一例を示す図である。具体的には、図11で説明した構成を、図7の形式のファイルに出力する処理の説明である。
S1201においては、出力先のファイルを生成する。このファイルが、リソーステンプレートファイルとなり、本実施形態においては、オリジナルのアプリケーション定義ファイル(図1の110、図3の定義フォルダ表示欄301内のファイル群など)における文字列(リソース値)が日本語で定義されているため日本語のリソースファイル142が出力されるためのファイルである。
S1202からS1211においては、アプリケーションリソース一覧(図11の1111)に格納されたリソース値に対する処理を繰り返す。
S1203においては、1つのリソース値に着目する。
S1204からS1209の繰り返し処理においては、ルートのタグ要素からその結合の末端である着目中のリソース値までを用いて、リソースキーとリソース値の対応付けを生成する。例として、図11の1122の部分から、図7の700の部分が生成される処理として説明する。
S1205においては、処理対象がいずれのタグ要素であるか、またリソース値(文字列)であるかを判定する。判定結果によって、S1206からS1208のいずれかの処理が行われる。ルートの直下のタグ要素S1206に進む具体例としては、図11のアプリケーションリソース一覧1100に直接格納されているタグ要素「APPLY_LIST」(1123)の直下のioタグ(1124)、io−item(1126)などのタグ要素の場合である。末端に結合されているリソース値(文字列)(例えば1131)であれば、S1208に進む。それ以外の場合にはS1207に進む。
S1206においては、リソースキーの最初のキーとしてルートのタグ要素の直下(前述の通り、ioタグ(1124)、io−item(1126)などのタグ)を設定する。これが、リソースキーの先頭となる。ただしio−itemは、便宜上「ioItem」に置き換えられているが、あくまで一例であり、必ずしも置き換える必要はない。
S1207においては、定義ファイル一リソース覧のルートタグと処理対象のタグを結合する。具体的には、オリジナルの定義ファイル「APPLY_LIST」に対応する場合には、定義ファイル一覧のルートタグとして「APPLY_LIST」が指定されているので、S1206で設定したタグ要素に“.”区切りで結合する。これにより、例えば「io.APPLY_LIST」、「ioItem.APPLY_LIST」などのタグ要素の結合されたリソースキーができる。
S1207においては、同様にタグ要素の後にタグ要素がある場合はS1207の結合処理が繰り返され、S1206でルートとした図11のタグ要素の後のタグ要素を結合する。「ioItem.APPLY_LIST.INPUT」(図11の1126、1123、1127の結合)ができる。すなわち、翻訳対象文字列の翻訳語となるリソース値を取得するためのキーとなるリソースキーを生成する。また、アプリケーション定義ファイルのタグの階層における位置の情報および前記タグの種別を用いて、一意的に認識可能に前記リソースキーを生成する。
図11の「fixed」タグは、「APPLY_LIST」の直下ではないが、翻訳対象を特定するため直下と同様の処理対象となる。fixedの代わりに「fixedList」と置き換え、上記の処理同様「APPLY_LIST」と(io−itemはスキップして)「INPUT」タグを結合する。結果として「fixedList.APPLY_LIST.INPUT」などのタグ要素が結合されたリソースキーが生成できる。
上記の中で、「io−item」を「ioItem」に置き換えたり、「fixed」をルートとしたり、またその処理をする際に「io−item」をスキップしたりしたが、これはあくまで一例である。必ずしもその通りの生成方法ではなくとも、結果として、異なるリソース値が一意に特定されるようにリソースキーが生成されるものであればよい。
さらに、fixedListの場合には、各選択項目が区別できるように、「wait_approve」(承認待ちの場合)、「closed」(完了の場合)を“.”で区切って結合する。「すべて」の場合は、対応するキー文字列がないため“.”のみを結合する。
以上で、S1206に始まり、S1207を繰り返すことによるリソースキーの生成について説明した。以上がリソースキーの生成に関する説明である。
次にリソース値の結合に関する説明を行う。S1208においては、処理対象がリソース値である場合に、その処理対象に対応するリソースキー(複数のタグ要素が“.”で結合されたもの)に「=リソース値(文字列)」を結合する。具体的には、リソース値(文字列)は、図11の構造の末端にあるため、リソース値(文字列)であると判断される。これにより「リソースキー」=「リソース値」の対応付けが完成する。すなわち、生成されたリソースキーに対応する翻訳語となるリソース値を翻訳対象文字列から取得する。
S1210においては、「リソースキー」=「リソース値」の対応付けをリソーステンプレートファイルに出力する。すなわち、リソースキーとリソース値を対応付けて、言語リソースファイルに出力する。出力結果の具体例は、図7のようになる。特に定義ファイル「APPLY_LIST」に対応するものは、点線(700)で囲まれた部分である。
以上で、図12のフローチャートの説明を完了する。なお、リソーステンプレートファイルは、アプリケーション定義と同じ言語(例えば日本語)であれば、そのまま(日本語の)リソースファイル142として使用可能である。その他の言語に関しては、本フローチャートで出力されたリソーステンプレートファイルをもとに、リソース値の部分を翻訳する。
以上、図7、図9〜図12を用いて、リソーステンプレートファイルを生成する処理と、その生成結果についての説明を完了する。
図13は、本発明の実施形態に係わるマルチ言語の中から特定の言語を用いてアプリケーションを動作させるフローチャートの一例を示す図である。図12までの説明で生成された各言語のリソースファイルを用いて、マルチ言語のアプリケーションを実行する処理について説明する。図13のフローチャートの各ステップは、アプリケーションサーバ140上のCPU201で実行される。
なお図1のプログラム生成部130で説明したように、アプリケーション143を生成する際に、前述の処理と同様にリソースキーが生成され、生成されるプログラムにおけるリソース値(文字列)のかわりに、対応するリソースキーが埋め込まれている必要がある。
その、対応するリソースキーの埋め込みの処理は、プログラム自動生成装置が画面プログラム(例えばJSP)を生成する際に行う。その処理については、図16のJSPへのリソースキーを埋め込む処理図において、説明を行う。
S1601において、例えば画面の入出力定義(例えば、図5)をメモリ内へ読み込む。画面の入出力定義はXML構造で作成されていて、これをプログラムで扱いやすいようにオブジェクトに変換してメモリ内に格納する。
続いて、S1602において、プログラム自動生成装置が保持するJSPテンプレートを読み込む。JSPテンプレートとは後続の処理でリソースキーを埋め込む変数を保有するJSPの元となるファイルである。画面定義の中において翻訳対象となる各項目分、JSPテンプレートを使用して、変数に適切な値をJSPテンプレートに対し埋め込むことで、最終的なJSPが完成する。
JSPテンプレートの1例を図17、1700に示す。図17、1700のJSPテンプレートには<label>タグがあり、そのリソースキー化を行う部分には<%=MessageResourcesProperties.getConfig().getFormatMessage(“IoItem.${io.code}.${ioItem.code}”)%>といった記述がなされている。
<%=MessageResourcesProperties.getConfig().getFormatMessage(“IoItem.${io.code}.${ioItem.code}”)%>の中のIoItem.${io.code}.${ioItem.code}の部分は、リソースキー化する部分であり、MessageResourcesProperties.getConfig().getFormatMessage(“IoItem.${io.code}.${ioItem.code}”)はリソースキーに該当する文字列を該当するリソースファイルから取得するためのAPIロジックである。
該当するリソースキーはこの例では入出力コードの${io.code}、および入出力項目コードの${ioItem.code}の組み合わせによって作成され、埋め込まれる(S1603)。なお、このAPIの例では、言語コードはセッションなどのメモリ内にセットされている言語コードを参照するため、言語コードについてはAPIの引数には出てこないが、もちろん、リソースキーと共に直接言語コードを指定できるAPIを用意しても良いこととする。
なお、図17、1700のリソーステンプレートファイルはあくまで一例であり、divタグとlabelタグで構成される要素についてのテンプレートであって、別のタグで作成されている項目に適用するためのテンプレートファイルは別のテンプレートを用意することで対応をすることとする。また、<%=MessageResourcesProperties.getConfig().getFormatMessage(“IoItem.${io.code}.${ioItem.code}”)%>の中のリソースキー化する部分となる(“IoItem.${io.code}.${ioItem.code}”)についても、別のリソースキーの構造で作成されても良いこととする。例えば、図7の700に記載のリソースキーの中にfixedList.APPLY_LIST.LANG.jaがあるが、この形式のリソースキーは、プルダウンで固定値リストを表示するための項目であるため、データを表示するための項目である申請IDとはキーの作成の仕方が異なる。このように、項目においては、項目タイプによってリソースキーの構成を異なるように作成しても良いこととする。
図16の説明に戻る。し、入出力定義の読み込み(S1601)によって、得られた入出力項目で、翻訳対象となっている入出力項目が存在する間、その入出力項目に対し、S1603の処理を繰り返す。
S1604では、入出力項目の情報から入出力コードおよび入出力項目コードの情報を得て、図17、1700に示すJSPテンプレートの変数部分${io.code}および${ioItem.code}に埋め込むことによりJSPを生成する。すなわち、アプリケーションの実行時に、指定した言語のリソースファイルに存在する、リソースキーに対応するリソース値を用いることにより、当該アプリケーションの翻訳対象文字列を指定した言語の文字列で表示可能にするために、ソースプログラムの翻訳対象文字列となる箇所に、言語表示を切り替えるためにリソースキーを埋め込んだプログラムを生成する。
例えば、図17、1710は、項目ラベルの文字列を出力するJSPのコードの一例である。図17、1710の1702は、JSPのコードにおいてにおいて、ioItem.APPLY_FORM.IDというリソースキーが埋め込まれている箇所である。
「ioItem.APPLY_FORM.ID」のうち、「APPLY_FORM」の部分は入出力コードである図3の302のより値を取得しており、「ID」の部分は入出力項目コードである、図3の305の項目コードから値を取得している。
なお、このリソースキーが、図17、1720(図7の700と同様)の1703、または、図17、1730(図8の800と同様)の1704で示したように、リソースファイルの中の同一のキーを参照することによって、そのリソーキーに対応するリソース値を取得することにより、言語切り替え処理を行う。
例えば、図17、1710の1702の「ioItem.APPLY_FORM.ID」のリソースキーで、画面を日本語表示にしたい場合は、図17、1720の日本語のリソースファイルの1703のリソースキー「ioItem.APPLY_LIST.ID」を参照し、そのリソース値の「申請ID」で表示を行う。
また、画面を英語表示にしたい場合は、図17、1730の英語のリソースファイルの1704のリソースキー「ioItem.APPLY_LIST.ID」を参照し、そのリソース値の「App ID」で表示を行う。すなわち、オペレーティングシステム、ブラウザの言語設定、ユーザの指定、生成されたソースプログラム、のいずれかにより指定された当該ソースプログラムの動作時の言語コードに対応付けられた言語リソースファイルを参照してソースプログラムに配置されたリソースキーにリソース値を対応付けて動作し、言語コードが異なる言語コードに切り替えられた場合には、異なる言語コードに対応するリソースファイルを参照して当該ソースプログラムに配置された当該リソースキーに当該リソース値を対応付けて動作するように切り替えるソースプログラムを生成する。
以上、生成するプログラムに対応するリソースキーを埋め込む処理の説明とする。
再び、図13の処理の説明を行う。S1301においては、ユーザによりアプリケーションが起動される。本実施形態では、クライアント端末とアプリケーションサーバ140が異なる筐体であるとして説明しているが、実際には、同一の筐体で動作していても良い。
S1302においては、アプリケーションが動作する言語コードを取得する。具体的には、OSが動作している言語設定、あるいはアプリケーションが動作しているWebブラウザの言語設定、またユーザが明示的に言語を指定した場合(図4の「言語」右にあるドロップダウンリストによる指定)、その言語コードを取得する。
S1303においては、取得された言語コードに応じたリソースファイルを読込む。ここで、言語コードとリソースファイルの対応付けは、アプリケーション内に組み込まれていてもよいし、また、言語コード記憶部(不図示)に対応付けを記憶しておき、必要に応じて言語ファイル対応機億部を言語コードで検索してリソースファイルを特定しても良い。アプリケーションに組み込まれている場合には、例えば、図3の301における「言語コード管理」に人手で定義を行い、図4の「言語」の右側のドロップダウンリストに必要な言語リストを用意して言語コードとリソースファイルの対応付けを記憶することが可能である。
S1304においては、アプリケーション内のリソースキーに対応するリソース値をリソースファイルから取得し、設定する。詳細を、S1311からS1314のサブフローチャートにより説明する。
S1311においては、前述で取得したリソースファイルに対応するリソースキーがあるか否かを判定する。リソースキーがある場合(YESの場合)は、S1312に進む。ない場合(NOの場合)は、S1313に進む。
S1312においては、リソースファイルからリソースキーに対応するリソース値を取得する。
S1313においては、アプリケーション定義ファイル(入出力定義ファイル、メッセージ定義ファイルなど)から、リソースキーに対応する文字列を抽出する。すなわち、ソースプログラムの動作時に、ソースプログラムに配置されたリソースキーが言語リソースファイルの中に存在しない場合には、アプリケーション定義ファイルを参照し、当該リソースキーに対応する当該アプリケーション定義ファイルにおける翻訳対象文字列を特定し、当該リソースキーに対応する文字列をリソース値として取得する。もともとリソースキーは、アプリケーション定義ファイルにしたがって、一意的にリソース値(文字列)の位置を特定できるように生成されているので対応するリソース値(文字列)を取得することが可能である。
S1314においては、S1312またはS1313において取得した文字列をリソース値として動作しているアプリケーションのリソースキーに設定する。
S1305においては、前記リソース値によりアプリケーション画面の表示を行う。
S1306においては、アプリケーションに対するユーザの操作指示を受け付ける。
S1307においては、前述の操作指示内容を判定する。操作内容が「終了指示」の場合には、アプリケーションを終了する。現在表示されている画面内で、言語切り替え以外の操作をした場合には、S1306に戻って操作を継続する。画面移行操作の場合には、S1304に戻って、その画面に含まれるリソースキーに対応するリソース値を取得して画面表示を行う。言語切り替え操作(図4の言語の後のドロップダウンリストで他の言語を選んで変更ボタンを押下)をユーザが行った場合には、S1302に戻り新たに指定された言語コードに対応するリソースファイルを読み込んで、画面の再表示をする。
以上で、図13のフローチャートの説明を完了する。
続いて、図18を用いて図13の処理を詳しく説明する。図18、1800はアプリケーション画面の一例である。
言語選択のドロップダウン選択(図18、1810)と選択言語に合わせた画面を表示するための表示ボタン(図18、1820)、ユーザIDとユーザ名(図18、1830)(英語の場合はUser ID、Usernameと表示する)をラベルとして持つ入力フィールドがある。
言語選択ドロップダウンからユーザが任意の言語を選択すると、図18の1840に図示するように、言語コードパラメータとして、ja、en、zhなどの言語コードがリクエストとしてアプリケーションサーバに送信される。
アプリケーションサーバはリクエストされた言語コードをセッションなどのメモリ内に格納する。次にアプリケーションサーバは表示リクエストに従い、JSPを画面として表示する。
JSPで作成した画面にはユーザID、ユーザ名のフィールド(図18、1850)があり、それぞれのラベル(図18、1830)にはリソースキーとして、ioItem.APPLY_FORM.USERID、ioItem.APPLY_FORM.USERNAMEが割り当てられているとする。
JSPの画面を表示する時には、言語コードの情報から対象となる言語リソースファイルを特定し、リソースキーの情報からその言語リソースファイル内のリソースキーに該当する値を取得し、JSPに表示する。
例えば、言語選択ドロップダウン(図18、1810)からユーザが英語を選択すると、言語コード(図18、1840)として「en」がアプリケーションサーバへ送信され、図18、1860のApplicationResources_en.confを対象となる言語リソースファイルとして使用することになる。
なお、ApplicationResourcesのサフィックスに英語ならenをつけてファイルがあるかを探索し、あればそれを表示するが、無い場合は、デフォルト値で表示するリソースファイルを表示する。例えば、図18、1870に図示のApplicationResources_ja.confがデフォルト値で表示するリソースファイルであるという設定であれば、こちらのファイルを使用して表示する。
なお、対応する言語リソースファイルが読み込めるか否かは、ユーザが例えばjaやenなどの言語コードを送信したなどのアクション以外の方法においては、OSの言語設定やブラウザの言語表示設定によっても、判断可能であることとする。
以上で図18の説明を終了する。
<第二の実施形態>
続いて、本発明の第二の実施形態を、図面を参照して説明する。第一の実施形態では、アプリケーションの画面定義の中より、翻訳対象となるリソースキーを翻訳語となるリソース値とともに抽出するまでを説明したが、アプリケーションの規模が大きくなり画面定義が増えると、異なるリソースキーに対して、同じ翻訳を行う箇所となるリソース値が重複して発生した場合に、無駄な翻訳作業が発生する可能性がある。
図19の1900は例として、従業員を管理するEMPLOYEEテーブル1900(従業員テーブル)を示している。このテーブルは、ID(社員番号)、NAME(社員名)、PASSWORD(社員パスワード)の項目からなるテーブルである。
このEMPLOYEEテーブル1900のデータがいくつかの異なる画面で利用されることとする。例えば、図19の1910は従業員を登録する画面の例である。図19の1920は登録した従業員を検索し、一覧表示する画面の例である。図19の1930は従業員を選択肢として選ぶ画面の例である。いずれも従業員テーブルのデータを利用した画面である。つまり、各画面における社員ID、社員名、社員パスワードの項目は、EMPLOYEEテーブル1900を構成する項目であるID、NAME、PASSWORDからなるものとする。
このような場合、各画面で使われる、ID(社員番号)、NAME(社員名)、PASSWORD(社員パスワード)は各画面で同じ翻訳がされても良い箇所である。しかしながら、第一の実施形態によりリソースファイルを作成すると、画面や項目が画面定義上異なるため、異なるリソースとして扱う。そのため、異なるリソースキーごとに、同一のリソース値が割り当てられるため、別のリソースファイルを作成する場合は、リソースファイルに含まれるリソースキーの数ごとに翻訳箇所に対する翻訳を行わなくてはならないといったことになる。また、リソースファイルの中における同じリソース値を割り当てるリソースキーが多くなると、同じ翻訳をそのリソースキーに対して間違いなく行わなくてはならない、あるいは、翻訳を業者に外注する場合などは、その分翻訳料金が増すなどの課題が発生する。
この課題に対しては、リソースファイル内の同じリソース値が割り当てられる複数のリソースキーに対する重複対応の処理を入れることで解決する。そのため、図10と、図12の処理において、リソースの重複対応の処理を追加した内容を、図21と図25において説明する。
図21は、定義フォルダ内の各々の定義ファイルから翻訳対象となるリソースキーとリソース値(文字列)を取り出して、重複するリソースを検出し、定義フォルダリソース一覧を生成する処理を説明するフローチャートである。図21のフローチャートの各ステップは、情報処理装置100上のCPU201で実行される。なお、図21のS2101からS2109までの処理は、図10のS1001からは1009までの処理、S2112からS2114までの処理は、図10のS1010からS1012までの処理と同様であるため、その部分についての説明は省略する。したがって、図21のS2110とS2111の処理について説明をする。
S2110は重複検出を行うか否かを判定するステップである。重複検出を行うか否かを判断する設定値はプログラム自動生成装置の重複管理部126に保存しておく。S2110で、重複検出を行うように設定されていると判定した場合は重複検出のステップ(S2111)を行う。なお、S2111の処理の説明は、図22で説明を行う。なお、S2110において、重複検出を行わないように設定されていると判定した場合は、S2112へ進み、第一の実施形態と同じリソースファイルが作成されることになる。
重複管理部126には重複検出を行うか否かの設定を行うだけではなく、重複を検出するための条件も管理する。重複条件とはどのような場合にリソース値は重複しているとみなすかという条件である。
重複条件の一例として、入出力画面定義の項目に対して関連するデータモデルのコードと関連するデータモデルの中の項目コードが同じであれば、それは同じリソース値を割り当てられる重複項目とみなす、という例を挙げて説明をする。すなわち、リソースキーが作成された基となるアプリケーション定義ファイルの中の項目定義が共通のデータモデルにより作成された場合に、グローバルリソースキーを割り当るリソースキーである条件とする。
図20は、EMPLOYEEテーブル1900のデータモデルである、EMPLOYEEテーブルのデータモデル2000の例を図20、2010と2020とともに説明した図である。図20、2010は、EMPLOYEEテーブル1900にアクセスするための、社員マスタ画面の入出力定義である。図20、2020は、EMPLOYEEテーブル1900にアクセスするための、社員更新画面の入出力定義である。
図20、EMPLOYEEテーブルのデータモデル2000は、データモデルコードが「EMPLOYEE(2001)」、そのテーブルを構成する項目であるデータモデルの項目コードは、「ID(2002)」、「NAME(2003)」、「PASSWORD(2004)」からなる。
なお、図20の2010と2020の入出力定義とも、図20のEMPLOYEEテーブルのデータモデル2000をもとに、作成した入出力定義であるものとする。したがって、図20の2010と図20の2020のいずれの入出力定義ともEMPLOYEEテーブルのデータモデル2000と関連している。
例えば、図20、2010の社員マスタの画面の入出力定義において、関連するデータモデルコード(関連DM)はEMPLOYEE(2011)になり、項目コードEMP_ID(2014)に関連する関連データモデル(DM)項目は、ID(2012)となる。また、項目コードEMP_NAME(2015)に関連する関連データモデル(DM)項目はNAME(2013)となる。
図20、2020の社員更新の画面の入出力定義においても、関連するデータモデルコード(関連DM)はEMPLOYEE(2021)になり、項目コードEMP_ID(2025)に関連する関連データモデル項目(関連DM項目)はID(2022)となる。また、項目コードEMP_NAME(2026)に関連するデータモデル項目(関連DM項目)は、NAME(2023)となる。さらに、項目コード、EMP_PWD(2027)に関連するデータモデル項目(関連DM項目)はPASSOWRD(2024)となる。
このように、関連DMと関連DM項目のコードが同じであることを重複条件の例とすると、この社員マスタの画面の入出力定義のEMP_ID(2014)、EMP_NAME(2015)と、社員更新の画面の入出力定義のEMP_ID(2025)、EMP_NAME(2026)から生成される項目のラベルに表示する文字列は関連するデータモデル、あるいはデータモデルの項目が共通のため重複リソースとみなすこととする。
なお、ここで説明した重複条件はあくまで一例であり、重複条件はこれ以外に、任意に定義することを可能する。すなわち、条件は、任意に変更可能であることとする。例えば、入出力定義の中の入出力項目コードのみ同じであれば、重複とみなす、といった条件にしても良いということである。
図22は、重複検出の処理を説明した図である。この図で説明する重複条件も、関連DMと関連DM項目のコードが同じである場合に重複とみなすルールで説明する。
S2201では対象となる入出力定義の情報(第一の実施形態でいうと図11の定義ファイルリソース)を読み取り、その入出力項目に関連するデータモデル(関連DM)があるかどうかを判定する。なお、関連DMがない場合、つまり、データベースと直接関連しない入出力項目である場合(S2201でNO)は、何もしないで処理を終了する。
S2201で関連DMがあると判定した場合(S2201でYES)、S2202のステップでメモリ上に展開しているグローバルキーリソースマップに_GLOBAL.関連DMコード.関連DM項目コードをキーとするエントリがあるかチェックする。
グローバルリソースキーマップとは、図11で作成された翻訳対象となる項目が、重複キーであるか否かを判定するためにメモリ上に展開する領域のことである。
なお、グローバルキーリソースマップのメモリ内のイメージを図23に示す。グローバルキーリソースマップのグローバルリソースキー2301は、グローバルキーの値を設定する項目である。本実施形態では、_GLOBAL.関連DMコード.関連DM項目コードで作成することとする。
グローバルリソース値2302は、グローバルリソースキー2301に対するグローバルリソース値となりうる名称を、入出力定義の項目名より登録する項目である。例えば、図23の2310のグローバルキーである_GLOBAL.EMPLOYEE.IDは、図20の社員更新の入出力定義(2010)のEMP_IDの項目(2014)や図20の社員更新の入出力定義(2020)のEMP_IDの項目(2025)の定義より作成しているが、この入出力定義に対応する2028と2029の項目名の値で登録することとする。なお、この場合入出力定義が複数のため項目名がそれぞれにおいて同一であることを条件とするが、仮に、同一でない場合は、名称を統一させる処理を行うことで対応することとする。
重複回数2303は、重複回数を示す項目である。1であれば、_GLOBAL.関連DMコード.関連DM項目コードで作成したグローバルキーリソースキーに重複はなく、2以上の値であれば、重複があることとなる。
S2202では、_GLOBAL.関連DMコード.関連DM項目コードで作成したグローバルキーリソースキーが、グローバルリソースマップ2300に既に存在するか、否かを判定する。
例えば、入出力コードがEMP_LIST、入出力項目コードがEMP_IDの入出力項目のリソース値についてチェックする場合、図20、2020より、関連DMコードはEMPLOYEE、関連DM項目コードはIDとなる。この場合のグローバルキーは_GLOBAL.EMPLOYEE.IDである。これと一致するエントリがグローバルリソースマップ2300のグローバルリソースキー2301に存在するか否か、で判定するということである。
S2202でグローバルリソースマップ2300に存在すると判定した場合、S2205の処理へ進む。S2202で、グローバルリソースマップ2300に存在しないと判定した場合(S2202でNO)は、S2203にて、_GLOBAL.関連DMコード.関連DM項目コードで作成したグローバルキーをマップに登録する。
S2203では、例えば、図20の社員更新の入出力定義(2020)のEMP_IDの項目(2025)の場合、関連DMコードが、EMPLOYEE(2021)、関連DM項目コードがID(2022)となるため、グローバルリソースキー2301へは、_GLOBAL.EMPLOYEE.IDで値を作成し登録する。
グローバルリソース値2302へは、図20の社員更新の入出力定義(2020)のEMP_IDの項目(2025)に対応する2029の項目名の値である「社員番号」登録することとする。
重複回数2303は、重複回数を示す項目である。初回の登録であれば、1を登録する(S2204)。なお、既に同じリソースキーが存在している場合は、そのキーの重複回数2303に対して1追加した値で更新する(S2205)。
なお、図20の2010と2020の入出力画面定義が存在する場合には、関連DMのコードのEMPLOYEEと、関連DM項目コードのIDとNAMEが共通していて、それに関連するそれぞれの入出力定義における入出力項目コードのEMP_ID、EMP_NAMEより2回共通したことが確認されているため、作成するグローバルリソースキーの重複回数2303の値が2となりグローバルリソースマップ2300が生成される(2310、2320)。一方、関連DM項目コードのPASSWORDについては、図20の2020の社員更新の入出力定義においてのみ、それから作成された項目が存在するため、重複回数2303の値は1のままグローバルリソースキーが生成される(2330)。
S2205では、グローバルリソースマップ2300の重複回数2303を1、カウントアップして更新する。重複がある場合は重複回数2303の値は1より大きい値になる。
続いて、S2206にてグローバルリソースキー使用情報2400へ情報を追加する処理を行う。
グローバルリソースキー使用情報2400のメモリ内のマップイメージを図24に示す。グローバルリソースキー使用情報2400とは、第一の実施形態の処理でも説明した、図11で登録された定義リソースのそれぞれのリソースごとにグローバルリソースキーの値の割り当てを行っている領域のことを指す。これにより、該当リソースの該当するグローバルリソースキーの情報がわかる。
リソースキー2401は、第一の実施形態で作成するのと同様の方法で作成し、メモリ上に配置状態となっているリソースキーの情報である、また、グローバルリソースキー2402は、グローバルリソースキーの名称である。
なお、ここへは、既に翻訳対象となる項目のみの情報が入っていることとする。つまり、S2206では、例えば、図20、2020の社員更新の入出力定義の項目コードがEMP_ID(2025)の場合、リソースキー2401へは、「ioItem.EMP_DTL.EMP_ID」の値を、グローバルリソースキー2402へは、S2203で作成したグローバルキーと同等の値である_GLOBAL.EMPLOYEE.IDの値を登録する(図24の2403)。
なお、図20の2010と2020の入出力画面定義が存在する場合には、データモデルに関連している項目コードは、図20の社員マスタの入出力画面定義(2010)においては、EMP_ID(2014)と、EMP_NAME(2015)であり、入出力コードがEMP_LISTであるため、図24の2404の線枠で示すようにリソースキーが作成され(作成方法は第一の実施形態を適応)、それに対応するグローバルリソースキー2402の値は、図24の2406の線枠で示すように、作成される。
また、図20の社員更新の入出力画面定義(2020)においてデータモデルに関連している項目コードは、EMP_ID(2025)と、EMP_NAME(2026)、EMP_PWD(2027)であり、入出力コードがEMP_DTLであるため、図24の2405の線枠で示すようにリソースキーが作成され(作成方法は第一の実施形態を適応)、それに対応するグローバルリソースキー2402の値は、は、図24の2407の線枠で示すように作成される。
以上、図22の重複検出の処理の説明を終了する。
次に、重複検出による結果を反映したリソースファイルテンプレートの出力処理について図25を用いて説明する。
図25は、メモリ上に構成されたリソースキーとリソース値(文字列)を対応付けて、重複対応を行ったリソーステンプレートファイルを出力するフローチャートの一例を示す図である。なお、図25のS2501は図12のS1201、図25のS2503からS2510までの処理は図12のS1202からS1209までの処理、図25のS2512の処理は図12のS1211の処理と同様であるため、この部分の処理の説明は省略する。したがって、図25においては、S2502とS2511の処理について説明をする。
図25のS2502は図23で説明したグローバルリソースマップ2300を読み、重複キーとなるグローバルリソースを抽出するステップである。詳細は後述の図26で説明する。
図25のS2511は最終的なリソースファイルを生成するにあたって、リソースファイルテンプレート内で、重複キーとなっているリソースキーのリソース値をグローバルリソースキーで差し替える処理になる。詳細は後述の図28で説明する。
図26はグローバルリソースを抽出する処理図である。この処理では、図23のグローバルリソースマップ2300を読み取り、重複しているとされているグローバルリソースキーのみを、グローバルリソースとしてメモリ上へ抽出する処理である。
なお、抽出されたグローバルリソースキーの情報は、後述の図28でグローバルリソースでの差し替え処理が行われたリソースキーの情報と合体して、最終的なリソースファイルとして出力されることとなる。この方法でリソースファイルを作成すると、重複するリソース値に関しては、リソースファイル内のグローバルリソースキーに対するリソース値のみを翻訳対象とすればよいこととなる。すなわち、グローバルリソースキーに割り当てられた共通のリソース値のみを他言語へ翻訳することにより、異なる言語コードに対応するリソースファイルを作成可能になる。
S2601からS2602までは図23で説明したグローバルリソースマップ2300をメモリから読み出し、読み出したマップ内に存在するグローバルリソースキー分だけ繰り返し処理を行う。
グローバルリソースマップ2300に存在する情報には図23で示したように何回重複があったかを示す、重複回数2303で管理する値の情報がある。
S2601では、この重複回数2303の情報を見て判定する。重複回数2303の値が1の場合つまり重複はしていない場合(S2601で=1の場合)、グローバルリソース出力は行わないため、グローバルリソースマップ2300内の次の情報に対して、再度S2601の判定処理を進める。
S2601で重複回数が2以上であるグローバルキーと判定した場合、S2602においてグローバルリソースの抽出を行う。すなわち、共通のリソース値が割り当てられるリソースキーが複数生成される場合に、共通のリソース値を割り当てたグローバルリソースキーを作成する。
図23のグローバルリソースマップ2300に存在するグローバルリソースキーの例でいうと、重複回数2303の値が2以上であるものは、グローバルリソースキー2301が、_GLOBAL.EMPLOYEE.ID(重複は2回)と、_GLOBAL.EMPLOYEE.NAME(重複は2回)のものであるため、これらのグローバルリソースキーがグローバルリソースとして抽出されることとなる。
また、そのグローバルリソースキーに対応するグローバルリソース値は、グローバルリソースキー2301に対応するグローバルリソース値2302より取得する。
抽出したグローバルリソースキーと、それに対応するグローバルリソース値をグローバルリソースとしてメモリ上に抽出した例を図27に示す。例えば、図23、2310の_GLOBAL.EMPLOYEE.IDからは図27、2701に図示するようにグローバルリソースが抽出され、図23、2320の_GLOBAL.EMPLOYEE.NAMEからは、図27、2702に図示するようにグローバルリソースが抽出される。
グローバルリソースマップ2300にあるすべてのグローバルリソースキーについてS2601からS2602までの処理を終えると、図26の処理を終了する。
図28は翻訳対象のリソース値のうち、重複しているリソース値について、グローバルリソースキー使用情報2400を参照し、グローバルリソースキーで差し替える処理図である。本処理のS2801からS2803は、第一の実施形態と同様に作成された、通常のリソースキーとなる情報(図25のS2501からS2510までの処理(ただし、S2502は除く)で、既にメモリ上に抽出してある、リソースキーに対応するリソース値の対応づけとして作成した図29の情報)に対し、順番に1件ずつグローバルリソースで置き換え可能である場合に、置き換えを行う処理である。
図29は、図20の2010と2020の入出力画面定義が存在する場合に、第一の実施形態において翻訳対象となる項目をリソースキーとし、それに対するリソース値を設定した状態のファイルである。第一の実施形態によると、図29に図示する形式でリソースファイルが作成されるが、第二の実施形態では、これに対し、重複するリソース値を、共通の翻訳語が設定されたグローバルリソースキーに置き換える処理を行う。
S2801で、図29の該当リソースキーに対し、図24のグローバルリソースキー使用情報2400に合致するレコードが存在するかを判定する。合致するかの判断は、図24のリソースキー2401の値に同じリソースキーが存在するか否かで判定する。
なお、図24に存在する場合は、図24は、DM関連項目コードを関連付けて抽出したメモリ情報であるため、処理対象のリソースキーはDM関連項目コードということになる。S2801で図24のグローバルリソースキー使用情報2400に合致するレコードが存在する場合は(S2801でYESの場合は)、S2802へ処理を進める。S2801で存在しない場合、次のリソースキーが存在する場合は、そのリソースキーに対して、再びS2801の処理を行う。
S2802において、図24で合致したリソースキーと同じ、図23のグローバルリソースマップ2300のリソースキーにおける重複回数2303において、1かそれとも2以上の値かを確認する。1の場合、重複値がないため、次のリソースキーが存在する場合は、そのリソースキーに対して再びS2801の処理を行う。2以上の場合は、重複値となるため、S2803へ処理を進める。
S2803では、図25のS2510までの処理で、既にメモリ上に抽出してある、リソースキーに対応するリソース値を、S2802で重複回数を確認した図23のグローバルリソースキー2301の値で差し替える。すなわち、共通のリソース値が割り当てられるリソースキーに、グローバルリソースキーをリソース値として割り当てる。
なお、S2801で、該当リソースキーに対し、図24のグローバルリソースキー使用情報2400に合致するレコードが存在しない場合(S2801でNOの場合)、また、S2802において、図24で合致したリソースキーと同じ、図23のグローバルリソースマップ2300のリソースキーにおける重複回数2303が1の場合(S2802でNOの場合)は、図25のS2510までの処理で、既にメモリ上にためてある、処理対象となっているリソースキーに対応するリソース値は、そのままの状態にしておく。
図29のリソースキーに対する、S2801からS2803のグローバルリソースキーへの差し替え処理が完了した後は、S2804において、図25のS2502(図26)の処理で抽出していたグローバルリソースも含め、図30に図示の、重複キー対応を行ったリソースファイルを出力する。
次に、その出力されるリソースファイルについて説明をする。図30の3001で図示する「_GLOBAL.EMPLOYEE.ID=社員」、「_GLOBAL.EMPLOYEE.NAME=社員名」の部分については、図25のS2502(図26の処理)のグローバルリソース出力で抽出され、ファイルとなった内容である。
図30の3003で図示する、「io.EMP_LIST」以降、「ioItem.EMP_DTL.UPDATE」までの行は、図28の処理で抽出され、ファイルとなった内容である。
再度、図28の処理の流れを、図29に図示する、図20の社員マスタの入出力定義(2010)と図20の社員更新の入出力定義(2020)から作成されたリソースキーをもとに説明をする。
図29の中において、図20の社員更新の入出力定義(2020)の項目コードがEMP_ID(2025)から作成されたリソースキーである「ioItem.EMP_DTL.EMP_ID」を例に挙げて説明をする。
S2801において、リソースキーの「ioItem.EMP_DTL.EMP_ID」が、図24のグローバルリソースキー使用情報2400に合致するレコードがあるか否かを判定する。
このリソースキーは、図24の2403のリソースキー2401に合致する(S2801においてYES)。また、それに対応するグローバルリソースキー2402の値は、「_GLOBAL.EMPLOYEE.ID」となる。
次ぎに、S2802において、リソースキーの「ioItem.EMP_DTL.EMP_ID」は、リソース値が重複するものであるかを判定する。
S2801で確認した図24のグローバルリソースキー2402の値である「_GLOBAL.EMPLOYEE.ID」に対応する、図23におけるグローバルリソースキーの情報を検索する。このとき、図23の2310のグローバルリソースキー2301の値が、「_GLOBAL.EMPLOYEE.ID」のレコードが合致する情報となる。また、図23の2310のレコードの重複回数2303の値は「2」であるため、重複しているグローバルリソースキーであることが分かる。したがって、S2802において、リソースキーの「ioItem.EMP_DTL.EMP_ID」は、リソース値が重複するものがあることになる(S2802において>=2)。
次に、S2803において、図25のS2510までの処理で、既にメモリ上に抽出してある、リソースキー(図29の「ioItem.EMP_DTL.EMP_ID」)に対応するリソース値(図29の社員番号)を、S2802で重複回数を確認した図23のグローバルリソースキー2301の値(「_GLOBAL.EMPLOYEE.ID」)で差し替える。したがって、最終的に、ioItem.EMP_DTL.EMP_ID=_GLOBAL.EMPLOYEE.IDというリソースキーとリソース値の組み合わせが作成されることになる。
同様の処理が、図29の中における、図20の社員更新の入出力定義(2020)の項目コードがEMP_ID(2026)から作成されたリソースキーである「ioItem.EMP_DTL.EMP_NAME」、図20の社員マスタの入出力定義(2010)の項目コードがEMP_ID(2014)から作成されたリソースキーである「ioItem.EMP_LST.EMP_ID」、項目コードがEMP_NAME(2015)から作成されたリソースキーである「ioItem.EMP_LST.EMP_NAME」も、重複キーとなっているため、同様の処理がされ、最終的に図30の3002に図示するリソースキーとリソース値の組み合わせが作成される。
以上で、重複リソースがある場合のリソースファイルテンプレート出力処理の説明を終了する。
以上、第1の実施形態に対して、第二の実施形態の処理を含めることにより、同じリソース値が割り当てられるリソースキーが複数存在した場合、そのリソースキーに割り当てる値をグローバルリソースキーとし、かつ、グローバルリソースキーへも共通となるリソース値を割り当て、リソースファイルを作成することで、共通する値が割り当てられるリソースキーに関しては、グローバルリソースキーに割り当てるリソース値を翻訳するだけで、他の言語切り替え処理用のリソースファイルを作成することが可能となる。
なお、上述した各種データの構成及びその内容はこれに限定されるものではなく、用途や目的に応じて、様々な構成や内容で構成されることは言うまでもない。
以上、二つの実施形態について示したが、本発明は、例えば、システム、装置、方法、コンピュータプログラムもしくは記録媒体等としての実施態様をとることが可能であり、具体的には、複数の機器から構成されるシステムに適用しても良いし、また、一つの機器からなる装置に適用しても良い。
また、本発明におけるコンピュータプログラムは、図9、図10、図12、図13、図15、図16、図21、図22、図25、図26、図28に示すフローチャートの処理方法をコンピュータが実行可能なコンピュータプログラムであり、本発明の記憶媒体は図9、図10、図12、図13、図15、図16、図21、図22、図25、図26、図28の処理方法をコンピュータが実行可能なコンピュータプログラムが記憶されている。なお、本発明におけるコンピュータプログラムは図9、図10、図12、図13、図15、図16、図21、図22、図25、図26、図28の各装置の処理方法ごとのコンピュータプログラムであってもよい。
以上のように、前述した実施形態の機能を実現するコンピュータプログラムを記録した記録媒体を、システムあるいは装置に供給し、そのシステムあるいは装置のコンピュータ(またはCPUやMPU)が記録媒体に格納されたコンピュータプログラムを読出し実行することによっても、本発明の目的が達成されることは言うまでもない。
この場合、記録媒体から読み出されたコンピュータプログラム自体が本発明の新規な機能を実現することになり、そのコンピュータプログラムを記憶した記録媒体は本発明を構成することになる。
コンピュータプログラムを供給するための記録媒体としては、例えば、フレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、CD−ROM、CD−R、DVD−ROM、磁気テープ、不揮発性のメモリカード、ROM、EEPROM、シリコンディスク、ソリッドステートドライブ等を用いることができる。
また、コンピュータが読み出したコンピュータプログラムを実行することにより、前述した実施形態の機能が実現されるだけでなく、そのコンピュータプログラムの指示に基づき、コンピュータ上で稼働しているOS(オペレーティングシステム)等が実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
さらに、記録媒体から読み出されたコンピュータプログラムが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書き込まれた後、そのコンピュータプログラムコードの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるCPU等が実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
また、本発明は、複数の機器から構成されるシステムに適用しても、1つの機器からなる装置に適用してもよい。また、本発明は、システムあるいは装置にコンピュータプログラムを供給することによって達成される場合にも適応できることは言うまでもない。この場合、本発明を達成するためのコンピュータプログラムを格納した記録媒体を該システムあるいは装置に読み出すことによって、そのシステムあるいは装置が、本発明の効果を享受することが可能となる。
さらに、本発明を達成するためのコンピュータプログラムをネットワーク上のサーバ、データベース等から通信プログラムによりダウンロードして読み出すことによって、そのシステムあるいは装置が、本発明の効果を享受することが可能となる。
なお、上述した各実施形態およびその変形例を組み合わせた構成も全て本発明に含まれるものである。