i18n/ 0000755 0000000 0000000 00000000000 14122217711 010331 5 ustar root root i18n/translations/ 0000755 0000000 0000000 00000000000 14122217342 013052 5 ustar root root i18n/translations/gettrans.py 0000755 0000000 0000000 00000023665 14122217342 015272 0 ustar root root #!/usr/bin/env python3
#******************************************************************************
# gettrans.py, updates Qt-style translation files from PyQt source
# uses gettext-style markings and filenames as contexts
#
# Copyright (C) 2020, Douglas W. Bell
#
# This is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License, either Version 2 or any later
# version. This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY. See the included LICENSE file for details.
#******************************************************************************
import argparse
import pathlib
import ast
import collections
import copy
import xml.etree.ElementTree as ET
from xml.sax.saxutils import escape
class TransItem:
"""Class to hold data for and output a single translation string.
"""
def __init__(self, contextName, lineNum, srcText, comment=''):
"""Initialize the tramslation string item.
Arguments:
contextName -- a string containing the filename-based context
lineNum -- the line of the first occurrence in the source code
srcText -- the untranslated source text string
comment -- optional comment from source as a guide to translation
"""
self.contextName = contextName
self.lineNum = lineNum
self.srcText = srcText
self.comment = comment
self.transType = 'unfinished'
self.transText = ''
def xmlLines(self):
"""Return a list of XML output lines for this item.
"""
lines = [' ',
f' ',
f' {escape(self.srcText)}']
if self.comment:
lines.append(f' {self.comment}')
transType = f' type="{self.transType}"' if self.transType else ''
lines.extend([f' '
f'{escape(self.transText)}',
' '])
return lines
def readSource(path, sourceDict):
"""Read strings to be translated from the a single source file path.
Updates the give source dict with any results from this context.
Arguments:
path -- the source file path to read
sourceDict -- the dictionary to add a context dict to with results
"""
with path.open(encoding='utf-8') as f:
src = f.read()
tree = ast.parse(src)
contextDict = collections.OrderedDict()
for node in ast.walk(tree):
if (isinstance(node, ast.Call) and isinstance(node.func, ast.Name) and
(node.func.id == '_' or node.func.id == 'N_')):
try:
text = node.args[0].value
text.replace # throw exception if not a string
comment = node.args[1].value if len(node.args) > 1 else ''
except AttributeError:
continue # skip if no string is present
item = TransItem(path.stem, node.lineno, text, comment)
contextDict.setdefault((text, comment), item)
if contextDict: # only add the context dictionary if there are results
sourceDict[path.stem] = contextDict
if verbose:
print('Read', len(contextDict), 'items from', path.name)
def readXml(root, sourceDict, keepObsolete=True):
"""Read the XML for a language file starting from an elemant tree root.
Returns tuple of an outputDict with results by context and
a globalDict with all translations to search for matches.
Arguments:
root -- the ET root to read
sourceDict -- the dict with source strings for comparison
keepObsolete -- save obsolete strings (no longer in source) if True
"""
outputDict = collections.OrderedDict()
globalDict = {}
for contextNode in root.findall('context'):
contextName = contextNode.find('name').text
currentDict = collections.OrderedDict()
numObsolete = 0
for msgNode in contextNode.findall('message'):
lineNum = int(msgNode.find('location').attrib['line'])
srcText = msgNode.find('source').text
commentNode = msgNode.find('comment')
comment = commentNode.text if commentNode is not None else ''
item = TransItem(contextName, lineNum, srcText, comment)
transNode = msgNode.find('translation')
item.transType = transNode.attrib.get('type', '')
item.transText = transNode.text if transNode.text else ''
try:
sourceItem = sourceDict[contextName][(srcText, comment)]
except KeyError: # string wasn't found in source dict
if item.transType != 'obsolete':
item.transType = 'obsolete'
numObsolete += 1
else:
item.lineNum = sourceItem.lineNum
if item.transType == 'obsolete':
item.transType = 'unfinished'
if keepObsolete or item.transType != 'obsolete':
currentDict[(srcText, comment)] = item
if item.transText:
globalDict[(srcText, comment)] = item
outputDict[contextName] = currentDict
if verbose and numObsolete:
print(f' {numObsolete} newly obsolete strings in '
f'{contextName}.py')
return (outputDict, globalDict)
def addMissingItems(sourceDict, outputDict):
"""Add items from source dict that are missing from output dict.
Arguments:
sourceDict -- the source translations to add from
outputDict -- the result dict to modify
"""
for contextName, sourceItems in sourceDict.items():
numNew = 0
currentDict = outputDict.get(contextName, {})
if not currentDict:
outputDict[contextName] = currentDict
for sourceItem in sourceItems.values():
if (verbose and (sourceItem.srcText, sourceItem.comment) not in
currentDict):
numNew += 1
currentDict.setdefault((sourceItem.srcText, sourceItem.comment),
copy.copy(sourceItem))
if verbose and numNew:
print(f' {numNew} new strings added from {contextName}.py')
def updateFromGlobal(outputDict, globalDict):
"""Search strings from all contexts and add translations if they match.
Arguments:
outputDict -- the result dict to modify
globalDict -- the overall dict to search
"""
for contextName, currentDict in outputDict.items():
numUpdates = 0
for item in currentDict.values():
if not item.transText:
match = globalDict.get((item.srcText, item.comment))
if match:
item.transText = match.transText
numUpdates += 1
if verbose and numUpdates:
print(f' {numUpdates} translations in {contextName} copied '
'from other strings')
def outputXml(outputDict, path, lang):
"""Return a list of output lines for a language file.
Arguments:
outputDict -- the result strings to output
path -- the translation file path to write the file
lang -- the language code for the file header
"""
outputLines = ['',
f'']
for contextName, currentDict in outputDict.items():
outputLines.extend(['',
f' {contextName}'])
for item in currentDict.values():
outputLines.extend(item.xmlLines())
outputLines.append('')
outputLines.append('')
with open(path, 'w', encoding='utf-8') as f:
f.write('\n'.join(outputLines))
verbose = False
def main():
"""Main program entry function.
"""
parser = argparse.ArgumentParser()
parser.add_argument('sourceDir', type=pathlib.Path,
help='directory of input source files read with *.py')
parser.add_argument('translateDir', type=pathlib.Path,
help='directory of *.ts translation files to update')
parser.add_argument('--no-obsolete', action='store_true',
help='drop all obsolete strings')
parser.add_argument('-R', '--recursive', action='store_true',
help='recursively scan the directories')
parser.add_argument('-v', '--verbose', action='store_true',
help='increase output messages')
args = parser.parse_args()
global verbose
verbose = args.verbose
sourceDict = collections.OrderedDict()
pyGlob = '**/*.py' if args.recursive else '*.py'
for sourcePath in sorted(args.sourceDir.glob(pyGlob)):
readSource(sourcePath, sourceDict)
if verbose:
print('-----------------------------------------')
tsGlob = '**/*.ts' if args.recursive else '*.ts'
for transPath in sorted(args.translateDir.glob(tsGlob)):
try:
root = ET.parse(transPath).getroot()
except ET.ParseError:
print('Warning: nothing read from', transPath)
root = ET.ElementTree(ET.Element('TS')).getroot()
lang = root.attrib.get('language')
if not lang: # get from filename if not in header
pathParts = transPath.stem.split('_')
if len(pathParts) > 1:
lang = pathParts[-1]
if not lang:
lang = 'xx'
if verbose:
print(f'For language code "{lang}":')
outputDict, globalDict = readXml(root, sourceDict,
not args.no_obsolete)
addMissingItems(sourceDict, outputDict)
updateFromGlobal(outputDict, globalDict)
outputXml(outputDict, transPath, lang)
if __name__ == '__main__':
"""Main program entry point.
"""
main()
i18n/translations/treeline_xx.ts 0000644 0000000 0000000 00000551431 14122217342 015761 0 ustar root root
conditionalstarts withends withcontainsTrueFalseandor[All Types]Node Type&Add New Rule&Remove Rule&OK&CancelFind &PreviousFind &Next&Filter&End Filter&CloseNo conditional matches were foundRule {0}Saved RulesName:&Load&Save&DeleteconfigdialogConfigure Data TypesT&ype ListTyp&e ConfigField &List&Field ConfigO&utput&Show Advanced&OK&Apply&Reset&Cancel&Hide AdvancedError - circular reference in math field equationsAdd or Remove Data Types&New Type...Co&py Type...Rena&me Type...&Delete TypeAdd TypeEnter new type name:Copy Type&Derive from originalRename TypeRename from {} to:Cannot delete data type being used by nodes[None]no type set&Data TypeDefault Child &TypeIconChange &IconOutput OptionsAdd &blank lines between nodesAllow &HTML rich text in formatAdd text bullet&sUse a table for field &dataCombination && Child List Output &SeparatorDerived from &Generic TypeAutomatic TypesNoneModify Co&nditional TypesCreate Co&nditional TypesSet Types ConditionallyModify &Field ListNameTypeSort KeyMove U&pMove Do&wn&New Field...Rena&me Field...Dele&te FieldSort &Keys...fwdrevAdd FieldEnter new field name:Rename FieldFile Info ReferenceF&ield&Field TypeOutpu&t FormatFormat &HelpExtra Text&PrefixSuffi&xDefault &Value for New NodesEditor HeightNum&ber of text linesMath EquationDefine EquationF&ield List&Title FormatOut&put FormatOther Field ReferencesReference Le&velRefere&nce TypeThe name cannot be emptyThe name must start with a letterThe name cannot start with "xml"The name cannot contain spacesThe following characters are not allowed: {}The name was already usedSet Data Type IconClear &SelectforwardreverseSort Key FieldsAvailable &Fields&Sort CriteriaFieldDirectionMove &Up&Move DownFlip &DirectionSelf ReferenceParent ReferenceRoot ReferenceChild ReferenceChild CountDate ResultTime Resultaddsubtractmultiplydividefloor dividemoduluspowersum of itemsmaximumminimumaverageabsolute valuesquare rootnatural logarithmbase-10 logarithmfactorialround to num digitslower integerhigher integertruncated integerfloating pointsine of radianscosine of radianstangent of radiansarc sinearc cosinearc tangentradians to degreesdegrees to radianspi constantnatural log constantDefine Math Field EquationField ReferencesReference &LevelReference &TypeAvailable &Field List&Result TypeDescription&EquationEquation error: {}Boolean ResultText ResultArithmetic OperatorsComparison OperatorsText Operatorsequal toless thangreater thanless than or equal togreater than or equal tonot equal totrue value, condition, false valuetrue if 1st text arg starts with 2nd argtrue if 1st text arg ends with 2nd argtrue if 1st text arg contains 2nd argconcatenate textjoin text using 1st arg as separatorconvert text to upper caseconvert text to lower casein 1st arg, replace 2nd arg with 3rd argOperationsO&perator TypeOper&ator Listlogical andlogical orOutput HTMLEvaluate &HTML tagsChild Type Limits[All Types Available]&Select AllSelect &NoneNumber ResultCountNumber of ChildrendataeditorsToday's &Date&Open LinkOpen &FolderExternal LinkScheme&Browse for FileFile Path TypeAbsoluteRelativeAddressDisplay Name&OK&CancelTreeLine - External Link File&Go to TargetInternal Link&Open PicturePicture LinkTreeLine - Picture FileSet to &NowClear &Link(Click link target in tree)linkexportsBookmarksTreeLine - Export HTMLTreeLine - Export Text TitlesTreeLine - Export Plain TextTreeLine - Export Text TablesTreeLine - Export Generic XMLTreeLine - Export TreeLine SubtreeTreeLine - Export ODF TextTreeLine - Export HTML BookmarksTreeLine - Export XBEL Bookmarks&HTML&Text&ODF OutlineBook&marks&Single HTML pageSingle &HTML page with navigation paneMultiple HTML &pages with navigation paneMultiple HTML &data tables&Tabbed title text&Unformatted output of all text&HTML format bookmarks&XBEL format bookmarksFile ExportChoose export format typeChoose export format subtypeChoose export optionsWhat to Export&Entire treeSelected &branchesSelected &nodesOther Options&Only open node childrenInclude &print header && footer&ColumnsNavigation pane &levelsError - export template files not found.
Check your TreeLine installation.Error - cannot link to unsaved TreeLine file.
Save the file and retry.Warning - no relative path from "{0}" to "{1}".
Continue with absolute path?ParentTree&Line&XML (generic)Live tree view, linked to TreeLine file (for web server)Live tree view, single file (embedded data)&Comma delimited (CSV) table of descendants (level numbers)Comma &delimited (CSV) table of children (single level)Tab &delimited table of children (&single level)&Old TreeLine (2.0.x)&TreeLine Subtree&Include root nodesMust select nodes prior to exportfieldformatTextHtmlTextOneLineTextSpacedTextNumberMathNumberingBooleanDateTimeChoiceAutoChoiceCombinationAutoCombinationExternalLinkInternalLinkPictureRegularExpressionNowOptional Digit #Required Digit 0Digit or Space (external) <space>Decimal Point .Decimal Comma ,Space Separator (internal) <space>Optional Sign -Required Sign +Exponent (capital) EExponent (small) eNumber 1Capital Letter ASmall Letter aCapital Roman Numeral ISmall Roman Numeral iLevel Separator /Section Separator ."/" Character //"." Character ..Outline Example I../A../1../a)/i)Section Example 1.1.1.1Separator /Example 1/2/3/4yes/notrue/falseT/FY/NAny Character .End of Text $0 Or More Repetitions *1 Or More Repetitions +0 Or 1 Repetitions ?Set of Numbers [0-9]Lower Case Letters [a-z]Upper Case Letters [A-Z]Not a Number [^0-9]Or |Escape a Special Character \DateTimeDay (1 or 2 digits) %-dDay (2 digits) %dWeekday Abbreviation %aWeekday Name %AMonth (1 or 2 digits) %-mMonth (2 digits) %mMonth Abbreviation %bMonth Name %BYear (2 digits) %yYear (4 digits) %YWeek Number (0 to 53) %-UDay of year (1 to 366) %-jHour (0-23, 1 or 2 digits) %-HHour (00-23, 2 digits) %HHour (1-12, 1 or 2 digits) %-IHour (01-12, 2 digits) %IMinute (1 or 2 digits) %-MMinute (2 digits) %MSecond (1 or 2 digits) %-SSecond (2 digits) %SMicroseconds (6 digits) %fAM/PM %pComma Separator \,Dot Separator \.DescendantCountgenbooleantruefalseyesnoglobalrefTreeLine FilesTreeLine Files - CompressedTreeLine Files - EncryptedAll FilesHTML FilesText FilesXML FilesODF Text FilesTreepad FilesPDF FilesCSV (Comma Delimited) FilesAll TreeLine FilesOld TreeLine FileshelpviewTools&Back&Forward&Home Find: Find &PreviousFind &NextText string not foundimports&Tab indented text, one node per lineTab delimited text table with header &rowPlain text ¶graphs (blank line delimited)Treepad &file (text nodes only)&Generic XML (non-TreeLine file)Open &Document (ODF) outline&HTML bookmarks (Mozilla Format)&XML bookmarks (XBEL format)FOLDERBOOKMARKSEPARATORLinkTextImport FileChoose Import MethodInvalid File"{0}" is not a valid TreeLine file.
Use an import filter?TreeLine - Import FileError - could not read file {0}Error - improper format in {0}TABLEBookmarksToo many entries on Line {0}Plain text, one &node per line (CR delimited)Bad CSV format on Line {0}Co&mma delimited (CSV) text table with level column && header rowComma delimited (CSV) text table &with header rowOtherOld Tree&Line File (1.x or 2.x)Invalid level number on line {0}Invalid level structuremathevalIllegal "{}" charactersChild references must be combined in a functionIllegal syntax in equationIllegal function present: {0}Illegal object type or operator: {0}miscdialogs&OK&CancelFieldsFile PropertiesFile Storage&Use file compressionUse file &encryptionSpell CheckLanguage code or
dictionary (optional)Math Fields&Treat blank fields as zerosEncrypted File PasswordType Password for "{0}":Type Password:Re-Type Password:Remember password during this sessionZero-length passwords are not permittedRe-typed password did not matchDefault - Single Line Text&Search TextWhat to SearchFull &data&Titles onlyHow to Search&Key wordsKey full &wordsF&ull phrase&Regular expressionFindFind &PreviousFind &NextFilter&Filter&End Filter&CloseError - invalid regular expressionSearch string "{0}" not foundFind and ReplaceReplacement &TextAny &matchFull &wordsRe&gular expression&Node TypeN&ode Fields&Find Next&ReplaceReplace &All[All Types][All Fields]Search text "{0}" not foundError - replacement failedReplaced {0} matchesSort NodesWhat to Sort&Entire treeSelected &branchesSelection's childre&nSelection's &siblingsSort Method&Predefined Key FieldsNode &TitlesSort Direction&Forward&Reverse&ApplyUpdate Node NumberingWhat to Update&Selection's childrenRoot NodeInclude top-level nodesHandling Nodes without Numbering Fields&Ignore and skip&Restart numbers for next siblingsReserve &numbersTreeLine NumberingNo numbering fields were found in data typesFile MenuFileEdit MenuEditNode MenuNodeData MenuDataTools MenuToolsView MenuViewWindow MenuWindowHelp MenuHelpKeyboard Shortcuts&Restore DefaultsKey {0} is already usedClear &Key--Separator--Customize ToolbarsToolbar &SizeSmall IconsLarge IconsToolbar Quantity&ToolbarsA&vailable CommandsTool&bar CommandsMove &UpMove &DownTree View FontOutput View FontEditor View FontNo menuTreeLine - Serious ErrorA serious error has occurred. TreeLine could be in an unstable state.
Recommend saving any file changes under another filename and restart TreeLine.
The debugging info shown below can be copied and emailed to doug101@bellz.org along with
an explanation of the circumstances.
Format MenuFormatCustomize Fonts&Use system default fontApp Default Font&Use app default fontnodeformatNameoptiondefaultsMondayTuesdayWednesdayThursdayFridaySaturdaySundayStartup ConditionAutomatically open last file usedShow descendants in output viewRestore tree view states of recent filesRestore previous window geometryFeatures AvailableOpen files in new windowsClick node to renameRename new nodes when createdTree drag && drop availableShow icons in the tree viewShow math fields in the Data Edit viewShow numbering fields in the Data Edit viewUndo MemoryNumber of undo levelsAuto SaveMinutes between saves
(set to 0 to disable)Recent FilesNumber of recent files
in the file menuData Editor FormatsTimesDatesFirst day
of weekAppearanceChild indent offset
(in font height units) Show breadcrumb ancestor viewShow child pane in right hand viewsRemove inaccessible recent file entriesActivate data editors on mouse hoverMinimize application to system trayIndent (pretty print) TreeLine JSON filesLimit data editor height to window sizeoptionsChoose configuration file locationUser's home directory (recommended)Program directory (for portable use)&OK&CancelprintdataError initializing printerTreeLine - Export PDFWarning: Page size and margin settings unsupported on current printer.
Save page adjustments?Warning: Page size setting unsupported on current printer.
Save adjustment?Warning: Margin settings unsupported on current printer.
Save adjustments?printdialogsPrint PreviewFit WidthFit PageZoom InZoom OutPrevious PageNext PageSingle PageFacing PagesPrint SetupPrintPrinting Setup&General OptionsPage &Setup&Font Selection&Header/FooterPrint Pre&view...&Print...&OK&CancelWhat to print&Entire treeSelected &branchesSelected &nodesIncluded Nodes&Include root nodeOnl&y open node childrenFeatures&Draw lines to children&Keep first child with parentIndentIndent Offse&t
(line height units)Letter (8.5 x 11 in.)Legal (8.5 x 14 in.)Tabloid (11 x 17 in.)A3 (279 x 420 mm)A4 (210 x 297 mm)A5 (148 x 210 mm)Custom SizeInches (in)Millimeters (mm)Centimeters (cm)&UnitsPaper &Size&Width:Height:OrientationPortra&itLan&dscapeMargins&Left:&Top:&Right:&Bottom:He&ader:Foot&er:Columns&Number of columnsSpace between colu&mnsDefault Font&Use TreeLine output view fontSelect Font&FontFont st&yleSi&zeSampleAaBbCcDdEeFfGg...TtUuVvWvXxYyZz&Header LeftHeader C&enterHeader &RightFooter &LeftFooter Ce&nterFooter Righ&tFiel&dsField For&matHeader and FooterField Format for "{0}"Output &FormatFormat &HelpExtra Text&Prefix&SuffixError: Page size or margins are invalidTreeLine PDF PrinterSelect &PrinterspellcheckCould not find either aspell.exe, ispell.exe or hunspell.exe
Browse for location?Spell Check ErrorLocate aspell.exe, ipsell.exe or hunspell.exeProgram (*.exe)TreeLine Spell Check Error
Make sure aspell, ispell or hunspell is installedTreeLine Spell CheckFinished spell checkingSpell CheckNot in DictionaryWord:Context:SuggestionsIgnor&e&Ignore All&AddAdd &Lowercase&ReplaceRe&place All&CancelFinished checking the branch
Continue from the top?titlelistviewSelect in TreetreeformatsDEFAULTFILETYPEFIELDFieldTypeTitleFormatOutputFormatSpaceBetweenFormatHtmlBulletsTableChildTypeIconGenericTypeConditionalRuleListSeparatorChildTypeLimitFormatPrefixSuffixInitialValueNumLinesSortKeyNumSortForwardEvalHtmltreelocalcontrolError - could not delete backup file {}Save changes to {}?Save changes?&SaveSave FileSave the current fileSave &As...Save the file with a new name&Export...Export the file in various other formatsProp&erties...Set file parameters like compression and encryptionP&rint Setup...Set margins, page size and other printing optionsPrint Pre&view...Show a preview of printing results&Print...Print tree output based on current optionsPrint &to PDF...Export to PDF with current printing options&UndoUndo the previous action&RedoRedo the previous undoCu&tCut the branch or text to the clipboard&CopyCopy the branch or text to the clipboard&PastePaste nodes or text from the clipboardPaste non-formatted text from the clipboard&Bold FontSet the current or selected font to bold&Italic FontSet the current or selected font to italicU&nderline FontSet the current or selected font to underline&Font SizeSet size of the current or selected textSmallDefaultLargeLargerLargestSet Font SizeFont C&olor...Set the color of the current or selected text&External Link...Add or modify an extrnal web linkInternal &Link...Add or modify an internal node linkClear For&mattingClear current or selected text formatting&RenameRename the current tree entry titleInsert Sibling &BeforeInsert new sibling before selectionInsert Sibling &AfterInsert new sibling after selectionAdd &ChildAdd new child to selected parent&Delete NodeDelete the selected nodes&Indent NodeIndent the selected nodes&Unindent NodeUnindent the selected nodes&Move UpMove the selected nodes upM&ove DownMove the selected nodes downMove &FirstMove the selected nodes to be the first childrenMove &LastMove the selected nodes to be the last children&Set Node TypeSet the node type for selected nodesSet Node TypeCopy Types from &File...Copy the configuration from another TreeLine fileFlatten &by CategoryCollapse descendants by merging fieldsAdd Category &Level...Insert category nodes above children&Spell Check...&New WindowOpen a new window for the same fileError - could not write to {}TreeLine - Save AsError - could not write to fileTreeLine - Open Configuration FileError - could not read file {0}Cannot expand without common fieldsCategory FieldsSelect fields for new levelFile savedPa&ste Plain TextPaste C&hildPaste a child node from the clipboardPaste Sibling &BeforePaste a sibling before selectionPaste Sibling &AfterPaste a sibling after selectionPaste Cl&oned ChildPaste a child clone from the clipboardPaste Clo&ned Sibling BeforePaste a sibling clone before selectionPaste Clone&d Sibling AfterPaste a sibling clone after selectionClone All &Matched NodesConvert all matching nodes into clones&Detach ClonesDetach all cloned nodes in current branchesS&wap Category LevelsSwap child and grandchild category nodesConverted {0} branches into clonesNo identical nodes foundWarning - file corruption!
Skipped bad child references in the following nodes:Spell check the tree's text data&Regenerate ReferencesForce update of all conditional types & math fieldsInsert &DateInsert current date as texttreemaincontrolWarning: Could not create local socketError - could not write config file to {}Error - could not read file {0}Backup file "{}" exists.
A previous session may have crashed&Restore Backup&Delete Backup&Cancel File OpenError - could not rename "{0}" to "{1}"Error - could not remove backup file {}&New...New FileStart a new file&Open...Open FileOpen a file from diskOpen Sa&mple...Open SampleOpen a sample file&Import...Open a non-TreeLine file&QuitExit the application&Select AllSelect all text in an editor&Configure Data Types...Modify data types, fields & output linesSor&t Nodes...Define node sort operationsUpdate &Numbering...Update node numbering fields&Find Text...Find text in node titles & data&Conditional Find...Use field conditions to find nodesFind and &Replace...Replace text strings in node data&Text Filter...Filter nodes to only show text matchesC&onditional Filter...Use field conditions to filter nodes&General Options...Set user preferences for all filesSet &Keyboard Shortcuts...Customize keyboard commandsC&ustomize Toolbars...Customize toolbar buttonsCustomize Fo&nts...Customize fonts in various views&Basic Usage...Display basic usage instructions&Full Documentation...Open a TreeLine file with full documentation&About TreeLine...Display version info about this program&Select TemplateTreeLine - Open FileOpen Sample File&Select SampleConditional FindConditional FilterGeneral OptionsError - basic help file not foundTreeLine Basic UsageError - documentation file not foundError - invalid TreeLine file {0}TreeLine version {0}written by {0}Library versions:missing directoryShow C&onfiguration Structure...Show read-only visualization of type structureCusto&mize Colors...Customize GUI colors and themestreenodeNewtreestructureMaintreeviewFiltering by "{0}", found {1} nodesConditional filtering, found {0} nodesSearch for:Search for: {0}Search for: {0} (not found)Next: {0}Next: {0} (not found)treewindowData OutputData EditTitle List&Expand Full BranchExpand all children of the selected nodes&Collapse Full BranchCollapse all children of the selected nodes&Previous SelectionReturn to the previous tree selection&Next SelectionGo to the next tree selection in historyShow Data &OutputShow data output in right viewShow Data &EditorShow data editor in right viewShow &Title ListShow title list in right view&Show Child PaneToggle showing right-hand child viewsToggle showing output view indented descendants&Close WindowClose this window&File&Edit&Node&Data&Tools&View&Window&HelpStart Incremental SearchNext Incremental SearchPrevious Incremental SearchShow &Breadcrumb ViewToggle showing breadcrumb ancestor viewShow Output &DescendantsFo&rmatcolorsetDialog background colorDialog text colorText widget background colorText widget foreground colorSelected item background colorSelected item text colorLink text colorTool tip background colorTool tip foreground colorButton background colorButton text colorDisabled text foreground colorDisabled button text colorColor SettingsColor ThemeDefault system themeDark themeCustom theme&OK&CancelCustom ColorsTheme ColorsSelect {0} color