I18n.C 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. /*
  2. * Copyright (C) 2011 Emweb bvba, Kessel-Lo, Belgium.
  3. *
  4. * See the LICENSE file for terms of use.
  5. */
  6. #include <boost/test/unit_test.hpp>
  7. #include "Wt/Test/WTestEnvironment"
  8. #include "Wt/WApplication"
  9. #include "Wt/WString"
  10. #include "web/FileUtils.h"
  11. #include <iostream>
  12. namespace {
  13. void pluralResourceBundleException(const std::string &resourceName)
  14. {
  15. Wt::Test::WTestEnvironment environment;
  16. Wt::WApplication app(environment);
  17. std::string file = app.appRoot() + resourceName;
  18. BOOST_REQUIRE(Wt::FileUtils::exists(file + ".xml"));
  19. app.messageResourceBundle().use(file);
  20. BOOST_REQUIRE(Wt::WString::tr("file").toUTF8() == "??file??");
  21. }
  22. std::string trn(const std::string &key, int n)
  23. {
  24. return Wt::WString::trn(key, n).arg(n).toUTF8();
  25. }
  26. }
  27. BOOST_AUTO_TEST_CASE( I18n_messageResourceBundleTest )
  28. {
  29. BOOST_REQUIRE(Wt::WString::tr("welcome-text").toUTF8() == "??welcome-text??");
  30. Wt::Test::WTestEnvironment environment;
  31. Wt::WApplication app(environment);
  32. BOOST_REQUIRE(Wt::WString::tr("welcome-text").toUTF8() == "??welcome-text??");
  33. app.messageResourceBundle().use(app.appRoot() + "private/i18n/plain");
  34. std::string welcome = Wt::WString::tr("welcome-text").arg("Joske").toUTF8();
  35. BOOST_REQUIRE(welcome ==
  36. "Welcome dear visiter, Joske of the WFooBar magic website !");
  37. BOOST_REQUIRE(Wt::WString::tr("welcome").toUTF8() == "??welcome??");
  38. app.setLocale("nl");
  39. welcome = Wt::WString::tr("welcome-text").arg("Joske").toUTF8();
  40. BOOST_REQUIRE(welcome ==
  41. "Welkom beste bezoeker, Joske van de WFooBar magic website !");
  42. std::string programmer = Wt::WString::tr("programmer").toUTF8();
  43. BOOST_REQUIRE(programmer == "Programmer");
  44. app.setLocale("pl");
  45. welcome = Wt::WString::tr("welcome-text").arg("Joske").toUTF8();
  46. BOOST_REQUIRE(welcome ==
  47. "Welcome dear visiter, Joske of the WFooBar magic website !");
  48. }
  49. BOOST_AUTO_TEST_CASE( I18n_pluralResourceBundleException1 )
  50. {
  51. pluralResourceBundleException("private/i18n/plural_err_1");
  52. }
  53. BOOST_AUTO_TEST_CASE( I18n_pluralResourceBundleException2 )
  54. {
  55. pluralResourceBundleException("private/i18n/plural_err_2");
  56. }
  57. BOOST_AUTO_TEST_CASE( I18n_pluralResourceBundleException3 )
  58. {
  59. pluralResourceBundleException("private/i18n/plural_err_3");
  60. }
  61. BOOST_AUTO_TEST_CASE( I18n_pluralResourceBundleException4 )
  62. {
  63. pluralResourceBundleException("private/i18n/plural_err_4");
  64. }
  65. BOOST_AUTO_TEST_CASE( I18n_pluralResourceBundleException5 )
  66. {
  67. pluralResourceBundleException("private/i18n/plural_err_5");
  68. }
  69. BOOST_AUTO_TEST_CASE( I18n_pluralResourceBundle1 )
  70. {
  71. Wt::Test::WTestEnvironment environment;
  72. Wt::WApplication app(environment);
  73. app.messageResourceBundle().use(app.appRoot() + "private/i18n/plural");
  74. BOOST_REQUIRE(trn("file", 0) == "0 files");
  75. BOOST_REQUIRE(trn("file", 1) == "1 file");
  76. BOOST_REQUIRE(trn("file", 6) == "6 files");
  77. BOOST_REQUIRE(Wt::WString::tr("welcome").toUTF8() == "??welcome??");
  78. BOOST_REQUIRE(trn("programmer", 0) == "0 programmers");
  79. BOOST_REQUIRE(trn("programmer", 1) == "1 programmer");
  80. BOOST_REQUIRE(trn("programmer", 6) == "6 programmers");
  81. app.setLocale("pl");
  82. BOOST_REQUIRE(trn("file", 0) == "0 pliko'w");
  83. BOOST_REQUIRE(trn("file", 1) == "1 plik");
  84. BOOST_REQUIRE(trn("file", 2) == "2 pliki");
  85. BOOST_REQUIRE(trn("file", 6) == "6 pliko'w");
  86. BOOST_REQUIRE(trn("file", 23) == "23 pliki");
  87. BOOST_REQUIRE(trn("file", 26) == "26 pliko'w");
  88. BOOST_REQUIRE(Wt::WString::tr("welcome").toUTF8() == "??welcome??");
  89. BOOST_REQUIRE(trn("programmer", 0) == "0 programmers");
  90. BOOST_REQUIRE(trn("programmer", 1) == "1 programmer");
  91. BOOST_REQUIRE(trn("programmer", 6) == "6 programmers");
  92. app.setLocale("nl");
  93. BOOST_REQUIRE(trn("file", 0) == "0 files");
  94. BOOST_REQUIRE(trn("file", 1) == "1 file");
  95. BOOST_REQUIRE(trn("file", 6) == "6 files");
  96. BOOST_REQUIRE(Wt::WString::tr("welcome").toUTF8() == "??welcome??");
  97. BOOST_REQUIRE(trn("programmer", 0) == "0 programmers");
  98. BOOST_REQUIRE(trn("programmer", 1) == "1 programmer");
  99. BOOST_REQUIRE(trn("programmer", 6) == "6 programmers");
  100. }
  101. BOOST_AUTO_TEST_CASE( I18n_findCaseException1 )
  102. {
  103. Wt::Test::WTestEnvironment environment;
  104. Wt::WApplication app(environment);
  105. app.messageResourceBundle().use("private/i18n/plural_findcase_err1");
  106. std::string error;
  107. try {
  108. Wt::WString::trn("file", 1).toUTF8();
  109. } catch (std::exception& e) {
  110. error = e.what();
  111. }
  112. BOOST_REQUIRE(error ==
  113. "Expression 'n-10' evaluates to '-9' for n=1 and values "
  114. "smaller than 0 are not allowed.");
  115. }
  116. BOOST_AUTO_TEST_CASE( I18n_findCaseException2 )
  117. {
  118. Wt::Test::WTestEnvironment environment;
  119. Wt::WApplication app(environment);
  120. app.messageResourceBundle().use(app.appRoot() +
  121. "private/i18n/plural_findcase_err2");
  122. std::string error;
  123. try {
  124. Wt::WString::trn("file", 1).toUTF8();
  125. } catch (std::exception& e) {
  126. error = e.what();
  127. }
  128. BOOST_REQUIRE(error ==
  129. "Expression '2' evaluates to '2' for n=1 which is greater "
  130. "than the list of cases (size=1).");
  131. }
  132. BOOST_AUTO_TEST_CASE( I18n_internalArgument1 )
  133. {
  134. Wt::Test::WTestEnvironment environment;
  135. Wt::WApplication app(environment);
  136. app.messageResourceBundle().use(app.appRoot() +
  137. "private/i18n/international_argument_1");
  138. Wt::WString text = Wt::WString::tr("text").arg(Wt::WString::tr("hello"));
  139. BOOST_REQUIRE(text.toUTF8() ==
  140. "Internationalized text containing an "
  141. "internationalized argument: hello");
  142. app.setLocale("nl");
  143. BOOST_REQUIRE(text.toUTF8() ==
  144. "Geïnternationaliseerde tekst met een geïnternationaliseerd "
  145. "argument: hallo");
  146. }
  147. BOOST_AUTO_TEST_CASE( I18n_badUTF8 )
  148. {
  149. // "máquina quente do forró"
  150. const char badutf8[] = {'m', (char)225, 'q', 'u', 'i', 'n', 'a', ' ',
  151. 'q', 'u', 'e', 'n', 't', 'e', ' ', 'd', 'o', ' ',
  152. 'f', 'o', 'r', 'r', (char)243, 0};
  153. std::string badUTF8(badutf8);
  154. Wt::WString::checkUTF8Encoding(badUTF8);
  155. }