Translation.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:6k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Ragnarok Online Assistent
  3. #
  4. #  This software is open source, licensed under the GNU General Public
  5. #  License, version 2.
  6. #  Basically, this means that you're allowed to modify and distribute
  7. #  this software. However, if you distribute modified versions, you MUST
  8. #  also distribute the source code.
  9. #  See http://www.gnu.org/licenses/gpl.html for the full license.
  10. #########################################################################
  11. ##
  12. # MODULE DESCRIPTION: Message translation framework
  13. #
  14. # This module provides functions for translating messages in the user's
  15. # native language. Translations are stored in
  16. # <a href="http://www.gnu.org/software/gettext/">GNU gettext</a> translation
  17. # files (*.mo).
  18. #
  19. # <b>Notes:</b>
  20. # `l
  21. # - Translation files MUST be encoded in UTF-8 (without BOM).
  22. # - We use short locale names, as defined by http://www.loc.gov/standards/iso639-2/englangn.html
  23. # `l`
  24. package Translation;
  25. use strict;
  26. use Exporter;
  27. use base qw(Exporter);
  28. use FindBin qw($RealBin);
  29. use XSTools;
  30. use I18N;
  31. use encoding 'utf8';
  32. XSTools::bootModule("Translation");
  33. our @EXPORT = qw(T TF);
  34. our $_translation;
  35. use constant DEFAULT_PODIR => "$RealBin/src/po";
  36. # Note: some of the functions in this module are implemented in
  37. # src/auto/XSTools/translation/wrapper.xs
  38. ##
  39. # boolean Translation::initDefault([String podir, String locale])
  40. # Ensures: Translation::T() and Translation::TF() will be usable.
  41. # Returns: Whether initialization succeeded. It is not fatal if
  42. #          initialization failed: this module will automatically
  43. #          fallback to using the original (English) strings.
  44. #
  45. # Initialize the default translation object. Translation::T() and
  46. # Translation::TF() will only be usable after calling this function once.
  47. sub initDefault {
  48. my ($podir, $locale) = @_;
  49. $podir = DEFAULT_PODIR if (!defined $podir);
  50. $_translation = _load(_autodetect($podir, $locale));
  51. return defined $_translation;
  52. }
  53. ##
  54. # Translation Translation->new([String podir, String locale])
  55. # podir: the directory which contains translation files.
  56. # locale: the name of a locale.
  57. # Returns: a Translation object.
  58. #
  59. # Create a new Translation object. A suitable language file will be loaded
  60. # from $podir. If $locale is not defined, then the operating system's locale
  61. # will be automatically detected. If $podir is not specified, it will default
  62. # to OpenKore's own translation files folder.
  63. #
  64. # You're probably looking for Translation::T() instead. See
  65. # $Translation->translate() for rationale.
  66. sub new {
  67. my ($class, $podir, $locale) = @_;
  68. my %self;
  69. $podir = DEFAULT_PODIR if (!defined $podir);
  70. $self{pofile} = _autodetect($podir, $locale);
  71. $self{trans} = _load($self{pofile});
  72. bless %self, $class;
  73. return %self;
  74. }
  75. sub DESTROY {
  76. my ($self) = @_;
  77. _unload($self->{trans});
  78. }
  79. # _autodetect(String podir, [String requested_locale])
  80. #
  81. # Autodetect the operating system's language, and return the filename for
  82. # the suitable translation file (.mo) from $podir. Returns undef if
  83. # there is no suitable translation file.
  84. sub _autodetect {
  85. my ($podir, $requested_locale) = @_;
  86. my $locale;
  87. if ($requested_locale eq '') {
  88. sub empty { return !defined($_[0]) || length($_[0]) == 0; }
  89. if (!empty($ENV{LC_ALL})) {
  90. $locale = $ENV{LC_ALL};
  91. } elsif (!empty($ENV{LC_MESSAGES})) {
  92. $locale = $ENV{LC_MESSAGES};
  93. } elsif (!empty($ENV{LANG})) {
  94. $locale = $ENV{LANG};
  95. }
  96. if (!defined($locale) && $^O eq 'MSWin32') {
  97. require Utils::Win32;
  98. $locale = Utils::Win32::getLanguageName();
  99. return undef if ($locale eq 'C');
  100. }
  101. return undef if (!defined $locale);
  102. } else {
  103. $locale = $requested_locale;
  104. }
  105. # $locale is in a format like this: en_US.UTF-8
  106. # Remove everything after the dot and all slashes.
  107. $locale =~ s/..*//;
  108. $locale =~ s////g;
  109. # Load the .mo file.
  110. return "$podir/$locale.mo" if (-f "$podir/$locale.mo");
  111. # That didn't work. Try removing the _US part.
  112. $locale =~ s/_.*//;
  113. return "$podir/$locale.mo" if (-f "$podir/$locale.mo");
  114. # Give up.
  115. return undef;
  116. }
  117. ##
  118. # String $Translation->translate(String message)
  119. # message: The message to translate.
  120. # Returns: the translated message, or the original message if it cannot be translated.
  121. #
  122. # Translate $message using the translation file defined by this class.
  123. #
  124. # This function is meant for plugin developers, who have their translation files
  125. # stored in a different folder than OpenKore's. If you want to translate strings
  126. # in OpenKore, then you should use Translation::T() instead.
  127. #
  128. # Example:
  129. # my $t = new Translation;
  130. # print($t->translate("hello worldn"));
  131. sub translate {
  132. my ($self, $message) = @_;
  133. _translate($self->{trans}, $message);
  134. return $message;
  135. }
  136. ##
  137. # String Translation::T(String message)
  138. # message: The message to translate.
  139. # Returns: the translated message, or the original message if it cannot be translated.
  140. # Requires: Translation::initDefault() must have been called once.
  141. #
  142. # Translate $message.
  143. #
  144. # This symbol is automatically exported.
  145. #
  146. # See also: $translation->translate() and Translation::TF()
  147. #
  148. # Example:
  149. # use Translation;
  150. # Translation::initDefault();
  151. # print(T("hello worldn"));
  152. sub T {
  153. my ($message) = @_;
  154. _translate($_translation, $message);
  155. return $message;
  156. }
  157. ##
  158. # String Translation::TF(String format, ...)
  159. # Requires: Translation::initDefault() must have been called once; $format must be encoded in UTF-8.
  160. # Ensures: the return value is encoded in UTF-8.
  161. #
  162. # Translate $format, and perform sprintf() formatting using the specified parameters.
  163. # This function is just a convenient way to write:<br>
  164. # <code>sprintf(T($format), ...);</code>
  165. #
  166. # This symbol is automatically exported.
  167. #
  168. # Example:
  169. # print(TF("Go to %s for more information", $url));
  170. sub TF {
  171. my $message = shift;
  172. _translate($_translation, $message);
  173. return sprintf($message, @_);
  174. #return sprintf($message, $_[0], $_[1], $_[2], $_[3], $_[4]);
  175. }
  176. ##
  177. # String Translation::getLocaleCharset()
  178. #
  179. # Return the character set for the current system's locale.
  180. # The return value is guaranteed to be a valid character set name.
  181. 1;