PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/yii/framework/i18n/gettext/CGettextPoFile.php

https://bitbucket.org/kmonk/zurmo_fork
PHP | 88 lines | 58 code | 2 blank | 28 comment | 3 complexity | fee3deb13b2ebf811501cfb480ba92ee MD5 | raw file
Possible License(s): GPL-2.0, GPL-3.0, BSD-3-Clause, LGPL-3.0, LGPL-2.1, BSD-2-Clause
  1. <?php
  2. /**
  3. * CGettextPoFile class file.
  4. *
  5. * @author Qiang Xue <qiang.xue@gmail.com>
  6. * @link http://www.yiiframework.com/
  7. * @copyright Copyright &copy; 2008-2011 Yii Software LLC
  8. * @license http://www.yiiframework.com/license/
  9. */
  10. /**
  11. * CGettextPoFile represents a PO Gettext message file.
  12. *
  13. * @author Qiang Xue <qiang.xue@gmail.com>
  14. * @package system.i18n.gettext
  15. * @since 1.0
  16. */
  17. class CGettextPoFile extends CGettextFile
  18. {
  19. /**
  20. * Loads messages from a PO file.
  21. * @param string $file file path
  22. * @param string $context message context
  23. * @return array message translations (source message => translated message)
  24. */
  25. public function load($file,$context)
  26. {
  27. $pattern='/(msgctxt\s+"(.*?(?<!\\\\))")?'
  28. . '\s+msgid\s+"(.*?(?<!\\\\))"'
  29. . '\s+msgstr\s+"(.*?(?<!\\\\))"/';
  30. $content=file_get_contents($file);
  31. $n=preg_match_all($pattern,$content,$matches);
  32. $messages=array();
  33. for($i=0;$i<$n;++$i)
  34. {
  35. if($matches[2][$i]===$context)
  36. {
  37. $id=$this->decode($matches[3][$i]);
  38. $message=$this->decode($matches[4][$i]);
  39. $messages[$id]=$message;
  40. }
  41. }
  42. return $messages;
  43. }
  44. /**
  45. * Saves messages to a PO file.
  46. * @param string $file file path
  47. * @param array $messages message translations (message id => translated message).
  48. * Note if the message has a context, the message id must be prefixed with
  49. * the context with chr(4) as the separator.
  50. */
  51. public function save($file,$messages)
  52. {
  53. $content='';
  54. foreach($messages as $id=>$message)
  55. {
  56. if(($pos=strpos($id,chr(4)))!==false)
  57. {
  58. $content.='msgctxt "'.substr($id,0,$pos)."\"\n";
  59. $id=substr($id,$pos+1);
  60. }
  61. $content.='msgid "'.$this->encode($id)."\"\n";
  62. $content.='msgstr "'.$this->encode($message)."\"\n\n";
  63. }
  64. file_put_contents($file,$content);
  65. }
  66. /**
  67. * Encodes special characters in a message.
  68. * @param string $string message to be encoded
  69. * @return string the encoded message
  70. */
  71. protected function encode($string)
  72. {
  73. return str_replace(array('"', "\n", "\t", "\r"),array('\\"', "\\n", '\\t', '\\r'),$string);
  74. }
  75. /**
  76. * Decodes special characters in a message.
  77. * @param string $string message to be decoded
  78. * @return string the decoded message
  79. */
  80. protected function decode($string)
  81. {
  82. return str_replace(array('\\"', "\\n", '\\t', '\\r'),array('"', "\n", "\t", "\r"),$string);
  83. }
  84. }