add language localization tools

This commit is contained in:
Chris Danford
2005-12-28 19:21:08 +00:00
parent 76e78a1bc4
commit b42d28af34
14 changed files with 312 additions and 34 deletions
+17 -2
View File
@@ -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() )
+3 -2
View File
@@ -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.
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+1 -2
View File
@@ -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
+6
View File
@@ -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;
};
+134 -19
View File
@@ -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();
}
+2
View File
@@ -25,4 +25,6 @@ protected:
public:
CListBox m_listThemes;
CListBox m_listLanguages;
afx_msg void OnBnClickedButtonCreate();
afx_msg void OnBnClickedButtonDelete();
};
+16
View File
@@ -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.
+5 -3
View File
@@ -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
+25 -4
View File
@@ -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
+5
View File
@@ -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