diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 7394fe3c85..4d612202c8 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -1155,6 +1155,29 @@ wxString wxStripMenuCodes(const wxString& in, int flags) size_t len = in.length(); out.reserve(len); + // In some East Asian languages _("&File") translates as "(&F)" + // Check for this first, otherwise fall through to the standard situation + if (flags & wxStrip_Mnemonics) + { + wxString label(in), accel; + int pos = in.Find('\t'); + if (pos != wxNOT_FOUND) + { + label = in.Left(pos+1).Trim(); + if (!(flags & wxStrip_Accel)) + { + accel = in.Mid(pos); + } + } + + // The initial '?' means we match "Foo(&F)" but not "(&F)" + if (label.Matches("?*(&?)") > 0) + { + label = label.Left( label.Len()-4 ).Trim(); + return label + accel; + } + } + for ( wxString::const_iterator it = in.begin(); it != in.end(); ++it ) { wxChar ch = *it; diff --git a/tests/Makefile.in b/tests/Makefile.in index d0af8d4e79..c389570dda 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -391,7 +391,7 @@ COND_wxUSE_REGEX_builtin___LIB_REGEX_p = \ ### Targets: ### -all: test$(EXEEXT) $(__test_drawing___depname) $(__test_drawingplugin___depname) $(__test_gui___depname) $(__test_gui_bundle___depname) data data-images fr +all: test$(EXEEXT) $(__test_drawing___depname) $(__test_drawingplugin___depname) $(__test_gui___depname) $(__test_gui_bundle___depname) data data-images fr ja install: @@ -496,6 +496,18 @@ fr: esac; \ done +ja: + @mkdir -p ./intl/ja + @for f in internat.po internat.mo; do \ + if test ! -f ./intl/ja/$$f -a ! -d ./intl/ja/$$f ; \ + then x=yep ; \ + else x=`find $(srcdir)/intl/ja/$$f -newer ./intl/ja/$$f -print` ; \ + fi; \ + case "$$x" in ?*) \ + cp -pRf $(srcdir)/intl/ja/$$f ./intl/ja ;; \ + esac; \ + done + test_test.o: $(srcdir)/test.cpp $(TEST_ODEP) $(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/test.cpp @@ -1075,4 +1087,4 @@ failtest_weakref: # Include dependency info, if present: @IF_GNU_MAKE@-include ./.deps/*.d -.PHONY: all install uninstall clean distclean test_gui_bundle data data-images fr +.PHONY: all install uninstall clean distclean test_gui_bundle data data-images fr ja diff --git a/tests/intl/ja/internat.mo b/tests/intl/ja/internat.mo new file mode 100644 index 0000000000..341bd595e2 Binary files /dev/null and b/tests/intl/ja/internat.mo differ diff --git a/tests/intl/ja/internat.po b/tests/intl/ja/internat.po new file mode 100644 index 0000000000..fd62c4e497 --- /dev/null +++ b/tests/intl/ja/internat.po @@ -0,0 +1,40 @@ +# Message catalog file template for the wxWindows i18n sample +# Copyright (C) 1999 wxWindows development team +# Vadim Zeitlin +# +msgid "" +msgstr "" +"Project-Id-Version: wxWindows 2.0 i18n sample\n" +"POT-Creation-Date: 1999-01-13 18:19+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Tadashi Jokagi\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/4Pane/language/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "&File" +msgstr "ファイル(&F)" + +msgid "E&dit\tCtrl+E" +msgstr "編集(&D)\tCtrl+E" + +msgid "Vie&w\tCtrl+V" +msgstr "閲覧 (&W)\tCtrl+V" + +msgid "&Options" +msgstr "オプション(&O)" + +msgid "&Help" +msgstr "ヘルプ(&H)" + +# Supply a non-mnemonic, non-shortcut translation for easier comparison +msgid "Edit" +msgstr "編集" + +msgid "View" +msgstr "閲覧" + +# Nothing to do with Japanese; here to test a translation with a 'normal' mnenomic +msgid "B&ogus" +msgstr "Preten&d" diff --git a/tests/makefile.bcc b/tests/makefile.bcc index 18075e7ae0..0c131e6393 100644 --- a/tests/makefile.bcc +++ b/tests/makefile.bcc @@ -462,7 +462,7 @@ $(OBJS): ### Targets: ### -all: $(OBJS)\test.exe $(__test_drawing___depname) $(__test_drawingplugin___depname) $(__test_gui___depname) data data-images fr +all: $(OBJS)\test.exe $(__test_drawing___depname) $(__test_drawingplugin___depname) $(__test_gui___depname) data data-images fr ja clean: -if exist $(OBJS)\*.obj del $(OBJS)\*.obj @@ -531,6 +531,10 @@ fr: if not exist $(OBJS)\intl\fr mkdir $(OBJS)\intl\fr for %f in (internat.po internat.mo) do if not exist $(OBJS)\intl\fr\%f copy .\intl\fr\%f $(OBJS)\intl\fr +ja: + if not exist $(OBJS)\intl\ja mkdir $(OBJS)\intl\ja + for %f in (internat.po internat.mo) do if not exist $(OBJS)\intl\ja\%f copy .\intl\ja\%f $(OBJS)\intl\ja + $(OBJS)\test_dummy.obj: .\dummy.cpp $(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) -H .\dummy.cpp diff --git a/tests/makefile.gcc b/tests/makefile.gcc index 81be8d735c..c390f2567d 100644 --- a/tests/makefile.gcc +++ b/tests/makefile.gcc @@ -465,7 +465,7 @@ $(OBJS): ### Targets: ### -all: $(OBJS)\test.exe $(__test_drawing___depname) $(__test_drawingplugin___depname) $(__test_gui___depname) data data-images fr +all: $(OBJS)\test.exe $(__test_drawing___depname) $(__test_drawingplugin___depname) $(__test_gui___depname) data data-images fr ja clean: -if exist $(OBJS)\*.o del $(OBJS)\*.o @@ -507,6 +507,10 @@ fr: if not exist $(OBJS)\intl\fr mkdir $(OBJS)\intl\fr for %%f in (internat.po internat.mo) do if not exist $(OBJS)\intl\fr\%%f copy .\intl\fr\%%f $(OBJS)\intl\fr +ja: + if not exist $(OBJS)\intl\ja mkdir $(OBJS)\intl\ja + for %%f in (internat.po internat.mo) do if not exist $(OBJS)\intl\ja\%%f copy .\intl\ja\%%f $(OBJS)\intl\ja + $(OBJS)\test_dummy.o: ./dummy.cpp $(CXX) -c -o $@ $(TEST_CXXFLAGS) $(CPPDEPS) $< @@ -1056,7 +1060,7 @@ $(OBJS)\test_gui_setsize.o: ./window/setsize.cpp $(OBJS)\test_gui_xrctest.o: ./xml/xrctest.cpp $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $< -.PHONY: all clean data data-images fr +.PHONY: all clean data data-images fr ja SHELL := $(COMSPEC) diff --git a/tests/makefile.vc b/tests/makefile.vc index be038677e2..075f84b817 100644 --- a/tests/makefile.vc +++ b/tests/makefile.vc @@ -651,7 +651,7 @@ $(OBJS): ### Targets: ### -all: $(OBJS)\test.exe $(__test_drawing___depname) $(__test_drawingplugin___depname) $(__test_gui___depname) data data-images fr +all: $(OBJS)\test.exe $(__test_drawing___depname) $(__test_drawingplugin___depname) $(__test_gui___depname) data data-images fr ja clean: -if exist $(OBJS)\*.obj del $(OBJS)\*.obj @@ -708,6 +708,10 @@ fr: if not exist $(OBJS)\intl\fr mkdir $(OBJS)\intl\fr for %f in (internat.po internat.mo) do if not exist $(OBJS)\intl\fr\%f copy .\intl\fr\%f $(OBJS)\intl\fr +ja: + if not exist $(OBJS)\intl\ja mkdir $(OBJS)\intl\ja + for %f in (internat.po internat.mo) do if not exist $(OBJS)\intl\ja\%f copy .\intl\ja\%f $(OBJS)\intl\ja + $(OBJS)\test_dummy.obj: .\dummy.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) /Yctestprec.h .\dummy.cpp diff --git a/tests/menu/menu.cpp b/tests/menu/menu.cpp index 454baac66c..0c53934587 100644 --- a/tests/menu/menu.cpp +++ b/tests/menu/menu.cpp @@ -86,6 +86,7 @@ private: CPPUNIT_TEST( EnableTop ); CPPUNIT_TEST( Count ); CPPUNIT_TEST( Labels ); + CPPUNIT_TEST( i18n ); CPPUNIT_TEST( RadioItems ); CPPUNIT_TEST( RemoveAdd ); CPPUNIT_TEST( ChangeBitmap ); @@ -99,6 +100,7 @@ private: void EnableTop(); void Count(); void Labels(); + void i18n(); void RadioItems(); void RemoveAdd(); void ChangeBitmap(); @@ -334,6 +336,36 @@ void MenuTestCase::Labels() CPPUNIT_ASSERT_EQUAL( "Foo", wxMenuItem::GetLabelText("&Foo\tCtrl-F") ); } +void MenuTestCase::i18n() +{ + // Check that appended mnemonics are correctly stripped; + // see http://trac.wxwidgets.org/ticket/16736 + wxLocale::AddCatalogLookupPathPrefix("./intl"); + CPPUNIT_ASSERT( wxLocale::IsAvailable(wxLANGUAGE_JAPANESE) ); + + wxLocale locale(wxLANGUAGE_JAPANESE, wxLOCALE_DONT_LOAD_DEFAULT); + locale.AddCatalog("internat"); + + // Check the translation is being used: + CPPUNIT_ASSERT( wxString("&File") != wxString(_("&File")) ); + + wxString filemenu = m_frame->GetMenuBar()->GetMenuLabel(0); + CPPUNIT_ASSERT_EQUAL + ( wxStripMenuCodes(_("&File")), + wxStripMenuCodes(wxGetTranslation(filemenu)) + ); + + // Test strings that have shortcuts. Duplicate non-mnemonic translations + // exist for both "Edit" and "View", for ease of comparison + CPPUNIT_ASSERT_EQUAL( _("Edit"), wxStripMenuCodes(_("E&dit\tCtrl+E")) ); + + //"Vie&w" also has a space before the (&W) + CPPUNIT_ASSERT_EQUAL( _("View"), wxStripMenuCodes(_("Vie&w\tCtrl+V")) ); + + // Test a 'normal' mnemonic too: the translation is "Preten&d" + CPPUNIT_ASSERT_EQUAL( "Pretend", wxStripMenuCodes(_("B&ogus")) ); +} + void MenuTestCase::RadioItems() { wxMenuBar * const bar = m_frame->GetMenuBar(); diff --git a/tests/test.bkl b/tests/test.bkl index 3a12c9aa32..10595fd001 100644 --- a/tests/test.bkl +++ b/tests/test.bkl @@ -328,6 +328,7 @@ +