diff --git a/.bzrignore b/.bzrignore new file mode 100644 index 000000000..c9ae8f8d8 --- /dev/null +++ b/.bzrignore @@ -0,0 +1,3 @@ +ecbuild +gen/* +*.class diff --git a/.classpath b/.classpath index c0d02d2e3..528f1b336 100644 --- a/.classpath +++ b/.classpath @@ -6,5 +6,5 @@ - + diff --git a/bin/androidxml2po.bash b/bin/androidxml2po.bash new file mode 100644 index 000000000..55e23a35f --- /dev/null +++ b/bin/androidxml2po.bash @@ -0,0 +1,101 @@ +#!/bin/bash +# +#Wrapper for xml2po for android and launchpad: Import .xml's from .po's, or export/update .po's from string.xml's. Provide a string with value "translator-credits" for Launchpad. +# +# Copyright (C) 2009 pjv +# +# This file is part of OpenIntents Androidxml2po. +# +# OpenIntents Androidxml2po is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# OpenIntents Androidxml2po is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenIntents Androidxml2po. If not, see . +# +# + +#Set the languages here (long version is the android resource append string). +short_lang=("nl" "de" "fr") #do not include template language ("en" usually). +long_lang=("nl_rNL" "de" "fr") #do not include template language ("en" usually). +#Change the dirs where the files are located. +launchpad_po_files_dir="translations" +launchpad_pot_file_dir="translations" +android_xml_files_res_dir="res/values" +#Change the typical filenames. +android_xml_filenames="strings arrays" +#Location of xml2po +xml2po="bin/xml2po.py" + +function import_po2xml +{ + for resource_file in $android_xml_filenames; do + for (( i=0 ; i<${#short_lang[*]} ; i=i+1 )); do + echo "Importing .xml from .po for "${resource_file}-${short_lang[i]}"" + mkdir -p "${android_xml_files_res_dir}"-"${long_lang[i]}" + ${xml2po} -a -l "${short_lang[i]}" -p "${launchpad_po_files_dir}"/"${resource_file}"-"${short_lang[i]}".po \ + "${android_xml_files_res_dir}"/"${android_xml_filename}".xml > "${android_xml_files_res_dir}"-"${long_lang[i]}"/"${resource_file}".xml + done + done +} + +function export_xml2po +{ + for resource_file in $android_xml_filenames; do + echo "Exporting .xml to .pot: $resource_file" + ${xml2po} -a -l "${short_lang[i]}" -o \ + "${launchpad_pot_file_dir}"/"${resource_file}".pot \ + "${android_xml_files_res_dir}"/"${resource_file}".xml + + for (( i=0 ; i<${#short_lang[*]} ; i=i+1 )); do + if [ -e "${launchpad_po_files_dir}"/"${resource_file}"-"${short_lang[i]}".po ] ; then + echo "Exporting .xml to updated .po for "${short_lang[i]}"" + echo "Making temporary folder: .tmp."${launchpad_po_files_dir}"" + mkdir -p .tmp."${launchpad_po_files_dir}" + if [ -e "${android_xml_files_res_dir}"-"${long_lang[i]}"/"${resource_file}".xml ] ; then + ${xml2po} -a -u "${launchpad_po_files_dir}"/"${resource_file}"-"${short_lang[i]}".po \ + "${android_xml_files_res_dir}"/"${resource_file}".xml + else + ${xml2po} -a -u "${launchpad_po_files_dir}"/"${resource_file}"-"${short_lang[i]}".po \ + "${android_xml_files_res_dir}"/"${resource_file}".xml + fi + fi + done + done +} + +function usage +{ + echo "Wrapper for xml2po for android and launchpad." + echo "Usage: androidxml2po -i Import .xml's from .po's. Updates the .xml's." + echo " androidxml2po -e Export/update .po's from string.xml's. Overwrites the .pot and merges the .po's." + echo "Set variables correctly inside. Provide a string with value "translator-credits" for Launchpad." + echo "" + echo "Copyright 2009 by pjv. Licensed under GPLv3." +} + +###Main +while [ "$1" != "" ]; do + case $1 in + -i | --po2xml | --import ) shift + import_po2xml + exit + ;; + -e | --xml2po | --export ) export_xml2po + exit + ;; + -h | --help ) usage + exit + ;; + * ) usage + exit 1 + esac + shift +done +usage diff --git a/bin/xml2po.py b/bin/xml2po.py new file mode 100644 index 000000000..34a561d26 --- /dev/null +++ b/bin/xml2po.py @@ -0,0 +1,887 @@ +#!/usr/bin/python -u +# -*- encoding: utf-8 -*- +# Copyright (c) 2004, 2005, 2006 Danilo Ĺ egan . +# +# This file is part of xml2po. +# +# xml2po is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# xml2po is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with xml2po; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +# xml2po -- translate XML documents +VERSION = "1.0.5" + +# Versioning system (I use this for a long time, so lets explain it to +# those Linux-versioning-scheme addicts): +# 1.0.* are unstable, development versions +# 1.1 will be first stable release (release 1), and 1.1.* bugfix releases +# 2.0.* will be unstable-feature-development stage (milestone 1) +# 2.1.* unstable development betas (milestone 2) +# 2.2 second stable release (release 2), and 2.2.* bugfix releases +# ... +# +import sys +import libxml2 +import gettext +import os +import re + +class NoneTranslations: + def gettext(self, message): + return None + + def lgettext(self, message): + return None + + def ngettext(self, msgid1, msgid2, n): + return None + + def lngettext(self, msgid1, msgid2, n): + return None + + def ugettext(self, message): + return None + + def ungettext(self, msgid1, msgid2, n): + return None + + + +class MessageOutput: + def __init__(self, with_translations = 0): + self.messages = [] + self.comments = {} + self.linenos = {} + self.nowrap = {} + if with_translations: + self.translations = [] + self.do_translations = with_translations + self.output_msgstr = 0 # this is msgid mode for outputMessage; 1 is for msgstr mode + + def translationsFollow(self): + """Indicate that what follows are translations.""" + self.output_msgstr = 1 + + def setFilename(self, filename): + self.filename = filename + + def outputMessage(self, text, lineno = 0, comment = None, spacepreserve = 0, tag = None): + """Adds a string to the list of messages.""" + if (text.strip() != ''): + t = escapePoString(normalizeString(text, not spacepreserve)) + if self.output_msgstr: + self.translations.append(t) + return + + if self.do_translations or (not t in self.messages): + self.messages.append(t) + if spacepreserve: + self.nowrap[t] = 1 + if t in self.linenos.keys(): + self.linenos[t].append((self.filename, tag, lineno)) + else: + self.linenos[t] = [ (self.filename, tag, lineno) ] + if (not self.do_translations) and comment and not t in self.comments: + self.comments[t] = comment + else: + if t in self.linenos.keys(): + self.linenos[t].append((self.filename, tag, lineno)) + else: + self.linenos[t] = [ (self.filename, tag, lineno) ] + if comment and not t in self.comments: + self.comments[t] = comment + + def outputHeader(self, out): + import time + out.write("""msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\\n" +"POT-Creation-Date: %s\\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n" +"Last-Translator: FULL NAME \\n" +"Language-Team: LANGUAGE \\n" +"MIME-Version: 1.0\\n" +"Content-Type: text/plain; charset=UTF-8\\n" +"Content-Transfer-Encoding: 8bit\\n" + +""" % (time.strftime("%Y-%m-%d %H:%M%z"))) + + def outputAll(self, out): + self.outputHeader(out) + + for k in self.messages: + if k in self.comments: + out.write("#. %s\n" % (self.comments[k].replace("\n","\n#. "))) + references = "" + for reference in self.linenos[k]: + references += "%s:%d(%s) " % (reference[0], reference[2], reference[1]) + out.write("#: %s\n" % (references)) + if k in self.nowrap and self.nowrap[k]: + out.write("#, no-wrap\n") + out.write("msgid \"%s\"\n" % (k)) + translation = "" + if self.do_translations: + if len(self.translations)>0: + translation = self.translations.pop(0) + if translation == k: + translation = "" + out.write("msgstr \"%s\"\n\n" % (translation)) + + +def normalizeNode(node): + #print >>sys.stderr, "<%s> (%s) [%s]" % (node.name, node.type, node.serialize('utf-8')) + if not node: + return + elif isSpacePreserveNode(node): + return + elif node.isText(): + if node.isBlankNode(): + if expand_entities or ( not (node.prev and not node.prev.isBlankNode() + and node.next and not node.next.isBlankNode()) ): + #print >>sys.stderr, "BLANK" + node.setContent('') + else: + node.setContent(re.sub('\s+',' ', node.content)) + + elif node.children and node.type == 'element': + child = node.children + while child: + normalizeNode(child) + child = child.next + +def normalizeString(text, ignorewhitespace = 1): + """Normalizes string to be used as key for gettext lookup. + + Removes all unnecessary whitespace.""" + if not ignorewhitespace: + return text + try: + # Lets add document DTD so entities are resolved + dtd = doc.intSubset() + tmp = dtd.serialize('utf-8') + tmp = tmp + '%s' % text + except: + tmp = '%s' % text + + try: + ctxt = libxml2.createDocParserCtxt(tmp) + if expand_entities: + ctxt.replaceEntities(1) + ctxt.parseDocument() + tree = ctxt.doc() + newnode = tree.getRootElement() + except: + print >> sys.stderr, """Error while normalizing string as XML:\n"%s"\n""" % (text) + return text + + normalizeNode(newnode) + + result = '' + child = newnode.children + while child: + result += child.serialize('utf-8') + child = child.next + + result = re.sub('^ ','', result) + result = re.sub(' $','', result) + + return result + +def stringForEntity(node): + """Replaces entities in the node.""" + text = node.serialize('utf-8') + try: + # Lets add document DTD so entities are resolved + dtd = node.doc.intSubset() + tmp = dtd.serialize('utf-8') + '%s' % text + next = 1 + except: + tmp = '%s' % text + next = 0 + + ctxt = libxml2.createDocParserCtxt(tmp) + if expand_entities: + ctxt.replaceEntities(1) + ctxt.parseDocument() + tree = ctxt.doc() + if next: + newnode = tree.children.next + else: + newnode = tree.children + + result = '' + child = newnode.children + while child: + result += child.serialize('utf-8') + child = child.next + + return result + + +def escapePoString(text): + return text.replace('\\','\\\\').replace('"', "\\\"").replace("\n","\\n").replace("\t","\\t") + +def unEscapePoString(text): + return text.replace('\\"', '"').replace('\\\\','\\') + +def getTranslation(text, spacepreserve = 0): + """Returns a translation via gettext for specified snippet. + + text should be a string to look for, spacepreserve set to 1 + when spaces should be preserved. + """ + #print >>sys.stderr,"getTranslation('%s')" % (text.encode('utf-8')) + text = normalizeString(text, not spacepreserve) + if (text.strip() == ''): + return text + global gt + if gt: + res = gt.ugettext(text.decode('utf-8')) + return res + + return text + +def myAttributeSerialize(node): + result = '' + if node.children: + child = node.children + while child: + if child.type=='text': + result += doc.encodeEntitiesReentrant(child.content) + elif child.type=='entity_ref': + if not expand_entities: + result += '&' + child.name + ';' + else: + result += child.content.decode('utf-8') + else: + result += myAttributeSerialize(child) + child = child.next + else: + result = node.serialize('utf-8') + return result + +def startTagForNode(node): + if not node: + return 0 + + result = node.name + params = '' + if node.properties: + for p in node.properties: + if p.type == 'attribute': + try: + nsprop = p.ns().name + ":" + p.name + except: + nsprop = p.name + params += " %s=\"%s\"" % (nsprop, myAttributeSerialize(p)) + return result+params + +def endTagForNode(node): + if not node: + return 0 + + result = node.name + return result + +def isFinalNode(node): + if automatic: + auto = autoNodeIsFinal(node) + # Check if any of the parents is also autoNodeIsFinal, + # and if it is, don't consider this node a final one + parent = node.parent + while parent and auto: + auto = not autoNodeIsFinal(parent) + parent = parent.parent + return auto + #node.type =='text' or not node.children or + if node.type == 'element' and node.name in ultimate_tags: + return 1 + elif node.children: + final_children = 1 + child = node.children + while child and final_children: + if not child.isBlankNode() and child.type != 'comment' and not isFinalNode(child): + final_children = 0 + child = child.next + if final_children: + return 1 + return 0 + +def ignoreNode(node): + if automatic: + if node.type in ('dtd', 'comment'): + return 1 + else: + return 0 + else: + if isFinalNode(node): + return 0 + if node.name in ignored_tags or node.type in ('dtd', 'comment'): + return 1 + return 0 + +def isSpacePreserveNode(node): + pres = node.getSpacePreserve() + if pres == 1: + return 1 + else: + if CurrentXmlMode and (node.name in CurrentXmlMode.getSpacePreserveTags()): + return 1 + else: + return 0 + +def getCommentForNode(node): + """Walk through previous siblings until a comment is found, or other element. + + Only whitespace is allowed between comment and current node.""" + prev = node.prev + while prev and prev.type == 'text' and prev.content.strip() == '': + prev = prev.prev + if prev and prev.type == 'comment': + return prev.content.strip() + else: + return None + +def replaceAttributeContentsWithText(node,text): + node.setContent(text) + +def replaceNodeContentsWithText(node,text): + """Replaces all subnodes of a node with contents of text treated as XML.""" + + if node.children: + starttag = startTagForNode(node) + endtag = endTagForNode(node) + + # Lets add document DTD so entities are resolved + tmp = '' + try: + dtd = doc.intSubset() + tmp = tmp + dtd.serialize('utf-8') + except libxml2.treeError: + pass + + content = '<%s>%s' % (starttag, text, endtag) + tmp = tmp + content.encode('utf-8') + + newnode = None + try: + ctxt = libxml2.createDocParserCtxt(tmp) + ctxt.replaceEntities(0) + ctxt.parseDocument() + newnode = ctxt.doc() + except: + pass + + if not newnode: + print >> sys.stderr, """Error while parsing translation as XML:\n"%s"\n""" % (text.encode('utf-8')) + return + + newelem = newnode.getRootElement() + + if newelem and newelem.children: + free = node.children + while free: + next = free.next + free.unlinkNode() + free = next + + if node: + copy = newelem.copyNodeList() + next = node.next + node.replaceNode(newelem.copyNodeList()) + node.next = next + + else: + # In practice, this happens with tags such as " " (only whitespace in between) + pass + else: + node.setContent(text) + +def autoNodeIsFinal(node): + """Returns 1 if node is text node, contains non-whitespace text nodes or entities.""" + if hasattr(node, '__autofinal__'): + return node.__autofinal__ + if node.name in ignored_tags: + node.__autofinal__ = 0 + return 0 + if node.isText() and node.content.strip()!='': + node.__autofinal__ = 1 + return 1 + final = 0 + child = node.children + while child: + if child.type in ['text'] and child.content.strip()!='': + final = 1 + break + child = child.next + + node.__autofinal__ = final + return final + + +def worthOutputting(node, noauto = 0): + """Returns 1 if node is "worth outputting", otherwise 0. + + Node is "worth outputting", if none of the parents + isFinalNode, and it contains non-blank text and entities. + """ + if noauto and hasattr(node, '__worth__'): + return node.__worth__ + elif not noauto and hasattr(node, '__autoworth__'): + return node.__autoworth__ + worth = 1 + parent = node.parent + final = isFinalNode(node) and node.name not in ignored_tags + while not final and parent: + if isFinalNode(parent): + final = 1 # reset if we've got to one final tag + if final and (parent.name not in ignored_tags) and worthOutputting(parent): + worth = 0 + break + parent = parent.parent + if not worth: + node.__worth__ = 0 + return 0 + + if noauto: + node.__worth__ = worth + return worth + else: + node.__autoworth__ = autoNodeIsFinal(node) + return node.__autoworth__ + +def processAttribute(node, attr): + if not node or not attr or not worthOutputting(node=node, noauto=1): + return + + outtxt = attr.content + if mode=='merge': + translation = getTranslation(outtxt, 0) + replaceAttributeContentsWithText(attr, translation.encode('utf-8')) + else: + msg.outputMessage(outtxt, node.lineNo(), "", 0, + node.name + ":" + attr.name) + +def processElementTag(node, replacements, restart = 0): + """Process node with node.type == 'element'.""" + if node.type == 'element': + # Translate attributes if needed + if node.properties and len(treated_attributes): + for p in node.properties: + if p.name in treated_attributes: + processAttribute(node, p) + + outtxt = '' + if restart: + myrepl = [] + else: + myrepl = replacements + + submsgs = [] + + child = node.children + while child: + if (isFinalNode(child)) or (child.type == 'element' and worthOutputting(child)): + myrepl.append(processElementTag(child, myrepl, 1)) + outtxt += '' % (len(myrepl)) + else: + if child.type == 'element': + (starttag, content, endtag, translation) = processElementTag(child, myrepl, 0) + outtxt += '<%s>%s' % (starttag, content, endtag) + else: + outtxt += doSerialize(child) + + child = child.next + + if mode == 'merge': + translation = getTranslation(outtxt, isSpacePreserveNode(node)) + else: + translation = outtxt.decode('utf-8') + + starttag = startTagForNode(node) + endtag = endTagForNode(node) + + worth = worthOutputting(node) + if not translation: + translation = outtxt.decode('utf-8') + if worth and mark_untranslated: node.setLang('C') + + if restart or worth: + i = 0 + while i < len(myrepl): + replacement = '<%s>%s' % (myrepl[i][0], myrepl[i][3], myrepl[i][2]) + i += 1 + translation = translation.replace('' % (i), replacement) + + if worth: + if mode == 'merge': + replaceNodeContentsWithText(node, translation) + else: + # try setting tag to the attribute's property + tag = node.name + if not node.properties is None: + tag = node.properties + msg.outputMessage(outtxt, node.lineNo(), getCommentForNode(node), isSpacePreserveNode(node), tag = tag) + + return (starttag, outtxt, endtag, translation) + else: + raise Exception("You must pass node with node.type=='element'.") + + +def isExternalGeneralParsedEntity(node): + if (node and node.type=='entity_ref'): + try: + # it would be nice if debugDumpNode could use StringIO, but it apparently cannot + tmp = file(".xml2po-entitychecking","w+") + node.debugDumpNode(tmp,0) + tmp.seek(0) + tmpstr = tmp.read() + tmp.close() + os.remove(".xml2po-entitychecking") + except: + # We fail silently, and replace all entities if we cannot + # write .xml2po-entitychecking + # !!! This is not very nice thing to do, but I don't know if + # raising an exception is any better + return 0 + if tmpstr.find('EXTERNAL_GENERAL_PARSED_ENTITY') != -1: + return 1 + else: + return 0 + else: + return 0 + +def doSerialize(node): + """Serializes a node and its children, emitting PO messages along the way. + + node is the node to serialize, first indicates whether surrounding + tags should be emitted as well. + """ + + if ignoreNode(node): + return '' + elif not node.children: + return node.serialize("utf-8") + elif node.type == 'entity_ref': + if isExternalGeneralParsedEntity(node): + return node.serialize('utf-8') + else: + return stringForEntity(node) #content #content #serialize("utf-8") + elif node.type == 'entity_decl': + return node.serialize('utf-8') #'<%s>%s' % (startTagForNode(node), node.content, node.name) + elif node.type == 'text': + return node.serialize('utf-8') + elif node.type == 'element': + repl = [] + (starttag, content, endtag, translation) = processElementTag(node, repl, 1) + return '<%s>%s' % (starttag, content, endtag) + else: + child = node.children + outtxt = '' + while child: + outtxt += doSerialize(child) + child = child.next + return outtxt + + +def read_finaltags(filelist): + if CurrentXmlMode: + return CurrentXmlMode.getFinalTags() + else: + defaults = ['para', 'title', 'releaseinfo', 'revnumber', + 'date', 'itemizedlist', 'orderedlist', + 'variablelist', 'varlistentry', 'term' ] + return defaults + +def read_ignoredtags(filelist): + if CurrentXmlMode: + return CurrentXmlMode.getIgnoredTags() + else: + defaults = ['itemizedlist', 'orderedlist', 'variablelist', + 'varlistentry' ] + return defaults + +def read_treatedattributes(filelist): + if CurrentXmlMode: + return CurrentXmlMode.getTreatedAttributes() + else: + return [] + + +def tryToUpdate(allargs, lang): + # Remove "-u" and "--update-translation" + print >>sys.stderr, "OVDI!" + command = allargs[0] + args = allargs[1:] + opts, args = getopt.getopt(args, 'avhm:ket:o:p:u:', + ['automatic-tags','version', 'help', 'keep-entities', 'extract-all-entities', 'merge', 'translation=', + 'output=', 'po-file=', 'update-translation=' ]) + for opt, arg in opts: + if opt in ('-a', '--automatic-tags'): + command += " -a" + elif opt in ('-k', '--keep-entities'): + command += " -k" + elif opt in ('-e', '--extract-all-entities'): + command += " -e" + elif opt in ('-m', '--mode'): + command += " -m %s" % arg + elif opt in ('-o', '--output'): + sys.stderr.write("Error: Option '-o' is not yet supported when updating translations directly.\n") + sys.exit(8) + elif opt in ('-v', '--version'): + print VERSION + sys.exit(0) + elif opt in ('-h', '--help'): + sys.stderr.write("Error: If you want help, please use `%s --help' without '-u' option.\n" % (allargs[0])) + sys.exit(9) + elif opt in ('-u', '--update-translation'): + pass + else: + sys.stderr.write("Error: Option `%s' is not supported with option `-u'.\n" % (opt)) + sys.exit(9) + + while args: + command += " " + args.pop() + + file = lang + + sys.stderr.write("Merging translations for %s: " % (lang)) + result = os.system("%s | msgmerge -o .tmp.%s.po %s -" % (command, lang, file)) + if result: + sys.exit(10) + else: + result = os.system("mv .tmp.%s.po %s" % (lang, file)) + if result: + sys.stderr.write("Error: cannot rename file.\n") + sys.exit(11) + else: + os.system("msgfmt -cv -o %s %s" % (NULL_STRING, file)) + sys.exit(0) + +def load_mode(modename): + #import imp + #found = imp.find_module(modename, submodes_path) + #module = imp.load_module(modename, found[0], found[1], found[2]) + try: + sys.path.append(submodes_path) + module = __import__(modename) + modeModule = '%sXmlMode' % modename + return getattr(module, modeModule) + except: + return None + +def xml_error_handler(arg, ctxt): + pass + +libxml2.registerErrorHandler(xml_error_handler, None) + + +# Main program start +if __name__ != '__main__': raise NotImplementedError + +# Parameters +submodes_path = "modes" +default_mode = 'docbook' + +filename = '' +origxml = '' +mofile = '' +gt = None +ultimate = [ ] +ignored = [ ] +filenames = [ ] +translationlanguage = '' + +mode = 'pot' # 'pot' or 'merge' +automatic = 0 +expand_entities = 1 +mark_untranslated = 0 +expand_all_entities = 0 + +output = '-' # this means to stdout + +NULL_STRING = '/dev/null' +if not os.path.exists('/dev/null'): NULL_STRING = 'NUL' + +import getopt, fileinput + +def usage (with_help = False): + print >> sys.stderr, "Usage: %s [OPTIONS] [XMLFILE]..." % (sys.argv[0]) + if (with_help): + print >> sys.stderr, """ +OPTIONS may be some of: + -a --automatic-tags Automatically decides if tags are to be considered + "final" or not + -k --keep-entities Don't expand entities + -e --expand-all-entities Expand ALL entities (including SYSTEM ones) + -m --mode=TYPE Treat tags as type TYPE (default: docbook) + -o --output=FILE Print resulting text (XML or POT) to FILE + -p --po-file=FILE Specify PO file containing translation, and merge + Overwrites temporary file .xml2po.mo. + -r --reuse=FILE Specify translated XML file with the same structure + -t --translation=FILE Specify MO file containing translation, and merge + -u --update-translation=LANG.po Updates a PO file using msgmerge program + + -l --language=LANG Set language of the translation to LANG + --mark-untranslated Set 'xml:lang="C"' on untranslated tags + + -v --version Output version of the xml2po program + + -h --help Output this message + +EXAMPLES: + To create a POTemplate book.pot from input files chapter1.xml and + chapter2.xml, run the following: + %s -o book.pot chapter1.xml chapter2.xml + + After translating book.pot into de.po, merge the translations back, + using -p option for each XML file: + %s -p de.po chapter1.xml > chapter1.de.xml + %s -p de.po chapter2.xml > chapter2.de.xml +""" % (sys.argv[0], sys.argv[0], sys.argv[0]) + sys.exit(0) + +if len(sys.argv) < 2: usage() + +args = sys.argv[1:] +try: opts, args = getopt.getopt(args, 'avhkem:t:o:p:u:r:l:', + ['automatic-tags','version', 'help', 'keep-entities', 'expand-all-entities', 'mode=', 'translation=', + 'output=', 'po-file=', 'update-translation=', 'reuse=', 'language=', 'mark-untranslated' ]) +except getopt.GetoptError: usage(True) + +for opt, arg in opts: + if opt in ('-m', '--mode'): + default_mode = arg + if opt in ('-a', '--automatic-tags'): + automatic = 1 + elif opt in ('-k', '--keep-entities'): + expand_entities = 0 + elif opt in ('--mark-untranslated',): + mark_untranslated = 1 + elif opt in ('-e', '--expand-all-entities'): + expand_all_entities = 1 + elif opt in ('-l', '--language'): + translationlanguage = arg + elif opt in ('-t', '--translation'): + mofile = arg + mode = 'merge' + if translationlanguage == '': translationlanguage = os.path.split(os.path.splitext(mofile)[0])[1] + elif opt in ('-r', '--reuse'): + origxml = arg + elif opt in ('-u', '--update-translation'): + tryToUpdate(sys.argv, arg) + elif opt in ('-p', '--po-file'): + mofile = ".xml2po.mo" + pofile = arg + if translationlanguage == '': translationlanguage = os.path.split(os.path.splitext(pofile)[0])[1] + os.system("msgfmt -o %s %s >%s" % (mofile, pofile, NULL_STRING)) and sys.exit(7) + mode = 'merge' + elif opt in ('-o', '--output'): + output = arg + elif opt in ('-v', '--version'): + print VERSION + sys.exit(0) + elif opt in ('-h', '--help'): + usage(True) + +# Treat remaining arguments as XML files +while args: + filenames.append(args.pop()) + +if len(filenames) > 1 and mode=='merge': + print >> sys.stderr, "Error: You can merge translations with only one XML file at a time." + sys.exit(2) + +try: + CurrentXmlMode = load_mode(default_mode)() +except: + CurrentXmlMode = None + # print >> sys.stderr, "Warning: cannot load module '%s', using automatic detection (-a)." % (default_mode) + automatic = 1 + +if mode=='merge' and mofile=='': + print >> sys.stderr, "Error: You must specify MO file when merging translations." + sys.exit(3) + +if mofile: + try: + mfile = open(mofile, "rb") + + gt = gettext.GNUTranslations(mfile) + gt.add_fallback(NoneTranslations()) + except: + print >> sys.stderr, "Can't open MO file '%s'." % (mofile) + +ultimate_tags = read_finaltags(ultimate) +ignored_tags = read_ignoredtags(ignored) +treated_attributes = read_treatedattributes(ignored) + +# I'm not particularly happy about making any of these global, +# but I don't want to bother too much with it right now +semitrans = {} +PlaceHolder = 0 +if origxml == '': + msg = MessageOutput() +else: + filenames.append(origxml) + msg = MessageOutput(1) + +for filename in filenames: + try: + if filename == origxml: + msg.translationsFollow() + ctxt = libxml2.createFileParserCtxt(filename) + ctxt.lineNumbers(1) + if expand_all_entities: + ctxt.replaceEntities(1) + ctxt.parseDocument() + doc = ctxt.doc() + if doc.name != filename: + print >> sys.stderr, "Error: I tried to open '%s' but got '%s' -- how did that happen?" % (filename, doc.name) + sys.exit(4) + except: + print >> sys.stderr, "Error: cannot open file '%s'." % (filename) + sys.exit(1) + + msg.setFilename(filename) + if CurrentXmlMode and origxml=='': + CurrentXmlMode.preProcessXml(doc,msg) + doSerialize(doc) + +if output == '-': + out = sys.stdout +else: + try: + out = file(output, 'w') + except: + print >> sys.stderr, "Error: cannot open file %s for writing." % (output) + sys.exit(5) + +if mode != 'merge': + if CurrentXmlMode: + tcmsg = CurrentXmlMode.getStringForTranslators() + tccom = CurrentXmlMode.getCommentForTranslators() + if tcmsg: + msg.outputMessage(tcmsg, 0, tccom) + + msg.outputAll(out) +else: + if CurrentXmlMode: + tcmsg = CurrentXmlMode.getStringForTranslators() + if tcmsg: + outtxt = getTranslation(tcmsg) + else: + outtxt = '' + CurrentXmlMode.postProcessXmlTranslation(doc, translationlanguage, outtxt) + out.write(doc.serialize('utf-8', 1)) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 89e57501f..6037c1c03 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -24,10 +24,11 @@ - + Hi there! Have a sec? Can I see you for a sec? Have a few minutes? @@ -42,9 +43,9 @@ It\'s a great day to - - I\'ve got something for you! + + I\'ve got something for you! Ready to put this in the past? Why don\'t you get this done? How about it? Ready tiger? @@ -63,8 +64,8 @@ Time to shorten your todo list! - + Please tell me it isn\'t true that you're a procrastinator! Doesn\'t being lazy get old sometimes? Somewhere, someone is depending on you to finish this! @@ -81,22 +82,22 @@ I can\'t help you organize your life if you do that... - + Pink Boring Astrid - + 0 1 2 - + disable twice an hour hourly @@ -106,8 +107,8 @@ weekly - + 0 1800 3600 diff --git a/res/values/strings.xml b/res/values/strings.xml index dc8c64337..d1a09fca5 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -40,60 +40,76 @@ Hour(s) + + 1 Task %d Tasks + %d / %d Active %d / %d Active + One Alarm Two Alarms %d Alarms + 1 Tag %d Tags - MMM d - M/dd HH:mm - D\na\ny\ns + + + MMM d + + M/dd HH:mm + + D\na\ny\ns H\no\nu\nr\ns + + 1 Day %d Days + 1 Day %d Days + 1 Hour %d Hours + 1 Minute %d Minutes + 1 Second %d Seconds + 1 Hr %d Hrs + 1 Min %d Min + 1 Sec %d Sec @@ -349,7 +365,7 @@ Thanks for using Astrid!\n Absolute Deadline! Goal Deadline! Working on: - You have %s tagged %s! + You have %d task(s) tagged %s! diff --git a/src/com/mdt/rtm/data/RtmTaskNote.java b/src/com/mdt/rtm/data/RtmTaskNote.java index df6f8489a..0ff012b40 100644 --- a/src/com/mdt/rtm/data/RtmTaskNote.java +++ b/src/com/mdt/rtm/data/RtmTaskNote.java @@ -24,6 +24,8 @@ import java.util.Date; import org.w3c.dom.Element; import org.w3c.dom.Text; +import android.util.Log; + /** * Represents a single task note. * @@ -53,11 +55,20 @@ public class RtmTaskNote // The note text itself might be split across multiple children of the // note element, so get all of the children. - for (int i=0; i 0) { Resources r = context.getResources(); String reminder = r.getString(R.string.notif_tagNotification, - r.getQuantityString(R.plurals.Ntasks, count, count), tagName); + count, tagName); Notifications.showTagNotification(context, tagId, reminder); Preferences.setLocaleLastAlertTime(context, tagId, diff --git a/translations/arrays.pot b/translations/arrays.pot index 4f7e68f23..3e9a59e77 100644 --- a/translations/arrays.pot +++ b/translations/arrays.pot @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2009-05-25 13:06-0700\n" +"POT-Creation-Date: 2009-06-13 01:16-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -9,251 +9,257 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: res/values/arrays.xml:29(item) +#. reminders: Make these < 20 chars so the task name is displayed +#: res/values/arrays.xml:32(item) msgid "Hi there! Have a sec?" msgstr "" -#: res/values/arrays.xml:30(item) +#: res/values/arrays.xml:33(item) msgid "Can I see you for a sec?" msgstr "" -#: res/values/arrays.xml:31(item) +#: res/values/arrays.xml:34(item) msgid "Have a few minutes?" msgstr "" -#: res/values/arrays.xml:32(item) +#: res/values/arrays.xml:35(item) msgid "Did you forget?" msgstr "" -#: res/values/arrays.xml:33(item) +#: res/values/arrays.xml:36(item) msgid "Excuse me!" msgstr "" -#: res/values/arrays.xml:34(item) +#: res/values/arrays.xml:37(item) msgid "When you have a minute:" msgstr "" -#: res/values/arrays.xml:35(item) +#: res/values/arrays.xml:38(item) msgid "On your agenda:" msgstr "" -#: res/values/arrays.xml:36(item) +#: res/values/arrays.xml:39(item) msgid "Free for a moment?" msgstr "" -#: res/values/arrays.xml:37(item) +#: res/values/arrays.xml:40(item) msgid "Astrid here!" msgstr "" -#: res/values/arrays.xml:38(item) +#: res/values/arrays.xml:41(item) msgid "Hi! Can I bug you?" msgstr "" -#: res/values/arrays.xml:39(item) +#: res/values/arrays.xml:42(item) msgid "A minute of your time?" msgstr "" -#: res/values/arrays.xml:40(item) +#: res/values/arrays.xml:43(item) msgid "It\\'s a great day to" msgstr "" -#: res/values/arrays.xml:45(item) +#. reminder_responses: Astrid says... (user should answer yes or no) +#: res/values/arrays.xml:48(item) msgid "I\\'ve got something for you!" msgstr "" -#: res/values/arrays.xml:46(item) +#: res/values/arrays.xml:49(item) msgid "Ready to put this in the past?" msgstr "" -#: res/values/arrays.xml:47(item) +#: res/values/arrays.xml:50(item) msgid "Why don\\'t you get this done?" msgstr "" -#: res/values/arrays.xml:48(item) +#: res/values/arrays.xml:51(item) msgid "How about it? Ready tiger?" msgstr "" -#: res/values/arrays.xml:49(item) +#: res/values/arrays.xml:52(item) msgid "Ready to do this?" msgstr "" -#: res/values/arrays.xml:50(item) +#: res/values/arrays.xml:53(item) msgid "Can you handle this?" msgstr "" -#: res/values/arrays.xml:51(item) +#: res/values/arrays.xml:54(item) msgid "You can be happy! Just finish this!" msgstr "" -#: res/values/arrays.xml:52(item) +#: res/values/arrays.xml:55(item) msgid "I promise you\\'ll feel better if you finish this!" msgstr "" -#: res/values/arrays.xml:53(item) +#: res/values/arrays.xml:56(item) msgid "Won\\'t you do this today?" msgstr "" -#: res/values/arrays.xml:54(item) +#: res/values/arrays.xml:57(item) msgid "Please finish this, I\\'m sick of it!" msgstr "" -#: res/values/arrays.xml:55(item) +#: res/values/arrays.xml:58(item) msgid "Can you finish this? Yes you can!" msgstr "" -#: res/values/arrays.xml:56(item) +#: res/values/arrays.xml:59(item) msgid "Are you ever going to do this?" msgstr "" -#: res/values/arrays.xml:57(item) +#: res/values/arrays.xml:60(item) msgid "Feel good about yourself! Let\\'s go!" msgstr "" -#: res/values/arrays.xml:58(item) +#: res/values/arrays.xml:61(item) msgid "I'm so proud of you! Lets get it done!" msgstr "" -#: res/values/arrays.xml:59(item) +#: res/values/arrays.xml:62(item) msgid "A little snack after you finish this?" msgstr "" -#: res/values/arrays.xml:60(item) +#: res/values/arrays.xml:63(item) msgid "Just this one task? Please?" msgstr "" -#: res/values/arrays.xml:61(item) +#: res/values/arrays.xml:64(item) msgid "Time to shorten your todo list!" msgstr "" -#: res/values/arrays.xml:66(item) +#. Astrid's nagging when user clicks postpone +#: res/values/arrays.xml:69(item) msgid "Please tell me it isn\\'t true that you're a procrastinator!" msgstr "" -#: res/values/arrays.xml:67(item) +#: res/values/arrays.xml:70(item) msgid "Doesn\\'t being lazy get old sometimes?" msgstr "" -#: res/values/arrays.xml:68(item) +#: res/values/arrays.xml:71(item) msgid "Somewhere, someone is depending on you to finish this!" msgstr "" -#: res/values/arrays.xml:69(item) +#: res/values/arrays.xml:72(item) msgid "When you said postpone, you really meant \\'I\\'m doing this\\', right?" msgstr "" -#: res/values/arrays.xml:70(item) +#: res/values/arrays.xml:73(item) msgid "This is the last time you postpone this, right?" msgstr "" -#: res/values/arrays.xml:71(item) +#: res/values/arrays.xml:74(item) msgid "Just finish this today, I won\\'t tell anyone!" msgstr "" -#: res/values/arrays.xml:72(item) +#: res/values/arrays.xml:75(item) msgid "Why postpone when you can um... not postpone!" msgstr "" -#: res/values/arrays.xml:73(item) +#: res/values/arrays.xml:76(item) msgid "You\\'ll finish this eventually, I presume?" msgstr "" -#: res/values/arrays.xml:74(item) +#: res/values/arrays.xml:77(item) msgid "I think you\\'re really great! How about not putting this off?" msgstr "" -#: res/values/arrays.xml:75(item) +#: res/values/arrays.xml:78(item) msgid "Will you be able to achieve your goals if you do that?" msgstr "" -#: res/values/arrays.xml:76(item) +#: res/values/arrays.xml:79(item) msgid "Postpone, postpone, postpone. When will you change!" msgstr "" -#: res/values/arrays.xml:77(item) +#: res/values/arrays.xml:80(item) msgid "I\\'ve had enough with your excuses! Just do it already!" msgstr "" -#: res/values/arrays.xml:78(item) +#: res/values/arrays.xml:81(item) msgid "Didn\\'t you make that excuse last time?" msgstr "" -#: res/values/arrays.xml:79(item) +#: res/values/arrays.xml:82(item) msgid "I can\\'t help you organize your life if you do that..." msgstr "" -#: res/values/arrays.xml:84(item) +#. Icons for notification tray +#: res/values/arrays.xml:87(item) msgid "Pink" msgstr "" -#: res/values/arrays.xml:85(item) +#: res/values/arrays.xml:88(item) msgid "Boring" msgstr "" -#: res/values/arrays.xml:86(item) +#: res/values/arrays.xml:89(item) msgid "Astrid" msgstr "" -#: res/values/arrays.xml:91(item) res/values/arrays.xml:109(item) +#. Corresponding to the constants in Preferences.java (do not edit) +#: res/values/arrays.xml:94(item) res/values/arrays.xml:112(item) msgid "0" msgstr "" -#: res/values/arrays.xml:92(item) +#: res/values/arrays.xml:95(item) msgid "1" msgstr "" -#: res/values/arrays.xml:93(item) +#: res/values/arrays.xml:96(item) msgid "2" msgstr "" -#: res/values/arrays.xml:98(item) +#. sync_interval_entries: Synchronization Intervals +#: res/values/arrays.xml:101(item) msgid "disable" msgstr "" -#: res/values/arrays.xml:99(item) +#: res/values/arrays.xml:102(item) msgid "twice an hour" msgstr "" -#: res/values/arrays.xml:100(item) +#: res/values/arrays.xml:103(item) msgid "hourly" msgstr "" -#: res/values/arrays.xml:101(item) +#: res/values/arrays.xml:104(item) msgid "twice a day" msgstr "" -#: res/values/arrays.xml:102(item) +#: res/values/arrays.xml:105(item) msgid "daily" msgstr "" -#: res/values/arrays.xml:103(item) +#: res/values/arrays.xml:106(item) msgid "twice a week" msgstr "" -#: res/values/arrays.xml:104(item) +#: res/values/arrays.xml:107(item) msgid "weekly" msgstr "" -#: res/values/arrays.xml:110(item) +#: res/values/arrays.xml:113(item) msgid "1800" msgstr "" -#: res/values/arrays.xml:111(item) +#: res/values/arrays.xml:114(item) msgid "3600" msgstr "" -#: res/values/arrays.xml:112(item) +#: res/values/arrays.xml:115(item) msgid "43200" msgstr "" -#: res/values/arrays.xml:113(item) +#: res/values/arrays.xml:116(item) msgid "86400" msgstr "" -#: res/values/arrays.xml:114(item) +#: res/values/arrays.xml:117(item) msgid "302400" msgstr "" -#: res/values/arrays.xml:115(item) +#: res/values/arrays.xml:118(item) msgid "604800" msgstr "" diff --git a/translations/strings.pot b/translations/strings.pot index 545d04bf9..0b2003983 100644 --- a/translations/strings.pot +++ b/translations/strings.pot @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2009-05-25 13:06-0700\n" +"POT-Creation-Date: 2009-06-13 01:16-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -10,993 +10,1010 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #. application -#: res/values/strings.xml:24(string) +#: res/values/strings.xml:25( name="app_name") msgid "Astrid" msgstr "" #. Importance Labels -#: res/values/strings.xml:30(string) +#: res/values/strings.xml:31( name="importance_1") msgid "!!!!" msgstr "" -#: res/values/strings.xml:31(string) +#: res/values/strings.xml:32( name="importance_2") msgid "!!!" msgstr "" -#: res/values/strings.xml:32(string) +#: res/values/strings.xml:33( name="importance_3") msgid "!!" msgstr "" -#: res/values/strings.xml:33(string) +#: res/values/strings.xml:34( name="importance_4") msgid "!" msgstr "" #. Repeat Interval Labels -#: res/values/strings.xml:36(string) +#: res/values/strings.xml:37( name="repeat_days") msgid "Day(s)" msgstr "" -#: res/values/strings.xml:37(string) +#: res/values/strings.xml:38( name="repeat_weeks") msgid "Week(s)" msgstr "" -#: res/values/strings.xml:38(string) +#: res/values/strings.xml:39( name="repeat_months") msgid "Month(s)" msgstr "" -#: res/values/strings.xml:39(string) +#: res/values/strings.xml:40( name="repeat_hours") msgid "Hour(s)" msgstr "" -#: res/values/strings.xml:43(item) +#. plurals: tasks +#: res/values/strings.xml:46( quantity="one") msgid "1 Task" msgstr "" -#: res/values/strings.xml:44(item) +#: res/values/strings.xml:47( quantity="other") msgid "%d Tasks" msgstr "" -#: res/values/strings.xml:47(item) res/values/strings.xml:48(item) +#. plurals: active tasks vs total tasks +#: res/values/strings.xml:51( quantity="one") res/values/strings.xml:52( quantity="other") msgid "%d / %d Active" msgstr "" -#: res/values/strings.xml:51(item) +#. plurals: alarms +#: res/values/strings.xml:56( quantity="one") msgid "One Alarm" msgstr "" -#: res/values/strings.xml:52(item) +#: res/values/strings.xml:57( quantity="two") msgid "Two Alarms" msgstr "" -#: res/values/strings.xml:53(item) +#: res/values/strings.xml:58( quantity="other") msgid "%d Alarms" msgstr "" -#: res/values/strings.xml:56(item) +#. plurals: tags +#: res/values/strings.xml:62( quantity="one") msgid "1 Tag" msgstr "" -#: res/values/strings.xml:57(item) +#: res/values/strings.xml:63( quantity="other") msgid "%d Tags" msgstr "" -#. Time Constants -#: res/values/strings.xml:61(string) +#. used for long due dates. c.f. Java's SimpleDateFormat +#: res/values/strings.xml:69( name="dateFormatter") msgid "MMM d" msgstr "" -#. used for long due -#. dates. c.f. Java's SimpleDateFormat -#: res/values/strings.xml:63(string) +#. used for alarms +#: res/values/strings.xml:71( name="alarmDateFormatter") msgid "M/dd HH:mm" msgstr "" -#. used for alarms -#: res/values/strings.xml:64(string) +#. vertical labels are used in dialog boxes +#: res/values/strings.xml:73( name="daysVertical") msgid "D\\na\\ny\\ns" msgstr "" -#. vertical labels -#. are used in the number dialogs -#: res/values/strings.xml:66(string) +#: res/values/strings.xml:74( name="hoursVertical") msgid "H\\no\\nu\\nr\\ns" msgstr "" -#: res/values/strings.xml:68(item) res/values/strings.xml:72(item) +#. plurals: days +#: res/values/strings.xml:78( quantity="one") res/values/strings.xml:83( quantity="one") msgid "1 Day" msgstr "" -#: res/values/strings.xml:69(item) res/values/strings.xml:73(item) +#: res/values/strings.xml:79( quantity="other") res/values/strings.xml:84( quantity="other") msgid "%d Days" msgstr "" -#: res/values/strings.xml:76(item) +#. plurals: hours +#: res/values/strings.xml:88( quantity="one") msgid "1 Hour" msgstr "" -#: res/values/strings.xml:77(item) +#: res/values/strings.xml:89( quantity="other") msgid "%d Hours" msgstr "" -#: res/values/strings.xml:80(item) +#. plurals: minutes +#: res/values/strings.xml:93( quantity="one") msgid "1 Minute" msgstr "" -#: res/values/strings.xml:81(item) +#: res/values/strings.xml:94( quantity="other") msgid "%d Minutes" msgstr "" -#: res/values/strings.xml:84(item) +#. plurals: seconds +#: res/values/strings.xml:98( quantity="one") msgid "1 Second" msgstr "" -#: res/values/strings.xml:85(item) +#: res/values/strings.xml:99( quantity="other") msgid "%d Seconds" msgstr "" -#: res/values/strings.xml:88(item) +#. plurals: hours (abbreviated) +#: res/values/strings.xml:103( quantity="one") msgid "1 Hr" msgstr "" -#: res/values/strings.xml:89(item) +#: res/values/strings.xml:104( quantity="other") msgid "%d Hrs" msgstr "" -#: res/values/strings.xml:92(item) +#. plurals: minutes (abbreviated) +#: res/values/strings.xml:108( quantity="one") msgid "1 Min" msgstr "" -#: res/values/strings.xml:93(item) +#: res/values/strings.xml:109( quantity="other") msgid "%d Min" msgstr "" -#: res/values/strings.xml:96(item) +#. plurals: seconds (abbreviated) +#: res/values/strings.xml:113( quantity="one") msgid "1 Sec" msgstr "" -#: res/values/strings.xml:97(item) +#: res/values/strings.xml:114( quantity="other") msgid "%d Sec" msgstr "" -#: res/values/strings.xml:99(string) +#: res/values/strings.xml:116( name="ago_suffix") msgid "Ago" msgstr "" #. title bar -#: res/values/strings.xml:105(string) +#: res/values/strings.xml:122( name="taskList_titlePrefix") msgid "Astrid:" msgstr "" -#: res/values/strings.xml:106(string) +#: res/values/strings.xml:123( name="taskList_titleTagPrefix") msgid "Tagged \\\"%s\\\":" msgstr "" -#: res/values/strings.xml:107(string) +#: res/values/strings.xml:124( name="taskList_titleUntagged") msgid "Untagged Tasks:" msgstr "" -#: res/values/strings.xml:108(string) +#: res/values/strings.xml:125( name="taskList_hiddenSuffix") msgid "hidden" msgstr "" -#: res/values/strings.xml:109(string) +#. menu items +#: res/values/strings.xml:126( name="addtask_label") res/values/strings.xml:148( name="taskList_menu_insert") msgid "New Task" msgstr "" -#: res/values/strings.xml:110(string) +#: res/values/strings.xml:127( name="missing_tag") msgid "Could Not Find Requested Tag!" msgstr "" #. text in the actual list -#: res/values/strings.xml:113(string) +#: res/values/strings.xml:130( name="taskList_hiddenPrefix") msgid "H" msgstr "" #. prefix to show that a task is hidden -#: res/values/strings.xml:114(string) +#: res/values/strings.xml:131( name="taskList_dueRelativeTime") msgid "Due in" msgstr "" #. i.e. Due in 4 days -#: res/values/strings.xml:115(string) +#: res/values/strings.xml:132( name="taskList_dueAbsoluteDate") msgid "Due on" msgstr "" #. i.e. Due on Jan 2 -#: res/values/strings.xml:116(string) +#: res/values/strings.xml:133( name="taskList_goalPrefix") msgid "Goal" msgstr "" #. prefix to deadline -#: res/values/strings.xml:117(string) +#: res/values/strings.xml:134( name="taskList_overdueBy") msgid "Overdue by" msgstr "" -#: res/values/strings.xml:118(string) +#: res/values/strings.xml:135( name="taskList_completedPrefix") msgid "Finished" msgstr "" #. i.e. Finished 4 days ago -#: res/values/strings.xml:119(string) +#: res/values/strings.xml:136( name="taskList_estimatedTimePrefix") msgid "Estimated:" msgstr "" #. i.e. Estimated 4: hours -#: res/values/strings.xml:120(string) +#: res/values/strings.xml:137( name="taskList_elapsedTimePrefix") msgid "Spent:" msgstr "" #. i.e. Spent 88 minutes on tax. -#: res/values/strings.xml:121(string) +#: res/values/strings.xml:138( name="taskList_periodicReminderPrefix") msgid "Poke Every" msgstr "" #. time interval to set frequency to remind user -#: res/values/strings.xml:122(string) +#: res/values/strings.xml:139( name="taskList_repeatPrefix") msgid "Repeats Every" msgstr "" #. time interval to set repeated tasks -#: res/values/strings.xml:123(string) +#: res/values/strings.xml:140( name="taskList_repeatsRemotely") msgid "Repeats On Remote Server" msgstr "" #. displayed when repeat is on remote server -#: res/values/strings.xml:124(string) +#: res/values/strings.xml:141( name="taskList_alarmPrefix") msgid "Next Alarm:" msgstr "" -#: res/values/strings.xml:125(string) res/values/strings.xml:180(string) +#: res/values/strings.xml:142( name="taskList_tagsPrefix") res/values/strings.xml:197( name="tags_label") msgid "Tags:" msgstr "" -#: res/values/strings.xml:126(string) +#: res/values/strings.xml:143( name="taskList_notesPrefix") msgid "Notes:" msgstr "" -#: res/values/strings.xml:127(string) +#: res/values/strings.xml:144( name="taskList_createdPrefix") msgid "Created:" msgstr "" #. Created: MM/DD/YY -#: res/values/strings.xml:128(string) +#: res/values/strings.xml:145( name="taskList_deleted") msgid "Deleted" msgstr "" -#. menu items -#: res/values/strings.xml:131(string) -msgid "Add" -msgstr "" - -#. Add or Insert -#: res/values/strings.xml:132(string) res/values/strings.xml:404(string) +#. New Tasks, Add or Insert +#: res/values/strings.xml:149( name="taskList_menu_tags") res/values/strings.xml:425( name="prefs_tagsVisible_title") msgid "Tags" msgstr "" -#: res/values/strings.xml:133(string) -msgid "Display" +#. filter menu +#: res/values/strings.xml:150( name="taskList_menu_filters") res/values/strings.xml:167( name="taskList_filter_title") +msgid "Sort/Filters" msgstr "" -#: res/values/strings.xml:134(string) +#: res/values/strings.xml:151( name="taskList_menu_syncshortcut") msgid "Sync" msgstr "" -#: res/values/strings.xml:135(string) +#: res/values/strings.xml:152( name="taskList_menu_more") msgid "More" msgstr "" -#: res/values/strings.xml:136(string) +#: res/values/strings.xml:153( name="taskList_menu_sync") msgid "Synchronization" msgstr "" -#: res/values/strings.xml:137(string) +#: res/values/strings.xml:154( name="taskList_menu_settings") msgid "Settings" msgstr "" -#: res/values/strings.xml:138(string) +#: res/values/strings.xml:155( name="taskList_menu_help") msgid "Help (opens in Browser)" msgstr "" -#: res/values/strings.xml:139(string) +#: res/values/strings.xml:156( name="taskList_menu_survey") msgid "Take Astrid\\'s Survey!" msgstr "" -#: res/values/strings.xml:140(string) +#: res/values/strings.xml:157( name="taskList_menu_tips") msgid "Quick Tips" msgstr "" -#: res/values/strings.xml:141(string) +#: res/values/strings.xml:158( name="taskList_menu_cleanup") msgid "Clean Up Old Tasks" msgstr "" -#: res/values/strings.xml:143(string) +#: res/values/strings.xml:160( name="taskList_context_edit") msgid "Edit Task" msgstr "" -#: res/values/strings.xml:144(string) +#: res/values/strings.xml:161( name="taskList_context_delete") msgid "Delete Task" msgstr "" -#: res/values/strings.xml:145(string) res/values/strings.xml:224(string) +#: res/values/strings.xml:162( name="taskList_context_startTimer") res/values/strings.xml:242( name="startTimer_label") msgid "Start Timer" msgstr "" -#: res/values/strings.xml:146(string) res/values/strings.xml:225(string) +#: res/values/strings.xml:163( name="taskList_context_stopTimer") res/values/strings.xml:243( name="stopTimer_label") msgid "Stop Timer" msgstr "" -#: res/values/strings.xml:147(string) +#: res/values/strings.xml:164( name="taskList_context_postpone") msgid "Postpone" msgstr "" -#. filter menu -#: res/values/strings.xml:150(string) -msgid "Sort/Filters" -msgstr "" - -#: res/values/strings.xml:151(string) +#: res/values/strings.xml:168( name="taskList_filter_hidden") msgid "Hidden/Blocked Tasks" msgstr "" -#: res/values/strings.xml:152(string) +#: res/values/strings.xml:169( name="taskList_filter_done") msgid "Completed Tasks" msgstr "" -#: res/values/strings.xml:153(string) +#: res/values/strings.xml:170( name="taskList_filter_tagged") msgid "Tagged \\'%s\\'" msgstr "" -#: res/values/strings.xml:154(string) +#: res/values/strings.xml:171( name="taskList_sort_auto") msgid "Auto Sort" msgstr "" -#: res/values/strings.xml:155(string) +#: res/values/strings.xml:172( name="taskList_sort_alpha") msgid "Sort By Name" msgstr "" -#: res/values/strings.xml:156(string) +#: res/values/strings.xml:173( name="taskList_sort_duedate") msgid "Sort By Due Date" msgstr "" -#: res/values/strings.xml:157(string) +#: res/values/strings.xml:174( name="taskList_sort_reverse") msgid "Sort Reverse" msgstr "" -#: res/values/strings.xml:159(string) +#: res/values/strings.xml:176( name="taskList_nonag_reminder") msgid "Select an Action:" msgstr "" -#: res/values/strings.xml:160(string) +#: res/values/strings.xml:177( name="taskList_postpone_count") msgid "Times You\\'ve Postponed: %d" msgstr "" -#: res/values/strings.xml:161(string) +#: res/values/strings.xml:178( name="taskList_postpone_dialog") msgid "Postpone for how long?" msgstr "" -#: res/values/strings.xml:162(string) +#: res/values/strings.xml:179( name="taskList_cleanup_dialog") msgid "\"Delete completed tasks older than # days:\"" msgstr "" #. title bar -#: res/values/strings.xml:167(string) +#: res/values/strings.xml:184( name="taskEdit_titleGeneric") msgid "Astrid: Editing Task" msgstr "" -#: res/values/strings.xml:168(string) +#: res/values/strings.xml:185( name="taskEdit_titlePrefix") msgid "Astrid: Editing" msgstr "" -#: res/values/strings.xml:169(string) +#: res/values/strings.xml:186( name="taskEdit_label") msgid "Astrid: New Task" msgstr "" #. tabs -#: res/values/strings.xml:172(string) +#: res/values/strings.xml:189( name="taskEdit_tab_basic") msgid "Basic" msgstr "" -#: res/values/strings.xml:173(string) res/values/strings.xml:398(string) +#: res/values/strings.xml:190( name="taskEdit_tab_dates") res/values/strings.xml:419( name="prefs_deadlineVisible_title") msgid "Dates" msgstr "" -#: res/values/strings.xml:174(string) +#: res/values/strings.xml:191( name="taskEdit_tab_alerts") msgid "Alerts" msgstr "" #. labels -#: res/values/strings.xml:177(string) +#: res/values/strings.xml:194( name="name_label") msgid "Summary" msgstr "" -#: res/values/strings.xml:178(string) -msgid "Task Description" +#: res/values/strings.xml:195( name="name_hint") +msgid "Task Name" msgstr "" -#: res/values/strings.xml:179(string) +#: res/values/strings.xml:196( name="importance_label") msgid "How Important is it?" msgstr "" -#: res/values/strings.xml:182(string) +#: res/values/strings.xml:198( name="tag_hint") +msgid "Tag Name" +msgstr "" + +#: res/values/strings.xml:200( name="estimatedDuration_label") msgid "How Long Will it Take?" msgstr "" -#: res/values/strings.xml:183(string) +#: res/values/strings.xml:201( name="elapsedDuration_label") msgid "Time Already Spent on Task" msgstr "" -#: res/values/strings.xml:184(string) +#: res/values/strings.xml:202( name="definiteDueDate_label") msgid "Absolute Deadline" msgstr "" -#: res/values/strings.xml:185(string) +#: res/values/strings.xml:203( name="preferredDueDate_label") msgid "Goal Deadline" msgstr "" -#: res/values/strings.xml:186(string) +#: res/values/strings.xml:204( name="addToCalendar_label") msgid "Add Task To Calendar" msgstr "" -#: res/values/strings.xml:187(string) +#: res/values/strings.xml:205( name="showCalendar_label") msgid "Open Calendar Event" msgstr "" -#: res/values/strings.xml:188(string) +#: res/values/strings.xml:206( name="hiddenUntil_label") msgid "Hide Until This Date" msgstr "" -#: res/values/strings.xml:189(string) +#: res/values/strings.xml:207( name="repeat_label") msgid "Repeat Every" msgstr "" -#: res/values/strings.xml:190(string) +#: res/values/strings.xml:208( name="repeat_value_unset") msgid "No Repeat Set" msgstr "" -#: res/values/strings.xml:191(string) +#: res/values/strings.xml:209( name="blockingOn_label") msgid "Hide Until This Task is Done" msgstr "" -#: res/values/strings.xml:192(string) res/values/strings.xml:410(string) +#: res/values/strings.xml:210( name="notes_label") res/values/strings.xml:431( name="prefs_notesVisible_title") msgid "Notes" msgstr "" -#: res/values/strings.xml:193(string) +#: res/values/strings.xml:211( name="notes_hint") msgid "Enter Task Notes" msgstr "" -#: res/values/strings.xml:195(string) +#: res/values/strings.xml:213( name="notification_label") msgid "Periodic Reminders" msgstr "" -#: res/values/strings.xml:196(string) +#: res/values/strings.xml:214( name="notification_prefix") msgid "Every" msgstr "" -#: res/values/strings.xml:197(string) +#: res/values/strings.xml:215( name="flags_label") msgid "Notify me..." msgstr "" -#: res/values/strings.xml:198(string) +#: res/values/strings.xml:216( name="flag_before") msgid "As Deadlines Approach" msgstr "" -#: res/values/strings.xml:199(string) +#: res/values/strings.xml:217( name="flag_during") msgid "At Deadlines" msgstr "" -#: res/values/strings.xml:200(string) +#: res/values/strings.xml:218( name="flag_after") msgid "After Absolute Deadline Passes" msgstr "" -#: res/values/strings.xml:201(string) +#: res/values/strings.xml:219( name="flag_nonstop") msgid "Alarm Clock Mode" msgstr "" -#: res/values/strings.xml:202(string) +#: res/values/strings.xml:220( name="alerts_label") msgid "Fixed Reminders" msgstr "" -#: res/values/strings.xml:203(string) +#: res/values/strings.xml:221( name="add_alert") msgid "Add New Reminder" msgstr "" #. dialog boxes -#: res/values/strings.xml:206(string) +#: res/values/strings.xml:224( name="hour_minutes_dialog") msgid "Time (hours : minutes)" msgstr "" -#: res/values/strings.xml:207(string) +#: res/values/strings.xml:225( name="notification_dialog") msgid "Remind Me Every" msgstr "" -#: res/values/strings.xml:208(string) +#: res/values/strings.xml:226( name="repeat_picker_title") msgid "Repeat Every (0 to disable)" msgstr "" -#: res/values/strings.xml:209(string) +#: res/values/strings.xml:227( name="repeat_help_dialog_title") msgid "Help: Astrid Repeats" msgstr "" -#: res/values/strings.xml:210(string) +#: res/values/strings.xml:228( name="repeat_help_dialog") msgid "To use repeats, set at least one of the deadlines above. When you complete this task, the deadline will be automatically advanced. \\n\\n If you don\\'t want to see the new task right after you complete the old one, you should use the \"Hide Until\" field, which will also be advanced automatically. \\n" msgstr "" -#: res/values/strings.xml:216(string) +#: res/values/strings.xml:234( name="repeat_help_hide") msgid "Don't Show Help Anymore" msgstr "" #. buttons -#: res/values/strings.xml:219(string) res/values/strings.xml:227(string) +#: res/values/strings.xml:237( name="save_label") res/values/strings.xml:245( name="taskEdit_menu_save") msgid "Save" msgstr "" -#: res/values/strings.xml:220(string) +#: res/values/strings.xml:238( name="discard_label") msgid "Discard" msgstr "" -#: res/values/strings.xml:221(string) +#: res/values/strings.xml:239( name="edit_label") msgid "Edit" msgstr "" -#: res/values/strings.xml:222(string) res/values/strings.xml:316(string) +#: res/values/strings.xml:240( name="delete_label") res/values/strings.xml:337( name="delete_title") msgid "Delete" msgstr "" -#: res/values/strings.xml:223(string) +#: res/values/strings.xml:241( name="blank_button_title") msgid "Click to Set" msgstr "" -#: res/values/strings.xml:228(string) +#: res/values/strings.xml:246( name="taskEdit_onTaskSave_Due") msgid "Task Saved: due in %s" msgstr "" -#: res/values/strings.xml:229(string) +#: res/values/strings.xml:247( name="taskEdit_onTaskSave_Overdue") msgid "Task Saved: due %s ago" msgstr "" -#: res/values/strings.xml:230(string) +#: res/values/strings.xml:248( name="taskEdit_onTaskSave_notDue") msgid "Task Saved" msgstr "" -#: res/values/strings.xml:235(string) +#: res/values/strings.xml:253( name="taskView_notifyTitle") msgid "Astrid says..." msgstr "" -#: res/values/strings.xml:239(string) +#: res/values/strings.xml:257( name="tagList_titlePrefix") msgid "Astrid: Tag View:" msgstr "" -#: res/values/strings.xml:240(string) +#: res/values/strings.xml:258( name="tagList_context_create") msgid "Create Task With Tag" msgstr "" -#: res/values/strings.xml:241(string) +#: res/values/strings.xml:259( name="tagList_context_edit") msgid "Edit Tag" msgstr "" -#: res/values/strings.xml:242(string) +#: res/values/strings.xml:260( name="tagList_context_delete") msgid "Delete Tag" msgstr "" -#: res/values/strings.xml:243(string) +#: res/values/strings.xml:261( name="tagList_context_showTag") msgid "Show on Home Page" msgstr "" -#: res/values/strings.xml:244(string) +#: res/values/strings.xml:262( name="tagList_context_hideTag") msgid "Hide on Home Page" msgstr "" -#: res/values/strings.xml:245(string) +#: res/values/strings.xml:263( name="tagList_context_shortcut") msgid "Create Shortcut" msgstr "" -#: res/values/strings.xml:246(string) +#: res/values/strings.xml:264( name="tagList_shortcut_created") msgid "Shortcut created on your home screen!" msgstr "" -#: res/values/strings.xml:247(string) +#: res/values/strings.xml:265( name="tagList_shortcut_prefix") msgid "Tag:" msgstr "" -#: res/values/strings.xml:248(string) +#: res/values/strings.xml:266( name="tagList_untagged") msgid "[untagged]" msgstr "" -#: res/values/strings.xml:250(string) +#: res/values/strings.xml:268( name="tagList_menu_sortAlpha") msgid "Sort A-Z" msgstr "" -#: res/values/strings.xml:251(string) +#: res/values/strings.xml:269( name="tagList_menu_sortSize") msgid "Sort by Size" msgstr "" -#: res/values/strings.xml:256(string) +#: res/values/strings.xml:274( name="sync_pref_group") msgid "Synchronization Services" msgstr "" -#: res/values/strings.xml:257(string) +#: res/values/strings.xml:275( name="sync_pref_group_actions") msgid "Actions" msgstr "" -#: res/values/strings.xml:258(string) +#: res/values/strings.xml:276( name="sync_pref_group_options") msgid "Options" msgstr "" -#: res/values/strings.xml:259(string) +#: res/values/strings.xml:277( name="sync_rtm_title") msgid "Remember The Milk" msgstr "" #. Proper noun - don't translate -#: res/values/strings.xml:260(string) +#: res/values/strings.xml:278( name="sync_rtm_desc") msgid "http://www.rememberthemilk.com" msgstr "" -#: res/values/strings.xml:261(string) +#: res/values/strings.xml:279( name="sync_interval_title") msgid "Auto-Synchronize" msgstr "" -#: res/values/strings.xml:262(string) +#: res/values/strings.xml:280( name="sync_interval_desc") msgid "If set, synchronization occurs automatically given interval" msgstr "" -#: res/values/strings.xml:263(string) +#: res/values/strings.xml:281( name="sync_button_title") msgid "Main Menu Shortcut" msgstr "" -#: res/values/strings.xml:264(string) +#: res/values/strings.xml:282( name="sync_button_desc") msgid "Show \\\"Synchronize\\\" in Astrid\\'s menu" msgstr "" -#: res/values/strings.xml:265(string) +#: res/values/strings.xml:283( name="sync_quiet_title") msgid "Hide Dialogs" msgstr "" -#: res/values/strings.xml:266(string) +#: res/values/strings.xml:284( name="sync_quiet_desc") msgid "Hide the Sync Results dialogs" msgstr "" -#: res/values/strings.xml:267(string) +#: res/values/strings.xml:285( name="sync_bgwifi_title") msgid "Auto-Sync Wifi Only" msgstr "" -#: res/values/strings.xml:268(string) +#: res/values/strings.xml:286( name="sync_bgwifi_desc") msgid "If set, auto-sync only happens when Wifi is active" msgstr "" -#: res/values/strings.xml:269(string) +#: res/values/strings.xml:287( name="sync_error") msgid "Sync Error! Sorry for the inconvenience! Error:" msgstr "" -#: res/values/strings.xml:270(string) -msgid "In order to synchronize, please log in to your %s account and authorize Astrid to read your data. \\n\\n When finished, restart Astrid." -msgstr "" - -#: res/values/strings.xml:275(string) +#: res/values/strings.xml:288( name="sync_upgrade_v99") msgid "Astrid 2.7 now performs synchronization with RTM in the background. You will be directed to the preferences page to configure how often you want this to occur (it is a minor drain on battery)." msgstr "" -#: res/values/strings.xml:280(string) +#: res/values/strings.xml:293( name="sync_now") msgid "Synchronize Now!" msgstr "" -#: res/values/strings.xml:281(string) +#: res/values/strings.xml:294( name="sync_forget") msgid "Clear Personal Data" msgstr "" -#: res/values/strings.xml:282(string) +#: res/values/strings.xml:295( name="sync_uptodate") msgid "Sync: Up to date!" msgstr "" -#: res/values/strings.xml:283(string) +#: res/values/strings.xml:296( name="sync_forget_confirm") msgid "Clear data for selected services?" msgstr "" -#: res/values/strings.xml:284(string) +#: res/values/strings.xml:297( name="sync_no_synchronizers") msgid "No Synchronizers Enabled!" msgstr "" -#: res/values/strings.xml:285(string) +#: res/values/strings.xml:298( name="sync_last_sync") msgid "Last Sync Date: %s" msgstr "" -#: res/values/strings.xml:286(string) +#: res/values/strings.xml:299( name="sync_last_auto_sync") msgid "Last AutoSync Attempt: %s" msgstr "" -#: res/values/strings.xml:287(string) +#: res/values/strings.xml:300( name="sync_date_never") msgid "never" msgstr "" -#: res/values/strings.xml:288(string) +#: res/values/strings.xml:301( name="sync_result_title") msgid "%s Results" msgstr "" -#: res/values/strings.xml:289(string) +#: res/values/strings.xml:302( name="sync_result_local") msgid "Summary - Astrid Tasks:" msgstr "" -#: res/values/strings.xml:290(string) +#: res/values/strings.xml:303( name="sync_result_remote") msgid "Summary - Remote Server:" msgstr "" -#: res/values/strings.xml:291(string) +#: res/values/strings.xml:304( name="sync_result_created") msgid "Created: %d" msgstr "" -#: res/values/strings.xml:292(string) +#: res/values/strings.xml:305( name="sync_result_updated") msgid "Updated: %d" msgstr "" -#: res/values/strings.xml:293(string) +#: res/values/strings.xml:306( name="sync_result_deleted") msgid "Deleted: %d" msgstr "" -#: res/values/strings.xml:294(string) +#: res/values/strings.xml:307( name="sync_result_merged") msgid "Merged: %d" msgstr "" -#: res/values/strings.xml:296(string) +#: res/values/strings.xml:309( name="sync_progress_remote") msgid "Reading Remote Data" msgstr "" -#: res/values/strings.xml:297(string) +#: res/values/strings.xml:310( name="sync_progress_rxlist") msgid "Reading List: %s" msgstr "" -#: res/values/strings.xml:298(string) +#: res/values/strings.xml:311( name="sync_progress_repeating") msgid "Synchronizing Repeating Task" msgstr "" -#: res/values/strings.xml:299(string) -msgid "Sending Task: %s" +#: res/values/strings.xml:312( name="sync_progress_localtx") +msgid "Transmitting: %s" msgstr "" -#: res/values/strings.xml:300(string) +#: res/values/strings.xml:313( name="sync_progress_localdel") msgid "Locally Deleted Tasks" msgstr "" -#: res/values/strings.xml:301(string) -msgid "Receiving Task: %s" +#: res/values/strings.xml:314( name="sync_progress_remotetx") +msgid "Receiving: %s" +msgstr "" + +#: res/values/strings.xml:316( name="rtm_login_label") +msgid "Please Log In to RTM..." msgstr "" -#: res/values/strings.xml:306(string) +#: res/values/strings.xml:317( name="rtm_login_error") +msgid "Sorry, there was an error verifying your login. Please try again. \\n\\n Error Message:" +msgstr "" + +#: res/values/strings.xml:326( name="loading") msgid "Loading..." msgstr "" -#: res/values/strings.xml:307(string) +#: res/values/strings.xml:327( name="updating") msgid "Updating List..." msgstr "" -#: res/values/strings.xml:308(string) +#: res/values/strings.xml:328( name="information_title") msgid "Information" msgstr "" -#: res/values/strings.xml:309(string) +#: res/values/strings.xml:329( name="question_title") msgid "Question" msgstr "" -#: res/values/strings.xml:310(string) +#: res/values/strings.xml:330( name="done_label") +msgid "Done" +msgstr "" + +#: res/values/strings.xml:331( name="notify_yes") msgid "View Task" msgstr "" -#: res/values/strings.xml:311(string) +#: res/values/strings.xml:332( name="notify_done") msgid "Already Done!" msgstr "" -#: res/values/strings.xml:312(string) +#: res/values/strings.xml:333( name="notify_snooze") msgid "Snooze" msgstr "" -#: res/values/strings.xml:313(string) +#: res/values/strings.xml:334( name="notify_no") msgid "Quit" msgstr "" -#: res/values/strings.xml:314(string) +#: res/values/strings.xml:335( name="notify_snooze_title") msgid "Hours/minutes to snooze?" msgstr "" -#: res/values/strings.xml:317(string) +#: res/values/strings.xml:338( name="delete_this_task_title") msgid "Delete this task?" msgstr "" -#: res/values/strings.xml:318(string) +#: res/values/strings.xml:339( name="delete_this_tag_title") msgid "Remove this tag from all tasks?" msgstr "" -#: res/values/strings.xml:320(string) +#: res/values/strings.xml:341( name="stop_timer_title") msgid "Stop the timer?" msgstr "" -#: res/values/strings.xml:322(string) +#: res/values/strings.xml:343( name="quick_tips") msgid "Some things you may not know about Astrid:\\n \\n - To create a task, just start typing!\\n - While editing a task, hit \\'back\\' to save it\\n - Select a task & press 1-4 to quickly change it\\'s priority\\n - If a task has a deadline, long-press to postpone it\\n \\n Thanks for using Astrid!\\n" msgstr "" -#: res/values/strings.xml:336(string) +#: res/values/strings.xml:357( name="locale_edit_alerts_title") msgid "Astrid Tag Alert" msgstr "" -#: res/values/strings.xml:337(string) +#: res/values/strings.xml:358( name="locale_edit_intro") msgid "Astrid will send you a reminder when you have uncompleted tasks with the following criteria:" msgstr "" -#: res/values/strings.xml:339(string) +#: res/values/strings.xml:360( name="locale_pick_tag") msgid "Tagged with:" msgstr "" -#: res/values/strings.xml:344(string) +#: res/values/strings.xml:365( name="notif_definiteDueDate") msgid "Absolute Deadline!" msgstr "" -#: res/values/strings.xml:345(string) +#: res/values/strings.xml:366( name="notif_preferredDueDate") msgid "Goal Deadline!" msgstr "" -#: res/values/strings.xml:346(string) +#: res/values/strings.xml:367( name="notif_timerStarted") msgid "Working on:" msgstr "" -#: res/values/strings.xml:347(string) -msgid "You have %s tagged %s!" +#: res/values/strings.xml:368( name="notif_tagNotification") +msgid "You have %d task(s) tagged %s!" msgstr "" -#: res/values/strings.xml:352(string) +#: res/values/strings.xml:373( name="error_opening") msgid "Couldn't find this item:" msgstr "" -#: res/values/strings.xml:353(string) +#: res/values/strings.xml:374( name="error_saving") msgid "Couldn't save:" msgstr "" -#: res/values/strings.xml:357(string) +#: res/values/strings.xml:378( name="prefs_category_alerts") msgid "Notifications" msgstr "" -#: res/values/strings.xml:359(string) +#: res/values/strings.xml:380( name="prefs_quietStart_title") msgid "Quiet Hours Start" msgstr "" -#: res/values/strings.xml:360(string) +#: res/values/strings.xml:381( name="prefs_quietStart_desc") msgid "Starting hour when Astrid should be quiet (e.g. 22)" msgstr "" -#: res/values/strings.xml:362(string) +#: res/values/strings.xml:383( name="prefs_quietEnd_title") msgid "Quiet Hours End" msgstr "" -#: res/values/strings.xml:363(string) +#: res/values/strings.xml:384( name="prefs_quietEnd_desc") msgid "Ending hour when Astrid should be quiet (e.g. 08)" msgstr "" -#: res/values/strings.xml:365(string) +#: res/values/strings.xml:386( name="prefs_defaultRemind_title") msgid "Default Reminders" msgstr "" -#: res/values/strings.xml:366(string) +#: res/values/strings.xml:387( name="prefs_defaultRemind_desc") msgid "For new tasks, in days (i.e. 7). Blank to disable" msgstr "" -#: res/values/strings.xml:368(string) +#: res/values/strings.xml:389( name="prefs_annoy_title") msgid "Persistent Mode" msgstr "" -#: res/values/strings.xml:369(string) +#: res/values/strings.xml:390( name="prefs_annoy_desc") msgid "If checked, LED and notifications must be cleared one at a time" msgstr "" -#: res/values/strings.xml:371(string) +#: res/values/strings.xml:392( name="prefs_notification_title") msgid "Notification Ringtone" msgstr "" -#: res/values/strings.xml:372(string) +#: res/values/strings.xml:393( name="prefs_notification_desc") msgid "Choose a ringtone for Astrid\\'s alerts" msgstr "" -#: res/values/strings.xml:374(string) +#: res/values/strings.xml:395( name="prefs_notificon_title") msgid "Notification Icons" msgstr "" -#: res/values/strings.xml:375(string) +#: res/values/strings.xml:396( name="prefs_notificon_desc") msgid "Choose Astrid\\'s notification bar icon" msgstr "" -#: res/values/strings.xml:377(string) +#: res/values/strings.xml:398( name="prefs_category_appearance") msgid "Appearance" msgstr "" -#: res/values/strings.xml:379(string) +#: res/values/strings.xml:400( name="prefs_colorize_title") msgid "Colorize Task List" msgstr "" -#: res/values/strings.xml:380(string) +#: res/values/strings.xml:401( name="prefs_colorize_desc") msgid "Different colors for different priorities" msgstr "" -#: res/values/strings.xml:382(string) +#: res/values/strings.xml:403( name="prefs_fontSize_title") msgid "Task List Font" msgstr "" -#: res/values/strings.xml:383(string) +#: res/values/strings.xml:404( name="prefs_fontSize_desc") msgid "Font on the main listing page (i.e. 22)" msgstr "" -#: res/values/strings.xml:385(string) +#: res/values/strings.xml:406( name="prefs_category_other") msgid "Other" msgstr "" -#: res/values/strings.xml:387(string) +#: res/values/strings.xml:408( name="prefs_nagging_title") msgid "Nag Messages" msgstr "" -#: res/values/strings.xml:388(string) +#: res/values/strings.xml:409( name="prefs_nagging_desc") msgid "Show Astrid\\'s comments when viewing reminders and postponing tasks?" msgstr "" -#: res/values/strings.xml:390(string) +#: res/values/strings.xml:411( name="prefs_deadlineTime_title") msgid "Default Deadlines" msgstr "" -#: res/values/strings.xml:391(string) +#: res/values/strings.xml:412( name="prefs_deadlineTime_desc") msgid "# of days from now to set new deadlines" msgstr "" -#: res/values/strings.xml:393(string) +#: res/values/strings.xml:414( name="displayedFields_PrefScreen_Title") msgid "Displayed Fields" msgstr "" -#: res/values/strings.xml:394(string) +#: res/values/strings.xml:415( name="displayedFields_PrefScreen_Desc") msgid "Select the fields to show in task list" msgstr "" -#: res/values/strings.xml:396(string) +#: res/values/strings.xml:417( name="prefs_titleVisible_title") msgid "Task Title" msgstr "" -#: res/values/strings.xml:397(string) +#: res/values/strings.xml:418( name="prefs_titleVisible_desc") msgid "Task description" msgstr "" -#: res/values/strings.xml:399(string) +#: res/values/strings.xml:420( name="prefs_deadlineVisible_desc") msgid "Upcoming deadlines / completed date" msgstr "" -#: res/values/strings.xml:400(string) +#: res/values/strings.xml:421( name="prefs_timeVisible_title") msgid "Times" msgstr "" -#: res/values/strings.xml:401(string) +#: res/values/strings.xml:422( name="prefs_timeVisible_desc") msgid "Estimated & Elapsed Times" msgstr "" -#: res/values/strings.xml:402(string) +#: res/values/strings.xml:423( name="prefs_importanceVisible_title") msgid "Importance" msgstr "" -#: res/values/strings.xml:403(string) +#: res/values/strings.xml:424( name="prefs_importanceVisible_desc") msgid "Task importance indicator" msgstr "" -#: res/values/strings.xml:405(string) +#: res/values/strings.xml:426( name="prefs_tagsVisible_desc") msgid "Tags associated with this task" msgstr "" -#: res/values/strings.xml:406(string) +#: res/values/strings.xml:427( name="prefs_repeatVisible_title") msgid "Repeats" msgstr "" -#: res/values/strings.xml:407(string) +#: res/values/strings.xml:428( name="prefs_repeatVisible_desc") msgid "Task repeat information" msgstr "" -#: res/values/strings.xml:408(string) +#: res/values/strings.xml:429( name="prefs_reminderVisible_title") msgid "Reminders" msgstr "" -#: res/values/strings.xml:409(string) +#: res/values/strings.xml:430( name="prefs_reminderVisible_desc") msgid "Displayed if this task has reminders" msgstr "" -#: res/values/strings.xml:411(string) +#: res/values/strings.xml:432( name="prefs_notesVisible_desc") msgid "Notes associated with this task" msgstr "" +#. Automatically filled in by Launchpad: +#: res/values/strings.xml:436( name="about_translators") +msgid "translator-credits" +msgstr "" +