From b42d28af345e380805d12522eff7b22c8c6e1c16 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Wed, 28 Dec 2005 19:21:08 +0000 Subject: [PATCH] add language localization tools --- stepmania/src/RageUtil.cpp | 19 ++- stepmania/src/RageUtil.h | 5 +- stepmania/src/SpecialFiles.cpp | 3 +- stepmania/src/SpecialFiles.h | 3 +- stepmania/src/ThemeManager.cpp | 3 +- stepmania/src/smpackage-net2003.vcproj | 6 + stepmania/src/smpackage/CreateLanguageDlg.cpp | 66 ++++++++ stepmania/src/smpackage/CreateLanguageDlg.h | 28 ++++ stepmania/src/smpackage/LanguagesDlg.cpp | 153 +++++++++++++++--- stepmania/src/smpackage/LanguagesDlg.h | 2 + stepmania/src/smpackage/SMPackageUtil.cpp | 16 ++ stepmania/src/smpackage/resource.h | 8 +- stepmania/src/smpackage/smpackage.rc | 29 +++- stepmania/src/smpackage/smpackageUtil.h | 5 + 14 files changed, 312 insertions(+), 34 deletions(-) create mode 100644 stepmania/src/smpackage/CreateLanguageDlg.cpp create mode 100644 stepmania/src/smpackage/CreateLanguageDlg.h diff --git a/stepmania/src/RageUtil.cpp b/stepmania/src/RageUtil.cpp index ecd32dbc14..5e85205188 100644 --- a/stepmania/src/RageUtil.cpp +++ b/stepmania/src/RageUtil.cpp @@ -446,7 +446,7 @@ static const LanguageInfo g_langs[] = {"ZU", "Zulu", "isiZulu"}, }; -void GetLanguageInfos( vector &vAddTo ) +void GetLanguageInfos( vector &vAddTo ) { for( int i=0; i &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 &sSource) { if( sSource.empty() ) diff --git a/stepmania/src/RageUtil.h b/stepmania/src/RageUtil.h index 9a69ea8ad3..711c13e5fd 100644 --- a/stepmania/src/RageUtil.h +++ b/stepmania/src/RageUtil.h @@ -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 &vAddTo ); +void GetLanguageInfos( vector &vAddTo ); +const LanguageInfo *GetLanguageInfo( const RString &sIsoCode ); RString GetLanguageNameFromISO639Code( RString sName ); // Splits a RString into an vector according the Delimitor. diff --git a/stepmania/src/SpecialFiles.cpp b/stepmania/src/SpecialFiles.cpp index efcca5a771..4845cdafcb 100644 --- a/stepmania/src/SpecialFiles.cpp +++ b/stepmania/src/SpecialFiles.cpp @@ -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 diff --git a/stepmania/src/SpecialFiles.h b/stepmania/src/SpecialFiles.h index 0ec6d6d6b1..f6219b4818 100644 --- a/stepmania/src/SpecialFiles.h +++ b/stepmania/src/SpecialFiles.h @@ -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 diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index fb6ae489c7..99de55f1d0 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -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 diff --git a/stepmania/src/smpackage-net2003.vcproj b/stepmania/src/smpackage-net2003.vcproj index 2c0186ddff..e0336d12dc 100644 --- a/stepmania/src/smpackage-net2003.vcproj +++ b/stepmania/src/smpackage-net2003.vcproj @@ -158,6 +158,12 @@ + + + + diff --git a/stepmania/src/smpackage/CreateLanguageDlg.cpp b/stepmania/src/smpackage/CreateLanguageDlg.cpp new file mode 100644 index 0000000000..dac9c679b5 --- /dev/null +++ b/stepmania/src/smpackage/CreateLanguageDlg.cpp @@ -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 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 v; + GetLanguageInfos( v ); + m_sChosenLanguageCode = v[iIndex]->szIsoCode; + + OnOK(); +} diff --git a/stepmania/src/smpackage/CreateLanguageDlg.h b/stepmania/src/smpackage/CreateLanguageDlg.h new file mode 100644 index 0000000000..7943e7fdce --- /dev/null +++ b/stepmania/src/smpackage/CreateLanguageDlg.h @@ -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; +}; diff --git a/stepmania/src/smpackage/LanguagesDlg.cpp b/stepmania/src/smpackage/LanguagesDlg.cpp index 4778ec874c..33d0d30596 100644 --- a/stepmania/src/smpackage/LanguagesDlg.cpp +++ b/stepmania/src/smpackage/LanguagesDlg.cpp @@ -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 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 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 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(); +} diff --git a/stepmania/src/smpackage/LanguagesDlg.h b/stepmania/src/smpackage/LanguagesDlg.h index 0ed7bc61c5..1412dc70a8 100644 --- a/stepmania/src/smpackage/LanguagesDlg.h +++ b/stepmania/src/smpackage/LanguagesDlg.h @@ -25,4 +25,6 @@ protected: public: CListBox m_listThemes; CListBox m_listLanguages; + afx_msg void OnBnClickedButtonCreate(); + afx_msg void OnBnClickedButtonDelete(); }; diff --git a/stepmania/src/smpackage/SMPackageUtil.cpp b/stepmania/src/smpackage/SMPackageUtil.cpp index cb344b8eeb..cd2aae3988 100644 --- a/stepmania/src/smpackage/SMPackageUtil.cpp +++ b/stepmania/src/smpackage/SMPackageUtil.cpp @@ -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. diff --git a/stepmania/src/smpackage/resource.h b/stepmania/src/smpackage/resource.h index c22b283113..27ed169678 100644 --- a/stepmania/src/smpackage/resource.h +++ b/stepmania/src/smpackage/resource.h @@ -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 diff --git a/stepmania/src/smpackage/smpackage.rc b/stepmania/src/smpackage/smpackage.rc index caaae8bbd8..8ebf65d1a1 100644 --- a/stepmania/src/smpackage/smpackage.rc +++ b/stepmania/src/smpackage/smpackage.rc @@ -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 diff --git a/stepmania/src/smpackage/smpackageUtil.h b/stepmania/src/smpackage/smpackageUtil.h index 6b5e6c99ec..ec5e5d68d7 100644 --- a/stepmania/src/smpackage/smpackageUtil.h +++ b/stepmania/src/smpackage/smpackageUtil.h @@ -1,6 +1,8 @@ #ifndef SMPackageUtil_H #define SMPackageUtil_H +struct LanguageInfo; + namespace SMPackageUtil { void WriteStepManiaInstallDirs( const vector& asInstallDirsToWrite ); @@ -16,6 +18,9 @@ namespace SMPackageUtil bool IsValidPackageDirectory(RString path); bool LaunchGame(); + + RString GetLanguageDisplayString( const RString &sIsoCode ); + RString GetLanguageCodeFromDisplayString( const RString &sDisplayString ); } #endif