add language localization tools
This commit is contained in:
@@ -446,7 +446,7 @@ static const LanguageInfo g_langs[] =
|
||||
{"ZU", "Zulu", "isiZulu"},
|
||||
};
|
||||
|
||||
void GetLanguageInfos( vector<LanguageInfo> &vAddTo )
|
||||
void GetLanguageInfos( vector<const LanguageInfo*> &vAddTo )
|
||||
{
|
||||
for( int i=0; i<ARRAYSIZE(g_langs); i++ )
|
||||
{
|
||||
@@ -456,10 +456,25 @@ void GetLanguageInfos( vector<LanguageInfo> &vAddTo )
|
||||
// smtools UI.
|
||||
if( g_langs[i].szNativeName == RString() )
|
||||
continue;
|
||||
vAddTo.push_back( g_langs[i] );
|
||||
vAddTo.push_back( &g_langs[i] );
|
||||
}
|
||||
}
|
||||
|
||||
const LanguageInfo *GetLanguageInfo( const RString &sIsoCode )
|
||||
{
|
||||
for( int i=0; i<ARRAYSIZE(g_langs); i++ )
|
||||
{
|
||||
// Only use languages in the intersection of Windows languages
|
||||
// and languages that had native forms on the site listed above.
|
||||
// Obscure languages are dropped so that they don't clutter up the
|
||||
// smtools UI.
|
||||
if( sIsoCode.CompareNoCase(g_langs[i].szIsoCode) == 0 )
|
||||
return &g_langs[i];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
RString join( const RString &sDeliminator, const vector<RString> &sSource)
|
||||
{
|
||||
if( sSource.empty() )
|
||||
|
||||
@@ -282,11 +282,12 @@ wstring RStringToWstring( const RString &sString );
|
||||
|
||||
struct LanguageInfo
|
||||
{
|
||||
const char *szIso639Code;
|
||||
const char *szIsoCode;
|
||||
const char *szEnglishName;
|
||||
const char *szNativeName; // empty string if not available
|
||||
};
|
||||
void GetLanguageInfos( vector<LanguageInfo> &vAddTo );
|
||||
void GetLanguageInfos( vector<const LanguageInfo*> &vAddTo );
|
||||
const LanguageInfo *GetLanguageInfo( const RString &sIsoCode );
|
||||
RString GetLanguageNameFromISO639Code( RString sName );
|
||||
|
||||
// Splits a RString into an vector<RString> according the Delimitor.
|
||||
|
||||
@@ -5,7 +5,8 @@ const RString SpecialFiles::KEYMAPS_PATH = "Save/Keymaps.ini";
|
||||
const RString SpecialFiles::PREFERENCES_INI_PATH = "Save/Preferences.ini";
|
||||
const RString SpecialFiles::THEMES_DIR = "Themes/";
|
||||
const RString SpecialFiles::LANGUAGES_SUBDIR = "Languages/";
|
||||
|
||||
const RString SpecialFiles::BASE_LANGUAGE = "en";
|
||||
const RString SpecialFiles::METRICS_FILE = "metrics.ini";
|
||||
|
||||
/*
|
||||
* (c) 2003-2005 Chris Danford
|
||||
|
||||
@@ -9,7 +9,8 @@ namespace SpecialFiles
|
||||
extern const RString PREFERENCES_INI_PATH;
|
||||
extern const RString THEMES_DIR;
|
||||
extern const RString LANGUAGES_SUBDIR;
|
||||
|
||||
extern const RString BASE_LANGUAGE;
|
||||
extern const RString METRICS_FILE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -34,8 +34,7 @@ StringToX( ElementCategory );
|
||||
|
||||
|
||||
const RString BASE_THEME_NAME = "default";
|
||||
const RString BASE_LANGUAGE = "english";
|
||||
const RString METRICS_FILE = "metrics.ini";
|
||||
// TODO: A theme should be able to specify a base language.
|
||||
|
||||
|
||||
struct Theme
|
||||
|
||||
@@ -158,6 +158,12 @@
|
||||
<File
|
||||
RelativePath=".\smpackage\ChangeGameSettings.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\smpackage\CreateLanguageDlg.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\smpackage\CreateLanguageDlg.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\smpackage\EditInsallations.cpp">
|
||||
</File>
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
// CreateLanguageDlg.cpp : implementation file
|
||||
//
|
||||
|
||||
#define CO_EXIST_WITH_MFC
|
||||
#include "global.h"
|
||||
#include "stdafx.h"
|
||||
#include "smpackage.h"
|
||||
#include "CreateLanguageDlg.h"
|
||||
#include "RageUtil.h"
|
||||
#include "SMPackageUtil.h"
|
||||
#include ".\createlanguagedlg.h"
|
||||
|
||||
// CreateLanguageDlg dialog
|
||||
|
||||
IMPLEMENT_DYNAMIC(CreateLanguageDlg, CDialog)
|
||||
CreateLanguageDlg::CreateLanguageDlg(CWnd* pParent /*=NULL*/)
|
||||
: CDialog(CreateLanguageDlg::IDD, pParent)
|
||||
{
|
||||
}
|
||||
|
||||
CreateLanguageDlg::~CreateLanguageDlg()
|
||||
{
|
||||
}
|
||||
|
||||
void CreateLanguageDlg::DoDataExchange(CDataExchange* pDX)
|
||||
{
|
||||
CDialog::DoDataExchange(pDX);
|
||||
DDX_Control(pDX, IDC_COMBO_LANGUAGES, m_comboLanguages);
|
||||
}
|
||||
|
||||
BOOL CreateLanguageDlg::OnInitDialog()
|
||||
{
|
||||
CDialog::OnInitDialog();
|
||||
|
||||
vector<const LanguageInfo*> v;
|
||||
GetLanguageInfos( v );
|
||||
FOREACH_CONST( const LanguageInfo*, v, i )
|
||||
{
|
||||
RString s = SMPackageUtil::GetLanguageDisplayString((*i)->szIsoCode);
|
||||
m_comboLanguages.AddString( s );
|
||||
}
|
||||
ASSERT( !v.empty() );
|
||||
m_comboLanguages.SetCurSel( 0 );
|
||||
return TRUE; // return TRUE unless you set the focus to a control
|
||||
}
|
||||
|
||||
BEGIN_MESSAGE_MAP(CreateLanguageDlg, CDialog)
|
||||
ON_BN_CLICKED(IDOK, OnBnClickedOk)
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
|
||||
// CreateLanguageDlg message handlers
|
||||
|
||||
void CreateLanguageDlg::OnBnClickedOk()
|
||||
{
|
||||
// TODO: Add your control notification handler code here
|
||||
|
||||
int iIndex = m_comboLanguages.GetCurSel();
|
||||
ASSERT( iIndex != LB_ERR );
|
||||
|
||||
vector<const LanguageInfo*> v;
|
||||
GetLanguageInfos( v );
|
||||
m_sChosenLanguageCode = v[iIndex]->szIsoCode;
|
||||
|
||||
OnOK();
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
#pragma once
|
||||
#include "afxwin.h"
|
||||
|
||||
|
||||
// CreateLanguageDlg dialog
|
||||
|
||||
class CreateLanguageDlg : public CDialog
|
||||
{
|
||||
DECLARE_DYNAMIC(CreateLanguageDlg)
|
||||
|
||||
public:
|
||||
CreateLanguageDlg(CWnd* pParent = NULL); // standard constructor
|
||||
virtual ~CreateLanguageDlg();
|
||||
|
||||
// Dialog Data
|
||||
enum { IDD = IDD_DIALOG1 };
|
||||
|
||||
protected:
|
||||
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
||||
virtual BOOL OnInitDialog();
|
||||
|
||||
DECLARE_MESSAGE_MAP()
|
||||
public:
|
||||
CComboBox m_comboLanguages;
|
||||
afx_msg void OnBnClickedOk();
|
||||
|
||||
CString m_sChosenLanguageCode;
|
||||
};
|
||||
@@ -8,6 +8,13 @@
|
||||
#include "LanguagesDlg.h"
|
||||
#include "SpecialFiles.h"
|
||||
#include "RageUtil.h"
|
||||
#include "IniFile.h"
|
||||
#include "languagesdlg.h"
|
||||
#include "SMPackageUtil.h"
|
||||
#include "CreateLanguageDlg.h"
|
||||
#include "RageFile.h"
|
||||
#include "languagesdlg.h"
|
||||
#include "RageFileManager.h"
|
||||
|
||||
|
||||
// LanguagesDlg dialog
|
||||
@@ -35,12 +42,13 @@ BOOL LanguagesDlg::OnInitDialog()
|
||||
|
||||
vector<RString> vs;
|
||||
GetDirListing( SpecialFiles::THEMES_DIR+"*", vs, true );
|
||||
StripCvs( vs );
|
||||
FOREACH_CONST( RString, vs, s )
|
||||
m_listThemes.AddString( *s );
|
||||
if( !vs.empty() )
|
||||
m_listThemes.SetSel( 0 );
|
||||
else
|
||||
OnSelchangeListThemes();
|
||||
|
||||
OnSelchangeListThemes();
|
||||
|
||||
return TRUE; // return TRUE unless you set the focus to a control
|
||||
}
|
||||
@@ -56,28 +64,82 @@ static RString GetCurrentString( const CListBox &list )
|
||||
return RString( s );
|
||||
}
|
||||
|
||||
static void SelectString( CListBox &list, const RString &sToSelect )
|
||||
{
|
||||
for( int i=0; i<list.GetCount(); i++ )
|
||||
{
|
||||
CString s;
|
||||
list.GetText( i, s );
|
||||
if( s == sToSelect )
|
||||
{
|
||||
list.SetCurSel( i );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LanguagesDlg::OnSelchangeListThemes()
|
||||
{
|
||||
// TODO: Add your control notification handler code here
|
||||
m_listLanguages.ResetContent();
|
||||
|
||||
RString sTheme = GetCurrentString( m_listThemes );
|
||||
if( sTheme.empty() )
|
||||
if( !sTheme.empty() )
|
||||
{
|
||||
OnSelchangeListLanguages();
|
||||
return;
|
||||
RString sLanguagesDir = SpecialFiles::THEMES_DIR + sTheme + "/" + SpecialFiles::LANGUAGES_SUBDIR;
|
||||
|
||||
vector<RString> vs;
|
||||
GetDirListing( sLanguagesDir+"*.ini", vs, false );
|
||||
FOREACH_CONST( RString, vs, s )
|
||||
{
|
||||
RString sIsoCode = GetFileNameWithoutExtension(*s);
|
||||
m_listLanguages.AddString( SMPackageUtil::GetLanguageDisplayString(sIsoCode) );
|
||||
}
|
||||
if( !vs.empty() )
|
||||
m_listLanguages.SetSel( 0 );
|
||||
}
|
||||
|
||||
RString sLanguagesDir = SpecialFiles::THEMES_DIR + sTheme + "/" + SpecialFiles::LANGUAGES_SUBDIR;
|
||||
OnSelchangeListLanguages();
|
||||
}
|
||||
|
||||
vector<RString> vs;
|
||||
GetDirListing( sLanguagesDir+"*.ini", vs, false );
|
||||
FOREACH_CONST( RString, vs, s )
|
||||
m_listLanguages.AddString( GetFileNameWithoutExtension(*s) );
|
||||
if( !vs.empty() )
|
||||
m_listLanguages.SetSel( 0 );
|
||||
else
|
||||
OnSelchangeListLanguages();
|
||||
static RString GetLanguageFile( const RString &sTheme, const RString &sLanguage )
|
||||
{
|
||||
return SpecialFiles::THEMES_DIR + sTheme + "/" + SpecialFiles::LANGUAGES_SUBDIR + sLanguage + ".ini";
|
||||
}
|
||||
|
||||
static int GetNumValuesInIniFile( const RString &sIniFile )
|
||||
{
|
||||
int count = 0;
|
||||
IniFile ini;
|
||||
ini.ReadFile( sIniFile );
|
||||
FOREACH_CONST_Child( &ini, key )
|
||||
{
|
||||
FOREACH_CONST_Attr( key, value )
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static int GetNumIntersectingIniValues( const RString &sIniFile1, const RString &sIniFile2 )
|
||||
{
|
||||
int count = 0;
|
||||
IniFile ini1;
|
||||
ini1.ReadFile( sIniFile1 );
|
||||
IniFile ini2;
|
||||
ini2.ReadFile( sIniFile2 );
|
||||
FOREACH_CONST_Child( &ini1, key1 )
|
||||
{
|
||||
const XNode *key2 = ini2.GetChild( key1->m_sName );
|
||||
if( key2 == NULL )
|
||||
continue;
|
||||
FOREACH_CONST_Attr( key1, attr1 )
|
||||
{
|
||||
if( key2->GetAttr(attr1->first) == NULL)
|
||||
continue;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
void LanguagesDlg::OnSelchangeListLanguages()
|
||||
@@ -89,24 +151,77 @@ void LanguagesDlg::OnSelchangeListLanguages()
|
||||
RString sTheme = GetCurrentString( m_listThemes );
|
||||
RString sLanguage = GetCurrentString( m_listLanguages );
|
||||
|
||||
if( !sTheme.empty() && !sLanguage.empty() )
|
||||
if( !sTheme.empty() )
|
||||
{
|
||||
RString sThemeDir = "Themes/" + sTheme + "/";
|
||||
RString sLanguageFile = sThemeDir + SpecialFiles::LANGUAGES_SUBDIR + sLanguage + ".ini";
|
||||
RString sBaseLanguageFile = GetLanguageFile( sTheme, SpecialFiles::BASE_LANGUAGE );
|
||||
iTotalStrings = GetNumValuesInIniFile( sBaseLanguageFile );
|
||||
|
||||
iTotalStrings = rand()%100;
|
||||
iNeedTranslation = rand()%100;
|
||||
if( !sLanguage.empty() )
|
||||
{
|
||||
sLanguage = SMPackageUtil::GetLanguageCodeFromDisplayString( sLanguage );
|
||||
|
||||
RString sLanguageFile = GetLanguageFile( sTheme, sLanguage );
|
||||
iNeedTranslation = iTotalStrings - GetNumIntersectingIniValues( sBaseLanguageFile, sLanguageFile );
|
||||
}
|
||||
}
|
||||
|
||||
GetDlgItem(IDC_STATIC_TOTAL_STRINGS )->SetWindowText( ssprintf(iTotalStrings==-1?"":"%d",iTotalStrings) );
|
||||
GetDlgItem(IDC_STATIC_NEED_TRANSLATION )->SetWindowText( ssprintf(iNeedTranslation==-1?"":"%d",iNeedTranslation) );
|
||||
|
||||
GetDlgItem(IDC_BUTTON_CREATE)->EnableWindow( !sTheme.empty() );
|
||||
GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow( !sLanguage.empty() );
|
||||
GetDlgItem(IDC_BUTTON_EXPORT)->EnableWindow( !sLanguage.empty() );
|
||||
GetDlgItem(IDC_BUTTON_IMPORT)->EnableWindow( !sLanguage.empty() );
|
||||
}
|
||||
|
||||
|
||||
BEGIN_MESSAGE_MAP(LanguagesDlg, CDialog)
|
||||
ON_LBN_SELCHANGE(IDC_LIST_THEMES, OnSelchangeListThemes)
|
||||
ON_LBN_SELCHANGE(IDC_LIST_LANGUAGES, OnSelchangeListLanguages)
|
||||
ON_BN_CLICKED(IDC_BUTTON_CREATE, OnBnClickedButtonCreate)
|
||||
ON_BN_CLICKED(IDC_BUTTON_DELETE, OnBnClickedButtonDelete)
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
|
||||
// LanguagesDlg message handlers
|
||||
|
||||
void LanguagesDlg::OnBnClickedButtonCreate()
|
||||
{
|
||||
// TODO: Add your control notification handler code here
|
||||
CreateLanguageDlg dlg;
|
||||
int nResponse = dlg.DoModal();
|
||||
if( nResponse != IDOK )
|
||||
return;
|
||||
|
||||
RString sTheme = GetCurrentString( m_listThemes );
|
||||
ASSERT( !sTheme.empty() );
|
||||
|
||||
RString sLanguageFile = GetLanguageFile( sTheme, RString(dlg.m_sChosenLanguageCode) );
|
||||
|
||||
// create empty file
|
||||
RageFile file;
|
||||
file.Open( sLanguageFile, RageFile::WRITE );
|
||||
file.Close(); // flush file
|
||||
|
||||
FlushDirCache();
|
||||
|
||||
OnSelchangeListThemes();
|
||||
SelectString( m_listLanguages, SMPackageUtil::GetLanguageDisplayString(RString(dlg.m_sChosenLanguageCode)) );
|
||||
OnSelchangeListLanguages();
|
||||
}
|
||||
|
||||
void LanguagesDlg::OnBnClickedButtonDelete()
|
||||
{
|
||||
// TODO: Add your control notification handler code here
|
||||
RString sTheme = GetCurrentString( m_listThemes );
|
||||
ASSERT( !sTheme.empty() );
|
||||
RString sLanguage = GetCurrentString( m_listLanguages );
|
||||
ASSERT( !sLanguage.empty() );
|
||||
sLanguage = SMPackageUtil::GetLanguageCodeFromDisplayString( sLanguage );
|
||||
|
||||
RString sLanguageFile = GetLanguageFile( sTheme, sLanguage );
|
||||
FILEMAN->Remove( sLanguageFile );
|
||||
FlushDirCache();
|
||||
|
||||
OnSelchangeListThemes();
|
||||
}
|
||||
|
||||
@@ -25,4 +25,6 @@ protected:
|
||||
public:
|
||||
CListBox m_listThemes;
|
||||
CListBox m_listLanguages;
|
||||
afx_msg void OnBnClickedButtonCreate();
|
||||
afx_msg void OnBnClickedButtonDelete();
|
||||
};
|
||||
|
||||
@@ -193,6 +193,22 @@ bool SMPackageUtil::LaunchGame()
|
||||
return true;
|
||||
}
|
||||
|
||||
RString SMPackageUtil::GetLanguageDisplayString( const RString &sIsoCode )
|
||||
{
|
||||
const LanguageInfo *li = GetLanguageInfo( sIsoCode );
|
||||
return ssprintf( "%s (%s)", li ? li->szIsoCode:sIsoCode.c_str(), li ? li->szNativeName:"???" );
|
||||
}
|
||||
|
||||
RString SMPackageUtil::GetLanguageCodeFromDisplayString( const RString &sDisplayString )
|
||||
{
|
||||
RString s = sDisplayString;
|
||||
// strip the space and everything after
|
||||
size_t iSpace = s.find(' ');
|
||||
ASSERT( iSpace != s.npos );
|
||||
s.erase( s.begin()+iSpace, s.end() );
|
||||
return s;
|
||||
}
|
||||
|
||||
/*
|
||||
* (c) 2002-2005 Chris Danford
|
||||
* All rights reserved.
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#define IDD_UNINSTALL_OLD_PACKAGES 148
|
||||
#define IDD_CHANGE_GAME_SETTINGS 149
|
||||
#define IDD_THEMES 150
|
||||
#define IDD_DIALOG1 151
|
||||
#define IDC_LIST_SONGS 1000
|
||||
#define IDC_LIST 1000
|
||||
#define IDC_BUTTON_PLAY 1001
|
||||
@@ -84,15 +85,16 @@
|
||||
#define IDC_LIST_LANGUAGES 1058
|
||||
#define IDC_STATIC_TOTAL_STRINGS 1060
|
||||
#define IDC_STATIC_NEED_TRANSLATION 1061
|
||||
#define IDC_STATIC_TOTAL_STRINGS2 1062
|
||||
#define IDC_COMBO1 1065
|
||||
#define IDC_COMBO_LANGUAGES 1065
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 151
|
||||
#define _APS_NEXT_RESOURCE_VALUE 152
|
||||
#define _APS_NEXT_COMMAND_VALUE 32771
|
||||
#define _APS_NEXT_CONTROL_VALUE 1062
|
||||
#define _APS_NEXT_CONTROL_VALUE 1066
|
||||
#define _APS_NEXT_SYMED_VALUE 104
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -281,11 +281,7 @@ CAPTION "Language Translations"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "Close",IDOK,272,173,50,14
|
||||
LISTBOX IDC_LIST_THEMES,7,18,102,121,LBS_SORT |
|
||||
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
|
||||
LTEXT "Themes",IDC_STATIC,7,7,101,10
|
||||
LISTBOX IDC_LIST_LANGUAGES,116,17,100,121,LBS_SORT |
|
||||
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
|
||||
LTEXT "Languages",IDC_STATIC,118,7,98,10
|
||||
PUSHBUTTON "Create Language",IDC_BUTTON_CREATE,232,45,85,15
|
||||
PUSHBUTTON "Delete Language",IDC_BUTTON_DELETE,232,67,85,15
|
||||
@@ -298,6 +294,23 @@ BEGIN
|
||||
LTEXT "Need translation:",IDC_STATIC,225,28,69,10
|
||||
LTEXT "",IDC_STATIC_TOTAL_STRINGS,296,18,26,10
|
||||
LTEXT "",IDC_STATIC_NEED_TRANSLATION,296,27,26,10
|
||||
LISTBOX IDC_LIST_THEMES,7,18,102,121,LBS_SORT |
|
||||
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
|
||||
LISTBOX IDC_LIST_LANGUAGES,116,17,100,121,LBS_SORT |
|
||||
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_DIALOG1 DIALOGEX 0, 0, 186, 47
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
|
||||
WS_SYSMENU
|
||||
CAPTION "Create Language"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "OK",IDOK,129,7,50,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,129,27,50,14
|
||||
LTEXT "Choose a language",IDC_STATIC,7,7,110,11
|
||||
COMBOBOX IDC_COMBO_LANGUAGES,17,24,100,110,CBS_DROPDOWNLIST |
|
||||
CBS_SORT | WS_VSCROLL | WS_TABSTOP
|
||||
END
|
||||
|
||||
|
||||
@@ -426,6 +439,14 @@ BEGIN
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 187
|
||||
END
|
||||
|
||||
IDD_DIALOG1, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 179
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 40
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef SMPackageUtil_H
|
||||
#define SMPackageUtil_H
|
||||
|
||||
struct LanguageInfo;
|
||||
|
||||
namespace SMPackageUtil
|
||||
{
|
||||
void WriteStepManiaInstallDirs( const vector<RString>& asInstallDirsToWrite );
|
||||
@@ -16,6 +18,9 @@ namespace SMPackageUtil
|
||||
bool IsValidPackageDirectory(RString path);
|
||||
|
||||
bool LaunchGame();
|
||||
|
||||
RString GetLanguageDisplayString( const RString &sIsoCode );
|
||||
RString GetLanguageCodeFromDisplayString( const RString &sDisplayString );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user