ゲームに使う文字列の多言語対応をエクセルやスプレッドシートで「c++用ヘッダー出力」

プログラムから文字列を識別するラベルのリストをenum出力してみる

LanguageMan()->SetLang( "日本語" );
wchar_t * str_help=LanguageMan()->GetString( STR_LABEL_TUTORIAL );
こんなふうにアクセスするために

VBAを書いてみる
'   出力
'   STR_LABELを探す
'       STR_LABELから下へラベル
'       STR_LABELから右へ言語リスト

'   C++ヘッダーファイル名
Const fn_enum As String = "lang_str"
Const fn_path As String = "\..\src_game\"
'   ラベル識別 enum classなどに使う
Const str_label As String = "STR_LABEL"
'   C++用言語名
Const str_言語名 As String = "str_言語名"


Dim sheet_now As Worksheet
Dim lbl_x As Long
Dim lbl_y As Long

'   tbl
Dim lbl_pos() As Long   '   n個目のラベルのY位置
Dim lbl_max As Long     '   ラベルの個数
Dim lang_pos() As Long  '   n個目の言語のX位置
Dim lang_max As Long    '   言語の個数

'   enumとバイナリー出力
Sub 文字列のバイナリー出力とラベル()
    Set sheet_now = ActiveSheet
    Set lbl = sheet_now.Cells.Find(str_label)
    If lbl Is Nothing Then Exit Sub
    lbl_x = lbl.Column()
    lbl_y = lbl.Row()
    バイナリー出力のラベルと言語の走査 sheet_now
    バイナリー出力のラベル sheet_now, ActiveWorkbook.Path & fn_path & fn_enum
End Sub

'   ラベルと言語の走査
Sub バイナリー出力のラベルと言語の走査(sh As Worksheet)
    If sh Is Nothing Then Exit Sub
    Dim y As Long
    lbl_max = 0
    ReDim lbl_pos(0)
    Dim x As Long
    lang_max = 0
    ReDim lang_pos(0)
 
    '   ラベルの個数
    For y = lbl_y + 1 To sh.UsedRange.Rows.Count + sh.UsedRange.Rows.Row + 10
        If sh.Cells(y, lbl_x).Value <> "" Then
            lbl_max = lbl_max + 1
            ReDim Preserve lbl_pos(lbl_max)
            lbl_pos(lbl_max) = y
        End If
    Next y
    '   言語の個数
    For x = lbl_x + 1 To sh.UsedRange.Columns.Count + sh.UsedRange.Columns.Column + 10
        If sh.Cells(lbl_y, x).Value <> "" Then
            lang_max = lang_max + 1
            ReDim Preserve lang_pos(lang_max)
            lang_pos(lang_max) = x
        End If
    Next x
    'MsgBox "ラベル=" & lbl_max & " 言語=" & lang_max
End Sub

'   ラベルのenum
Sub バイナリー出力のラベル(sh As Worksheet, fn As String)
    If sh Is Nothing Then Exit Sub
    '
    Open fn & ".h" For Output As #1
    '
    Print #1, "#pragma once"
    Print #1, "/**"
    Print #1, "    @brief   文字列のラベルリスト"
    Print #1, "    @author  " & ActiveWorkbook.Name
    Print #1, "*/"
    Print #1, ""
     
    Print #1, "//! 文字列の識別子"
    Dim y As Long
    Dim yp As Long
    Print #1, "enum " & str_label & " {"
    For y = 1 To lbl_max
        yp = lbl_pos(y)
        Print #1, "    " & str_label & "_" & sh.Cells(yp, lbl_x).Value & ",    // " & sh.Cells(yp, lbl_x - 1).Value
    Next y
    Print #1, "    " & str_label & "_MAX"
    Print #1, "};"
    Print #1, ""
    Print #1, "//!  言語名の個数"
    Print #1, "#define " & str_言語名 & "_MAX " & lang_max
    Print #1, "//!  言語名リスト"
    Print #1, "extern const wchar_t* " & str_言語名 & "[" & str_言語名 & "_MAX+1]; "
    Close #1
    '
    Open fn & ".cpp" For Output As #1
    '
    Print #1, "#include """ & fn_enum & ".h"""
    Print #1, "/**"
    Print #1, "    @brief   文字列の言語名リスト"
    Print #1, "    @author  " & ActiveWorkbook.Name
    Print #1, "*/"
    Print #1, ""
    Print #1, "//!  言語名リスト"
    Print #1, "const wchar_t* " & str_言語名 & "[" & str_言語名 & "_MAX+1]={ "
    Dim x As Long
    Dim xp As Long
    For x = 1 To lang_max
        xp = lang_pos(x)
        Print #1, "    L""" & sh.Cells(lbl_y, xp).Value & """, "
    Next x
        Print #1, "    nullptr"
    Print #1, "};"
    Close #1
End Sub



元のエクセル

help説明STR_LABEL日本語English
言語LANGUAGE言語language
ゲームから操作説明へTUTORIAL操作説明tutorial
ゲームに戻るRETURN2GAMEゲームにもどるreturn to game
操作説明「一歩進む」TUTORIAL_GO一歩進んでみよう
操作説明「左にまがる」TUTORIAL_TURN_LEFT左にまがってみよう
操作説明「右にまがる」TUTORIAL_TURN_RIGHT右にまがってみよう
操作説明「ゴールまですすむ」TUTORIAL_GOALゴールまで進んでみよう


出力結果
ヘッダー
#pragma once
/**
    @brief   文字列のラベルリスト
    @author  ゲーム文字列.xlsm
*/

//! 文字列の識別子
enum STR_LABEL {
    STR_LABEL_LANGUAGE,    // 言語
    STR_LABEL_TUTORIAL,    // ゲームから操作説明へ
    STR_LABEL_RETURN2GAME,    // ゲームに戻る
    STR_LABEL_TUTORIAL_GO,    // 操作説明「一歩進む」
    STR_LABEL_TUTORIAL_TURN_LEFT,    // 操作説明「左にまがる」
    STR_LABEL_TUTORIAL_TURN_RIGHT,    // 操作説明「右にまがる」
    STR_LABEL_TUTORIAL_GOAL,    // 操作説明「ゴールまですすむ」
    STR_LABEL_MAX
};

//!  言語名の個数
#define str_言語名_MAX 2
//!  言語名リスト
extern const wchar_t* str_言語名[str_言語名_MAX+1];


出力結果 cpp
#include "lang_str.h"
/**
    @brief   文字列の言語名リスト
    @author  ゲーム文字列.xlsm
*/

//!  言語名リスト
const wchar_t* str_言語名[str_言語名_MAX+1]={
    L"日本語",
    L"English",
    nullptr
};


文字列が少ないから
プログラムに内包したほうがはやそうですが
今後のためにこのまま





次回、文字列そのもののバイナリー出力


コメント