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

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
Post Reply
exploder
In need of some credit
In need of some credit
Posts: 3
Joined: Mon Jan 28, 2008 1:54 pm
Location: China

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

Post by exploder »

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

Post 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
In fascination of creating worlds by words, and in pursuit of words behind the world.

On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
Satervalley
Knows some wx things
Knows some wx things
Posts: 47
Joined: Fri Dec 14, 2007 1:10 am

Post by Satervalley »

wxWidgets 的本地化基于 gettext,简单地说,在 wxWidgets 的安装目录下,有一个 locale 目录,里面有很多种语言的 po 源文件,本地化了wxWidgets 内部的字符串,其中 zh_CN.po 对应简体中文,你把它编译成mo文件,放在你的应用的适当目录,并在程序启动时载入这个mo文件即可。
liuyug
Experienced Solver
Experienced Solver
Posts: 53
Joined: Wed Jul 09, 2008 4:32 am

Post by liuyug »

首先我编写的程序已经通过wxLocale实现了国际化,已经有了一个.po文件,但wxWidget库自带的对话框还是英文,如何实现wxWidget的国际化?

将2个.po文件合并在一起吗?
如何将.po文件集成到.exe文件中?
Satervalley
Knows some wx things
Knows some wx things
Posts: 47
Joined: Fri Dec 14, 2007 1:10 am

Post by Satervalley »

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

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

Post by Utensil »

Satervalley wrote: 第三,gettext支持context概念,但我没有研究wxwidgets是如何应用context的,
wxWidgets尚不支持context,这是3.0的计划。

-Utensil
In fascination of creating worlds by words, and in pursuit of words behind the world.

On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
Satervalley
Knows some wx things
Knows some wx things
Posts: 47
Joined: Fri Dec 14, 2007 1:10 am

Post by Satervalley »

Utensil wrote:
Satervalley wrote: 第三,gettext支持context概念,但我没有研究wxwidgets是如何应用context的,
wxWidgets尚不支持context,这是3.0的计划。

-Utensil
嗯。应该支持的,现在用的时候感觉不方便,同样的字符串在不同的上下文中翻译并不一样。
liuyug
Experienced Solver
Experienced Solver
Posts: 53
Joined: Wed Jul 09, 2008 4:32 am

Post 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文件?
如何嵌入?
哪有介绍的文档
kingkamg
I live to help wx-kind
I live to help wx-kind
Posts: 187
Joined: Tue Apr 08, 2008 1:45 pm

Post 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;
}
Post Reply