2 // Licensed under same license as Banshee
3 // Copyright (C) 2006 Novell, Inc.
4 // Written by Aaron Bockover <abock@gnome.org>
6 // This tool extracts translator information from .po files
7 // to generate information for display in the about dialog
11 using System
.Globalization
;
13 using System
.Collections
.Generic
;
14 using System
.Text
.RegularExpressions
;
16 public class TranslatorExtractor
18 public static void Main(string [] args
)
20 Console
.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
21 Console
.WriteLine("<!-- AUTOGENERATED - DO NOT EDIT -->");
22 Console
.WriteLine("<translators>");
23 foreach(string filename
in Directory
.GetFiles(args
.Length
== 0 ? "." : args
[0], "*.po")) {
24 using(FileStream stream
= new FileStream(filename
, FileMode
.Open
, FileAccess
.Read
)) {
25 using(StreamReader reader
= new StreamReader(stream
)) {
26 ParseFile(filename
, reader
);
30 Console
.WriteLine("</translators>");
33 private static void ParseFile(string file
, TextReader reader
)
35 Dictionary
<string, string> names
= new Dictionary
<string, string>();
36 string language_code
= Path
.GetFileNameWithoutExtension(file
);
37 string language_name
= null;
39 bool past_plural_forms
= false;
42 string line
= reader
.ReadLine();
43 if(line
== null || (line
.StartsWith("#:") && past_plural_forms
)) {
45 } else if(line
.StartsWith("\"Plural-Forms:")) {
46 past_plural_forms
= true;
50 Match match
= Regex
.Match(line
, ".*#(.*)<(.*)>(.*,.*|[ \n]*$)");
52 match
= Regex
.Match(line
, ".*\\\"Last-Translator:(.*)<(.*)>.*");
54 match
= Regex
.Match(line
, ".*\\\"Language-Team:(.*)<.*>.*");
59 language_name
= match
.Groups
[1].Value
.Trim();
60 int pos
= language_name
.IndexOf('(');
62 language_name
= language_name
.Substring(0, pos
).Trim();
65 pos
= language_name
.IndexOf("GNOME");
67 language_name
= language_name
.Substring(0, pos
).Trim();
72 string name
= match
.Groups
[1].Value
.Trim();
73 string email
= match
.Groups
[2].Value
.Trim();
75 if(name
== String
.Empty
|| email
== String
.Empty
|| name
== "FIRST AUTHOR") {
77 } else if(name
.StartsWith("Maintainer:")) {
78 name
= name
.Substring(11).Trim();
81 if(!names
.ContainsKey(email
)) {
84 foreach(string iter_name
in names
.Values
) {
85 if(String
.Compare(iter_name
, name
, true) == 0) {
92 names
.Add(email
, name
);
100 // hack for banshee, remove if used elsewhere
101 if(language_code
== "sr") {
103 } else if(language_code
== "sr@latin") {
104 language_code
= "sr";
108 // override language names from extracted
109 switch(language_code
) {
110 case "ast": language_name
= "Asturian"; break;
111 case "ca": language_name
= "Catalan"; break;
112 case "ca@valencia": language_name
= "Catalan (Valencian)"; break;
113 case "cs": language_name
= "Czech"; break;
114 case "de": language_name
= "German"; break;
115 case "fr": language_name
= "French"; break;
116 case "el": language_name
= "Greek"; break;
117 case "en_GB": language_name
= "British English"; break;
118 case "gl": language_name
= "Galician"; break;
119 case "gu": language_name
= "Gujarati"; break;
120 case "he": language_name
= "Hebrew"; break;
121 case "id": language_name
= "Indonesian"; break;
122 case "ko": language_name
= "Korean"; break;
123 case "lt": language_name
= "Lithuanian"; break;
124 case "pt": language_name
= "Portuguese"; break;
125 case "ro": language_name
= "Romanian"; break;
126 case "zh_CN": language_name
= "Simplified Chinese"; break;
127 case "zh_HK": language_name
= "Chinese (Hong Kong)"; break;
128 case "zh_TW": language_name
= "Chinese (Taiwan)"; break;
132 Console
.WriteLine(" <language code=\"{0}\" name=\"{1}\">", language_code
, language_name
);
133 List
<string> sorted_names
= new List
<string> (names
.Values
);
134 sorted_names
.Sort ();
135 foreach(string name
in sorted_names
) {
136 Console
.WriteLine(" <person>{0}</person>", name
.Replace("\"", """));
138 Console
.WriteLine(" </language>");