header.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright 2013 ChaiShushan <chaishushan{AT}gmail.com>. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package po
  5. import (
  6. "bytes"
  7. "fmt"
  8. "strings"
  9. )
  10. // Header is the initial comments "SOME DESCRIPTIVE TITLE", "YEAR"
  11. // and "FIRST AUTHOR <EMAIL@ADDRESS>, YEAR" ought to be replaced by sensible information.
  12. //
  13. // See http://www.gnu.org/software/gettext/manual/html_node/Header-Entry.html#Header-Entry
  14. type Header struct {
  15. Comment // Header Comments
  16. ProjectIdVersion string // Project-Id-Version: PACKAGE VERSION
  17. ReportMsgidBugsTo string // Report-Msgid-Bugs-To: FIRST AUTHOR <EMAIL@ADDRESS>
  18. POTCreationDate string // POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE
  19. PORevisionDate string // PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
  20. LastTranslator string // Last-Translator: FIRST AUTHOR <EMAIL@ADDRESS>
  21. LanguageTeam string // Language-Team: golang-china
  22. Language string // Language: zh_CN
  23. MimeVersion string // MIME-Version: 1.0
  24. ContentType string // Content-Type: text/plain; charset=UTF-8
  25. ContentTransferEncoding string // Content-Transfer-Encoding: 8bit
  26. PluralForms string // Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;
  27. XGenerator string // X-Generator: Poedit 1.5.5
  28. UnknowFields map[string]string
  29. }
  30. func (p *Header) parseHeader(msg *Message) {
  31. if msg.MsgId != "" || msg.MsgStr == "" {
  32. return
  33. }
  34. lines := strings.Split(msg.MsgStr, "\n")
  35. for i := 0; i < len(lines); i++ {
  36. idx := strings.Index(lines[i], ":")
  37. if idx < 0 {
  38. continue
  39. }
  40. key := strings.TrimSpace(lines[i][:idx])
  41. val := strings.TrimSpace(lines[i][idx+1:])
  42. switch strings.ToUpper(key) {
  43. case strings.ToUpper("Project-Id-Version"):
  44. p.ProjectIdVersion = val
  45. case strings.ToUpper("Report-Msgid-Bugs-To"):
  46. p.ReportMsgidBugsTo = val
  47. case strings.ToUpper("POT-Creation-Date"):
  48. p.POTCreationDate = val
  49. case strings.ToUpper("PO-Revision-Date"):
  50. p.PORevisionDate = val
  51. case strings.ToUpper("Last-Translator"):
  52. p.LastTranslator = val
  53. case strings.ToUpper("Language-Team"):
  54. p.LanguageTeam = val
  55. case strings.ToUpper("Language"):
  56. p.Language = val
  57. case strings.ToUpper("MIME-Version"):
  58. p.MimeVersion = val
  59. case strings.ToUpper("Content-Type"):
  60. p.ContentType = val
  61. case strings.ToUpper("Content-Transfer-Encoding"):
  62. p.ContentTransferEncoding = val
  63. case strings.ToUpper("Plural-Forms"):
  64. p.PluralForms = val
  65. case strings.ToUpper("X-Generator"):
  66. p.XGenerator = val
  67. default:
  68. if p.UnknowFields == nil {
  69. p.UnknowFields = make(map[string]string)
  70. }
  71. p.UnknowFields[key] = val
  72. }
  73. }
  74. p.Comment = msg.Comment
  75. }
  76. // String returns the po format header string.
  77. func (p Header) String() string {
  78. var buf bytes.Buffer
  79. fmt.Fprintf(&buf, "%s", p.Comment.String())
  80. fmt.Fprintf(&buf, `msgid ""`+"\n")
  81. fmt.Fprintf(&buf, `msgstr ""`+"\n")
  82. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", "Project-Id-Version", p.ProjectIdVersion)
  83. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", "Report-Msgid-Bugs-To", p.ReportMsgidBugsTo)
  84. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", "POT-Creation-Date", p.POTCreationDate)
  85. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", "PO-Revision-Date", p.PORevisionDate)
  86. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", "Last-Translator", p.LastTranslator)
  87. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", "Language-Team", p.LanguageTeam)
  88. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", "Language", p.Language)
  89. if p.MimeVersion != "" {
  90. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", "MIME-Version", p.MimeVersion)
  91. }
  92. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", "Content-Type", p.ContentType)
  93. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", "Content-Transfer-Encoding", p.ContentTransferEncoding)
  94. if p.XGenerator != "" {
  95. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", "X-Generator", p.XGenerator)
  96. }
  97. for k, v := range p.UnknowFields {
  98. fmt.Fprintf(&buf, `"%s: %s\n"`+"\n", k, v)
  99. }
  100. return buf.String()
  101. }