Exemplo n.º 1
0
        /// <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;
        }