/// <summary> /// Parse the po file and return a <see cref="Catalog"/>. /// </summary> public Catalog Parse() { Catalog dict = new Catalog(); string msgctxtCache = null; string msgctxt = null; string msgid = ""; Token currentToken; while ((currentToken = tokenizer.GetNextToken()) != null) { TokenWord command = ExpectWord(currentToken); if (command.Word == "msgctxt") { TokenString ctxtString = ExpectString(tokenizer.GetNextToken()); msgctxtCache = encoding.GetString(ctxtString.Data); } else if (command.Word == "msgid") { TokenString idString = ExpectString(tokenizer.GetNextToken()); msgid = encoding.GetString(idString.Data); msgctxt = msgctxtCache; msgctxtCache = null; } else if (command.Word == "msgstr") { Token indexOrString = ExpectIndexOrString(tokenizer.GetNextToken()); int index = 0; if (indexOrString is TokenIndex) { index = ((TokenIndex)indexOrString).I; indexOrString = tokenizer.GetNextToken(); } TokenString msgstrToken = ExpectString(indexOrString); string msgstr = encoding.GetString(msgstrToken.Data); //now add it to the catalog if (msgid == "") { //header dict.PluralForm = GetPluralForm(msgstr); this.encoding = GetEncoding(msgstr); } else { dict.AddTranslation(msgctxt, msgid, msgstr, index); } } else if (command.Word == "msgid_plural") { //msgid_plural is followed by a string which we check here. ExpectString(tokenizer.GetNextToken()); //but in the end, we ignore msgid_plural completely //FIXME: is this correct? } else { //unrecognized command throw new ParserException( string.Format("Unexpected Word \"{0}\" at {1}:{2}", command.Word, command.Line, command.Column)); } } return dict; }