Page 1 of 1

如何修改wxWizard中的按钮为中文

Posted: Sun Mar 15, 2009 2:09 pm
by exploder
近日程序中使用到wxWizard时,发现按钮都是E文,因此想通过其内部变量“m_btnPrev”、“m_btnNext”进行修改,前者可以实现。后者因在父类的showpange()事件中进行了设置,所以修改不成功;而且,对于“Cancel”,内部没有提供该变量,也就无法修改。在修改源码的前提下,不知还有什么招没有啊?
建议,为了更好的国际化,应当把wxWizard的这些内容独立出来,可实现设置。

Posted: Mon Mar 16, 2009 2:40 am
by Utensil
wxWidgets有自己的国际化机制,不用像你这样hack的,呵呵。

请参见wxLocale的文档(http://docs.wxwidgets.org/trunk/classwx_locale.html)、例子samples/internat(http://docs.wxwidgets.org/trunk/page_sa ... s_internat)。也可参见《wxWidgets跨平台GUI开发》的第十六章。

-Utensil

Posted: Wed Mar 18, 2009 1:25 pm
by Satervalley
wxWidgets 的本地化基于 gettext,简单地说,在 wxWidgets 的安装目录下,有一个 locale 目录,里面有很多种语言的 po 源文件,本地化了wxWidgets 内部的字符串,其中 zh_CN.po 对应简体中文,你把它编译成mo文件,放在你的应用的适当目录,并在程序启动时载入这个mo文件即可。

Posted: Tue Mar 24, 2009 6:56 am
by liuyug
首先我编写的程序已经通过wxLocale实现了国际化,已经有了一个.po文件,但wxWidget库自带的对话框还是英文,如何实现wxWidget的国际化?

将2个.po文件合并在一起吗?
如何将.po文件集成到.exe文件中?

Posted: Wed Mar 25, 2009 4:35 am
by Satervalley
liuyug wrote:首先我编写的程序已经通过wxLocale实现了国际化,已经有了一个.po文件,但wxWidget库自带的对话框还是英文,如何实现wxWidget的国际化?

将2个.po文件合并在一起吗?
如何将.po文件集成到.exe文件中?
首先,po 文件是不行的,需要编译成mo文件。
其次,wxLocale支持载入多个mo文件,若多个mo文件中都有同一字符串的翻译,似乎以后载入的优先。
第三,gettext支持context概念,但我没有研究wxwidgets是如何应用context的,
第四,若要mo放到exe里,可以把它以资源方式嵌入,然后再编程读取即可,但我个人认为没必要。

Posted: Wed Mar 25, 2009 4:26 pm
by Utensil
Satervalley wrote: 第三,gettext支持context概念,但我没有研究wxwidgets是如何应用context的,
wxWidgets尚不支持context,这是3.0的计划。

-Utensil

Posted: Thu Mar 26, 2009 1:48 am
by Satervalley
Utensil wrote:
Satervalley wrote: 第三,gettext支持context概念,但我没有研究wxwidgets是如何应用context的,
wxWidgets尚不支持context,这是3.0的计划。

-Utensil
嗯。应该支持的,现在用的时候感觉不方便,同样的字符串在不同的上下文中翻译并不一样。

Posted: Fri Mar 27, 2009 4:09 am
by liuyug
Satervalley wrote:
liuyug wrote:首先我编写的程序已经通过wxLocale实现了国际化,已经有了一个.po文件,但wxWidget库自带的对话框还是英文,如何实现wxWidget的国际化?

将2个.po文件合并在一起吗?
如何将.po文件集成到.exe文件中?
首先,po 文件是不行的,需要编译成mo文件。
其次,wxLocale支持载入多个mo文件,若多个mo文件中都有同一字符串的翻译,似乎以后载入的优先。
第三,gettext支持context概念,但我没有研究wxwidgets是如何应用context的,
第四,若要mo放到exe里,可以把它以资源方式嵌入,然后再编程读取即可,但我个人认为没必要。
载入多个mo文件?
如何嵌入?
哪有介绍的文档

Posted: Fri Apr 10, 2009 1:51 am
by kingkamg

Code: Select all

void myFrm::InitLanguages()
{
	wxString dir = wxPathOnly(wxStandardPaths::Get().GetExecutablePath()) + wxFILE_SEP_PATH + wxT("Languages");
	if ( wxFileName::DirExists( dir ) )
	{
		for ( int i = wxLANGUAGE_ABKHAZIAN; i < wxLANGUAGE_USER_DEFINED; i++ )
		{
			const wxLanguageInfo* aLanguageInfo = wxLocale::GetLanguageInfo( i );
			if ( aLanguageInfo )
			{
				wxString path = dir + wxFILE_SEP_PATH + aLanguageInfo->CanonicalName + _T(".mo");
				if ( wxFileName::FileExists( dir + wxFILE_SEP_PATH + aLanguageInfo->CanonicalName + _T(".mo") ) )
				{
					m_LanguageHashMap[aLanguageInfo->Description] = i;
				}
			}
		}
	}
}

void myFrm::OnChangeLanguage(wxCommandEvent& event)
{	
	size_t id=event.GetId();
	wxString languageName = m_pMenuBar->GetLabel(id);

	SelectedLanguage( languageName );

	LanguageSubInstance::Get()->Notify();

	m_pSashSplitter->UpdateSize();
}

bool myFrm::SelectedLanguage( wxString languageName )
{
	pwLanguageHashMap::iterator item = m_LanguageHashMap.find( languageName );	
	if ( item == m_LanguageHashMap.end() )
		return false;
	if ( !wxLocale::IsAvailable( m_LanguageHashMap[languageName] ) )
	{
		wxLogError(wxT("This language is not supported by the system."));
		return false;
	}
	if ( m_pLocale ){
		delete m_pLocale;
		m_pLocale = NULL;
	}

	m_pLocale = new wxLocale( m_LanguageHashMap[languageName], wxLOCALE_CONV_ENCODING );
	if ( !m_pLocale )
		return false;
	m_pLocale->AddCatalogLookupPathPrefix( ConfigInstance::Get()->m_AppPath + wxFILE_SEP_PATH + wxT("Languages") );

	const wxLanguageInfo* aLanguageInfo = wxLocale::GetLanguageInfo( m_LanguageHashMap[languageName] );
	if ( !aLanguageInfo )
		return false;
	if ( !m_pLocale->AddCatalog( aLanguageInfo->CanonicalName ) )
	{
		wxLogError(wxT("This language file error!"));
		return false;
	}

	ConfigInstance::Get()->m_Language = languageName;

	return true;
}