bauble-0.9.7/0000755000175000017500000000000011310570250011775 5ustar brettbrettbauble-0.9.7/LICENSE0000644000175000017500000003545111210626427013021 0ustar brettbrett GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONSbauble-0.9.7/setup.cfg0000644000175000017500000000015311310570250013615 0ustar brettbrett[sdist] formats = bztar,gztar,zip [nosetests] [egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 bauble-0.9.7/bauble/0000755000175000017500000000000011310570250013227 5ustar brettbrettbauble-0.9.7/bauble/_gui.py0000755000175000017500000005716311222136117014545 0ustar brettbrett# # _gui.py # import os import sys import traceback import gtk import gobject import bauble import bauble.db as db import bauble.utils as utils import bauble.utils.desktop as desktop import bauble.paths as paths import bauble.pluginmgr as pluginmgr from bauble.prefs import prefs from bauble.utils.log import log, debug, warning from bauble.utils.pyparsing import * from bauble.view import SearchView import bauble.error as error class DefaultView(pluginmgr.View): ''' DefaultView is not related to view.DefaultCommandHandler ''' def __init__(self): super(DefaultView, self).__init__() image = gtk.Image() image.set_from_file(os.path.join(paths.lib_dir(), 'images', 'bauble_logo.png')) self.pack_start(image) class GUI(object): entry_history_pref = 'bauble.history' history_size_pref = 'bauble.history_size' window_geometry_pref = "bauble.geometry" _default_history_size = 12 def __init__(self): glade_path = os.path.join(paths.lib_dir(), 'bauble.glade') self.glade = gtk.glade.XML(glade_path) self.widgets = utils.GladeWidgets(self.glade) self.window = self.widgets.main_window self.window.hide() # restore the window size geometry = prefs[self.window_geometry_pref] if geometry is not None: self.window.set_default_size(*geometry) self.window.connect('delete-event', self.on_delete_event) self.window.connect("destroy", self.on_quit) self.window.set_title(self.title) try: pixbuf = gtk.gdk.pixbuf_new_from_file(bauble.default_icon) self.window.set_icon(pixbuf) except Exception: utils.message_details_dialog(_('Could not load icon from %s' % \ bauble.default_icon), traceback.format_exc(), gtk.MESSAGE_ERROR) menubar = self.create_main_menu() self.widgets.menu_box.pack_start(menubar) self.populate_main_entry() main_entry = self.widgets.main_entry # main_entry.connect('key_press_event', self.on_main_entry_key_press) main_entry.connect('activate', self.on_main_entry_activate) accel_group = gtk.AccelGroup() main_entry.add_accelerator("grab-focus", accel_group, ord('L'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) self.window.add_accel_group(accel_group) go_button = self.widgets.go_button go_button.connect('clicked', self.on_go_button_clicked) self.set_default_view() # add a progressbar to the status bar # Warning: this relies on gtk.Statusbar internals and could break in # future versions of gtk statusbar = self.widgets.statusbar statusbar.set_spacing(10) statusbar.set_has_resize_grip(True) self._cids = [] def on_statusbar_push(sb, cid, txt): if cid not in self._cids: self._cids.append(cid) statusbar.connect('text-pushed', on_statusbar_push) # remove label from frame frame = statusbar.get_children()[0] #frame.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#FF0000')) label = frame.get_children()[0] frame.remove(label) # replace label with hbox and put label and progress bar in hbox hbox = gtk.HBox(False, 5) frame.add(hbox) hbox.pack_start(label, True, True, 0) vbox = gtk.VBox(True, 0) hbox.pack_end(vbox, False, True, 15) self.progressbar = gtk.ProgressBar() vbox.pack_start(self.progressbar, False, False, 0) self.progressbar.set_size_request(-1, 10) vbox.show() hbox.show() cmd = StringStart() +':'+ Word(alphanums + '-_').setResultsName('cmd') arg = restOfLine.setResultsName('arg') self.cmd_parser = (cmd + StringEnd()) | (cmd + '=' + arg) | arg def on_expanded(*args): eb = self.widgets.msg_eventbox width, height = eb.size_request() eb.set_size_request(-1, -1) eb.queue_resize() self.widgets.msg_eventbox.hide() self.widgets.msg_details_expander.connect('notify::expanded', on_expanded) img = gtk.Image() img.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_SMALL_TOOLBAR) button = self.widgets.msg_close_button button.set_label('') button.set_image(img) button.set_relief(gtk.RELIEF_NONE) # def on_enter(button, *args): # debug(button) # button.emit_stop_by_name('enter') # button.stop_emission('enter') # #button.emit_stop_by_name('enter-notify-event') # #button.stop_emission('enter-notify-event') # return True # button.connect('enter', on_enter) self.widgets.msg_close_button.connect('clicked', self.close_msg_box) # TODO: need to handle the case where a message is added when # another message already exists or the message box is in the # middle of either opening or closing def close_msg_box(self, *args): # TODO: reverse animate? eb = self.widgets.msg_eventbox.hide() self.widgets.msg_details_expander.set_expanded(False) def _msg_common(self, msg, colors): eb = self.widgets.msg_eventbox colormap = eb.get_colormap() style = eb.get_style().copy() for attr, state, color in colors: c = colormap.alloc_color(color) getattr(style, attr)[state] = c # is it ok to set the style the expander and button even # though the style was copied from the eventbox eb.set_style(style) self.widgets.msg_details_expander.set_style(style) self.widgets.msg_close_button.set_style(style) self.widgets.msg_label.set_text(msg) def info_msg(self, msg): colors = [('bg', gtk.STATE_NORMAL, '#b6daf2')] self._msg_common(msg, colors) self.widgets.msg_eventbox.show() def error_msg(self, msg, details=None): colors = [('bg', gtk.STATE_NORMAL, '#FF9999'), ('bg', gtk.STATE_PRELIGHT, '#FFAAAA')] self._msg_common(msg, colors) eb = self.widgets.msg_eventbox if not details: self.widgets.msg_details_expander.set_property('visible', False) else: self.widgets.msg_details_expander.set_property('visible', True) self.widgets.msg_details_label.set_text(details) width, height = eb.size_request() eb.set_size_request(width, 0) eb.show() def animate(final_height): width, height = eb.size_request() if height >= final_height: return False height = height + 7 eb.set_size_request(width, height) return True gobject.timeout_add(7, animate, height) def show(self): self.build_tools_menu() self.window.show() def _get_history_size(self): history = prefs[self.history_size_pref] if history is None: prefs[self.history_size_pref] = self._default_history_size return int(prefs[self.history_size_pref]) history_size = property(_get_history_size) # def on_main_entry_key_press(self, widget, event, data=None): # ''' # ''' # keyname = gtk.gdk.keyval_name(event.keyval) # if keyname == "Return": # self.widgets.go_button.emit("clicked") # return True # else: # return False def send_command(self, command): self.widgets.main_entry.set_text(command) self.widgets.go_button.emit("clicked") def on_main_entry_activate(self, widget, data=None): self.widgets.go_button.emit("clicked") def on_go_button_clicked(self, widget): ''' ''' self.close_msg_box() text = self.widgets.main_entry.get_text() if text == '': return self.add_to_history(text) tokens = self.cmd_parser.parseString(text) cmd = None arg = None try: cmd = tokens['cmd'] except KeyError, e: pass try: arg = tokens['arg'] except KeyError, e: pass bauble.command_handler(cmd, arg) def add_to_history(self, text, index=0): """ add text to history, if text is already in the history then set its index to index parameter """ if index < 0 or index > self.history_size: raise ValueError(_('history size must be greater than zero and '\ 'less than the history size')) history = prefs.get(self.entry_history_pref, []) if text in history: history.remove(text) # trim the history if the size is larger than the history_size pref while len(history) >= self.history_size-1: history.pop() history.insert(index, text) prefs[self.entry_history_pref] = history self.populate_main_entry() def populate_main_entry(self): history = prefs[self.entry_history_pref] main_combo = self.widgets.main_comboentry model = main_combo.get_model() model.clear() completion = self.widgets.main_entry.get_completion() if completion is None: completion = gtk.EntryCompletion() completion.set_text_column(0) self.widgets.main_entry.set_completion(completion) compl_model = gtk.ListStore(str) completion.set_model(compl_model) completion.set_popup_completion(False) completion.set_inline_completion(True) completion.set_minimum_key_length(2) else: compl_model = completion.get_model() if history is not None: for herstory in history: main_combo.append_text(herstory) compl_model.append([herstory]) main_combo.set_model(model) def __get_title(self): if bauble.conn_name is None: return '%s %s' % ('Bauble', bauble.version) else: return '%s %s - %s' % ('Bauble', bauble.version, bauble.conn_name) title = property(__get_title) def set_busy(self, busy): self.window.set_sensitive(not busy) if busy: self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) else: self.window.window.set_cursor(None) def set_default_view(self): if self.widgets.main_entry is not None: self.widgets.main_entry.set_text('') self.set_view(DefaultView()) def set_view(self, view=None): ''' set the view, if view is None then remove any views currently set @param view: default=None ''' view_box = self.widgets.view_box if view_box is None: return # viewbox should never be None, why is this here? for kids in view_box.get_children(): view_box.remove(kids) view_box.pack_start(view, True, True, 0) view.show_all() def get_view(self): ''' return the current view in the view box ''' return self.widgets.view_box.get_children()[0] def create_main_menu(self): """ get the main menu from the UIManager XML description, add its actions and return the menubar """ self.ui_manager = gtk.UIManager() # add accel group accel_group = self.ui_manager.get_accel_group() self.window.add_accel_group(accel_group) # TODO: get rid of new, open, and just have a connection # menu item # create and addaction group for menu actions menu_actions = gtk.ActionGroup("MenuActions") menu_actions.add_actions([("file", None, _("_File")), ("file_new", gtk.STOCK_NEW, _("_New"), None, None, self.on_file_menu_new), ("file_open", gtk.STOCK_OPEN, _("_Open"), 'o', None, self.on_file_menu_open), ("file_quit", gtk.STOCK_QUIT, _("_Quit"), None, None, self.on_quit), ("edit", None, _("_Edit")), ("edit_cut", gtk.STOCK_CUT, _("_Cut"), None, None, self.on_edit_menu_cut), ("edit_copy", gtk.STOCK_COPY, _("_Copy"), None, None, self.on_edit_menu_copy), ("edit_paste", gtk.STOCK_PASTE, _("_Paste"), None, None, self.on_edit_menu_paste), ## ("edit_preferences", None, ## _("_Preferences"), ## "P", None, ## self.on_edit_menu_prefs), ("insert", None, _("_Insert")), ("tools", None, _("_Tools")), ("help", None, _("_Help")), ("help_contents", gtk.STOCK_HELP, _("Contents"), None, None, self.on_help_menu_contents), ("help_bug", None, _("Report a bug"), None, None, self.on_help_menu_bug), ("help_web", gtk.STOCK_HOME, _("Bauble website"), None, None, self.on_help_menu_web), ("help_about", gtk.STOCK_ABOUT, _("About"), None, None, self.on_help_menu_about), ]) self.ui_manager.insert_action_group(menu_actions, 0) # load ui ui_filename = os.path.join(paths.lib_dir(), 'bauble.ui') self.ui_manager.add_ui_from_file(ui_filename) # get menu bar from ui manager self.menubar = self.ui_manager.get_widget("/MenuBar") self.clear_menu('/ui/MenuBar/insert_menu') self.clear_menu('/ui/MenuBar/tools_menu') self.insert_menu= self.ui_manager.get_widget('/ui/MenuBar/insert_menu') return self.menubar def clear_menu(self, path): """ remove all the menus items from a menu """ # clear out the insert an tools menus menu = self.ui_manager.get_widget(path) submenu = menu.get_submenu() for c in submenu.get_children(): submenu.remove(c) menu.show() def add_menu(self, name, menu, index=-1): ''' add a menu to the menubar @param name: @param menu: @param index: ''' menu_item = gtk.MenuItem(name) menu_item.set_submenu(menu) self.menubar.insert(menu_item, len(self.menubar.get_children())-1) self.menubar.show_all() return menu_item __insert_menu_cache = {} def add_to_insert_menu(self, editor, label): """ add an editor to the insert menu @param editor: the editor to add to the menu @param label: the label for the menu item """ menu = self.ui_manager.get_widget('/ui/MenuBar/insert_menu') submenu = menu.get_submenu() item = gtk.MenuItem(label) item.connect('activate', self.on_insert_menu_item_activate, editor) submenu.append(item) self.__insert_menu_cache[label] = item item.show() # sort items i = 0 for label in sorted(self.__insert_menu_cache.keys()): submenu.reorder_child(self.__insert_menu_cache[label], i) i += 1 def build_tools_menu(self): """ build the tools menu from the tools provided by the plugins """ topmenu = self.ui_manager.get_widget('/ui/MenuBar/tools_menu') menu = topmenu.get_submenu() menu.show() tools = [] tools = {'__root': []} # categorize the tools into a dict for p in pluginmgr.plugins.values(): for tool in p.tools: if tool.category is not None: try: tools[tool.category].append(tool) except KeyError, e: tools[tool.category] = [] tools[tool.category].append(tool) else: tools['__root'].append(tool) # add the tools with no category to the root menu root_tools = sorted(tools.pop('__root')) for tool in root_tools: item = gtk.MenuItem(tool.label) item.show() item.connect("activate", self.on_tools_menu_item_activate, tool) menu.append(item) if not tool.enabled: item.set_sensitive(False) # create submenus for the categories and add the tools for category in sorted(tools.keys()): submenu = gtk.Menu() submenu_item = gtk.MenuItem(category) submenu_item.set_submenu(submenu) menu.append(submenu_item) for tool in sorted(tools[category], cmp=lambda x, y: cmp(x.label, y.label)): item = gtk.MenuItem(tool.label) item.connect("activate", self.on_tools_menu_item_activate, tool) submenu.append(item) if not tool.enabled: item.set_sensitive(False) menu.show_all() return menu def on_tools_menu_item_activate(self, widget, tool): # debug('on_tools_menu_item_activate(%s)' % tool) try: tool.start() except Exception, e: utils.message_details_dialog(utils.xml_safe(str(e)), traceback.format_exc(), gtk.MESSAGE_ERROR) debug(traceback.format_exc()) def on_insert_menu_item_activate(self, widget, editor): try: view = self.get_view() if isinstance(view, SearchView): expanded_rows = view.get_expanded_rows() e = editor() committed = e.start() if committed is not None and isinstance(view, SearchView): view.results_view.collapse_all() view.expand_to_all_refs(expanded_rows) except Exception, e: utils.message_details_dialog(utils.xml_safe(str(e)), traceback.format_exc(), gtk.MESSAGE_ERROR) debug(traceback.format_exc()) ## def on_edit_menu_prefs(self, widget, data=None): ## p = PreferencesMgr() ## p.run() ## p.destroy() def on_edit_menu_cut(self, widget, data=None): self.widgets.main_entry.cut_clipboard() def on_edit_menu_copy(self, widget, data=None): self.widgets.main_entry.copy_clipboard() def on_edit_menu_paste(self, widget, data=None): self.widgets.main_entry.paste_clipboard() def on_file_menu_new(self, widget, data=None): msg = "If a database already exists at this connection then creating "\ "a new database could destroy your data.\n\nAre you sure "\ "this is what you want to do?" if not utils.yes_no_dialog(msg, yes_delay=2): return #if gui is not None and hasattr(gui, 'insert_menu'): submenu = self.insert_menu.get_submenu() for c in submenu.get_children(): submenu.remove(c) self.insert_menu.show() try: db.create() pluginmgr.init() except Exception, e: msg = _('Could not create a new database.\n\n%s' % \ utils.xml_safe_utf8(e)) tb = utils.xml_safe_utf8(traceback.format_exc()) utils.message_details_dialog(msg, tb, gtk.MESSAGE_ERROR) return self.set_default_view() def on_file_menu_open(self, widget, data=None): """ Open the connection manager. """ from connmgr import ConnectionManager default_conn = prefs[bauble.conn_default_pref] cm = ConnectionManager(default_conn) name, uri = cm.start() if name is None: return engine = None try: engine = db.open(uri, True, True) except Exception, e: # we don't do anything to handle the exception since # db.open() should have shown an error dialog if there was # a problem opening the database as long as the # show_error_dialogs parameter is True warning(e) if engine is None: # the database wasn't open return # everything seems to have passed ok so setup the rest of bauble if engine is not None: bauble.conn_name = name self.window.set_title(self.title) # TODO: come up with a better way to reset the handler than have # to bauble.last_handler = None # # we have to set last_handler to None since although the # view is changing the handler isn't so we might end up # using the same instance of a view that could have old # settings from the previous handler... bauble.last_handler = None self.set_default_view() self.clear_menu('/ui/MenuBar/insert_menu') self.statusbar_clear() pluginmgr.init() def statusbar_clear(self): """ Call gtk.Statusbar.pop() for each context_id that had previously been pushed() onto the the statusbar stack. This might not clear all the messages in the statusbar but its the best we can do without knowing how many messages are in the stack. """ # TODO: if we need to do a proper clear() then we would # probably have to subclass gtk.Statusbar to keep track of the # message ids and context ids so we can properly clear the # statusbar. for cid in self._cids: self.widgets.statusbar.pop(cid) def on_help_menu_contents(self, widget, data=None): desktop.open('http://bauble.belizebotanic.org/docs/0.9/', dialog_on_error=True) def on_help_menu_bug(self, widget, data=None): desktop.open('https://bugs.launchpad.net/bauble/+bugs', dialog_on_error=True) def on_help_menu_web(self, widget, data=None): desktop.open('http://bauble.belizebotanic.org', dialog_on_error=True) def on_help_menu_about(self, widget, data=None): about = gtk.AboutDialog() about.set_name('Bauble') about.set_version(bauble.version) gtk.about_dialog_set_url_hook(lambda d, l: desktop.open(l, dialog_on_error=True)) about.set_website(_('http://bauble.belizebotanic.org')) f = os.path.join(paths.lib_dir(), 'images', 'icon.svg') pixbuf = gtk.gdk.pixbuf_new_from_file(f) about.set_logo(pixbuf) about.set_copyright(_(u'Copyright \u00A9 Belize Botanic Gardens')) about.run() about.destroy() def save_state(self): """ this is usually called from bauble.py when it shuts down """ rect = self.window.allocation prefs[self.window_geometry_pref] = rect.width, rect.height # prefs.save() is called in bauble/__init__.py def on_delete_event(self, *args): import bauble.task as task if task._flushing or not task._task_queue.empty(): msg = _('Would you like the cancel the current tasks?') if not utils.yes_no_dialog(msg): # stop other handlers for being invoked for this event return True return False def on_quit(self, widget, data=None): bauble.quit() bauble-0.9.7/bauble/images/0000755000175000017500000000000011310570250014474 5ustar brettbrettbauble-0.9.7/bauble/images/icon2.png0000644000175000017500000001121711210626427016225 0ustar brettbrettPNG  IHDR@@iqsBIT|dtEXtSoftwarewww.inkscape.org<!IDATx՛itl&۲-v8&1qbx4MI (iK-t|2gJfZh;%RJ,! M%x-ٖkybz#Ytgs>dUUUk0OͥLJt233$$$d?WZy| 6GFCVVYYY국U044ę3g IWaٱ rI$++TrW~\e«6rĐmk~AA\x>99IMM 555T*gM .M{{KxLPC'9{Soș.`v/88Boߎzn XKj6-##o=O@](ʥ&{<կ``W*l߾¿TTTTT-}wy^/鸹D}OHdB"NKdlM0Lsbr9XJ+9ۉiJ?555LMME``EEEE G]ΈO eX]]$$DZqS[6r$iĠ@ettBCCRj0::ҰM{bzr~Ax^<*j\SRR())!##cMkr y*n5 ilWNw[ql]m3/z~Kqq1999B@ycBv$uͤ%ql&Oݡ{ʙimm"""ּFBQ : ԝbӎ}<9@p>:Q^[Ԝo@Mbrpv~w݊t`cyXXX %%eMڠh4UFѥad?a1[ٰ5j/A.9GKO?ՠ '%=Lɻq썓+ؘBXv컙P.|Pjf(+oۊ;wV0kZdׁlS(Ty&ۦ Gزu#;wp T*QQW{ .`XX\cW A!~)}+K uS$ c⼕ 0̒SnZ'8f[/1E]JAfZЋ73=˹Sy8Mi)ݛ`*;[0455a2HMM]VU T6-G&-AB4fMM8w8>ÈPl㹯b~Ll$ǽ_{orW>mͽ377Gxp5s3sDD3a02>>بёqFЍIېDBb,k?<[ꅆ8p3# \" ۶m<{j },>>"w=I vaʇ~7ܘC_c] ٟ>ƴi ea re L&d2dirNlW |`bbˢI{E@)Ww}|E;NUUT=*Z{0?>G9ڑFm1H7C1ÍGxW·* |K}ͱbXWH@z1ͅb|}}%k:sr+;yop c?w?+??. ŕ\ޗXZ@/$mpM z!I}ltC_g_e\72~_)"cV \\a20L'V b2a#+7gs??~A6% rW1m/o/%~L$x-&GfxGjc~Vܢ2VN" o=M *f G>v=/6&{&` $DEE9r).qP+E~*ۂA:}LFq5jHnf\N|Ȓ7~邨)}x[8|k|E-9< BNՉ!nLOOd`||+Wێ*6M'=~ ؙ ۓ^еdlKd y9vl^2qU3я$4bb~d&*J+bZ}r~})ì~`=Mh_4!'!=yj|nqgG-3}FNgbb[p9^[,V0=ywdLVD?6MҖNee{dP9 ׮'JEڅ'ޞMw]9"]4ӇeQ*xJJ Z$vRItt4:&f FV9x`wZv('ks,Li8M{,HDZ-h4t:]hsJUCWwjIpFcqL{i<âKG.{#uuṵ#ڷox|*꫻YKee%YYiYaOkN'$gzo6~w EyxbYnuf޸(ilKX|}}1tLS-]9K Y]~>ɫVp.f'$m*U_Y\N\\#1i5pc'LO9^6K[)~`emVOpNp] wS5H@A~tq_OA|fxKsnI 9+8;_ЁI'RVV֭[=#X  ̰܀'-cNM;= /:?/w05,-SZZʶmۮ5` A@&V/)=Ulm"uP S;Jv500%g{G bff3#WL%25\ Km~ce"eRťQjt^ VwGCqӢ'.911vEzaVy_rq9 htǎUoH@BBH@IS =gif-zj_kgMzGAAEEE p-JӢrxDHt $ʯlAvV0>Ak 5KK___)..^]`E4t|O߾ L.C5ID P(ؾ};%%%?VH@@@* ^*xީ ~U^*|FQ7#^IQZZ ^m?11 Im~a8}za[oOO0"K.KYYٺ.9_/xE@BB.ϓ2xTxU]\zu?~rmۍRJI|__ \A#`˖-[͛wMM͇/_.VXA{{;DHӜ8qw޿KRə\׌e˖ھ޾od͚5$ (PJA DJI__?<߿+Lo.mmmAKKU۶mcyq!vɑ#G3|L:~ ֭[ϛ7[ou]wܹs }\%2hd(B0k,YH$ڎ;V0?X`n߾ZrePg6H$BGGksX2<8ӵi%Ikk]> !RR*m]JI.6DQ8Ri]OO `:Op m |*aP(cO=9ђTx 4X!eZȡD"V,S];L 6,_9җR8{졻{'|un`Z™RBNϲrʉSպ#DNMÔ`}gg'eqPoڵ_K[M=:rTibD5\ mb8Ia߾}[2L;?|eKukf|uKTk'$!$ CbTkL566UZ ryUJ~{[קץ;ҔD:i]Ɗ74@'pL˘ !D9TjcWW.^K㢵$/BDf@X({&i@S&\nyj+%+ P4: a:Ԝ (@u_.tD-@D@3ځ $:9TXVԇu_}ҋr@MAYz"VD`G` \%EJQ*+ϓJ?xۼy-SYp5ˢ=GLUH:lM&*2kw@ )'?#},:b<^~Y:XН/OV\L[s_v,yQ6mZlO|:[/J$PJF ж, Њ)CPuI<qp]˲}}bM'ћ}Wn_m{/N\i njLiU#,XÎ+Z΄(5ligG;$P ܰ:|G}QQJ/8 .rvPruYxinngǫNry b,n;2rI K?IRpٝ=+6_u ߄ 2ΛYIq.*(-˯˯)rishl\qEazȝD%`X#%2oBz\ 2C r:>)$yCq[ˠ}& @4iJ4WaH4߃X=Bi gz-Wq($"$z?)'ظN ;үH!`5 *?&, 7\ÒFwy-csKH};ᕟ>ͼFV餾D] };gs-7i_.BL.þ%[miÒ*Ϟs k6vԿ!]<> (/7yH x:w(K6\y'4'[Jf)IqϘ3J@Pa !%J+F jk˝g]קנL2MsUFA*e&?mxz2">RA8S qƆ4 M0uu$ms# ,eC# pڶx.O<1aX.Z; QŀBQ#}XHد<7=B7KŲ.ޓBʴG۝JG4՚&"|!K!4̪#7XB}OܼnxYr! ;v+)xO$O #}CuGۺ_gDJad'(dXt,%hle MEY7Nw'G+y=vԩײbQiZS8?* It`B#XCo;\yӕYn>9x$z1vKrx+t^'/ sywօ-F'@1] P&K,'@ax*.P`)RLgb¡m\6ܰ%ac|^/y xx 8pWȪt8La%XH 5ekrٺ.;<%/2|cCO܁% F=;SGb]bY1]ʪ^ Dc&I)|V_ Bѵr![Lk܁|ި|sdixuǛC0oYU xE7^~KFcp 4dR\X?(CjQG'5d^_^ⵧ_u$ F.x!)qopqm]wj (mY r62+LxC%&R 0oO01r! ;e5z`ʠ*kAyx<,1&YVto(Mq<zLN#=W ;S/t>:Y % H9Y&&d]C/+G9|,|?cYAӘ9A3<4e>_,^mrx1 image/svg+xml bauble-0.9.7/bauble/images/prefs_general.png0000644000175000017500000001146711210626427020036 0ustar brettbrettPNG  IHDR00WIDATxk]yܯsƙ!ë((Y,YFV6Ĺi4M&Aph  ?U %rTƹg9sn}H%*h69zou!_ӗ2&ܥyH9D»Pfoۛm>`?A㗞u:v)tifl ӗCBOX& TR٥'ɫ l}/P1o0 ?LxO<[f2z}']_XX|h|eyM@|L~k}X2TRJols%C1-m&iP[[繅H+}Uj=Y,c#GbHbvvUV cn^}u☳RɍV$IedJ! Qd1mc1q_={o_t07|Sϸ{z V"sX\X\.1wl.5^eL\z\( CKY@c0b18O84u5?3l{q"p0ZF}uچ]'>ő#195$lmojIR۷rEvt?$Q1 ahi55amUc1@'s<{Y3"g75LN@y֝_n'5trDZn#Cy/Utj/XAV#CVBMN;R<@yp=g~©oV͕S~ {С'<,#廆rKq '9r0w;U\u]1w:;Q:-c9v Od$|,Ŭୋm^lmM"5Qt#tSw:ǟR 0kE+scxGVC)rDڰg̱>,'*0i9uA%)٨FOT. CTY.yї>PeOl:FGTqz{>믿Ʌqn;|(R )%d iR &߭Z/89.y+9J{l$v )?,oBH>r"% Zn!5hCCgbr##xGE(PŬAI B[*V`b!$(?hCJ߬޺P9_yn6*^2) C6) >_[bA! nyލKPJ"!8H5 /0d\gtۊ^~l=(8*q DQpT/}ٷ3~ʯH [|5EzJE|?RQJ".Ne@~=:mYK*olwohN&wg֭ !~N&Swv&Ӿ?H2墵u%Z[J?xw[6!J1<2GO|hT 2mya4K+7R k RZKIMc/U_dRkwcEGY% ͖` lo֐Ria 7ҚV lyJYKT3P&Kd r v8780-9=p3WYUR?B68G e 1  Ð0 L62CSS@/pfX_[gjz㎣H)n8 e2iz k7{R5r9;V|.e'1*r+r0a15Rlnmsub'̏?/6Qd߾1]ǹ!D/G: SpQ $fWxG `uȖ[dOLj4d3Y(Tz{0>~a(ccct:\QBvqn-N2OA \:V|)8X|ڳ$}#vV kMRI*$ɠbm}y6~ JɮmJЭWQ Z~52WMEfxd/ov0H ȷϝ}avnnlH$X[_'4J$EV ߏG#QK%QB"TI}byR `c&Ce:nҰ8^zivFmYDrLl^Av"L"N3vwSFI븱\EHJokhnxԯm(tͥ\u֥[Rdo.gI45UwH%-tdm>:W`5Μ~B!:'I^RqO#@X( 4嫳PkT&x }/b#)?AMZAfԡMd#c 6\%pNרWN.m>:/\<ު9z,j~vo9 j6Y^]gvn_3V@%9|젂P1&Z3pMD{AK##/"tNbCB p;H $?umʆC [#F`M t5Gs-2=>LPZN^y`pߛ>:"#tכd.]AI Raa3dOT6rq,q BDh=ӃJ3ĝi)+3?>14%VG@FͰfZ,Y6VB 8S⟥NJ$aPhWb-oym|+$79/&ϵ;:[L&-˞]%E˷,^7Bf5 ͭ;,/֘ع8ꥩ7bbk,ZTHmJl^JZo\^  @p=o62>^,H`J it 5Ғ{\:ey!5Qi5|̀jӬNu|S`hCڝXwtoSHDRJA[\hߩRkK`؁ ÃǞ৾PȒJ{X ~`͐Ffze]8|s5kMbǸ~U{9b2'>681RvFRH5LJ楉p zXڼ[>tH[̃b{h4N:ڮ]Yhon:k+]ݫ 4/reOC|V%^T7y;~gǍ~jcvu|^rXf Vd.+Ou^G! vQnv_No%q?[ 8ۛͰIENDB`bauble-0.9.7/bauble/images/bauble_logo.png0000644000175000017500000002502111210626427017463 0ustar brettbrettPNG  IHDR=F C+sBIT|dtEXtSoftwarewww.inkscape.org< IDATxwxչlVͲ, kg1!rK~BBB`.`& `06,3Ү\%Wa[mI.%ݝcfj\<~@3syggsۈ1H2oP\ƍjSf DtZxؑmvW; cRDhhhhŽSgLs`5W,(&ƨ]v{PQVU>^j+9TztW޾U)T>4444B"lwf=nƀ%qǛ rʛ:)huIGU_w +>^@ai{khhhMJvtK^1߯8hW4/&hGUu YeG+78۾|i*!)MO0{;vmc@ǵ ]ȫmھ1捤/ @zTzDD;=8}\(Lu^wբy11)>םpp ^h}jhht.mЩ zk$k$(Hu^@gCcꭵXg \ &d88|&ɔC+A-θj܌o$Č[oVU$ {mݽc??ǚabUDqI 8'D)FW:YZH_v넧!F7ƼҶOq2mhS߿?R~ʛ|uM=p Nm-54N3_;u 3hDEAw\oe^)ƨv>c(_u>KZYAY6KmV=fz=grVf/$M\M朼 JK%I ")c^MϼDܷBȷ ¥Z Gg>ej"Sb˔YǧHCׯm߹fc&L=ڛ. n?Yt)qXS-و>_aI3}1Ȕa:ś ;$aΝұ~#& O1'7ne͘G{nI[1L0 @\`UD1O}54]Lpȋ,*5=q1FSk}2 vf`.>Ұ{W~nb|{acƏq\cxEՑXf%?[4mڠ[+"w^bn(Z!"OpZ- \hE2-埏2ac }GH]Y8L2`5FI7rLhnr~)6>%%%yv{pPձ$\q)%y@0hÐX&‹wx9S(6x*+f\r9*Gxa `Ĕ)#%vf&Gyu?䐈O0YM+!//ǒ7W44r..ƛo@찄1MdL|~G 荢"mMk+{ P =T55lq;%|w{TRPo1v>&ZQ?>Z!9N`D[k;w; d 85TȣqbqROLI?i0 lkuymiC$=Tzg-pLW* Ո!wOD[UEڙUb!/σ< QL@M#K/gMODؗ]-6QT%UI,{BmxZ}GgLg@)MF19fQbb :\XƤScgU c&uq AοɋoJ"ECca謂0qABU>M3> +H"a?u,o%xlsVyI̲?* ~C^c;d׫p-< ,VAx/<Kծ5)j\ZԸÍGjG77b$Lʸ^s۾SH dȑl\ 9yp 佲 6Q,@Ӊ|8&\UFx@` ) ]p &iU+=gi)5M!1`p!s .˱h{CT(`q z@EYL ‹{5 ;6Q\`eZNmwM)?)?Ya:XO t>RSoAlx!S:`:4cGLMK|Lxn4@P=E6NN0hCD_KSML䥭Y*uU{8 y9&_s}@v%A:, gInbI.l "|Y>6ԐDEΑ>󭂐aEg]6^Dn'BRRO5N2d߰~-=8R-4hj~gCv"SU13Lve %,lYGlrܵM]UPg4npO1؊OCANtg]\s95on I&)Odskʮt8rٹGEYu]H0V!#Y 3AX&-P`Ƭy'] 9yP~[Mk"L _I_g Aj[#^&ugw:dԴ jU*4].杛 ZڂuSՇLoSf JvavUV*NƧ`_F8gW92>V$A{_>jR'18K7 $[v!XrcNL7,3߻e='Kى\ &(Xa}Aze`xqsUEl 8z37p+h?96 r9GPO9dd%ғc`І–|qGk/1L&)&G4 F]̔=)5XH9d+VA0DqOBXz~yQzmn,.O3^UU񶊻( 9I [M (Tp~,ppy퇗i68Vjw@%8Qmxոi/& goOskA q}TP~vBKpMӭ!6}z@Ub\&`*sNӣpm8Ŗ^AVO Khm=ppV}ےLrm0zz\M"\YFT{}t 0PE9֧q"~)ˊO|VM(l4U}TjXtwmP> pFᣧ`ڏ"?BN 1,+q F_wk)[Jy?V_:jD.o;,pX<-+Y_ioT3`pcRC@`VU"uh,( ~2EC%B5 =,!#o:0cXM5C[_mϫ!W]\dO\vPCIeh>796az=}49IH_5Z8u^UET!5NEICkJywEtRPґS:u4XAKvB lD2KX\pYc7G7zUjD@H j?rW7ugU3=Ibش1S@IphwyZzx_snhekYc_˦y0' `wVJQ*dtsU笂3b~!ȩm',SFcji1@==}e#"~M5}7_m/F+*kO` 7 JANc!)e>U{rbV?3 kq VA)*pB(/Ub/7 Eg-)t$yD*CաE9e^]\Qau?]9uS!ԨpB/M Hn1*x% 9=엗M=VA֟G`X\s f5"H;d?h]PfT<%}]G&p? 85 U(Wr+![U"d_;Ԛ;hxb6^BisHMBZ\=j4yr_t|< xTgr Wu h: f7Z~e W`k&/tN_u r֙"!:J1Ly @\`8 UI0  1 Ɉs 9T}V`c}=)=O.=9?' {ڵ;7{Scfx&챽yyGg,f-&oGfj6 t-\'!'T;哐 rk&'-.&Z 8Pq@v Na)-+[=ݦ8r{$Hc@'-\jR fu[ 9MZ!6Q\Y Heo2y!/>zPjc@.=Vlu<'KA}^*WU^/žJ5K%M5nC]ƒx,׆;) ye }DHll܁в2șYDp "ǐJlfM{r͉V6( -(ϧHkTR !gq'AN6Qlųa1nï]zك\YIkXژ~|YW0:.J-U-GvWߙΞ-s.X(!J&B3@VŐglx$2& MI!.*e*ryt} !*' U < 967rZ6{ugs#lw]? ] J kƏ`=ͅ[R<#)d&1TjXZ&D?h= Y?JG-v/C[OjَCD;8aN;Oo|3>FJT*.k <X .7 ##c$I_w8K`q̬}J_o4ؠh2fs~_-\PGD7?zNg/oܸѥt..h` I%Nk6;Ύ<ϿGDwA.ZNw7vK v=oƍo+=zʽ t'/0$--m˽J}F/Jy{"p8<t:s%I;,9>l'Nwc\񹹹̯<ϑd^t:;y]Dtoξ222J}p8:DP.h^a۫S^?~N{9~|"Z c&qKK??v@CmsU? 6l_;9] h)#ߠ$I8뒪=33316OnY1&AWBcl-UzIII_566p8vزիW)!<t:0 |lRi6vWjc,Dǽ)IN݌[$I :J?7SX H///OaMO{(0c->t<ž*'-FE$:[<3IUfyzt<g=;Cy3ƆpVq({:O\D-[dff'pk&'$X,/Ht.MKKp8-K^AMZ^o cIICDWdeee@{{{ >?=%Zȵ4.&b_ND.]FD5g%Q$Ix1qIb0n"DQs\aٌhs{{o& `q~9WC*KJn@.Ȼp`$I {mZZZ#1clnvvn3? ekn{z=OD3.QWKTzkZBDI9WqEb^huXg-ADc.-o{6۔ -P[ek8[DDYk k껖1BWХ+VvInrr8#Tqel95r&z ۰kdhhidffx<,#Tˣc|xy 0v:3:8y-dzǚ;3$<6rތa^w IENDB`bauble-0.9.7/bauble/images/calendar.png0000644000175000017500000000131611210626427016763 0ustar brettbrettPNG  IHDRh6 pHYsaa?i tEXtComment*kIDATxOR7Cj9JrfXFB<988M"DHOjG/y~?B('2dJ"#Up%$;*db Ay9 <<m'nE䇠a?탋{0/C?ri< e5;ep{qao? 6X݄7ȭWHBrHsyxE@1qSEu 2 F=+iON :GCq&W8 (& qc |h6/J&ڛHNd$5==nɯ}^a's #>ݫZ5``{uNntDC;9_$fS2f=4/I8o*Ngq뭂QA#ۧg{CdaY ÔÒ40RƆʯH9qʍWÎ'jkZLjf}v p=lKKkZ mv:3-5du[۔ePL\Q$  r0 ^g`& S),>o1z5Wĥ7Xy#RIENDB`bauble-0.9.7/bauble/images/icon.ico0000644000175000017500000002735611210626427016144 0ustar brettbretth6 00F( =jYq~[CvhlIcV>yVgFuVŲHgTbU™Gh{̾AtHtPn¢þHzQwpƥqƥuBKXƝYƝǹAoQGuSfHfıXiNx>gCuάEEapjzpoItͪJfZqh_Ikl:iK^n?ZKYŝ\6sLHiFGHk`v7 =W4lFWl^z?s.YIkpŤ?q\-d?Gd?Z5jF^qdVshL-_LctΫoģ>p[-d@HfIh=X6gFdujAo^Vš4pZXtͫt̪nâ=nY.f@HeKiIgbJ@q_WšXěWš1iT`tͫs˩s˩s˩s˩tͪl6dP0kCIgJhJhJhJhJhJiEc6{MBcM>gXƝXÛYƝ6u^QxtΫs˩s˩s˩s˩s˩tͪl5bN0lCIgJhJhJhJhJhKiKjEb4uIAWHBxYŝXÛYƝ>mBvbuΫs˩s˩s˩s˩s˩s˩tͫk4_L0mDJhKiKiIgEa?X6zK+b>'Z;C.#j|uKXŜXÛYŜI;lYrʨs̩s˩s˩s˩s˩s˩s˩tͫl2]J/kB9O,d>(Z;"N5'WA1mT:fIM/YIHn`SXĜXÛXĜO1^Mls̪s˩s˩s˩s˩s̪tΫqȧ^;cT( +aJ8|aF}OUYŝYƝYǞJ]mg@s`WěXÛXÛXĜU-^Ldtͪs˩s˩s̪tΫpƥZ?iYHf[tIj^IZȟYŝXĜXĜXÛXÛYƝ@l?kYŝXÛXÛXÛXŜ4oY[tͫs̪tΫnâU~aTVvjťʤȣǣǥj3nXYƝXÛXÛXÛXÛYŝAuDn^TXěXÛXÛXŜWš=l!5-Z{oƥɣȣǣǣǣǥ6nYYǞYƝYƝYƝYƝYǞ>u`?uaXŜXÛXěYŝP1mV$[E*bKe|ɣȣǣǣǣǣȥɡt#@51iT2kV3lW3mW5qZ.iSC\S?nYŝXŜWBt$TB/xZEC-YGɣǣǤȥʠÀUpfVlctyxxvOc\@GE}FZǞO0mV$ZD_Qö̾myu~{ߌDl[5c!K:Pa[l~wx}x}UXW(0`hljFKH6;: +!aca6,1XH*<#(<.^a_-'1'OuCwb4#/oD*a< 3&nqo)UE"M=Lopƥ?p]6$:R@[&X6+?2uwvS[X;j+`L=lZs˩nâ>n[5#WJiJhKiHf7N%N2=G@~~.mUXÛV?3Vs̪s˩s˩t̪n¢8eS;&>WJiJhJhKiGd7O!C,?LCijj8gYƝXÛ$L=Cvcs˩s˩s˩s˩tͪl7cQ<'?YJhJhJhJhJhHe4wIC+JPLIXRBwYƞXÛ.eQ+L?s˩s˩s˩s˩s˩tͪl5`O<&@ZJiJhJhJhJhKjFc/qD$A-DIF*M@OYŜXě>n">3pƥs̩s˩s˩s˩s˩tͪm4]M>(@ZJiJhJhJhJhJhKiDa1sF6%NVQ&TCWXĜXĜK:0ht̪s˩s˩s˩s˩s˩tͪk3\K>(A\JhJhJhJhJhJhJhJhEb.jB:'\`],bNZȞXÛXĜP:/ZtΫs˩s˩s˩s˩s˩s˩tͫk1XH>'B\JiJhJhJhJhJhJhJhKiC_*g>(@0X]ZRa[$;,hnj+A9KXŜXÛXÛW*_K8cRuϬs˩s˩s˩s˩s˩s˩s˩s˩tͫj/UE@(C^JhJhJhJhJhJhJhJhJhJhJhA\)_;*B2rus(C8TXěXÛXÛYŝ9e1WHqȧs̪s˩s˩s˩s˩s˩s˩s˩s˩tͫj-QB@(C_JiJhJhJhJhJhJhJhJhJhJiJh>X(]90A6sxt(OAWÛXÛXÛXÛYǞ@q'F:itͪs˩s˩s˩s˩s˩s˩s˩s˩s˩tͫk+N?A)C_JiJhJhJhJhJhJhJhJhJhJhKiIg>X'W6.B5bif5x_XÛXÛXÛXÛYƝH~;0]uάs˩s˩s˩s˩s˩s˩s˩s˩s˩s˩tͫi*M>A)D`JhJhJhJhJhJhJhJhJhJhJhJhHe@Z%V5 $'%GNKBxXĜXÛXÛXÛYŜP?2RyuϬs˩s˩s˩s˩s˩s˩s˩s˩s˩s˩s˩tͫh(H:A(EaJiJhKiKjKiIfFbB\:Q-f?A(3"0 4$"K: ;FBKXĜXÛXÛXÛXěWš'VEJltͫs˩s˩s˩s˩s˩s˩s˩s˩s˩s˩s˩s˩tͫi&F8D*EaHe@Z6{L0lB%T36")7*C3)\H=kLRI1(/PDQXěXÛXÛXÛXÛZȟ.eQms̪s˩s˩s˩s˩s˩s˩s˩s˩s˩tͫtͫmT{.NB 2+ 5v^BuJTYƞZǟYƝXĜXÛXÛXÛXěXÛ(YGrsr5~cYŝXÛXÛXÛXÛXÛYŝEy1'hs̪s˩s˩s˩s˩s˩s˩s˩s̪uϬjNs+I=*;5Wuj}';4JZǞYƝXĜXÛXÛXÛXÛXÛXÛXÛYŝM*I>T]Y>qYǞXÛXÛXÛXÛXÛXĜQ;/bs̪s˩s˩s˩s˩s˩s̪s̪jHj'C81D=]}qȝ.C;CwXĜXÛXÛXÛXÛXÛXÛXÛXÛXÛYƞ=oW_\2PEKYŝXÛXÛXÛXÛXÛXÛW@4T{s̪s˩s˩s̩tΫs˩hDxd"900Cs˩rʨ`SKmӿȤȣǣǣǣǣǣFcX$Q@XÛXÛXÛXÛXÛXÛXÛXÛXÛXĜH>GCepl6x_ZǞXÛXÛXÛXÛXÛXÛXÛXĜDy!>3[8`P$80E]TxӿˣȣǣǣǣǣǣǣǣZ{o=1WšXÛXÛXÛXÛXÛXÛXÛXÛXě7}c\da3G?G~YŝXÛXÛXÛXÛXÛXÛXěYƝG});4IcZʤȣǣǣǣǣǣǣǣǣǣr=2VXÛXÛXÛXÛXÛXÛXÛXÛW'K>(A8RXĜXÛXÛXÛXÛXÛXĜV;h:.4)Lg]ӾɣȣǣǣǣǣǣǣǣǣǣǣǤȅ<2RXÛXÛXÛXÛXÛXÛXÛXĜN&=4&E9WšXÛXÛXÛXÛXĜXĜM)\I2&-uW7k7,pɣǣǣǣǣǣǣǣǣǣǤɤɛѽk5*;/<0>1?3A4B5!E8!G97+JUQu}z1kVXÛXÛXÛXÛYŜV=l2'K8qXěXÛXěXĜM&UC8*-sVFHHHF"U@C[RѽȣǣǣǣǤȤȘͺi7JC7D?kzֻ̽׻׻׻׼׻֑ETNrss@IEIXĜYŝUr˽ؽػֻֻֻֽٴt?GD1I@OYƝL(YF.#.xZEIHHHHHHI5f!5-~ʥʑıcy1A;5A=vû׽ػ׻ֻֻּ׽؞µOb[Y][,_LS:g7,P<w0&qɽؽػֻֻֻֻ׾ٷҎZngCHF`fc)!,tWDHHHHHHHHHHHHHDG7Pa[ϼ׻ֻֻֻּ׼׷ыM_YINL鰰NZU!D60_BHHHHHHHHHHG)iN8HB˽ػֻֻֽؽرˊHWRCIG𭯮MVR$J;.^CIHHHHHHH7i/)ٻֻּؾ٭ƀM\VHKJ񣦥Q[W"L:0^DHHHHH?y7,g}uռ׼׺թvJYT]`_ꪪGUO"I92cCHIE#UAOb[ͳ͢ɺ~P`Z!mIDATxy\N4)Li@)S CDȔyʽ5&sdf2E2TҤyxs󺮯{Z{AEQ!dY{Zr̊n?o?h(39|k &-kUs'4քjҚՕ˕RWvV6 Xy0ltA&J&J&ߏ%@Z4f[=GȪ \sD&ܘ, { [S_KmC*!#Dۓ_l[ {\`%_-Z~? A?A?A_/5/ <$nLN* xFdP+wm8aUE5ge|ol~WoS;__QPQp^zjup3?u߇Fy*T'^֭(qmehYZF!Hr$;ɏ6OJۉbVXuiZ8[ /#עT~vutB첅PԲLXdaKcxBf.yXxŋ|!.A m!\N0ŶƏQ܍$3|,8({=l#=D>x~&x=ශdNJAGG~s̔Uv8pځ7'4fbQZ<0vlf;HuC"[\YxGqh5;5ʹ:uyUpL8p~'( -Xyv_a$rk{xt&:g12 :uBn?$z'N^FV {hff5WX48+(mX6s ^u}ML~5(4 ۧW>5 GDzhҪq1p-aɵ5nM>~z:ӥ(+V< (nۣXI~0T ~/I/7&ߛV]80u֏ݧ)w6OsKWڂ[-: 6{MoY/CNJ:>m]co;^(}" ecakzɪTq.1Q!пDb\F5 ͼvnpk?3|@h9fS-> *"=~4`EPvQd:mAU7D&Zٕ§eOMjuC ڬx\?|҂O/? vqv*]9p/%93FТ7zTUb{܋8Ú6^#}s쮭;F~c zғNZ(Q/aK[*Mdppj^˒p0gunVto gdMY}ɶs>#A/GĈ4U,L}s#I.{Az0tP68? 3 h:iWU3.mͻ &]u+4V|=> @gg(*W<?X~1/%G _@i\ UeZk{|cB-I 7xx>qo209Dat\3ep)~cm[ ckλt,jW͖֒: 0eͯA0h76پo_N*k*šg6 -;1X( X ΦZdjxcLFq H$ 3anFѮxeUˮHѷxWw }e{N=Z z3tU\b"ʀ ڰo᦭aó^K/L;dw|%1kbd?}g|ހ'W^?gTlͷACfڭ`aQ M)i l/ZVWiMREq ^,|T>~mwfs:#DnZ]zc#?5(+=~djgXsr@ᱲl)د|TFA,O%:'myGL~#-U [{<=p'{y-~=D@4H C"|tv_?XniwUF=-\v h-wt6TC݂= ZFWԚB34eǪ+̿jrċ>bZŴ Ԫk\>Ҩ\)7VR ]=iI4wt>I+m'Ԅ9&ǀ({*wxt]%ocXVvr;uRwi&0zQ̠{itkcW׉˫g;C7z)w!\7/iS1i=8xm->|$,T*({u+N,?"8_m TQ#_= X9{9}䜳2xS͇ou{햘ΡǡTtʳ?ꋨ)`8b͇߮K#_OuI|y$tԙS.jvQ7 .Qi?X̱鯩u fO٨ԧn:llhqӟ|52^E 8MR53@d=W5ﯿB)MJau%੼{Sdeej9`wƧJ}n@i /k괪WP-ˣ:Oi . H< +;k6ؤ4?l>gr|Ecx {Hu+Tw14t;W ʌˌˌ˻^կy!L+aaj1,Ѭ]qUV)s:ށE׮ FOϪN83.Noқdƻby%&P4`Uih9+V>Ó1ry(r Щq]5!~3o^T]ALxgUiRRyU[R'9{zN#\m2[;V.w`y9k!9EqtY2޾7O[oQ7p1?&Ao3xc Þ u p…IhB9eV Nk@/ þ;L B\:M?snfmE1 ,09+iO24 ߪaHCt96?+mׇw&>.v3fbu ]& SZɆ&uÕ&ZS@yj*P#*a[cT5OFS.]SC>JrEП _o -k#C I+3X}DW#*e:eȷȾT4F<`[ 2GZ@XPxj5\(OvOw9WS1U[f#zZC]-/^Z se>9⩩l95C FSOHdf$$Hl IwdFfm޻w &P[D9=BeJaReH^):Ի\֣j hc! zE/(TyۺddMIvmɭ3 !~ܝ㯎[G ~fPm7V5ޮ4{oo$LQї'F,,u0 T넹cwSgæ XkiY ,2yxbF(nkPY¨gE:W|OV$G~(%r- n~h!'G4y 8'cXͯ'N qh%e~Zw4<4T$%P|:V{εwelZ^='5C[LOUX9hZXxv!0eGkPYTG!2^y[N]~ Kp(6rn;(|~_:-F@qEeP0^.q7PK x#^3ǜGoh?oNcKڳ+]";ɼZno8rf˵Сe Nl<:xo/J*Kþ!j7}!ǿOMq{5zį̙QOPL,RXinکs\. Q@&Twov}lAYz0)z9^y$EW,| |zYW?$ЉxR3f؂+QzYOCYuB[]{Z{HPw=_^Wr|>JSC5;9Z"DGGSs|xM7a[bxl΃&ӠIs*+n}?or[\} -n h'}?;ޡ8wb>:{Nz1ޤ+W6!аa_5 ݺr|Ep_2uboL, hٲw|ooshpܭ h^;S\`NM{y.:.;dd`f憏KЌ>{J^@//@" hT1R<ӹb oV>n{_V$^rAUa~-6^r2x_Mлlaޡ4+p(!~mׯaaov ;>hhh\+ ?蔰oENS!<;5ē`ǛF9eC^ w5K-S 1 _]2#ǀʺY7f օօ0wtA6]6]6.1o!ݞ5(5v3qur+:cEѝoYqhv4{==)ԬII2̌p]3++f¢>~YrW]Y|K F)wt7PkB䕦Ago%0Tlc E| Nq3N4 ,F~wH .ٶ'd|Inwvrξ"`Ǽn>XD@@AhӶڢpT}hx4x~>9Tӯǖ|~}'&ɾDzv ]\X*U@_nB%\Zd$3 l/;hѶn8 ?>~|T%orŪ<0QW|ɻ˝p8kk۠KPZ]דIzw66nNGCJYvْ hѶnÿNsw UsA|Y'}yz Ҩm B|`mh*(۔}m't3\VM Z@`wN#W&IB̓!~X|@~| Ջ!.0ZmA cu}gݲ.m>:o=ߵ7r:d?xmW/NR/ʄЪwƨ@`CL`K9`ܹaGu*jVq^lm4\t딗9 `8 PαکA5$0۱ָ]Y<zf/p?[`fn16,= _Qd O M^Om_[WGo.pR{y`S0e{/6,p/}TN4 = loE5n.Q";Tz7ևiS-%:0ޤ|CO< W_\BچjEY <rvp9{Hk FG[)/ÿAG~D(BwpɗK)ME87oECqKJdVK.37OvEi4DC~ەV:h]f=Q:xYnʹ4PQ.~2G#o{Q,k^ּ'JZMQTmD!Koy>>JJJ,,,NNNVVV! NETSCAPE2.0!Created with ajaxload.info! ,##@pH,ȤQ1p(JP0@z k4<"x;&* P"Cv@,H."iI aTCJ ]BTxO rTmP BZBX [Nd  B Ndu XCBC C[ IzH!* T3A JPBȀ +rĉ 1YchA8>Єr! #4H;7(p56EB Yc 7N\a!Sa ` (h}`YMOɄ{]Za6-\@a(dqBq7Y~;$K)\Tb-flmCYCU7&D} /! ,##@pH,ȤQ1p(JP0@z k4<"x;&2P"Cv@TO arTCS[J~a]BTxZH VTmaP BBk|W [N[ d B uTOByg[ HRBT F (RAfdB ^+"CpM|`A:ؖA6xlA(R 0‡ yaL :@uPB! !n@b! <ڰDN$ m @Xh@aN+ YM\b0 CčXI ;+m!&V+"9t@c2`Knp#:\8v ! ,##@pH,ȤQ1p(JP0@z k4<"x;&2P"Cv@TO arTCS[J~a]BTxZH VTmaP BBk|W [N[ d B uTPR! ֘BC&!O  % qPjPx)\HFgqX 0F &(| 1!dq^08BxhA .% >t`@DST aSi``J/!:p @ !A\ IZ7h@B8z x .HD@JD bX 9,hjs@b<)!@©kLJ(ȉ! ,##@pH,dй@P XbS\EwC:ЂAwGQ@6D&J yl $UC" J BTBIyv!U$QyB "BqPM X {f# gC! !OBC+@p OA , 0D@ċ9`FJ}«" @Y #4x@  bDPd>pO!<D9&!0`eg<>R# hBP X% 92AzBHR.7@{P&LHڈlN%ſC4 Xz//-b 4QWD0n(0 k@Oȋ! ,##@pH,ȤI(E"Q@Dez`*U51, 4 c_&D${I o"\ CI NBSB J B nB%P BBoO N#W yB jeCwXCƜ!tD  0 I>Y2(ͿT$g3f dDd9pQF>.h@ّ$h|`ZUBu‡ 8hp)hLce<"@o_7Zx"BU \!bmԑU$5%"Ts$.עyfE,;Vv^/vbOV.{ G;bauble-0.9.7/bauble/images/icon.svg0000644000175000017500000001076311210626427016163 0ustar brettbrett image/svg+xml bauble-0.9.7/bauble/images/bauble.xpm0000644000175000017500000004434611210626427016476 0ustar brettbrett/* XPM */ static char * bauble_xpm[] = { "64 64 635 2", " c None", ". c #C8C9C7", "+ c #787B74", "@ c #EDEDED", "# c #DCDCDB", "$ c #474C41", "% c #050605", "& c #000000", "* c #20211E", "= c #959793", "- c #E2E2E2", "; c #FFFFFF", "> c #DEDEDD", ", c #4C5145", "' c #2B3A16", ") c #77A03E", "! c #2F3A1F", "~ c #7A836A", "{ c #131511", "] c #7D7F7B", "^ c #D4D5D4", "/ c #FCFCFC", "( c #E0E0E0", "_ c #50554A", ": c #293715", "< c #769E3D", "[ c #8BBA48", "} c #87B445", "| c #10120E", "1 c #43483A", "2 c #D6E6BB", "3 c #C4D3AB", "4 c #8C977A", "5 c #2F3229", "6 c #636560", "7 c #C4C5C3", "8 c #F7F7F7", "9 c #555A4E", "0 c #263313", "a c #759C3C", "b c #6C9038", "c c #869075", "d c #CCDBB2", "e c #9CA889", "f c #484D3E", "g c #4B4D49", "h c #D5D6D5", "i c #E4E4E4", "j c #595E52", "k c #233012", "l c #749B3C", "m c #465B28", "n c #B5C39E", "o c #D1E1B7", "p c #ABB795", "q c #4A5041", "r c #363834", "s c #CACBCA", "t c #E6E6E6", "u c #5E6357", "v c #212C11", "w c #72993B", "x c #242B1A", "y c #060705", "z c #D0DFB5", "A c #BFCDA7", "B c #5B624F", "C c #20211F", "D c #BEBEBD", "E c #FEFEFE", "F c #E8E8E8", "G c #62675B", "H c #1E280F", "I c #71973A", "J c #80AB42", "K c #585F4D", "L c #C5D4AC", "M c #6A725D", "N c #0A0A09", "O c #B0B1AE", "P c #EAEAEA", "Q c #676B60", "R c #1B250E", "S c #70953A", "T c #5F7F32", "U c #95A182", "V c #CBDAB1", "W c #798269", "X c #A1A29F", "Y c #F8F8F8", "Z c #DFDFDF", "` c #5F6358", " . c #18210C", ".. c #6E9439", "+. c #394923", "@. c #BFCDA6", "#. c #CFDFB5", "$. c #91928E", "%. c #F3F3F3", "&. c #4E5446", "*. c #37481D", "=. c #89B847", "-. c #8AB847", ";. c #1B1F15", ">. c #1F221B", ",. c #D3E3B9", "'. c #D2E2B8", "). c #929D80", "!. c #040403", "~. c #7F817D", "{. c #0D1007", "]. c #698C36", "^. c #779F3D", "/. c #6B735E", "(. c #D1E0B6", "_. c #D5E5BA", ":. c #9EAA8A", "<. c #181A15", "[. c #6D6E6A", "}. c #F0F0F0", "|. c #89AD4E", "1. c #37461F", "2. c #35471C", "3. c #89B747", "4. c #181C13", "5. c #828C72", "6. c #CFDEB5", "7. c #A8B593", "8. c #2C2F26", "9. c #B9BAB8", "0. c #6D8A3E", "a. c #9BC358", "b. c #718E40", "c. c #0C0F06", "d. c #688B35", "e. c #3A4B22", "f. c #ADC08E", "g. c #4C543F", "h. c #7B846C", "i. c #CCDCB3", "j. c #818B71", "k. c #6D6F6B", "l. c #F9F9F9", "m. c #4B4F44", "n. c #445627", "o. c #92B853", "p. c #394820", "q. c #34451B", "r. c #88B746", "s. c #658734", "t. c #87956E", "u. c #C7DCA3", "v. c #BBCE99", "w. c #535B45", "x. c #020201", "y. c #747D65", "z. c #CAD9B0", "A. c #B4C19D", "B. c #060605", "C. c #0C0C0B", "D. c #D8D8D8", "E. c #989B94", "F. c #0E1208", "G. c #728F40", "H. c #0B0E06", "I. c #668935", "J. c #85B245", "K. c #0C0D0A", "L. c #474E3A", "M. c #BED29B", "N. c #5A634A", "O. c #070706", "P. c #6C745E", "Q. c #C7D6AE", "R. c #D0DFB6", "S. c #5B6250", "T. c #9B9C99", "U. c #D4D4D3", "V. c #96BD55", "W. c #93B853", "X. c #3A4A21", "Y. c #33431B", "Z. c #88B646", "`. c #2C371C", " + c #BDD19B", ".+ c #C0D59E", "++ c #616B50", "@+ c #0B0C09", "#+ c #646C57", "$+ c #9AA687", "%+ c #454642", "&+ c #EEEEEE", "*+ c #F5F5F5", "=+ c #84A74B", "-+ c #739141", ";+ c #0A0D05", ">+ c #54702D", ",+ c #9EAE81", "'+ c #C3D79F", ")+ c #687356", "!+ c #0E0F0C", "~+ c #5C6350", "{+ c #C1CFA8", "]+ c #C3D2AA", "^+ c #2E3228", "/+ c #C1C1C0", "(+ c #0A0B08", "_+ c #658039", ":+ c #93B953", "<+ c #3C4C22", "[+ c #32421A", "}+ c #7BA540", "|+ c #687355", "1+ c #C4D9A1", "2+ c #6F7B5B", "3+ c #11130F", "4+ c #535A49", "5+ c #BDCBA5", "6+ c #787975", "7+ c #FBFBFB", "8+ c #5D6257", "9+ c #749242", "0+ c #090C05", "a+ c #648634", "b+ c #1E2416", "c+ c #1C1F17", "d+ c #C5DAA1", "e+ c #C6DAA2", "f+ c #768361", "g+ c #151712", "h+ c #3C4132", "i+ c #5A634D", "j+ c #59614B", "k+ c #575F4A", "l+ c #565E48", "m+ c #545C47", "n+ c #515944", "o+ c #505743", "p+ c #4E5641", "q+ c #4D5440", "r+ c #4B533E", "s+ c #4A513D", "t+ c #0A0D06", "u+ c #191C13", "v+ c #CCCDCC", "w+ c #A8AAA4", "x+ c #93BA53", "y+ c #3D4D23", "z+ c #304019", "A+ c #87B546", "B+ c #445827", "C+ c #B0C290", "D+ c #C6DBA2", "E+ c #7D8B67", "F+ c #010200", "G+ c #030401", "H+ c #040602", "I+ c #060703", "J+ c #070904", "K+ c #090B05", "L+ c #0C0F07", "M+ c #0D1107", "N+ c #0F1308", "O+ c #101509", "P+ c #12170A", "Q+ c #5E6258", "R+ c #759342", "S+ c #080B04", "T+ c #58752E", "U+ c #84926C", "V+ c #B6C995", "W+ c #82A349", "X+ c #69853C", "Y+ c #7E9F48", "Z+ c #94BA54", "`+ c #3F4F24", " @ c #0E100B", ".@ c #434A37", "+@ c #A0B183", "@@ c #8EB350", "#@ c #8FB451", "$@ c #E1E1E1", "%@ c #1D1F19", "&@ c #5D7534", "*@ c #98BF56", "=@ c #040503", "-@ c #181B12", ";@ c #404634", ">@ c #A7B989", ",@ c #83916B", "'@ c #0C1007", ")@ c #94978F", "!@ c #707369", "~@ c #2E391A", "{@ c #9EBE6C", "]@ c #7A9253", "^@ c #202519", "/@ c #2D3225", "(@ c #9EAF81", "_@ c #636E4F", ":@ c #9AC257", "<@ c #546A30", "[@ c #252821", "}@ c #B6B8B3", "|@ c #637D39", "1@ c #A8CA72", "2@ c #A9CB73", "3@ c #849F5A", "4@ c #29301F", "5@ c #191B14", "6@ c #93A379", "7@ c #434B34", "8@ c #83A54A", "9@ c #F2F2F2", "0@ c #90B551", "a@ c #3E4D25", "b@ c #242B18", "c@ c #8EAA60", "d@ c #333B25", "e@ c #030403", "f@ c #87966F", "g@ c #C3D8A0", "h@ c #282E1D", "i@ c #303C1B", "j@ c #99C157", "k@ c #B7B9B4", "l@ c #789744", "m@ c #1C2211", "n@ c #546439", "o@ c #96B466", "p@ c #3D472B", "q@ c #7A8764", "r@ c #C0D49D", "s@ c #14180C", "t@ c #4B5F2A", "u@ c #3B4B22", "v@ c #52564B", "w@ c #30332A", "x@ c #53692F", "y@ c #799152", "z@ c #9DBD6B", "A@ c #475432", "B@ c #6C7758", "C@ c #637C38", "D@ c #81857B", "E@ c #212A13", "F@ c #91B752", "G@ c #93B164", "H@ c #A2C36E", "I@ c #526239", "J@ c #070806", "K@ c #5C664B", "L@ c #B4C894", "M@ c #C1D59E", "N@ c #769443", "O@ c #C3C4C1", "P@ c #779543", "Q@ c #A3C46F", "R@ c #A6C871", "S@ c #5E7040", "T@ c #0F110C", "U@ c #ADBF8E", "V@ c #B1C491", "W@ c #85A84B", "X@ c #1F2711", "Y@ c #7D8077", "Z@ c #8CB04F", "`@ c #526730", " # c #697E48", ".# c #161912", "+# c #393F2F", "@# c #A4B687", "## c #9AAA7E", "$# c #90B652", "%# c #617A37", "&# c #2E391C", "*# c #374326", "=# c #748B4F", "-# c #1E2217", ";# c #21241A", "># c #000100", ",# c #8AAE4E", "'# c #E9E9E9", ")# c #43473C", "!# c #495C29", "~# c #0F120A", "{# c #637743", "]# c #7C9554", "^# c #0E150A", "/# c #050803", "(# c #1A2510", "_# c #425526", ":# c #708D3F", "<# c #A3A69F", "[# c #92958C", "}# c #14190B", "|# c #99C057", "1# c #1E2814", "2# c #040603", "3# c #619B45", "4# c #568A3D", "5# c #40662D", "6# c #213517", "7# c #070C05", "8# c #202C13", "9# c #4B5F2B", "0# c #779643", "a# c #4A5E2A", "b# c #383C32", "c# c #CFD0CE", "d# c #97BE56", "e# c #87AA4C", "f# c #9BBA69", "g# c #A7C971", "h# c #212C16", "i# c #609A44", "j# c #68A74A", "k# c #619D45", "l# c #52843A", "m# c #3B5E2A", "n# c #1A2B13", "o# c #0A1007", "p# c #273417", "q# c #536A2F", "r# c #7E9E47", "s# c #97BE55", "t# c #7D9E47", "u# c #87A94C", "v# c #66813A", "w# c #A7C871", "x# c #A8C972", "y# c #243019", "z# c #5F9843", "A# c #67A649", "B# c #5F9944", "C# c #4F7F38", "D# c #355626", "E# c #14200E", "F# c #0E1509", "G# c #2E3D1B", "H# c #5B7434", "I# c #69843B", "J# c #415126", "K# c #171C10", "L# c #27341B", "M# c #5E9742", "N# c #66A549", "O# c #5D9542", "P# c #4B7835", "Q# c #304D22", "R# c #0C1409", "S# c #565A4F", "T# c #3E4E23", "U# c #202714", "V# c #495832", "W# c #2B381D", "X# c #5C9542", "Y# c #53853B", "Z# c #111B0C", "`# c #6B7168", " $ c #A1A49D", ".$ c #060803", "+$ c #030402", "@$ c #71884D", "#$ c #2E3B1F", "$$ c #5B9341", "%$ c #172611", "&$ c #646A61", "*$ c #EBEBEB", "=$ c #DADAD9", "-$ c #95BB54", ";$ c #313F22", ">$ c #5A9140", ",$ c #598F3F", "'$ c #1E3015", ")$ c #565C53", "!$ c #81A249", "~$ c #799845", "{$ c #A0C16D", "]$ c #344324", "^$ c #243A19", "/$ c #474E44", "($ c #151611", "_$ c #607937", ":$ c #556B31", "<$ c #374726", "[$ c #578C3E", "}$ c #5E9743", "|$ c #2A431E", "1$ c #393F36", "2$ c #D8D8D7", "3$ c #686C61", "4$ c #33401D", "5$ c #313D1D", "6$ c #2C351E", "7$ c #3B4B28", "8$ c #609B44", "9$ c #2F4C22", "0$ c #2B3029", "a$ c #B0B2AD", "b$ c #14180D", "c$ c #5A6C3D", "d$ c #3E4E2A", "e$ c #54873C", "f$ c #629E46", "g$ c #355525", "h$ c #1D211B", "i$ c #C6C7C5", "j$ c #E3E3E2", "k$ c #9AC157", "l$ c #7D9655", "m$ c #41522C", "n$ c #64A047", "o$ c #3A5D29", "p$ c #10130F", "q$ c #BCBEBA", "r$ c #7B9B46", "s$ c #89AC4D", "t$ c #96B566", "u$ c #44552F", "v$ c #518239", "w$ c #65A248", "x$ c #3F652C", "y$ c #B1B4AF", "z$ c #282B23", "A$ c #576E31", "B$ c #69843C", "C$ c #A5C670", "D$ c #475931", "E$ c #4F8038", "F$ c #66A449", "G$ c #436C30", "H$ c #A5A9A3", "I$ c #FDFDFD", "J$ c #7A7D73", "K$ c #263116", "L$ c #445427", "M$ c #0A0C07", "N$ c #4A5D33", "O$ c #4D7D37", "P$ c #477333", "Q$ c #999D97", "R$ c #BEBFBB", "S$ c #232B15", "T$ c #3E4B2A", "U$ c #4E6035", "V$ c #4C7A36", "W$ c #4B7936", "X$ c #030502", "Y$ c #8C918A", "Z$ c #8DB250", "`$ c #090B06", " % c #687E47", ".% c #516337", "+% c #4A7734", "@% c #0A1107", "#% c #7F847C", "$% c #F4F4F4", "%% c #88A35C", "&% c #546739", "*% c #487433", "=% c #111C0C", "-% c #71776E", ";% c #3B3E35", ">% c #4D612C", ",% c #576A3B", "'% c #467032", ")% c #182611", "!% c #636A60", "~% c #8B8E85", "{% c #1A200E", "]% c #576D32", "^% c #5A6E3D", "/% c #446D30", "(% c #1E3115", "_% c #555C52", ":% c #E6E6E5", "<% c #CACBC8", "[% c #98C056", "}% c #333F1E", "|% c #1F2615", "1% c #5C713F", "2% c #426A2F", "3% c #5C9341", "4% c #243A1A", "5% c #474D44", "6% c #F1F1F1", "7% c #171C0E", "8% c #506036", "9% c #5F7441", "0% c #3F662D", "a% c #2A441E", "b% c #D7D8D7", "c% c #6C883D", "d% c #768D50", "e% c #627743", "f% c #3D632B", "g% c #2B3028", "h% c #4E5247", "i% c #435426", "j% c #91AF63", "k% c #657A45", "l% c #3B5F2A", "m% c #355526", "n% c #C5C7C4", "o% c #9B9E96", "p% c #6B863C", "q% c #687D46", "r% c #395B28", "s% c #0F120E", "t% c #BBBEBA", "u% c #D5D6D4", "v% c #455628", "w% c #6A8048", "x% c #365726", "y% c #65A348", "z% c #3F652D", "A% c #020302", "B% c #B0B3AF", "C% c #F6F6F6", "D% c #242D16", "E% c #333D23", "F% c #6D834A", "G% c #345325", "H% c #A5A8A3", "I% c #0C0E0A", "J% c #0D0F08", "K% c #516237", "L% c #314F23", "M% c #989D96", "N% c #FAFAFA", "O% c #5F6359", "P% c #8C9189", "Q% c #8F918C", "R% c #7E847C", " . + @ ", " # $ % & & * = - ; ", " > , & ' ) ! & ~ { & & ] ^ / ", " ( _ & : < [ [ } | 1 2 3 4 5 & & 6 7 8 ", " - 9 & 0 a [ [ [ [ [ b & c 2 2 2 d e f & & g h ", " i j & k l [ [ [ [ [ [ [ [ m & n 2 2 2 2 2 o p q & r s ; ", " t u & v w [ [ [ [ [ [ [ [ [ [ [ x y z 2 2 2 2 2 2 2 A B & C D E ", " F G & H I [ [ [ [ [ [ [ [ [ [ [ [ [ J y K 2 2 2 2 2 2 2 2 2 L M & N O / ", " P Q & R S [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ T & U 2 2 2 2 2 2 2 2 2 2 V W & & X Y ", " Z ` & ...[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ +.& @.2 2 2 2 2 2 2 2 2 2 2 #.c & & $.%. ", " &.& *.=.[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ -.;.>.,.2 2 2 2 2 2 2 2 2 2 2 2 '.).!.& ~.@ ", " . & & {.].[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ ^.& /.(.2 2 2 2 2 2 2 2 2 2 2 2 2 _.:.<.& [.P ", " }.& |.1.& 2.3.[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ -.4.& & 5.6.2 2 2 2 2 2 2 2 2 2 2 2 2 2 7.8.& 9. ", " ; & 0.a.b.& c.d.[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ e.& f.g.& & h.i.2 2 2 2 2 2 2 2 2 2 2 2 2 2 j.& k.l. ", " m.n.a.a.o.p.& q.r.[ [ [ [ [ [ [ [ [ [ [ [ [ [ s.& t.u.u.v.w.x.& y.z.2 2 2 2 2 2 2 2 2 2 2 2 2 A.B.C.D. ", " E.F.a.a.a.a.G.& H.I.[ [ [ [ [ [ [ [ [ [ [ [ J.K.L.u.u.u.u.u.M.N.O.& P.Q.2 2 2 2 2 2 2 2 2 2 2 2 R.S.& T.; ", " U.& V.a.a.a.a.W.X.& Y.Z.[ [ [ [ [ [ [ [ [ [ `.& +u.u.u.u.u.u.u..+++@+& #+3 2 2 2 2 2 2 2 2 2 2 2 2 $+& %+&+ ", " *+& =+a.a.a.a.a.a.-+& ;+s.[ [ [ [ [ [ [ [ >+& ,+u.u.u.u.u.u.u.u.u.u.'+)+!+& ~+{+2 2 2 2 2 2 2 2 2 2 2 ]+^+& /+ ", " (+_+a.a.a.a.a.a.a.:+<+& [+Z.[ [ [ [ [ }+& |+u.u.u.u.u.u.u.u.u.u.u.u.u.1+2+3+& 4+5+2 2 2 2 2 2 2 2 2 2 _.~ & 6+7+ ", " 8+p.a.a.a.a.a.a.a.a.a.9+& 0+a+[ [ [ [ b+c+d+u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.e+f+g+& h+i+j+k+l+m+w.n+o+p+q+r+s+t+u+v+ ", " w+& a.a.a.a.a.a.a.a.a.a.x+y+& z+A+[ B+& C+u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.D+E+& & & F+G+H+I+J+K+t+L+M+N+O+P+Q+ ", " > & :+a.a.a.a.a.a.a.a.a.a.a.R+& S+T+& U+u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.V+& W+a.a.a.a.a.a.a.a.a.a.a.a.X+& ; ", " l.& Y+a.a.a.a.a.a.a.a.a.a.a.a.Z+`+ @.@C+u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.+@& @@a.a.a.a.a.a.a.a.a.a.a.a.#@& $@ ", " %@&@a.a.a.a.a.a.a.a.a.a.a.a.a.*@=@-@& ;@>@u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.,@& V.a.a.a.a.a.a.a.a.a.a.a.a.a.'@)@ ", " !@~@a.a.a.a.a.a.a.a.a.a.a.a.a.=+& {@]@^@& /@(@u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u._@& :@a.a.a.a.a.a.a.a.a.a.a.a.a.<@[@ ", " }@& :@a.a.a.a.a.a.a.a.a.a.a.a.|@& 1@2@2@3@4@& 5@6@D+u.u.u.u.u.u.u.u.u.u.u.u.u.7@O+a.a.a.a.a.a.a.a.a.a.a.a.a.a.8@& 9@ ", " t & 0@a.a.a.a.a.a.a.a.a.a.a.a.a@b@2@2@2@2@2@c@d@& e@f@g@u.u.u.u.u.u.u.u.u.u.u.h@i@a.a.a.a.a.a.a.a.a.a.a.a.a.a.j@& k@ ", " / & l@a.a.a.a.a.a.a.a.a.a.a.a.m@n@2@2@2@2@2@2@2@o@p@& & q@r@u.u.u.u.u.u.u.u.u.s@t@a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.u@v@ ", " w@x@a.a.a.a.a.a.a.a.a.a.a.a.& y@2@2@2@2@2@2@2@2@2@z@A@& & B@v.u.u.u.u.u.u.u.J+C@a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.9+& / ", " D@E@a.a.a.a.a.a.a.a.a.a.a.F@& G@2@2@2@2@2@2@2@2@2@2@2@H@I@J@& K@L@u.u.u.u.M@& N@a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.Z+& U. ", " O@& j@a.a.a.a.a.a.a.a.a.a.P@& Q@2@2@2@2@2@2@2@2@2@2@2@2@2@R@S@T@& r+U@u.u.V@& W@a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.X@Y@ ", " @ & Z@a.a.a.a.a.a.a.a.a.a.`@x.2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@1@ #.#& +#@###& $#a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.%#@+; ", " E & b.a.a.a.a.a.a.a.a.a.a.&#*#2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@=#-#& ;#>#Z@:@a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.,#& '#", " )#!#a.a.a.a.a.a.a.a.a.a.~#{#2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@]#^#& & /#(#_#:#$#a.a.a.a.a.a.a.a.a.a.a.a.& <#", " [#}#a.a.a.a.a.a.a.a.a.|#& 3@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@R@1#2#3#4#5#6#& & & 7#8#9#0#Z+a.a.a.a.a.a.a.a#b#", " c#& d#a.a.a.a.a.a.a.a.e#& f#2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@g#h#>#i#j#j#j#j#j#k#l#m#n#& & & o#p#q#r#s#a.a.t#& ", " %.& u#a.a.a.a.a.a.a.a.v#& w#2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@x#y#& z#j#j#j#j#j#j#j#j#j#j#A#B#C#D#E#& & & F#G#H#& ", " ; x.I#a.a.a.a.a.a.a.a.J#K#2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@1@L#& M#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#N#O#P#Q#R#& & ", " S#T#a.a.a.a.a.a.a.a.U#V#2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@1@W#& X#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#Y#Z#& `#", " $.$a.a.a.a.a.a.a.a.+$@$2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@#$& $$j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#4#%$& &$*$ ", " =$& -$a.a.a.a.a.a.:+& c@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@;$& >$j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#,$'$& )$t ", " Y & !$a.a.a.a.a.a.~$& {$2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@]$& ,$j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#$$^$& /$Z ", " ($_$a.a.a.a.a.a.:$& 2@2@2@2@2@2@2@2@2@2@2@2@2@2@2@<$& [$j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#}$|$& 1$2$ ", " 3$4$a.a.a.a.a.a.5$6$2@2@2@2@2@2@2@2@2@2@2@2@2@2@7$& 4#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#8$9$& 0$c# ", " a$& a.a.a.a.a.a.b$c$2@2@2@2@2@2@2@2@2@2@2@2@2@d$& e$j#j#j#j#j#j#j#j#j#j#j#j#j#j#f$g$& h$i$ ", " j$& F@a.a.a.a.k$& l$2@2@2@2@2@2@2@2@2@2@2@2@m$& Y#j#j#j#j#j#j#j#j#j#j#j#j#j#n$o$& p$q$; ", " 7+& r$a.a.a.a.s$& t$2@2@2@2@2@2@2@2@2@2@2@u$& v$j#j#j#j#j#j#j#j#j#j#j#j#w$x$& e@y$E ", " z$A$a.a.a.a.B$& C$2@2@2@2@2@2@2@2@2@2@D$& E$j#j#j#j#j#j#j#j#j#j#j#F$G$& & H$I$ ", " J$K$a.a.a.a.L$M$2@2@2@2@2@2@2@2@2@2@N$& O$j#j#j#j#j#j#j#j#j#j#A#P$& & Q$7+ ", " R$& :@a.a.a.S$T$2@2@2@2@2@2@2@2@2@U$& V$j#j#j#j#j#j#j#j#j#j#W$X$& Y$Y ", " P & Z$a.a.a.`$ %2@2@2@2@2@2@2@2@.%& +%j#j#j#j#j#j#j#j#j#E$@%& #%$% ", " E & 9+a.a.Z+& %%2@2@2@2@2@2@2@&%& *%j#j#j#j#j#j#j#j#Y#=%& -%}. ", " ;%>%a.a.r$& z@2@2@2@2@2@2@,%& '%j#j#j#j#j#j#j#4#)%& !%*$ ", " ~%{%a.a.]%& 1@2@2@2@2@2@^%& /%j#j#j#j#j#j#,$(%& _%:% ", " <%& [%a.}%|%2@2@2@2@2@1%& 2%j#j#j#j#j#3%4%& 5%Z ", " 6%& s$a.7%8%2@2@2@2@9%& 0%j#j#j#j#}$a%& 1$b% ", " ; & c%:@& d%2@2@2@e%& f%j#j#j#8$Q#& g%c# ", " h%i%,#& j%2@2@k%& l%j#j#f$m%& h$n% ", " o%L+p%& H@2@q%& r%j#n$o$& s%t%; ", " u%& v%& 2@w%& x%y%z%& A%B%E ", " C%& D%E%F%& G%G$& & H%I$ ", " I%J%K%& L%& & M%N% ", " O%>#& X$& P%Y ", " Q%& & R%$% "}; bauble-0.9.7/bauble/error.py0000755000175000017500000000244011210626427014744 0ustar brettbrett# # all bauble exceptions and errors # # TODO: should I make everything extend from BaubleException class BaubleError(Exception): def __init__(self, msg=None): self.msg = msg def __str__(self): if self.msg is None: return str(type(self).__name__) else: return '%s: %s' % (type(self).__name__, self.msg) return self.msg class CommitException(Exception): def __init__(self, exc, row): self.row = row # the model we were trying to commit self.exc = exc # the exception thrown while committing def __str__(self): return str(self.exc) class DatabaseError(BaubleError): pass class EmptyDatabaseError(DatabaseError): pass class MetaTableError(DatabaseError): pass class TimestampError(DatabaseError): pass class RegistryError(DatabaseError): pass class VersionError(DatabaseError): def __init__(self, version): super(VersionError, self).__init__() self.version = version class SQLAlchemyVersionError(BaubleError): pass class CheckConditionError(BaubleError): pass def check(condition, msg=None): """ Check that condition is true. If not then raise CheckConditionError(msg) """ if not condition: raise CheckConditionError(msg) bauble-0.9.7/bauble/meta.py0000755000175000017500000000312611220415671014541 0ustar brettbrett# # meta.py # from sqlalchemy import * import bauble import bauble.db as db import bauble.utils as utils from bauble.utils.log import debug VERSION_KEY = u'version' CREATED_KEY = u'created' REGISTRY_KEY = u'registry' # date format strings: # yy - short year # yyyy - long year # dd - number day, always two digits # d - number day, two digits when necessary # mm -number month, always two digits # m - number month, two digits when necessary DATE_FORMAT_KEY = u'date_format' def get_default(name, default=None, session=None): """ Get a BaubleMeta object with name. If the default value is not None then a BaubleMeta object is returned with name and the default value given. If a session instance is passed (session != None) then we don't commit the session. """ commit = False if not session: session = bauble.Session() commit = True query = session.query(BaubleMeta) meta = query.filter_by(name=name).first() if not meta and default is not None: meta = BaubleMeta(name=utils.utf8(name), value=default) session.add(meta) if commit: session.commit() # load the properties so that we can close the session and # avoid getting errors when accessing the properties on the # returned meta meta.value meta.name if commit: # close the session whether we added anything or not session.close() return meta class BaubleMeta(db.Base): __tablename__ = 'bauble' name = Column(Unicode(64), unique=True) value = Column(UnicodeText) bauble-0.9.7/bauble/view.py0000755000175000017500000013214411255231005014563 0ustar brettbrett# # view.py # # Description: the default view # import sys import re import traceback import itertools import gtk import gobject import pango from sqlalchemy import * from sqlalchemy.orm import * import sqlalchemy.sql import sqlalchemy.exc as saexc from sqlalchemy.orm.mapper import Mapper from sqlalchemy.orm.properties import ColumnProperty, PropertyLoader import bauble import bauble.db as db from bauble.error import check, CheckConditionError, BaubleError import bauble.pluginmgr as pluginmgr import bauble.utils as utils from bauble.prefs import prefs from bauble.utils.log import debug, error, warning from bauble.utils.pyparsing import * # TODO: should we provide a way to change the results view from list to icon # and provide an icon type to each type that can be returned and then you could # double click on an icon to open the children of that type # use different formatting template for the result view depending on the # platform _mainstr_tmpl = '%s' if sys.platform == 'win32': _substr_tmpl = '%s' else: _substr_tmpl = '%s' #import gc #gc.enable() #gc.set_debug(gc.DEBUG_UNCOLLECTABLE|gc.DEBUG_INSTANCES|gc.DEBUG_OBJECTS) #gc.set_debug(gc.DEBUG_LEAK) # TODO: reset expander data on expand, the problem is that we don't keep the # row around that was used to update the infoexpander, if we don't do this # then we can't update unless the search view updates us, this means that # the search view would have to register on_expanded on each info expander # in the infobox class InfoExpander(gtk.Expander): """ an abstract class that is really just a generic expander with a vbox to extend this you just have to implement the update() method """ # preference for storing the expanded state expanded_pref = None def __init__(self, label, widgets=None): """ :param label: the name of this info expander, this is displayed on the expander's expander :param glade_xml: a gtk.glade.XML instace where can find the expanders widgets """ super(InfoExpander, self).__init__(label) self.vbox = gtk.VBox(False) self.vbox.set_border_width(5) self.add(self.vbox) self.set_expanded(True) self.widgets = widgets self.connect("notify::expanded", self.on_expanded) def on_expanded(self, expander, *args): if self.expanded_pref: prefs[self.expanded_pref] = expander.get_expanded() prefs.save() def set_widget_value(self, widget_name, value, markup=True, default=None): ''' a shorthand for L{bauble.utils.set_widget_value()} ''' utils.set_widget_value(self.widgets.glade_xml, widget_name, value, markup, default) def update(self, value): ''' This method should be implemented by classes that extend InfoExpander ''' raise NotImplementedError("InfoExpander.update(): not implemented") class PropertiesExpander(InfoExpander): def __init__(self): super(PropertiesExpander, self).__init__(_('Properties')) table = gtk.Table(rows=4, columns=2) table.set_col_spacings(15) table.set_row_spacings(8) # database id id_label = gtk.Label(_("ID:")) id_label.set_use_markup(True) id_label.set_alignment(1, .5) self.id_data = gtk.Label('--') self.id_data.set_alignment(0, .5) table.attach(id_label, 0, 1, 0, 1) table.attach(self.id_data, 1, 2, 0, 1) # object type type_label = gtk.Label(_("Type:")) type_label.set_use_markup(True) type_label.set_alignment(1, .5) self.type_data = gtk.Label('--') self.type_data.set_alignment(0, .5) table.attach(type_label, 0, 1, 1, 2) table.attach(self.type_data, 1, 2, 1, 2) # date created created_label = gtk.Label(_("Date created:")) created_label.set_use_markup(True) created_label.set_alignment(1, .5) self.created_data = gtk.Label('--') self.created_data.set_alignment(0, .5) table.attach(created_label, 0, 1, 2, 3) table.attach(self.created_data, 1, 2, 2, 3) # date last updated updated_label = gtk.Label(_("Last updated:")) updated_label.set_use_markup(True) updated_label.set_alignment(1, .5) self.updated_data = gtk.Label('--') self.updated_data.set_alignment(0, .5) table.attach(updated_label, 0, 1, 3, 4) table.attach(self.updated_data, 1, 2, 3, 4) box = gtk.HBox() box.pack_start(table, expand=False, fill=False) self.vbox.pack_start(box, expand=False, fill=False) def update(self, row): """" Update the widget in the expander. """ self.id_data.set_text(str(row.id)) self.type_data.set_text(str(type(row).__name__)) self.created_data.set_text(str(row._created)) self.updated_data.set_text(str(row._last_updated)) class InfoBoxPage(gtk.ScrolledWindow): """ A :class:`gtk.ScrolledWindow` that contains :class:`bauble.view.InfoExpander` objects. """ def __init__(self): super(InfoBoxPage, self).__init__() self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.vbox = gtk.VBox() self.vbox.set_spacing(10) viewport = gtk.Viewport() viewport.add(self.vbox) self.add(viewport) self.expanders = {} self.label = None def add_expander(self, expander): ''' Add an expander to the list of exanders in this infobox :param expander: the bauble.view.InfoExpander to add to this infobox ''' self.vbox.pack_start(expander, expand=False, fill=True, padding=5) self.expanders[expander.get_property("label")] = expander sep = gtk.HSeparator() self.vbox.pack_start(sep, False, False) def get_expander(self, label): """ Returns an expander by the expander's label name :param label: the name of the expander to return """ if label in self.expanders: return self.expanders[label] else: return None def remove_expander(self, label): """ Remove expander from the infobox by the expander's label bel :param label: the name of th expander to remove Return the expander that was removed from the infobox. """ if label in self.expanders: return self.vbox.remove(self.expanders[label]) def update(self, row): """ Updates the infobox with values from row :param row: the mapper instance to use to update this infobox, this is passed to each of the infoexpanders in turn """ for expander in self.expanders.values(): expanders.update(row) ## TODO: should we just iter over the expanders and update them all #raise NotImplementedError class InfoBox(gtk.Notebook): """ Holds list of expanders with an optional tabbed layout. The default is to not use tabs. To create the InfoBox with tabs use InfoBox(tabbed=True). When using tabs then you can either add expanders directly to the InfoBoxPage or using InfoBox.add_expander with the page_num argument. """ def __init__(self, tabbed=False): super(InfoBox, self).__init__() self.row = None self.set_property('show-border', False) if not tabbed: page = InfoBoxPage() self.insert_page(page, position=0) self.set_property('show-tabs', False) self.set_current_page(0) self.connect('switch-page', self.on_switch_page) # TODO: this seems broken: self == notbook def on_switch_page(self, notebook, dummy_page, page_num, *args): """ Called when a page is switched """ if not self.row: return page = self.get_nth_page(page_num) page.update(self.row) def add_expander(self, expander, page_num=0): """ Add an expander to a page. :param expander: The expander to add. :param page_num: The page number in the InfoBox to add the expander. """ page = self.get_nth_page(page_num) page.add_expander(expander) def update(self, row): """ Update the current page with row. """ self.row = row page_num = self.get_current_page() self.get_nth_page(page_num).update(row) # TODO: should be able to just to a add_link(uri, description) to # add buttons ## class LinkExpander(InfoExpander): ## def __init__(self): ## super(LinkExpander, self).__init__() ## def add_button(button): ## self.vbox.pack_start(button) class SearchParser(object): """ The parser for bauble.view.MapperSearch """ value_chars = Word(alphanums + '%.-_*') # value can contain any string once its quoted value = value_chars | quotedString.setParseAction(removeQuotes) value_list = (value ^ delimitedList(value) ^ OneOrMore(value)) binop = oneOf('= == != <> < <= > >= not like contains has ilike '\ 'icontains ihas is')('binop') domain = Word(alphas, alphanums)('domain') domain_values = Group(value_list.copy()) domain_expression = (domain + Literal('=') + Literal('*') + StringEnd()) \ | (domain + binop + domain_values + StringEnd()) and_token = CaselessKeyword('and') or_token = CaselessKeyword('or') log_op = and_token | or_token identifier = Group(delimitedList(Word(alphas, alphanums+'_'), '.')) ident_expression = Group(identifier + binop + value) query_expression = ident_expression \ + ZeroOrMore(log_op + ident_expression) query = domain + CaselessKeyword('where').suppress() \ + Group(query_expression) + StringEnd() statement = query | domain_expression | value_list def parse_string(self, text): ''' returns a pyparsing.ParseResults objects that represents either a query, an expression or a list of values ''' return self.statement.parseString(text) class SearchStrategy(object): """ Interface for adding search strategies to a view. """ def search(self, text, session): ''' :param text: the search string :param: the session to use for the search Return an iterator that iterates over mapped classes retrieved from the search. ''' pass class MapperSearch(SearchStrategy): """ Mapper Search support three types of search expression: 1. value searches: search that are just list of values, e.g. value1, value2, value3, searches all domains and registered columns for values 2. expression searches: searched of the form domain=value, resolves the domain and searches specific columns from the mapping 3. query searchs: searches of the form domain where ident.ident = value, resolve the domain and identifiers and search for value """ _domains = {} _properties = {} def __init__(self): super(MapperSearch, self).__init__() self._results = ResultSet() self.parser = SearchParser() def add_meta(self, domain, cls, properties): """ Adds search meta to the domain :param domain: a string, list or tuple of domains that will resolve to cls a search string, domain act as a shorthand to the class name :param cls: the class the domain will resolve to :param properties: a list of string names of the properties to search by default """ check(isinstance(properties, list), _('MapperSearch.add_meta(): '\ 'default_columns argument must be list')) check(len(properties) > 0, _('MapperSearch.add_meta(): '\ 'default_columns argument cannot be empty')) if isinstance(domain, (list, tuple)): for d in domain: self._domains[d] = cls, properties else: self._domains[d] = cls, properties self._properties[cls] = properties def on_query(self, s, loc, tokens): """ Called when the parser hits a query token. """ # We build the queries by fetching the ids of the rows that # match the condition and then returning a query to return the # object that have ids in the built query. This might seem # like a roundabout way but it works on databases don't # support union and/or intersect # # TODO: support 'not' as well, e.g sp where # genus.genus=Maxillaria and not genus.family=Orchidaceae domain, expr = tokens check(domain in self._domains, 'Unknown search domain: %s' % domain) cls = self._domains[domain][0] mapper = class_mapper(cls) expr_iter = iter(expr) op = None id_query = self._session.query(cls.id) clause = prev_clause = None for e in expr_iter: idents, cond, val = e #debug('idents: %s, cond: %s, val: %s' % (idents, cond, val)) if val == 'None': val = None if len(idents) == 1: # we get here when the idents only refer to a property # on the mapper table col = idents[0] check(col in mapper.c, 'The %s table does not have a '\ 'column named %s' % \ (mapper.local_table.name, col)) q = id_query.filter(getattr(cls, col).\ op(cond)(utils.utf8(val))) clause = cls.id.in_(q.statement) else: # we get here when the idents refer to a relation on a # mapper/table relations = idents[:-1] col = idents[-1] # TODO: do all the databases quote the same # TODO: need to either stick to a subset of conditions # that work on all database or just normalize the # conditions depending on the databases # since we build the query from a string instead of # trying to resolve the columns and relations then we # need to make sure that None is translated to NULL if val is None and cond in ('=', '==', 'is'): cond = 'is' val = 'NULL' elif val is None and cond in ('!='): cond = 'is not' val = 'NULL' elif val is not None: # use is not None b/c val could be '' val = "'%s'" % val if col in cls.__table__.c and \ relations[-1] == cls.__table__.name: where = "%s %s %s" % ('.'.join(idents), cond, val) elif len(relations) and relations[-1] in \ [t.name for t in bauble.db.metadata.sorted_tables]: # We get here when there are identifiers before # the column and the next to the last ident is a # table. Usually this means that the next to the # last ident is a table and not a join. This # allows us to be more specific about the col in # the case that it is ambiguous. where = "%s.%s %s %s" % (idents[-2], col, cond, val) else: where = "%s %s %s" % (col, cond, val) clause = cls.id.in_(id_query.join(*relations).\ filter(where).statement) if op is not None: check(op in ('and', 'or'), 'Unsupported operator: %s' % op) op = getattr(sqlalchemy.sql, '%s_' % op) clause = op(prev_clause, clause) prev_clause = clause try: op = expr_iter.next() except StopIteration: pass self._results.add(self._session.query(cls).filter(clause)) def on_domain_expression(self, s, loc, tokens): """ Called when the parser hits a domain_expression token """ domain, cond, values = tokens try: cls, properties = self._domains[domain] except KeyError: raise KeyError(_('Unknown search domain: %s' % domain)) query = self._session.query(cls) # select all objects from the domain if values == '*': self._results.add(query) return # TODO: should probably create a normalize_cond() method # to convert things like contains and has into like conditions # TODO: i think that sqlite uses case insensitve like, there # is a pragma to change this so maybe we could send that # command first to handle case sensitive and insensitive # queries # here the equals sign is case insensitive but the double # equals is case sensitive mapper = class_mapper(cls) if cond in ('like', 'ilike', 'contains', 'icontains', 'has', 'ihas'): condition = lambda col: \ lambda val: utils.ilike(mapper.c[col], '%%%s%%' % val) elif cond == '=': condition = lambda col: \ lambda val: utils.ilike(mapper.c[col], utils.utf8(val)) else: condition = lambda col: \ lambda val: mapper.c[col].op(cond)(val) for col in properties: # TODO: i don't know how well this will work out if we're # search for numbers ors = or_(*map(condition(col), values)) self._results.add(query.filter(ors)) return tokens def on_value_list(self, s, loc, tokens): """ Called when the parser hits a value_list token """ # debug('on_value_list()') # debug(' s: %s' % s) # debug(' loc: %s' % loc) # debug(' toks: %s' % tokens) # TODO: should also combine all the values into a single # string and search for that string # make searches case-insensitive, in postgres use ilike, # in other use upper() like = lambda table, col, val: \ utils.ilike(table.c[col], ('%%%s%%' % val)) for cls, columns in self._properties.iteritems(): q = self._session.query(cls) cv = [(c,v) for c in columns for v in tokens] # as of SQLAlchemy>=0.4.2 we convert the value to a unicode # object if the col is a Unicode or UnicodeText column in order # to avoid the "Unicode type received non-unicode bind param" def unicol(col, v): mapper = class_mapper(cls) if isinstance(mapper.c[col].type, (Unicode,UnicodeText)): return unicode(v) else: return v mapper = class_mapper(cls) q = q.filter(or_(*[like(mapper, c, unicol(c, v)) for c,v in cv])) #debug(q) self._results.add(q) def search(self, text, session): """ Returns a ResultSet of database hits for the text search string. If session=None then the session should be closed after the results have been processed or it is possible that some database backends could cause deadlocks. """ self._session = session # this looks kinda ridiculous to add the parse actions and # then remove them but then it allows us to reuse the parser # for other things, particulary tests, without calling the # parse actions self.parser.query.setParseAction(self.on_query) self.parser.domain_expression.setParseAction(self.on_domain_expression) self.parser.value_list.setParseAction(self.on_value_list) self._results.clear() self.parser.parse_string(text) self.parser.query.parseAction = [] self.parser.domain_expression.parseAction = [] self.parser.value_list.parseAction = [] return self._results # TODO: it would handy if we could support some sort of smart slicing # where we chould slice across the different sets and still return the # query values using LIMIT queries class ResultSet(object): ''' A ResultSet represents a set of results returned from a query, it allows you to add results to the set and then iterate over all the results as if they were one set. It will only return objects that are unique between all the results. ''' def __init__(self, results=None): self._results = set() if results: self.add(results) def add(self, results): if isinstance(results, (list, tuple, set)): self._results.update(results) else: self._results.add(results) def __len__(self): # it's possible, but unlikely that int() can truncate the value return int(self.count()) def count(self): ''' return the number of total results from all of the members of this results set, does not take into account duplicate results ''' ctr = 0 for r in self._results: if isinstance(r, Query): ctr += r.count() elif hasattr(r, '__iter__'): ctr += len(r) else: ctr += 1 return ctr def __iter__(self): # If this ResultSet contains other ResultSets that are large # we'll be creating lots of large set objects. This shouldn't # be too much of a problem since the sets would only be # holding references to the same object self._iterset = set() self._iter = itertools.chain(*self._results) return self def next(self): ''' returns unique items from the result set ''' v = self._iter.next() if v not in self._iterset: # only return unique objects self._iterset.add(v) return v else: return self.next() def clear(self): """ Clear out the set. """ del self._results self._results = set() class SearchView(pluginmgr.View): """ The SearchView is the main view for Bauble. It manages the search results returned when search strings are entered into the main text entry. """ class ViewMeta(dict): """ This class shouldn't need to be instantiated directly. Access the meta for the SearchView with the :class:`bauble.view.SearchView`'s view_meta property. """ class Meta(object): def __init__(self): self.children = None self.infobox = None self.context_menu_desc = None self.markup_func = None def set(self, children=None, infobox=None, context_menu=None, markup_func=None): ''' :param children: where to find the children for this type, can be a callable of the form C{children(row)} :param infobox: the infobox for this type :param context_menu: a dict describing the context menu used when the user right clicks on this type :param markup_func: the function to call to markup search results of this type, if markup_func is None the instances __str__() function is called ''' self.children = children self.infobox = infobox self.context_menu_desc = context_menu self.markup_func = markup_func def get_children(self, obj): ''' :param obj: get the children from obj according to self.children, the returned object should support __len__, if you want to return a query then wrap it in a ResultSet ''' if self.children is None: return [] if callable(self.children): return self.children(obj) return getattr(obj, self.children) def __getitem__(self, item): if item not in self: # create on demand self[item] = self.Meta() return self.get(item) view_meta = ViewMeta() ''' the search strategy is keyed by domain and each value will be a list of SearchStrategy instances ''' search_strategies = [MapperSearch()] @classmethod def add_search_strategy(cls, strategy): cls.search_strategies.append(strategy()) @classmethod def get_search_strategy(cls, name): for strategy in cls.search_strategies: if strategy.__class__.__name__ == name: return strategy def __init__(self): ''' the constructor ''' super(SearchView, self).__init__() self.create_gui() # we only need this for the timeout version of populate_results self.populate_callback_id = None # the context menu cache holds the context menus by type in the results # view so that we don't have to rebuild them every time self.context_menu_cache = {} self.infobox_cache = {} self.infobox = None # keep all the search results in the same session, this should # be cleared when we do a new search self.session = bauble.Session() def update_infobox(self): ''' sets the infobox according to the currently selected row or remove the infobox is nothing is selected ''' self.set_infobox_from_row(None) values = self.get_selected_values() if len(values) == 0: return try: self.set_infobox_from_row(values[0]) except Exception, e: debug('SearchView.update_infobox: %s' % e) debug(traceback.format_exc()) self.set_infobox_from_row(None) def set_infobox_from_row(self, row): ''' get the infobox from the view meta for the type of row and set the infobox values from row :param row: the row to use to update the infobox ''' # remove the current infobox if there is one and stop # debug('set_infobox_from_row: %s -- %s' % (row, repr(row))) if row is None: if self.infobox is not None and self.infobox.parent == self.pane: self.pane.remove(self.infobox) return new_infobox = None selected_type = type(row) # check if we've already created an infobox of this type, # if not create one and put it in self.infobox_cache if selected_type in self.infobox_cache.keys(): new_infobox = self.infobox_cache[selected_type] elif selected_type in self.view_meta and \ self.view_meta[selected_type].infobox is not None: new_infobox = self.view_meta[selected_type].infobox() self.infobox_cache[selected_type] = new_infobox # remove any old infoboxes connected to the pane if self.infobox is not None and \ type(self.infobox) != type(new_infobox): if self.infobox.parent == self.pane: self.pane.remove(self.infobox) # update the infobox and put it in the pane self.infobox = new_infobox if self.infobox is not None: self.pane.pack2(self.infobox, resize=False, shrink=True) self.pane.show_all() self.infobox.update(row) def get_selected_values(self): ''' Return the values in all the selected rows. ''' model, rows = self.results_view.get_selection().get_selected_rows() if model is None: return None return [model[row][0] for row in rows] def on_results_view_select_row(self, view): ''' add and removes the infobox which should change depending on the type of the row selected ''' self.update_infobox() nresults_statusbar_context = 'searchview.nresults' ## @staticmethod ## def dump_garbage(): ## """ ## show us what's the garbage about ## """ ## # force collection ## print "\nGARBAGE:" ## gc.collect() ## print "\nGARBAGE OBJECTS:" ## for x in gc.garbage: ## s = str(x) ## if len(s) > 80: ## s = s[:80] ## print type(x),"\n ", s def search(self, text): ''' search the database using text ''' # set the text in the entry even though in most cases the entry already # has the same text in it, this is in case this method was called from # outside the class so the entry and search results match # debug('SearchView.search(%s)' % text) # TODO: we should cancel any current running searches # this will probably have to wait until we have a better task # handling API, see: # https://bugs.launchpad.net/bauble/+bug/378897 results = ResultSet() error_msg = None error_details_msg = None self.session.close() # create a new session for each search...maybe we shouldn't # even have session as a class attribute self.session = bauble.Session() bold = '%s' try: for strategy in self.search_strategies: results.add(strategy.search(text, self.session)) except ParseException, err: error_msg = _('Error in search string at column %s') % err.column except (BaubleError, AttributeError, Exception, SyntaxError), e: debug(traceback.format_exc()) error_msg = _('** Error: %s') % utils.xml_safe_utf8(e) error_details_msg = traceback.format_exc() if error_msg: bauble.gui.error_msg(error_msg, error_details_msg) return # not error utils.clear_model(self.results_view) self.set_infobox_from_row(None) statusbar = bauble.gui.widgets.statusbar sbcontext_id = statusbar.get_context_id('searchview.nresults') statusbar.pop(sbcontext_id) if len(results) == 0: model = gtk.ListStore(str) model.append([bold % _('Couldn\'t find anything')]) self.results_view.set_model(model) else: if len(results) > 5000: msg = _('This query returned %s results. It may take a '\ 'long time to get all the data. Are you sure you '\ 'want to continue?') % len(results) if not utils.yes_no_dialog(msg): return statusbar.push(sbcontext_id, _("Retrieving %s search " \ "results...") % len(results)) if len(results) > 1000: self.populate_results(results) else: task = self._populate_worker(results) while True: try: task.next() except StopIteration: break self.results_view.set_cursor(0) statusbar.pop(sbcontext_id) statusbar.push(sbcontext_id, _("%s search results") % len(results)) def remove_children(self, model, parent): """ remove all children of some parent in the model, reverse iterate through them so you don't invalidate the iter """ while model.iter_has_child(parent): nkids = model.iter_n_children(parent) child = model.iter_nth_child(parent, nkids-1) model.remove(child) def on_test_expand_row(self, view, treeiter, path, data=None): ''' look up the table type of the selected row and if it has any children then add them to the row ''' expand = False model = view.get_model() row = model.get_value(treeiter, 0) view.collapse_row(path) self.remove_children(model, treeiter) try: kids = self.view_meta[type(row)].get_children(row) if len(kids) == 0: return True except saexc.InvalidRequestError, e: debug(utils.utf8(e)) model = self.results_view.get_model() for found in utils.search_tree_model(model, row): model.remove(found) return True except Exception, e: debug(utils.utf8(e)) debug(traceback.format_exc()) return True else: self.append_children(model, treeiter, kids) return False def populate_results(self, results, check_for_kids=False): """ :param results: a ResultSet instance :param check_for_kids: only used for testing This method adds results to the search view in a task. """ def on_error(exc): error('SearchView.populate_results:') error(exc) def on_quit(): try: self.results_view.set_cursor(0) except Exception, e: debug(e) return bauble.task.queue(self._populate_worker, on_quit, on_error, results, check_for_kids) def _populate_worker(self, results, check_for_kids=False): """ Generator function for adding the search results to the model. This method is usually called by self.populate_results() """ nresults = len(results) model = gtk.TreeStore(object) model.set_default_sort_func(lambda *args: -1) model.set_sort_column_id(-1, gtk.SORT_ASCENDING) utils.clear_model(self.results_view) # group the results by type. this is where all the results are # actually fetched from the database groups = [] for key, group in itertools.groupby(results, lambda x: type(x)): groups.append(sorted(group, key=utils.natsort_key)) # sort the groups by type so we more or less always get the # results by type in the same order groups = sorted(groups, key=lambda x: type(x[0])) chunk_size = 100 update_every = 200 steps_so_far = 0 # iterate over slice of size "steps", yield after adding each # slice to the model #for obj in itertools.islice(itertools.chain(*groups), 0,None, steps): #for obj in itertools.islice(itertools.chain(results), 0,None, steps): for obj in itertools.chain(*groups): parent = model.append(None, [obj]) obj_type = type(obj) if check_for_kids: kids = self.view_meta[obj_type].get_children(obj) if len(kids) > 0: model.append(parent, ['-']) elif self.view_meta[obj_type].children is not None: model.append(parent, ['-']) #steps_so_far += chunk_size steps_so_far += 1 if steps_so_far % update_every == 0: percent = float(steps_so_far)/float(nresults) if 0< percent < 1.0: bauble.gui.progressbar.set_fraction(percent) yield self.results_view.freeze_child_notify() self.results_view.set_model(model) self.results_view.thaw_child_notify() def append_children(self, model, parent, kids): ''' append object to a parent iter in the model :param model: the model the append to :param parent: the parent gtk.TreeIter :param kids: a list of kids to append @return: the model with the kids appended ''' check(parent is not None, "append_children(): need a parent") #debug([str(k) for k in sorted(kids, key=utils.natsort_key)]) #for k in sorted(kids, key=utils.natsort_key): for k in kids: i = model.append(parent, [k]) if self.view_meta[type(k)].children is not None: model.append(i, ["_dummy"]) return model def cell_data_func(self, col, cell, model, iter): value = model[iter][0] #debug('%s(%s)' % (value, type(value))) path = model.get_path(iter) tree_rect = self.results_view.get_visible_rect() cell_rect = self.results_view.get_cell_area(path, col) if cell_rect.y > tree_rect.height: # only update the cells if they're visible...this # drastically speeds up populating the view with large # datasets return if isinstance(value, basestring): cell.set_property('markup', value) else: try: func = self.view_meta[type(value)].markup_func if func is not None: r = func(value) if isinstance(r, (list,tuple)): main, substr = r else: main = r substr = '(%s)' % type(value).__name__ else: main = utils.xml_safe(str(value)) substr = '(%s)' % type(value).__name__ cell.set_property('markup', '%s\n%s' % \ (_mainstr_tmpl % utils.utf8(main), _substr_tmpl % utils.utf8(substr))) except (saexc.InvalidRequestError, TypeError), e: #warning('bauble.view.SearchView.cell_data_func(): \n%s' % e) def remove(): model = self.results_view.get_model() self.results_view.set_model(None) # detach model for found in utils.search_tree_model(model, value): model.remove(found) self.results_view.set_model(model) gobject.idle_add(remove) def get_expanded_rows(self): ''' return all the rows in the model that are expanded ''' expanded_rows = [] self.results_view.map_expanded_rows(lambda view, path: expanded_rows.append(gtk.TreeRowReference(view.get_model(), path))) # seems to work better if we passed the reversed rows to # self.expand_to_all_refs expanded_rows.reverse() return expanded_rows def expand_to_all_refs(self, references): ''' :param references: a list of TreeRowReferences to expand to Note: This method calls get_path() on each gtk.TreeRowReference in which apparently invalidates the reference. ''' for ref in references: if ref.valid(): self.results_view.expand_to_path(ref.get_path()) def on_view_button_release(self, view, event, data=None): """ Popup a context menu on the selected row. """ # TODO: should probably fix this so you can right click on something # that is not the selection, but get the path from where the click # happened, make that that selection and then popup the menu, # see the pygtk FAQ about this at #http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq13.017.htp if event.button != 3: return # if not right click then leave values = self.get_selected_values() model, paths = self.results_view.get_selection().get_selected_rows() if len(paths) > 1: return selected_type = type(values[0]) if self.view_meta[selected_type].context_menu_desc is None: # no context menu return menu = None try: menu = self.context_menu_cache[selected_type] except Exception: menu = gtk.Menu() for label, func in self.view_meta[selected_type].context_menu_desc: if label == '--': menu.add(gtk.SeparatorMenuItem()) else: def on_activate(item, f): value = self.get_selected_values()[0] result = False try: result = f(value) except Exception, e: msg = utils.xml_safe_utf8(str(e)) utils.message_details_dialog(msg, traceback.format_exc(), gtk.MESSAGE_ERROR) debug(traceback.format_exc()) if result: self.reset_view() item = gtk.MenuItem(label) item.connect('activate', on_activate, func) menu.add(item) self.context_menu_cache[selected_type] = menu menu.show_all() menu.popup(None, None, None, event.button, event.time) def reset_view(self): """ expire all the children in the model, collapse everything, reexpand the rows to the previous state where possible and update the infobox """ # TODO: we should do some profiling to see how this method # performs on large datasets model, paths = self.results_view.get_selection().get_selected_rows() ref = gtk.TreeRowReference(model, paths[0]) for obj in self.session: try: self.session.expire(obj) except saexc.InvalidRequestError, e: # TODO: i was originally thinking to remove the object # if there was an error when trying to expire it but # if the model is big to search through the entire # model for the obj would be expensive...maybe if we # iterated through the model instead of the session # then we would only be going through the model # once...then again, what's the consequences of this # error and should we even worry about it #debug(e) pass expanded_rows = self.get_expanded_rows() self.results_view.collapse_all() # expand_to_all_refs will invalidate the ref so get the path first path = None if ref.valid(): path = ref.get_path() self.expand_to_all_refs(expanded_rows) self.results_view.set_cursor(path) def on_view_row_activated(self, view, path, column, data=None): ''' expand the row on activation ''' view.expand_row(path, False) def create_gui(self): ''' create the interface ''' # create the results view and info box self.results_view = gtk.TreeView() # will be a select results row self.results_view.set_headers_visible(False) self.results_view.set_rules_hint(True) #self.results_view.set_fixed_height_mode(True) #self.results_view.set_fixed_height_mode(False) selection = self.results_view.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) self.results_view.set_rubber_banding(True) renderer = gtk.CellRendererText() renderer.set_fixed_height_from_font(2) renderer.set_property('ellipsize', pango.ELLIPSIZE_END) column = gtk.TreeViewColumn("Name", renderer) column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) column.set_cell_data_func(renderer, self.cell_data_func) self.results_view.append_column(column) # view signals self.results_view.connect("cursor-changed", self.on_results_view_select_row) self.results_view.connect("test-expand-row", self.on_test_expand_row) self.results_view.connect("button-release-event", self.on_view_button_release) self.results_view.connect("row-activated", self.on_view_row_activated) # scrolled window for the results view sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sw.add(self.results_view) # pane to split the results view and the infobox, the infobox # is created when a row in the results is selected self.pane = gtk.HPaned() self.pane.pack1(sw, resize=True, shrink=True) self.pack_start(self.pane) self.show_all() def select_in_search_results(obj): """ :param obj: the object the select @returns: a gtk.TreeIter to the selected row Search the tree model for obj if it exists then select it if not then add it and select it. The the obj is not in the model then we add it. """ check(obj != None, 'select_in_search_results: arg is None') view = bauble.gui.get_view() if not isinstance(view, SearchView): return None model = view.results_view.get_model() found = utils.search_tree_model(model, obj) row_iter = None if len(found) > 0: row_iter = found[0] else: row_iter = model.append(None, [obj]) model.append(row_iter, ['-']) view.results_view.set_cursor(model.get_path(row_iter)) return row_iter class DefaultCommandHandler(pluginmgr.CommandHandler): def __init__(self): super(DefaultCommandHandler, self).__init__() self.view = None command = None def get_view(self): if self.view is None: self.view = SearchView() return self.view def __call__(self, arg): self.view.search(arg) bauble-0.9.7/bauble/bauble.glade0000644000175000017500000002214311210626427015470 0ustar brettbrett Bauble bauble bauble 800 600 True True True False False True True True -- True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_ENTER_NOTIFY_MASK False 3 True 0 True gtk-find False 5 GTK_PACK_END 1 False False 2 1 True True True True True 0.05000000074505806 5 10 -- True True True True GTK_RELIEF_NONE False 0 0 False False False False 1 False False True True 0.05000000074505806 -- True Show details label_item 1 False False True 1 2 True False 1 bauble-0.9.7/bauble/task.py0000755000175000017500000001062211232617100014546 0ustar brettbrett# # task.py """ The bauble.task module allows you to queue up long running tasks. The running tasks still block but allows the GUI to update. """ import Queue import gobject import gtk import bauble import bauble.utils as utils from bauble.utils.log import debug, error _task_queue = Queue.Queue(0) # TODO: after some specified time the status bar should be cleared but not # too soon, maybe 30 seconds or so but only once the queue is empty, anytime # something is added to the queue we should set a 30 second timeout to # check again if the queue is empty and set the status bar message if it's # empty # TODO: catch the quit or closes signals and see if there are any running tasks # and send then the task cancel signal so they can ask the user if they # really wan't to cancel the task # TODO: test callback # WARNING: tasks don't work if called inside a gobject.idle_add # callback...UPDATE: it seems like they do but they're touchy, we run # bauble.create_database() inside of bauble._post_loop which # eventually calls cvs import which is a task # TODO: provide a way to create background tasks that don't call set_busy() def _update_gui(): while gtk.events_pending(): gtk.main_iteration(block=False) class TaskQuitting(Exception): pass def _run_task(func, *args, **kwargs): global __gtk_quitting task = func(*args, **kwargs) try: while True: if not __gtk_quitting: task.next() _update_gui() # TODO: should we sleep here for maybe 1ms to make # things more responsive else: raise TaskQuitting except StopIteration: pass __message_ids = [] def set_message(msg): """ A convenience function for setting a message on the statusbar. Returns the message id """ if bauble.gui is None or bauble.gui.widgets is None: return global _context_id try: _context_id except NameError, e: # context_id not defined _context_id = bauble.gui.widgets.statusbar.get_context_id('__task') msg_id = bauble.gui.widgets.statusbar.push(_context_id, msg) __message_ids.append(msg_id) return msg_id def clear_messages(): """ Clear all the messages from the statusbar that were set with :func:`bauble.task.set_message` """ if bauble.gui is None or bauble.gui.widgets is None \ or bauble.gui.widgets.statusbar is None: return global _context_id, __message_ids for id in __message_ids: bauble.gui.widgets.statusbar.remove(_context_id, id) _flushing = False def flush(): ''' Flush out the task queue. This is normally called by :func:`bauble.task.queue` ''' global _flushing if _flushing: return _flushing = True bauble.set_busy(True) while not _task_queue.empty(): if bauble.gui is not None: bauble.gui.progressbar.show() bauble.gui.progressbar.set_pulse_step(1.0) bauble.gui.progressbar.set_fraction(0) func, on_quit, on_error, args = _task_queue.get() try: _run_task(func, *args) if on_quit: on_quit() except (GeneratorExit, TaskQuitting), e: raise except Exception, e: # we can't raise an exception here since the other # pending tasks would be able to complete...on_error also # shouldn't raise an exception #gobject.idle_add(on_error, e) error(e) if on_error: on_error(e) bauble.set_busy(False) clear_messages() if bauble.gui is not None: bauble.gui.progressbar.set_pulse_step(0) bauble.gui.progressbar.set_fraction(0) bauble.gui.progressbar.hide() _flushing = False __quit_handler_id = None __gtk_quitting = False def _quit(): global __gtk_quitting __gtk_quitting = True return 0 # return 0 to remove from gtk quit handlers def queue(task, on_quit, on_error, *args): """ Queue a new task :param task: the task to queue :param callback: the function to call when the task is finished :param args: the arguments to pass to the task """ global _task_queue global __quit_handler_id if __quit_handler_id is None: level = gtk.main_level() __quit_handler_id = gtk.quit_add(level, _quit) _task_queue.put((task, on_quit, on_error, args)) flush() bauble-0.9.7/bauble/plugins/0000755000175000017500000000000011310570250014710 5ustar brettbrettbauble-0.9.7/bauble/plugins/plants/0000755000175000017500000000000011310570250016211 5ustar brettbrettbauble-0.9.7/bauble/plugins/plants/species_model.py0000755000175000017500000003421111267162050021410 0ustar brettbrett# # species_model.py # import traceback import xml.sax.saxutils as sax import gtk from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.orm.session import object_session from sqlalchemy.ext.associationproxy import association_proxy import bauble import bauble.db as db import bauble.utils as utils from bauble.utils.log import log, debug from bauble.types import Enum from bauble.plugins.plants.geography import Geography#, geography_table from sqlalchemy.orm.collections import collection class VNList(list): """ A Collection class for Species.vernacular_names This makes it possible to automatically remove a default_vernacular_name if the vernacular_name is removed from the list. """ def remove(self, vn): super(VNList, self).remove(vn) try: if vn.species.default_vernacular_name == vn: del vn.species.default_vernacular_name except Exception, e: debug(e) # ***** supported names # Genus sp # Genus sp sp_author # Genus sp_hybrid (cv.) 'infrasp' # not supported any more? # Genus sp_hybrid sp # Genus sp sp_hybrid infrasp # Genus sp infrasp_rank infrasp # Genus sp (cv.) 'infrasp' # Genus sp cv_group # Genus sp (cv.) (cv_group) 'infrasp' # ***** names we don't support # Genux sp x sp2 [infrasp_rank] infrasp # Genus sp infrasp_rank infrasp 'cv' # eg Rudbeckia fulgida var. sullivantii 'Goldsturm', # we can't support this without more infrasp and infrasp_rank fields, # like BGRecorder # ***** are these even valid # Genus x sp sp_author # Genus sp sp_athor x infrasp infrasp_author # TODO: there is a trade_name column but there's no support yet for editing # the trade_name or for using the trade_name when building the string # for the species, for more information about trade_names see, # http://www.hortax.org.uk/gardenplantsnames.html class Species(db.Base): """ :Table name: species :Columns: *sp_hybrid*: Hybrid flag Possible values: H: A hybrid formula for an Interspecific hybrid x: A Nothotaxon name for an Interspecific hybrid +: An Interspecific graft hybrid or graft chimaera *sp_qual*: Species qualifier Possible values: *agg.*: An aggregate species *s. lat.*: aggregrate species (sensu lato) *s. str.*: segregate species (sensu stricto) *infrasp_rank*: The infraspecific rank Possible values: *subsp.*: subspecies *variety.*: variety *subvar.*: sub variety *f.*: form *subf.*: subform *cv.*: cultivar *infrasp*: The infraspecific epithet :Properties: *accessions*: *vernacular_names*: *default_vernacular_name*: *synonyms*: *distribution*: :Constraints: The combination of sp, sp_author, sp_hybrid, sp_qual, cv_group, trade_name, infrasp, infrasp_author, infrasp_rank, genus_id """ __tablename__ = 'species' __table_args__ = (UniqueConstraint('sp', 'sp_author', 'sp_hybrid', 'sp_qual', 'cv_group', 'trade_name', 'infrasp', 'infrasp_author', 'infrasp_rank', 'genus_id', name='species_index')) _mapper_args__ = {'order_by': ['sp', 'sp_author', 'infrasp_rank', 'infrasp']} # columns sp = Column(Unicode(64), nullable=False, index=True) sp_author = Column(Unicode(128)) sp_hybrid = Column(Enum(values=['x', '+', 'H', '']), default=u'') sp_qual = Column(Enum(values=['agg.', 's. lat.', 's. str.', '']), default=u'') cv_group = Column(Unicode(50)) trade_name = Column(Unicode(64)) infrasp = Column(Unicode(50)) infrasp_author = Column(Unicode(255)) infrasp_rank = Column(Enum(values=['subsp.', 'var.', 'subvar.', 'f.', 'subf.', 'cv.', '']), default=u'') notes = Column(UnicodeText) genus_id = Column(Integer, ForeignKey('genus.id'), nullable=False) # relations synonyms = association_proxy('_synonyms', 'synonym') _synonyms = relation('SpeciesSynonym', primaryjoin='Species.id==SpeciesSynonym.species_id', cascade='all, delete-orphan', uselist=True, backref='species') # this is a dummy relation, it is only here to make cascading work # correctly and to ensure that all synonyms related to this genus # get deleted if this genus gets deleted __syn = relation('SpeciesSynonym', primaryjoin='Species.id==SpeciesSynonym.synonym_id', cascade='all, delete-orphan', uselist=True) vernacular_names = relation('VernacularName', cascade='all, delete-orphan', collection_class=VNList, backref=backref('species', uselist=False)) _default_vernacular_name = relation('DefaultVernacularName', uselist=False, cascade='all, delete-orphan', backref=backref('species', uselist=False)) distribution = relation('SpeciesDistribution', cascade='all, delete-orphan', backref=backref('species', uselist=False)) def __init__(self, *args, **kwargs): super(Species, self).__init__(*args, **kwargs) def __str__(self): ''' returns a string representation of this species, calls Species.str(self) ''' return Species.str(self) def _get_default_vernacular_name(self): if self._default_vernacular_name is None: return None return self._default_vernacular_name.vernacular_name def _set_default_vernacular_name(self, vn): if vn is None: del self.default_vernacular_name return if vn not in self.vernacular_names: self.vernacular_names.append(vn) d = DefaultVernacularName() d.vernacular_name = vn self._default_vernacular_name = d def _del_default_vernacular_name(self): utils.delete_or_expunge(self._default_vernacular_name) del self._default_vernacular_name default_vernacular_name = property(_get_default_vernacular_name, _set_default_vernacular_name, _del_default_vernacular_name) def distribution_str(self): if self.distribution is None: return '' else: dist = ['%s' % d for d in self.distribution] return unicode(', ').join(sorted(dist)) def markup(self, authors=False): ''' returns this object as a string with markup @param authors: flag to toggle whethe the author names should be included ''' return Species.str(self, authors, True) @staticmethod def str(species, authors=False, markup=False): ''' returns a string for species @param species: the species object to get the values from @param authors: flags to toggle whether the author names should be included @param markup: flags to toggle whether the returned text is marked up to show italics on the epithets ''' genus = str(species.genus) sp = species.sp infrasp = species.infrasp if markup: italic = u'%s' #genus = italic % species.genus genus = italic % utils.xml_safe_utf8(genus) if sp is not None: # shouldn't really be allowed sp = italic % species.sp # the infrasp italic is handled below #escape = sax.escape escape = utils.xml_safe_utf8 if species.infrasp_rank not in (u'cv.', 'cv.'): infrasp = italic % species.infrasp else: italic = u'%s' escape = lambda x: x author = None isp_author = None if authors: if species.sp_author: author = escape(species.sp_author) if species.infrasp_author: isp_author = escape(species.infrasp_author) if species.sp_hybrid: # is a hybrid if species.infrasp: if not species.infrasp_rank: name = [s for s in [genus, sp, author, species.sp_hybrid, infrasp, isp_author] \ if s is not None] elif species.infrasp_rank in (u'cv.', 'cv.'): if species.cv_group: cv = "(%s Group) '%s'" % \ (species.cv_group, infrasp) else: cv = "'%s'" % infrasp name = [s for s in [genus, species.sp_hybrid, sp, author, cv, isp_author] \ if s not in (None, '')] else: name = [s for s in [genus, species.sp_hybrid, sp, author, species.infrasp_rank, infrasp, isp_author] \ if s not in (None, '')] else: name = [s for s in [genus, species.sp_hybrid, sp, author] \ if s not in (None, '')] else: # isn't a hybrid if species.cv_group: if species.infrasp is None: cv = None group = '%s Group' % species.cv_group else: cv = "'%s'" % infrasp group = '(%s Group)' % species.cv_group name = [s for s in [genus, sp, author, group, cv, isp_author] \ if s not in (None, '')] else: if species.infrasp is None: isp = None isp_rank = None else: if species.infrasp_rank == 'cv.': isp_rank = None isp = "'%s'" % (species.infrasp or '') else: isp_rank = species.infrasp_rank #isp = italic % species.infrasp isp = infrasp name = [s for s in [genus, sp, author, isp_rank, isp, isp_author] if s not in (None, '')] if species.sp_qual not in (None, ''): name.append(species.sp_qual) s = u' '.join(name) return s class SpeciesSynonym(db.Base): """ :Table name: species_synonym """ __tablename__ = 'species_synonym' __table_args__ = (UniqueConstraint('species_id', 'synonym_id', name='species_synonym_index')) # columns species_id = Column(Integer, ForeignKey('species.id'), nullable=False) synonym_id = Column(Integer, ForeignKey('species.id'), nullable=False) # relations synonym = relation('Species', uselist=False, primaryjoin='SpeciesSynonym.synonym_id==Species.id') def __init__(self, synonym=None, **kwargs): # it is necessary that the first argument here be synonym for # the Species.synonyms association_proxy to work self.synonym = synonym super(SpeciesSynonym, self).__init__(**kwargs) def __str__(self): return str(self.synonym) class VernacularName(db.Base): """ :Table name: vernacular_name :Columns: *name*: the vernacular name *language*: language is free text and could include something like UK or US to identify the origin of the name *species_id*: key to the species this vernacular name refers to :Properties: :Constraints: """ __tablename__ = 'vernacular_name' name = Column(Unicode(128), nullable=False) language = Column(Unicode(128)) species_id = Column(Integer, ForeignKey('species.id'), nullable=False) __table_args__ = ((UniqueConstraint('name', 'language', 'species_id', name='vn_index'))) def __str__(self): return self.name class DefaultVernacularName(db.Base): """ :Table name: default_vernacular_name DefaultVernacularName is not meant to be instantiated directly. Usually the default vernacular name is set on a species by setting the default_vernacular_name property on Species to a VernacularName instance :Columns: *id*: Integer, primary_key *species_id*: foreign key to species.id, nullable=False *vernacular_name_id*: :Properties: :Constraints: """ __tablename__ = 'default_vernacular_name' __table_args__ = (UniqueConstraint('species_id', 'vernacular_name_id', name='default_vn_index'), {}) # columns species_id = Column(Integer, ForeignKey('species.id'), nullable=False) vernacular_name_id = Column(Integer, ForeignKey('vernacular_name.id'), nullable=False) # relations vernacular_name = relation(VernacularName, uselist=False) def __str__(self): return str(self.vernacular_name) class SpeciesDistribution(db.Base): """ :Table name: species_distribution :Columns: :Properties: :Constraints: """ __tablename__ = 'species_distribution' # columns geography_id = Column(Integer, ForeignKey('geography.id'), nullable=False) species_id = Column(Integer, ForeignKey('species.id'), nullable=False) def __str__(self): return str(self.geography) # late bindings SpeciesDistribution.geography = relation('Geography', primaryjoin='SpeciesDistribution.geography_id==Geography.id', uselist=False) bauble-0.9.7/bauble/plugins/plants/infoboxes.glade0000644000175000017500000005743611210626427021231 0ustar brettbrett species_window 440 250 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 5 -- True GTK_JUSTIFY_FILL True 4 2 15 8 0 -- 1 2 1 2 GTK_FILL True 1 <b>Distribution:</b> True 3 4 GTK_FILL True 1 <b># of Plants:</b> True 2 3 GTK_FILL True 1 <b># of Accessions:</b> True 1 2 GTK_FILL True 0 -- 1 2 2 3 GTK_FILL True 0 -- True 1 2 3 4 GTK_FILL False False 1 True True 0 -- False False False 1 True 5 False 2 True True GTK_WRAP_WORD False 3 genus_window True True 5 True True 0 False False True True 0 -- 1 5 True 3 2 15 8 True 0 -- 1 2 2 3 True 0 -- 1 2 1 2 True 0 -- 1 2 True 1 <b># of Species:</b> True GTK_FILL True 1 <b># of Plants:</b> True 2 3 GTK_FILL True 1 <b># of Accessions:</b> True 1 2 GTK_FILL False False 1 False True False 1 True True True GTK_WRAP_WORD False 2 family_window True True True 0 8 False False True 4 2 15 8 True 0 -- 1 2 3 4 GTK_FILL True 0 -- 1 2 2 3 GTK_FILL True 0 -- 1 2 1 2 GTK_FILL True 0 -- 1 2 GTK_FILL True 1 <b># of Plants</b> True 3 4 GTK_FILL True 1 <b># of Accessions:</b> True 2 3 GTK_FILL True 1 <b># of Species:</b> True 1 2 GTK_FILL True 1 <b># of Genera:</b> True GTK_FILL 1 True 1 True True True GTK_WRAP_WORD 2 bauble-0.9.7/bauble/plugins/plants/species.py0000755000175000017500000003523311235051462020234 0ustar brettbrett# # species.py # import bauble.pluginmgr as pluginmgr from bauble.plugins.plants.species_editor import * from bauble.plugins.plants.species_model import * from bauble.view import SearchView, SearchStrategy, MapperSearch, \ PropertiesExpander import bauble.utils.desktop as desktop __all__ = ['Species', 'SpeciesSynonym', 'VernacularName', 'species_context_menu', 'species_markup_func', 'species_get_kids', 'vernname_get_kids', 'vernname_markup_func', 'vernname_context_menu', 'SpeciesEditor', 'SpeciesInfoBox', 'VernacularNameInfoBox', 'DefaultVernacularName', 'SpeciesDistribution', 'edit_callback', 'add_accession_callback', 'remove_callback', 'call_on_species'] # TODO: we need to make sure that this will still work if the # AccessionPlugin is not present, this means that we would have to # change the species context menu, getting the children from the # search view and what else def edit_callback(value): from bauble.plugins.plants.species_editor import SpeciesEditor return SpeciesEditor(model=value).start() != None def remove_callback(species): """ The callback function to remove a species from the species context menu. """ from bauble.plugins.garden.accession import Accession session = bauble.Session() nacc = session.query(Accession).filter_by(species_id=species.id).count() safe_str = utils.xml_safe_utf8(str(species)) if nacc > 0: msg = _('The species %s has %s accessions. Are you sure ' 'you want remove it?') % (safe_str, nacc) else: msg = _("Are you sure you want to remove the species %s?") \ % safe_str if not utils.yes_no_dialog(msg): return try: obj = session.query(Species).get(species.id) session.delete(obj) session.commit() except Exception, e: msg = _('Could not delete.\n\n%s') % utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), type=gtk.MESSAGE_ERROR) finally: session.close() return True def call_on_species(func): return lambda value : func(value.species) def add_accession_callback(value): from bauble.plugins.garden.accession import Accession, AccessionEditor session = bauble.Session() e = AccessionEditor(model=Accession(species=session.merge(value))) return e.start() != None species_context_menu = [(_('Edit'), edit_callback), ('--', None), (_('Remove'), remove_callback)] vernname_context_menu = [(_('Edit'), call_on_species(edit_callback)), ('--', None)] def species_markup_func(species): ''' ''' # TODO: add (syn) after species name if there are species synonyms that # refer to the id of this plant if len(species.vernacular_names) > 0: substring = '%s -- %s' % \ (species.genus.family, \ ', '.join([str(v) for v in species.vernacular_names])) else: substring = '%s' % species.genus.family return species.markup(authors=False), substring def species_get_kids(species): try: return sorted(species.accessions, key=utils.natsort_key) except Exception: return [] def vernname_get_kids(vernname): ''' ''' # TODO: should probably just create an accessions property on vername that # does the same thing as vername.species.accessions and might even make # it faster if we create the join directly instead of loading the species # first try: return sorted(vernname.species.accessions, key=utils.natsort_key) except Exception: return [] def vernname_markup_func(vernname): ''' ''' return str(vernname), vernname.species.markup(authors=False) from bauble.view import InfoBox, InfoBoxPage, InfoExpander, \ select_in_search_results # # Species infobox for SearchView # class VernacularExpander(InfoExpander): ''' the constructor ''' def __init__(self, widgets): InfoExpander.__init__(self, _("Vernacular Names"), widgets) vernacular_box = self.widgets.sp_vernacular_box self.widgets.remove_parent(vernacular_box) self.vbox.pack_start(vernacular_box) def update(self, row): ''' update the expander @param row: the row to get thevalues from ''' if len(row.vernacular_names) == 0: self.set_sensitive(False) self.set_expanded(False) else: names = [] for vn in row.vernacular_names: if row.default_vernacular_name is not None \ and vn == row.default_vernacular_name: names.insert(0, '%s - %s (default)' % \ (vn.name, vn.language)) else: names.append('%s - %s' % \ (vn.name, vn.language)) self.set_widget_value('sp_vernacular_data', '\n'.join(names)) self.set_sensitive(True) # TODO: get expanded state from prefs self.set_expanded(True) class SynonymsExpander(InfoExpander): def __init__(self, widgets): InfoExpander.__init__(self, _("Synonyms"), widgets) synonyms_box = self.widgets.sp_synonyms_box self.widgets.remove_parent(synonyms_box) self.vbox.pack_start(synonyms_box) def update(self, row): ''' update the expander @param row: the row to get thevalues from ''' #debug(row.synonyms) if len(row.synonyms) == 0: self.set_sensitive(False) self.set_expanded(False) else: def on_label_clicked(label, event, syn): select_in_search_results(syn) syn_box = self.widgets.sp_synonyms_box # remove all the children syn_box.foreach(syn_box.remove) for syn in row.synonyms: # create clickable label that will select the synonym # in the search results box = gtk.EventBox() label = gtk.Label() label.set_alignment(0, .5) label.set_markup(Species.str(syn, markup=True, authors=True)) box.add(label) utils.make_label_clickable(label, on_label_clicked, syn) syn_box.pack_start(box, expand=False, fill=False) self.show_all() self.set_sensitive(True) # TODO: get expanded state from prefs self.set_expanded(True) class NotesExpander(InfoExpander): def __init__(self, widgets): InfoExpander.__init__(self, _("Notes"), widgets) notes_box = self.widgets.sp_notes_box self.widgets.remove_parent(notes_box) self.vbox.pack_start(notes_box) def update(self, row): if row.notes is None: self.set_expanded(False) self.set_sensitive(False) else: self.set_expanded(True) self.set_sensitive(True) self.set_widget_value('sp_notes_data', row.notes) class GeneralSpeciesExpander(InfoExpander): ''' expander to present general information about a species ''' def __init__(self, widgets): ''' the constructor ''' InfoExpander.__init__(self, _("General"), widgets) general_box = self.widgets.sp_general_box self.widgets.remove_parent(general_box) self.vbox.pack_start(general_box) self.widgets.sp_name_data.set_line_wrap(True) # make the check buttons read only def on_enter(button, *args): button.emit_stop_by_name("enter-notify-event") return True self.current_obj = None def update(self, row): ''' update the expander @param row: the row to get the values from ''' # TODO: how do we put the genus is a seperate label so so it # can be clickable but still respect the text wrap to wrap # around and indent from the genus name instead of from the # species name session = bauble.Session() self.set_widget_value('sp_name_data', '%s' % \ row.markup(True)) self.set_widget_value('sp_dist_data', row.distribution_str()) # stop here if not GardenPluin if 'GardenPlugin' not in pluginmgr.plugins: return from bauble.plugins.garden.accession import Accession from bauble.plugins.garden.plant import Plant nacc = session.query(Accession).join('species').\ filter_by(id=row.id).count() self.set_widget_value('sp_nacc_data', nacc) nplants = session.query(Plant).join(['accession', 'species']).\ filter_by(id=row.id).count() if nplants == 0: self.set_widget_value('sp_nplants_data', nplants) else: nacc_in_plants = session.query(Plant.accession_id).\ join(['accession', 'species']).\ filter_by(id=row.id).distinct().count() self.set_widget_value('sp_nplants_data', '%s in %s accessions' \ % (nplants, nacc_in_plants)) session.close() class LinksExpander(InfoExpander): """ A collection of link buttons to use for internet searches. """ def __init__(self): InfoExpander.__init__(self, _("Links")) self.tooltips = gtk.Tooltips() buttons = [] self.google_button = gtk.LinkButton("", _("Search Google")) self.tooltips.set_tip(self.google_button, _("Search Google")) buttons.append(self.google_button) self.gbif_button = gtk.LinkButton("", _("Search GBIF")) self.tooltips.set_tip(self.gbif_button, _("Search the Global Biodiversity Information "\ "Facility")) buttons.append(self.gbif_button) self.itis_button = gtk.LinkButton("", _("Search ITIS")) self.tooltips.set_tip(self.itis_button, _("Search the Intergrated Taxonomic "\ "Information System")) buttons.append(self.itis_button) self.ipni_button = gtk.LinkButton("", _("Search IPNI")) self.tooltips.set_tip(self.ipni_button, _("Search the International Plant Names Index")) buttons.append(self.ipni_button) self.bgci_button = gtk.LinkButton("", _("Search BGCI")) self.tooltips.set_tip(self.bgci_button, _("Search Botanic Gardens Conservation " \ "International")) buttons.append(self.bgci_button) for b in buttons: b.set_alignment(0, -1) self.vbox.pack_start(b, expand=False, fill=False) def update(self, row): s = str(row) self.gbif_button.set_uri("http://data.gbif.org/search/%s" % \ s.replace(' ', '+')) itis_uri = "http://www.itis.gov/servlet/SingleRpt/SingleRpt?"\ "search_topic=Scientific_Name" \ "&search_value=%(search_value)s" \ "&search_kingdom=Plant" \ "&search_span=containing" \ "&categories=All&source=html&search_credRating=All" \ % {'search_value': s.replace(' ', '%20')} self.itis_button.set_uri(itis_uri) self.google_button.set_uri("http://www.google.com/search?q=%s" % \ s.replace(' ', '+')) bgci_uri = "http://www.bgci.org/plant_search.php?action=Find"\ "&ftrGenus=%(genus)s&ftrRedList=&ftrSpecies=%(species)s"\ "&ftrRedList1997=&ftrEpithet=&ftrCWR=&x=0&y=0#results" % \ {'genus': str(row.genus), "species": str(row.sp) } self.bgci_button.set_uri(bgci_uri) ipni_uri = "http://www.ipni.org/ipni/advPlantNameSearch.do?"\ "find_genus=%(genus)s&find_species=%(species)s" \ "&find_isAPNIRecord=on& find_isGCIRecord=on" \ "&find_isIKRecord=on&output_format=normal" % \ {'genus': str(row.genus), 'species': str(row.sp)} self.ipni_button.set_uri(ipni_uri) class SpeciesInfoBox(InfoBox): def __init__(self): super(SpeciesInfoBox, self).__init__(tabbed=True) page = SpeciesInfoPage() label = page.label if isinstance(label, basestring): label = gtk.Label(label) self.insert_page(page, label, 0) from bauble.plugins.picasa import PicasaInfoPage page = PicasaInfoPage() label = page.label if isinstance(label, basestring): label = gtk.Label(label) self.insert_page(page, label, 1) class SpeciesInfoPage(InfoBoxPage): ''' general info, fullname, common name, num of accessions and clones, distribution ''' # others to consider: reference, images, redlist status def __init__(self): ''' the constructor ''' super(SpeciesInfoPage, self).__init__() glade_file = os.path.join(paths.lib_dir(), 'plugins', 'plants', 'infoboxes.glade') self.widgets = utils.GladeWidgets(gtk.glade.XML(glade_file)) self.general = GeneralSpeciesExpander(self.widgets) self.add_expander(self.general) self.vernacular = VernacularExpander(self.widgets) self.add_expander(self.vernacular) self.synonyms = SynonymsExpander(self.widgets) self.add_expander(self.synonyms) self.notes = NotesExpander(self.widgets) self.add_expander(self.notes) self.links = LinksExpander() self.add_expander(self.links) self.props = PropertiesExpander() self.add_expander(self.props) self.label = _('General') if 'GardenPlugin' not in pluginmgr.plugins: self.widgets.remove_parent('sp_nacc_label') self.widgets.remove_parent('sp_nacc_data') self.widgets.remove_parent('sp_nplants_label') self.widgets.remove_parent('sp_nplants_data') def update(self, row): ''' update the expanders in this infobox @param row: the row to get the values from ''' self.general.update(row) self.vernacular.update(row) self.synonyms.update(row) self.notes.update(row) self.links.update(row) self.props.update(row) # it's easier just to put this here instead of playing around with imports class VernacularNameInfoBox(SpeciesInfoBox): def update(self, row): super(VernacularNameInfoBox, self).update(row.species) #self.props.update(row) bauble-0.9.7/bauble/plugins/plants/species_editor.py0000755000175000017500000012105311302533377021603 0ustar brettbrett# # Species table definition # import os import sys import traceback import xml.sax.saxutils as sax from operator import itemgetter import gtk import gobject from sqlalchemy import * from sqlalchemy.orm.session import object_session from sqlalchemy.exc import SQLError import bauble from bauble.prefs import prefs import bauble.utils as utils import bauble.paths as paths import bauble.editor as editor from bauble.utils.log import log, debug from bauble.plugins.plants.family import Family from bauble.plugins.plants.genus import Genus from bauble.plugins.plants.species_model import Species, \ SpeciesSynonym, VernacularName, DefaultVernacularName, \ SpeciesDistribution, Geography class SpeciesEditorPresenter(editor.GenericEditorPresenter): PROBLEM_INVALID_GENUS = 1 widget_to_field_map = {'sp_genus_entry': 'genus', 'sp_species_entry': 'sp', 'sp_author_entry': 'sp_author', 'sp_infra_rank_combo': 'infrasp_rank', 'sp_hybrid_combo': 'sp_hybrid', 'sp_infra_entry': 'infrasp', 'sp_cvgroup_entry': 'cv_group', 'sp_infra_author_entry': 'infrasp_author', 'sp_spqual_combo': 'sp_qual', 'sp_notes_textview': 'notes'} def __init__(self, model, view): super(SpeciesEditorPresenter, self).__init__(model, view) self.session = object_session(model) combos = ('sp_infra_rank_combo', 'sp_hybrid_combo', 'sp_spqual_combo') for name in combos: self.init_enum_combo(name, self.widget_to_field_map[name]) self.init_fullname_widgets() self.vern_presenter = VernacularNamePresenter(self.model, self.view, self.session) self.synonyms_presenter = SynonymsPresenter(self.model, self.view, self.session) self.dist_presenter = DistributionPresenter(self.model, self.view, self.session) self.refresh_view() # connect signals def gen_get_completions(text): if text.startswith('x'): clause = or_(utils.ilike(Genus.genus, '%s%%' % unicode(text)), utils.ilike(Genus.hybrid, '%s%%' % unicode(text[0]))) else: clause = utils.ilike(Genus.genus, '%s%%' % unicode(text)) return self.session.query(Genus).filter(clause) #def set_in_model(self, field, value): # debug('set_in_model(%s, %s)' % (field, value)) # setattr(self.model, field, value) def on_select(value): self.set_model_attr('genus', value) self.assign_completions_handler('sp_genus_entry', #'genus', gen_get_completions, on_select=on_select) self.assign_simple_handler('sp_species_entry', 'sp', editor.UnicodeOrNoneValidator()) self.assign_simple_handler('sp_infra_rank_combo', 'infrasp_rank')#, #editor.UnicodeOrNoneValidator()) self.assign_simple_handler('sp_hybrid_combo', 'sp_hybrid')#, #editor.UnicodeOrNoneValidator()) self.assign_simple_handler('sp_infra_entry', 'infrasp', editor.UnicodeOrNoneValidator()) self.assign_simple_handler('sp_cvgroup_entry', 'cv_group', editor.UnicodeOrNoneValidator()) self.assign_simple_handler('sp_infra_author_entry', 'infrasp_author', editor.UnicodeOrNoneValidator()) self.assign_simple_handler('sp_spqual_combo', 'sp_qual')#, #editor.UnicodeOrNoneValidator()) self.assign_simple_handler('sp_author_entry', 'sp_author', editor.UnicodeOrNoneValidator()) self.assign_simple_handler('sp_notes_textview', 'notes', editor.UnicodeOrNoneValidator()) self.__dirty = False def __del__(self): # we have to delete the views in the child presenters manually # to avoid the circul reference del self.vern_presenter.view del self.synonyms_presenter.view del self.dist_presenter.view def dirty(self): return self.__dirty or self.vern_presenter.dirty() or \ self.synonyms_presenter.dirty() or self.dist_presenter.dirty() def refresh_sensitivity(self): ''' set the sensitivity on the widgets that make up the species name according to values in the model ''' # states_dict: # { widget: [list of fields] # - if any of fields is None then the widget.sensitive = False # - if one of the fields is a tuple then the values in the # tuple are AND'd together to determine the widgets # sensitivity, e.g. all of the widgets in the tuple have to be # not None # states_dict = {'sp_hybrid_combo': [('genus', 'genus')], # 'sp_species_entry': [('genus', 'genus')], # 'sp_author_entry': ['sp'], # 'sp_infra_rank_combo': ['sp'], # 'sp_infra_entry': [('infrasp_rank', 'sp_hybrid'), 'sp'], # 'sp_infra_author_entry': [('infrasp_rank', 'sp_hybrid'), # 'infrasp', 'sp']} states_dict = {'sp_hybrid_combo': ['genus'], 'sp_species_entry': ['genus'], 'sp_author_entry': ['sp'], 'sp_infra_rank_combo': ['sp'], 'sp_infra_entry': [('infrasp_rank', 'sp_hybrid'), 'sp'], 'sp_infra_author_entry': [('infrasp_rank', 'sp_hybrid'), 'infrasp', 'sp']} for widget, fields in states_dict.iteritems(): sensitive = False for field in fields: if isinstance(field, tuple): if None not in [getattr(self.model, f) for f in field]: sensitive = True break elif getattr(self.model, field) is not None: sensitive = True break self.view.widgets[widget].set_sensitive(sensitive) # turn off the infraspecific rank combo if the hybrid value in the # model is not None, this has to be called before the conditional that # sets the sp_cvgroup_entry # if self.model.sp_hybrid is not None: # self.view.widgets.sp_infra_rank_combo.set_sensitive(False) # infraspecific rank has to be a cultivar for the cultivar group entry # to be sensitive if self.model.infrasp_rank == 'cv.' \ and self.view.widgets['sp_infra_rank_combo'].get_property('sensitive'): self.view.widgets.sp_cvgroup_entry.set_sensitive(True) else: self.view.widgets.sp_cvgroup_entry.set_sensitive(False) def set_model_attr(self, field, value, validator=None): ''' Resets the sensitivity on the ok buttons and the name widgets when values change in the model ''' super(SpeciesEditorPresenter, self).set_model_attr(field, value, validator) self.__dirty = True sensitive = True if len(self.problems) != 0 \ or len(self.vern_presenter.problems) != 0 \ or len(self.synonyms_presenter.problems) != 0 \ or len(self.dist_presenter.problems) != 0: sensitive = False elif not self.model.sp or not self.model.genus: sensitive = False self.view.set_accept_buttons_sensitive(sensitive) self.refresh_sensitivity() def init_fullname_widgets(self): ''' initialized the signal handlers on the widgets that are relative to building the fullname string in the sp_fullname_label widget ''' self.refresh_fullname_label() def on_insert(entry, *args): self.refresh_fullname_label() def on_delete(entry, *args): self.refresh_fullname_label() for widget_name in ['sp_genus_entry', 'sp_species_entry', 'sp_author_entry', 'sp_infra_entry', 'sp_cvgroup_entry', 'sp_infra_author_entry']: w = self.view.widgets[widget_name] self.view.connect_after(widget_name, 'insert-text', on_insert) self.view.connect_after(widget_name, 'delete-text', on_delete) def on_changed(*args): self.refresh_fullname_label() for widget_name in ['sp_infra_rank_combo', 'sp_hybrid_combo', 'sp_spqual_combo']: w = self.view.widgets[widget_name] self.view.connect_after(widget_name, 'changed', on_changed) def refresh_fullname_label(self): ''' set the value of sp_fullname_label to either '--' if there is a problem or to the name of the string returned by Species.str ''' if len(self.problems) > 0 or self.model.genus == None: self.view.widgets.sp_fullname_label.set_markup('--') return sp_str = Species.str(self.model, markup=True, authors=True) self.view.widgets.sp_fullname_label.set_markup(sp_str) def start(self): r = self.view.start() return r def refresh_view(self): for widget, field in self.widget_to_field_map.iteritems(): if field is 'genus_id': value = self.model.genus else: value = getattr(self.model, field) # debug('%s, %s, %s' % (widget, field, value)) # self.view.set_widget_value(widget, value, # default=self.defaults.get(field, None)) self.view.set_widget_value(widget, value) self.refresh_sensitivity() self.vern_presenter.refresh_view(self.model.default_vernacular_name) self.synonyms_presenter.refresh_view() self.dist_presenter.refresh_view() class DistributionPresenter(editor.GenericEditorPresenter): """ """ def __init__(self, species, view, session): ''' @param species: @param view: @param session: ''' super(DistributionPresenter, self).__init__(species, view) self.session = session self.__dirty = False self.add_menu = gtk.Menu() self.add_menu.attach_to_widget(self.view.widgets.sp_dist_add_button, None) self.remove_menu = gtk.Menu() self.remove_menu.attach_to_widget(self.view.widgets.sp_dist_remove_button, None) self.view.connect('sp_dist_add_button', 'button-press-event', self.on_add_button_pressed) self.view.connect('sp_dist_remove_button', 'button-press-event', self.on_remove_button_pressed) self.init_add_button() def refresh_view(self): label = self.view.widgets.sp_dist_label s = ', '.join([str(d) for d in self.model.distribution]) label.set_text(s) def on_add_button_pressed(self, button, event): self.add_menu.popup(None, None, None, event.button, event.time) def on_remove_button_pressed(self, button, event): # clear the menu for c in self.remove_menu.get_children(): self.remove_menu.remove(c) # add distributions to menu for dist in self.model.distribution: item = gtk.MenuItem(str(dist)) self.view.connect(item, 'activate', self.on_activate_remove_menu_item, dist) self.remove_menu.append(item) self.remove_menu.show_all() self.remove_menu.popup(None, None, None, event.button, event.time) def on_activate_add_menu_item(self, widget, id=None): from bauble.plugins.plants.species_model import Geography geo = self.session.query(Geography).filter_by(id=id).one() # check that this geography isn't already in the distributions if geo in [d.geography for d in self.model.distribution]: # debug('%s already in %s' % (geo, self.model)) return dist = SpeciesDistribution(geography=geo) self.model.distribution.append(dist) # debug([str(d) for d in self.model.distribution]) self.__dirty = True self.refresh_view() self.view.set_accept_buttons_sensitive(True) def on_activate_remove_menu_item(self, widget, dist): self.model.distribution.remove(dist) utils.delete_or_expunge(dist) self.refresh_view() self.__dirty = True self.view.set_accept_buttons_sensitive(True) def dirty(self): return self.__dirty def init_add_button(self): self.view.widgets.sp_dist_add_button.set_sensitive(False) geography_table = Geography.__table__ geos = select([geography_table.c.id, geography_table.c.name, geography_table.c.parent_id]).execute().fetchall() geos_hash = {} for geo_id, name, parent_id in geos: try: geos_hash[parent_id].append((geo_id, name)) except KeyError: geos_hash[parent_id] = [(geo_id, name)] for kids in geos_hash.values(): kids.sort(key=itemgetter(1)) # sort by name def get_kids(pid): try: return geos_hash[pid] except KeyError: return [] def has_kids(pid): try: return len(geos_hash[pid]) > 0 except KeyError: return False def build_menu(id, name): item = gtk.MenuItem(name) if not has_kids(id): if item.get_submenu() is None: self.view.connect(item, 'activate', self.on_activate_add_menu_item,id) return item kids_added = False submenu = gtk.Menu() # removes two levels of kids with the same name, there must be a # better way to do this but i got tired of thinking about it for kid_id, kid_name in get_kids(id): if kid_name == name: for gk_id, gk_name in get_kids(kid_id): if gk_name == kid_name: for gk2_id, gk2_name in get_kids(gk_id): submenu.append(build_menu(gk2_id, gk2_name)) kids_added = True else: submenu.append(build_menu(gk_id, gk_name)) kids_added = True else: submenu.append(build_menu(kid_id, kid_name)) kids_added = True if kids_added: sel_item = gtk.MenuItem(name) submenu.insert(sel_item, 0) submenu.insert(gtk.SeparatorMenuItem(), 1) item.set_submenu(submenu) self.view.connect(sel_item, 'activate', self.on_activate_add_menu_item,id) else: self.view.connect(item, 'activate', self.on_activate_add_menu_item, id) return item def populate(): """ add geography value to the menu, any top level items that don't have any kids are appended to the bottom of the menu """ if not geos_hash: # this is really only here so we don't get an error # when running the species editor from a unittest return no_kids = [] for geo_id, geo_name in geos_hash[None]: if geo_id not in geos_hash.keys(): no_kids.append((geo_id, geo_name)) else: self.add_menu.append(build_menu(geo_id, geo_name)) for geo_id, geo_name in sorted(no_kids): self.add_menu.append(build_menu(geo_id, geo_name)) self.add_menu.show_all() self.view.widgets.sp_dist_add_button.set_sensitive(True) gobject.idle_add(populate) class VernacularNamePresenter(editor.GenericEditorPresenter): # TODO: change the background of the entries and desensitize the # name/lang entries if the name conflicts with an existing vernacular # name for this species """ in the VernacularNamePresenter we don't really use self.model, we more rely on the model in the TreeView which are VernacularName objects """ def __init__(self, species, view, session): ''' @param model: a list of VernacularName objects @param view: @param session: ''' super(VernacularNamePresenter, self).__init__(species, view) self.session = session self.__dirty = False self.init_treeview(species.vernacular_names) # clear the name and language entries self.view.widgets.vern_name_entry.props.text = '' self.view.widgets.vern_lang_entry.props.text = '' self.view.connect('sp_vern_add_button', 'clicked', self.on_add_button_clicked) self.view.connect('sp_vern_remove_button', 'clicked', self.on_remove_button_clicked) self.view.connect('vern_lang_entry', 'insert-text', self.on_entry_insert, 'vern_name_entry') self.view.connect('vern_lang_entry', 'delete-text', self.on_entry_delete, 'vern_name_entry') self.view.connect('vern_name_entry', 'insert-text', self.on_entry_insert, 'vern_lang_entry') self.view.connect('vern_name_entry', 'delete-text', self.on_entry_delete, 'vern_lang_entry') def dirty(self): """ @return True or False if the vernacular names have changed. """ return self.__dirty def on_entry_insert(self, entry, new_text, new_text_length, position, other_widget_name): """ @param entry @param new_text @param new_text_length @param position @param other_widget_name Sets the sensitivity of the add button only if both the vernacular name and language are not empty. """ entry_text = entry.get_text() cursor = entry.get_position() full_text = entry_text[:cursor] + new_text + entry_text[cursor:] sensitive = False if full_text != '' \ and self.view.widgets[other_widget_name].get_text() != '': sensitive = True self.view.widgets.sp_vern_add_button.set_sensitive(sensitive) def on_entry_delete(self, entry, start, end, other_widget_name): """ @param entry @param start @param end @param other_widget_name Sets the sensitivity of the add button only if both the vernacular name and language are not empty. """ text = entry.get_text() full_text = text[:start] + text[end:] sensitive = False if full_text != '' \ and self.view.widgets[other_widget_name].get_text() != '': sensitive = True self.view.widgets.sp_vern_add_button.set_sensitive(sensitive) def on_add_button_clicked(self, button, data=None): """ Add the values in the entries to the model. """ name = self.view.widgets.vern_name_entry.get_text() lang = self.view.widgets.vern_lang_entry.get_text() vn = VernacularName(name=utils.utf8(name), language=utils.utf8(lang)) tree_model = self.treeview.get_model() self.model.vernacular_names.append(vn) it = tree_model.append([vn]) # append to tree model if len(tree_model) == 1: #self.set_model_attr('default_vernacular_name', vn) self.model.default_vernacular_name = vn self.view.widgets.sp_vern_add_button.set_sensitive(False) self.view.widgets.vern_name_entry.set_text('') self.view.widgets.vern_lang_entry.set_text('') self.view.set_accept_buttons_sensitive(True) self.__dirty = True def on_remove_button_clicked(self, button, data=None): """ Removes the currently selected vernacular name from the view. """ # TODO: maybe we should only ask 'are you sure' if the selected value # is an instance, this means it will be deleted from the database tree = self.view.widgets.vern_treeview path, col = tree.get_cursor() tree_model = tree.get_model() value = tree_model[tree_model.get_iter(path)][0] msg = _('Are you sure you want to remove the vernacular name %s?') \ % utils.xml_safe_utf8(value.name) if not utils.yes_no_dialog(msg, parent=self.view.get_window()): return tree_model.remove(tree_model.get_iter(path)) self.model.vernacular_names.remove(value) if self.model.default_vernacular_name is not None \ and value == self.model.default_vernacular_name: # if there is only one value in the tree then set it as the # default vernacular name first = tree_model.get_iter_first() if first is not None: # self.set_model_attr('default_vernacular_name', # tree_model[first][0]) self.model.default_vernacular_name = tree_model[first][0] utils.delete_or_expunge(value) self.view.set_accept_buttons_sensitive(True) self.__dirty = True def on_default_toggled(self, cell, path, data=None): """ Default column callback. """ active = cell.get_active() if not active: # then it's becoming active vn = self.treeview.get_model()[path][0] self.set_model_attr('default_vernacular_name', vn) self.__dirty = True self.view.set_accept_buttons_sensitive(True) def init_treeview(self, model): """ Initialized the list of vernacular names. """ self.treeview = self.view.widgets.vern_treeview # remove any columns that were setup previous, this became a # problem when we starting reusing the glade files with # utils.GladeLoader, the right way to do this would be to # create the columns in glade instead of here for col in self.treeview.get_columns(): self.treeview.remove_column(col) def _name_data_func(column, cell, model, iter, data=None): v = model[iter][0] cell.set_property('text', v.name) # just added so change the background color to indicate its new # if not v.isinstance: if v.id is None: # hasn't been committed cell.set_property('foreground', 'blue') else: cell.set_property('foreground', None) cell = gtk.CellRendererText() col = gtk.TreeViewColumn('Name', cell) col.set_cell_data_func(cell, _name_data_func) #col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) #col.set_min_width(150) col.set_fixed_width(150) col.set_min_width(50) col.set_resizable(True) self.treeview.append_column(col) def _lang_data_func(column, cell, model, iter, data=None): v = model[iter][0] cell.set_property('text', v.language) # just added so change the background color to indicate its new #if not v.isinstance:` if v.id is None: # hasn't been committed cell.set_property('foreground', 'blue') else: cell.set_property('foreground', None) cell = gtk.CellRendererText() col = gtk.TreeViewColumn('Language', cell) col.set_cell_data_func(cell, _lang_data_func) #col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) col.set_resizable(True) #col.set_min_width(150) col.set_fixed_width(150) col.set_min_width(50) self.treeview.append_column(col) def _default_data_func(column, cell, model, iter, data=None): v = model[iter][0] try: cell.set_property('active', v==self.model.default_vernacular_name) return except AttributeError, e: pass cell.set_property('active', False) cell = gtk.CellRendererToggle() self.view.connect(cell, 'toggled', self.on_default_toggled) col = gtk.TreeViewColumn('Default', cell) col.set_cell_data_func(cell, _default_data_func) col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) col.set_fixed_width(20) col.set_max_width(20) self.treeview.append_column(col) utils.clear_model(self.treeview) # add the vernacular names to the tree tree_model = gtk.ListStore(object) for vn in model: tree_model.append([vn]) self.treeview.set_model(tree_model) self.view.connect(self.treeview, 'cursor-changed', self.on_tree_cursor_changed) def on_tree_cursor_changed(self, tree, data=None): path, column = tree.get_cursor() self.view.widgets.sp_vern_remove_button.set_sensitive(True) def refresh_view(self, default_vernacular_name): tree_model = self.treeview.get_model() #if len(self.model) > 0 and default_vernacular_name is None: vernacular_names = self.model.vernacular_names default_vernacular_name = self.model.default_vernacular_name if len(vernacular_names) > 0 and default_vernacular_name is None: msg = 'This species has vernacular names but none of them are '\ 'selected as the default. The first vernacular name in the '\ 'list has been automatically selected.' utils.message_dialog(msg) first = tree_model.get_iter_first() value = tree_model[first][0] path = tree_model.get_path(first) #self.set_model_attr('default_vernacular_name', value) self.model.default_vernacular_name = value debug(self.model.default_vernacular_name) self.__dirty = True self.view.set_accept_buttons_sensitive(True) elif default_vernacular_name is None: return class SynonymsPresenter(editor.GenericEditorPresenter): PROBLEM_INVALID_SYNONYM = 1 # TODO: if you add a species and then immediately remove then you get an # error, something about the synonym not being in the session def __init__(self, model, view, session): ''' @param model: a Species instance @param view: see GenericEditorPresenter @param session: ''' super(SynonymsPresenter, self).__init__(model, view) self.session = session self.init_treeview() # use completions_model as a dummy object for completions, we'll create # seperate SpeciesSynonym models on add completions_model = SpeciesSynonym() def sp_get_completions(text): query = self.session.query(Species) query = query.join('genus') query = query.filter(utils.ilike(Genus.genus, '%s%%' % text)) query = query.filter(Species.id != self.model.id) return query def on_select(value): sensitive = True if value is None: sensitive = False self.view.widgets.sp_syn_add_button.set_sensitive(sensitive) self._selected = value self.assign_completions_handler('sp_syn_entry', sp_get_completions, on_select=on_select) self._selected = None self.view.connect('sp_syn_add_button', 'clicked', self.on_add_button_clicked) self.view.connect('sp_syn_remove_button', 'clicked', self.on_remove_button_clicked) self.__dirty = False def dirty(self): return self.__dirty def init_treeview(self): ''' initialize the gtk.TreeView ''' self.treeview = self.view.widgets.sp_syn_treeview # remove any columns that were setup previous, this became a # problem when we starting reusing the glade files with # utils.GladeLoader, the right way to do this would be to # create the columns in glade instead of here for col in self.treeview.get_columns(): self.treeview.remove_column(col) def _syn_data_func(column, cell, model, treeiter, data=None): v = model[treeiter][0] #cell.set_property('text', str(v.synonym)) cell.set_property('text', str(v)) # just added so change the background color to indicate its new if v.id is None: cell.set_property('foreground', 'blue') else: cell.set_property('foreground', None) cell = gtk.CellRendererText() col = gtk.TreeViewColumn('Synonym', cell) col.set_cell_data_func(cell, _syn_data_func) self.treeview.append_column(col) tree_model = gtk.ListStore(object) for syn in self.model._synonyms: tree_model.append([syn]) self.treeview.set_model(tree_model) self.view.connect(self.treeview, 'cursor-changed', self.on_tree_cursor_changed) def on_tree_cursor_changed(self, tree, data=None): ''' ''' path, column = tree.get_cursor() self.view.widgets.sp_syn_remove_button.set_sensitive(True) def refresh_view(self): """ doesn't do anything """ return def on_add_button_clicked(self, button, data=None): """ adds the synonym from the synonym entry to the list of synonyms for this species """ syn = SpeciesSynonym(species=self.model, synonym=self._selected) tree_model = self.treeview.get_model() tree_model.append([syn]) self._selected = None entry = self.view.widgets.sp_syn_entry self.pause_completions_handler(entry, True) entry.set_text('') entry.set_position(-1) self.pause_completions_handler(entry, False) self.view.widgets.sp_syn_add_button.set_sensitive(False) self.view.widgets.sp_syn_add_button.set_sensitive(False) self.view.set_accept_buttons_sensitive(True) self.__dirty = True def on_remove_button_clicked(self, button, data=None): ''' removes the currently selected synonym from the list of synonyms for this species ''' # TODO: maybe we should only ask 'are you sure' if the selected value # is an instance, this means it will be deleted from the database tree = self.view.widgets.sp_syn_treeview path, col = tree.get_cursor() tree_model = tree.get_model() value = tree_model[tree_model.get_iter(path)][0] s = Species.str(value.synonym, markup=True) msg = 'Are you sure you want to remove %s as a synonym to the ' \ 'current species?\n\nNote: This will not remove the species '\ '%s from the database.' % (s, s) if utils.yes_no_dialog(msg, parent=self.view.get_window()): tree_model.remove(tree_model.get_iter(path)) self.model.synonyms.remove(value.synonym) utils.delete_or_expunge(value) # make the change in synonym immediately available so that if # we try to add the same species again we don't break the # SpeciesSynonym UniqueConstraint self.session.flush([value]) self.view.set_accept_buttons_sensitive(True) self.__dirty = True class SpeciesEditorView(editor.GenericEditorView): expanders_pref_map = {'sp_infra_expander': 'editor.species.infra.expanded', 'sp_meta_expander': 'editor.species.meta.expanded'} _tooltips = { 'sp_genus_entry': _('Genus '), 'sp_species_entry': _('Species epithet'), 'sp_author_entry': _('Species author'), 'sp_infra_rank_combo': _('Infraspecific rank'), 'sp_hybrid_combo': _('Species hybrid flag'), 'sp_infra_entry': _('Infraspecific epithet'), 'sp_cvgroup_entry': _('Cultivar group'), 'sp_infra_author_entry': _('Infraspecific author'), 'sp_spqual_combo': _('Species qualifier'), 'sp_notes_frame': _('Note'), 'sp_dist_box': _('Species distribution'), 'sp_vern_box': _('Vernacular names'), 'sp_syn_box': _('Species synonyms') } def __init__(self, parent=None): ''' the constructor @param parent: the parent window ''' glade_path = os.path.join(paths.lib_dir(), 'plugins', 'plants', 'editors.glade') super(SpeciesEditorView, self).__init__(glade_path, parent=parent) self.dialog = self.widgets.species_dialog self.dialog.set_transient_for(parent) self.set_accept_buttons_sensitive(False) self.attach_completion('sp_genus_entry', self.genus_completion_cell_data_func, match_func=self.genus_match_func) self.attach_completion('sp_syn_entry', self.syn_cell_data_func) self.restore_state() self.connect_dialog_close(self.widgets.species_dialog) def get_window(self): ''' Returns the top level window or dialog. ''' return self.widgets.species_dialog @staticmethod def genus_match_func(completion, key, iter, data=None): """ match against both str(genus) and str(genus.genus) so that we catch the genera with hybrid flags in their name when only entering the genus name """ genus = completion.get_model()[iter][0] if str(genus).lower().startswith(key.lower()) \ or str(genus.genus).lower().startswith(key.lower()): return True return False def set_accept_buttons_sensitive(self, sensitive): ''' set the sensitivity of all the accept/ok buttons for the editor dialog ''' self.widgets.sp_ok_button.set_sensitive(sensitive) try: import bauble.plugins.garden self.widgets.sp_ok_and_add_button.set_sensitive(sensitive) except Exception: pass self.widgets.sp_next_button.set_sensitive(sensitive) @staticmethod def genus_completion_cell_data_func(column, renderer, model, treeiter, data=None): ''' ''' v = model[treeiter][0] renderer.set_property('text', '%s (%s)' % (Genus.str(v), Family.str(v.family))) @staticmethod def syn_cell_data_func(column, renderer, model, treeiter, data=None): ''' ''' v = model[treeiter][0] renderer.set_property('text', str(v)) def save_state(self): ''' save the current state of the gui to the preferences ''' for expander, pref in self.expanders_pref_map.iteritems(): prefs[pref] = self.widgets[expander].get_expanded() def restore_state(self): ''' restore the state of the gui from the preferences ''' for expander, pref in self.expanders_pref_map.iteritems(): expanded = prefs.get(pref, True) self.widgets[expander].set_expanded(expanded) def start(self): ''' starts the views, essentially calls run() on the main dialog ''' return self.widgets.species_dialog.run() class SpeciesEditor(editor.GenericModelViewPresenterEditor): label = 'Species' mnemonic_label = '_Species' # these have to correspond to the response values in the view RESPONSE_OK_AND_ADD = 11 RESPONSE_NEXT = 22 ok_responses = (RESPONSE_OK_AND_ADD, RESPONSE_NEXT) def __init__(self, model=None, parent=None): ''' @param model: a species instance or None @param parent: the parent window or None ''' if model is None: model = Species() super(SpeciesEditor, self).__init__(model, parent) if not parent and bauble.gui: parent = bauble.gui.window self.parent = parent self._committed = [] def handle_response(self, response): """ @return: return True if the editor is realdy to be closes, False if we want to keep editing, if any changes are committed they are stored in self._committed """ # TODO: need to do a __cleanup_model before the commit to do things # like remove the insfraspecific information that's attached to the # model if the infraspecific rank is None not_ok_msg = 'Are you sure you want to lose your changes?' if response == gtk.RESPONSE_OK or response in self.ok_responses: try: if self.presenter.dirty(): self.commit_changes() self._committed.append(self.model) except SQLError, e: exc = traceback.format_exc() msg = _('Error committing changes.\n\n%s') % \ utils.xml_safe_utf8(e.orig) utils.message_details_dialog(msg, str(e), gtk.MESSAGE_ERROR) return False except Exception, e: msg = _('Unknown error when committing changes. See the '\ 'details for more information.\n\n%s') % \ utils.xml_safe_utf8(e) debug(traceback.format_exc()) #warning(traceback.format_exc()) utils.message_details_dialog(msg, traceback.format_exc(), gtk.MESSAGE_ERROR) return False elif self.presenter.dirty() and utils.yes_no_dialog(not_ok_msg) \ or not self.presenter.dirty(): self.session.rollback() return True else: return False more_committed = None if response == self.RESPONSE_NEXT: self.presenter.cleanup() e = SpeciesEditor(Species(genus=self.model.genus), self.parent) more_committed = e.start() elif response == self.RESPONSE_OK_AND_ADD: from bauble.plugins.garden.accession import AccessionEditor, \ Accession e = AccessionEditor(Accession(species=self.model), parent=self.parent) more_committed = e.start() if more_committed is not None: if isinstance(more_committed, list): self._committed.extend(more_committed) else: self._committed.append(more_committed) return True def commit_changes(self): if self.model.sp_hybrid is None and self.model.infrasp_rank is None: self.model.infrasp = None self.model.infrasp_author = None self.model.cv_group = None super(SpeciesEditor, self).commit_changes() def start(self): if self.session.query(Genus).count() == 0: msg = 'You must first add or import at least one genus into the '\ 'database before you can add species.' utils.message_dialog(msg) return view = SpeciesEditorView(parent=self.parent) self.presenter = SpeciesEditorPresenter(self.model, view) # add quick response keys self.attach_response(view.dialog, gtk.RESPONSE_OK, 'Return', gtk.gdk.CONTROL_MASK) self.attach_response(view.dialog, self.RESPONSE_OK_AND_ADD, 'k', gtk.gdk.CONTROL_MASK) self.attach_response(view.dialog, self.RESPONSE_NEXT, 'n', gtk.gdk.CONTROL_MASK) # set default focus if self.model.genus is None: view.widgets.sp_genus_entry.grab_focus() else: view.widgets.sp_species_entry.grab_focus() while True: response = self.presenter.start() view.save_state() # should view or presenter save state if self.handle_response(response): break self.presenter.cleanup() self.session.close() # cleanup session return self._committed bauble-0.9.7/bauble/plugins/plants/geography.py0000755000175000017500000000520311210626427020562 0ustar brettbrett# # geography.py # from datetime import datetime from sqlalchemy import * from sqlalchemy.orm import * import bauble import bauble.db as db from bauble.view import ResultSet from bauble.utils.log import debug def get_species_in_geography(geo): # get all the geography children under geo from bauble.plugins.plants.species import SpeciesDistribution, \ species_distribution_table, Species, species_table geo_kids = [] # TODO: getting the kids is too slow, is there a better way? # TODO: it might be better to put this in a tasklet or something so # that we can atleast do a set_busy() on the gui so the user only clicks # on the item once, or just disable double clicking until everything has # expanded properly....that's probably not a bad idea in general, just # before we get an items children in the results view we should disable # clicking in the view and once the item has expanded we reenable it # # TODO: need to change this to use the new queries on the mapper # or to update the select statements if we don't want to create # full on Geography objects raise NotImplementedError kids_stmt = select([geography_table.c.id], geography_table.c.parent_id==bindparam('parent_id')) def get_kids(parent_id): for kid_id, in kids_stmt.execute(parent_id=parent_id): geo_kids.append(kid_id) get_kids(kid_id) geo_kids.append(parent_id) get_kids(geo.id) session = object_session(geo) species_ids = select([species_distribution_table.c.species_id], species_distribution_table.c.geography_id.in_(geo_kids)) return ResultSet(session.query(Species).\ filter(species_table.c.id.in_(species_ids))) class Geography(db.Base): """ Represents a geography unit. :Table name: geography :Columns: *name*: *tdwg_code*: *iso_code*: *parent_id*: :Properties: *children*: :Constraints: """ __tablename__ = 'geography' # columns name = Column(Unicode(255), nullable=False) tdwg_code = Column(String(6)) iso_code = Column(String(7)) parent_id = Column(Integer, ForeignKey('geography.id')) def __str__(self): return self.name # late bindings Geography.children = relation(Geography, primaryjoin=Geography.parent_id==Geography.id, cascade='all', backref=backref("parent", remote_side=[Geography.__table__.c.id]), order_by=[Geography.name]) bauble-0.9.7/bauble/plugins/plants/genus.py0000755000175000017500000007642311267165137017742 0ustar brettbrett# # Genera table module # import os import traceback import xml import gtk from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.orm.session import object_session from sqlalchemy.exc import SQLError from sqlalchemy.ext.associationproxy import association_proxy import bauble import bauble.db as db import bauble.pluginmgr as pluginmgr import bauble.editor as editor import bauble.utils as utils import bauble.utils.desktop as desktop from bauble.types import Enum from bauble.utils.log import debug import bauble.paths as paths from bauble.prefs import prefs from bauble.view import InfoBox, InfoExpander, PropertiesExpander, \ select_in_search_results # TODO: warn the user that a duplicate genus name is being entered # even if only the author or qualifier is different # TODO: should be a higher_taxon column that holds values into # subgen, subfam, tribes etc, maybe this should be included in Genus # TODO: since there can be more than one genus with the same name but # different authors we need to show the Genus author in the result search # and at least give the Genus it's own infobox, we should also check if # when entering a plantname with a chosen genus if that genus has an author # ask the user if they want to use the accepted name and show the author of # the genus then so they aren't using the wrong version of the Genus, # e.g. Cananga def edit_callback(value): return GenusEditor(model=value).start() != None def add_species_callback(value): from bauble.plugins.plants.species_editor import SpeciesEditor return SpeciesEditor(model=Species(genus=value)).start() != None def remove_callback(genus): """ The callback function to remove a genus from the genus context menu. """ from bauble.plugins.plants.species_model import Species session = bauble.Session() nsp = session.query(Species).filter_by(genus_id=genus.id).count() safe_str = utils.xml_safe_utf8(str(genus)) if nsp > 0: msg = _('The genus %s has %s species. Are you sure you want ' 'to remove it?') % (safe_str, nsp) else: msg = _("Are you sure you want to remove the genus %s?") \ % safe_str if not utils.yes_no_dialog(msg): return try: obj = session.query(Genus).get(genus.id) session.delete(obj) session.commit() except Exception, e: msg = _('Could not delete.\n\n%s') % utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), type=gtk.MESSAGE_ERROR) finally: session.close() return True genus_context_menu = [(_('Edit'), edit_callback), ('--', None), (_('Add species'), add_species_callback), ('--', None), (_('Remove'), remove_callback)] def genus_markup_func(genus): ''' ''' return str(genus), str(genus.family) class Genus(db.Base): # TODO: the H in the hybrid name doesn't make much sense in this # context since we don't include a second genus name as the # hybrid, see the HISPID standard for a good explanation...we # could just drop the H and create a second genus field so that if # the second genus field is selected then the name automatically # becomes genus1 x/+ genus2 """ :Table name: genus :Columns: *genus*: The name of the genus. *hybrid*: Indicates whether the name in genus field refers to an Intergeneric hybrid or an Intergeneric graft chimaera. Possible values: * H: An intergeneric hybrid collective name * x: An Intergeneric Hybrid * +: An Intergeneric Graft Hybrid or Graft Chimaera *qualifier*: Designates the botanical status of the genus. Possible values: * s. lat.: aggregrate genus (sensu lato) * s. str.: segregate genus (sensu stricto) *author*: *notes*: :Properties: *family*: *synonyms*: :Contraints: The combination of genus, hybrid, author, qualifier and family_id must be unique. """ __tablename__ = 'genus' __table_args__ = (UniqueConstraint('genus', 'hybrid', 'author', 'qualifier', 'family_id'), {}) __mapper_args__ = {'order_by': ['genus', 'author']} # columns genus = Column(String(64), nullable=False, index=True) hybrid = Column(Enum(values=['H', 'x', '+', '']), default=u'') author = Column(Unicode(255), default=u'') qualifier = Column(Enum(values=['s. lat.', 's. str', '']), default=u'') notes = Column(UnicodeText) family_id = Column(Integer, ForeignKey('family.id'), nullable=False) # relations synonyms = association_proxy('_synonyms', 'synonym') _synonyms = relation('GenusSynonym', primaryjoin='Genus.id==GenusSynonym.genus_id', cascade='all, delete-orphan', uselist=True, backref='genus') # this is a dummy relation, it is only here to make cascading work # correctly and to ensure that all synonyms related to this genus # get deleted if this genus gets deleted __syn = relation('GenusSynonym', primaryjoin='Genus.id==GenusSynonym.synonym_id', cascade='all, delete-orphan', uselist=True) def __str__(self): return Genus.str(self) @staticmethod def str(genus, author=False): if genus.genus is None: return repr(genus) elif not author or genus.author is None: return ' '.join([s for s in [genus.hybrid, genus.genus, genus.qualifier] if s not in ('', None)]) else: return ' '.join( [s for s in [genus.hybrid, genus.genus, genus.qualifier, xml.sax.saxutils.escape(genus.author)] if s not in ('', None)]) class GenusSynonym(db.Base): """ :Table name: genus_synonym """ __tablename__ = 'genus_synonym' __table_args__ = (UniqueConstraint('genus_id', 'synonym_id'), {}) # columns genus_id = Column(Integer, ForeignKey('genus.id'), nullable=False) synonym_id = Column(Integer, ForeignKey('genus.id'), nullable=False) # relations synonym = relation('Genus', uselist=False, primaryjoin='GenusSynonym.synonym_id==Genus.id') def __init__(self, synonym=None, **kwargs): # it is necessary that the first argument here be synonym for # the Genus.synonyms association_proxy to work self.synonym = synonym super(GenusSynonym, self).__init__(**kwargs) def __str__(self): return str(self.synonym) # late bindings from bauble.plugins.plants.family import Family from bauble.plugins.plants.species_model import Species from bauble.plugins.plants.species_editor import SpeciesEditor Genus.species = relation('Species', cascade='all, delete-orphan', order_by=['sp', 'infrasp_rank', 'infrasp'], backref=backref('genus', uselist=False)) class GenusEditorView(editor.GenericEditorView): syn_expanded_pref = 'editor.genus.synonyms.expanded' expanders_pref_map = {'gen_syn_expander': 'editor.genus.synonyms.expanded', 'gen_notes_expander': 'editor.genus.notes.expanded'} _tooltips = { 'gen_family_entry': _('The family name'), 'gen_hybrid_combo': _('The type of hybrid for this genus.'), 'gen_genus_entry': _('The genus name'), 'gen_author_entry': _('The name or abbreviation of the author that '\ 'published this genus'), 'gen_syn_box': _('A list of synonyms for this genus.\n\nTo add a ' 'synonym enter a family name and select one from the ' 'list of completions. Then click Add to add it to '\ 'the list of synonyms.'), 'gen_notes_textview': _('Miscelleanous notes about this genus.') } def __init__(self, parent=None): super(GenusEditorView, self).__init__(os.path.join(paths.lib_dir(), 'plugins', 'plants', 'editors.glade'), parent=parent) self.dialog = self.widgets.genus_dialog self.dialog.set_transient_for(parent) self.set_accept_buttons_sensitive(False) self.connect_dialog_close(self.dialog) self.attach_completion('gen_syn_entry', self.syn_cell_data_func) self.attach_completion('gen_family_entry') self.restore_state() def syn_cell_data_func(self, column, renderer, model, iter, data=None): ''' ''' v = model[iter][0] author = None if v.author is None: author = '' else: author = utils.xml_safe(unicode(v.author)) renderer.set_property('markup', '%s %s (%s)' \ % (Genus.str(v), author, Family.str(v.family))) def save_state(self): ''' save the current state of the gui to the preferences ''' for expander, pref in self.expanders_pref_map.iteritems(): prefs[pref] = self.widgets[expander].get_expanded() def restore_state(self): ''' restore the state of the gui from the preferences ''' for expander, pref in self.expanders_pref_map.iteritems(): expanded = prefs.get(pref, True) self.widgets[expander].set_expanded(expanded) def get_window(self): ''' ''' return self.widgets.genus_dialog def set_accept_buttons_sensitive(self, sensitive): self.widgets.gen_ok_button.set_sensitive(sensitive) self.widgets.gen_ok_and_add_button.set_sensitive(sensitive) self.widgets.gen_next_button.set_sensitive(sensitive) def start(self): return self.dialog.run() class GenusEditorPresenter(editor.GenericEditorPresenter): widget_to_field_map = {'gen_family_entry': 'family', 'gen_genus_entry': 'genus', 'gen_author_entry': 'author', 'gen_hybrid_combo': 'hybrid', # 'gen_qualifier_combo': 'qualifier' 'gen_notes_textview': 'notes'} def __init__(self, model, view): ''' @model: should be an instance of class Genus @view: should be an instance of GenusEditorView ''' super(GenusEditorPresenter, self).__init__(model, view) self.session = object_session(model) # initialize widgets self.init_enum_combo('gen_hybrid_combo', 'hybrid') self.synonyms_presenter = SynonymsPresenter(self.model, self.view, self.session) self.refresh_view() # put model values in view # connect signals def fam_get_completions(text): query = self.session.query(Family) return query.filter(Family.family.like('%s%%' % text)) def on_select(value): self.set_model_attr('family', value) self.assign_completions_handler('gen_family_entry',fam_get_completions, on_select=on_select) self.assign_simple_handler('gen_genus_entry', 'genus') self.assign_simple_handler('gen_hybrid_combo', 'hybrid')#, #editor.UnicodeOrNoneValidator()) self.assign_simple_handler('gen_author_entry', 'author', editor.UnicodeOrNoneValidator()) #self.assign_simple_handler('gen_qualifier_combo', 'qualifier') self.assign_simple_handler('gen_notes_textview', 'notes', editor.UnicodeOrNoneValidator()) # for each widget register a signal handler to be notified when the # value in the widget changes, that way we can do things like sensitize # the ok button self.__dirty = False def set_model_attr(self, field, value, validator=None): super(GenusEditorPresenter, self).set_model_attr(field, value, validator) sensitive = False self.__dirty = True if self.model.family and self.model.genus: sensitive = True self.view.set_accept_buttons_sensitive(sensitive) def dirty(self): return self.__dirty or self.synonyms_presenter.dirty() def refresh_view(self): for widget, field in self.widget_to_field_map.iteritems(): if field == 'family_id': value = getattr(self.model, 'family') else: value = getattr(self.model, field) self.view.set_widget_value(widget, value) def start(self): r = self.view.start() return r # # TODO: you shouldn't be able to set a genus as a synonym of itself # class SynonymsPresenter(editor.GenericEditorPresenter): PROBLEM_INVALID_SYNONYM = 1 def __init__(self, genus, view, session): ''' @param model: Genus instance @param view: see GenericEditorPresenter @param session: ''' super(SynonymsPresenter, self).__init__(genus, view) self.session = session self.init_treeview() # use completions_model as a dummy object for completions, we'll create # seperate SpeciesSynonym models on add completions_model = GenusSynonym() def gen_get_completions(text): query = self.session.query(Genus) return query.filter(and_(Genus.genus.like('%s%%' % text), Genus.id != self.model.id)) self._selected = None def on_select(value): # don't set anything in the model, just set self.selected sensitive = True if value is None: sensitive = False self.view.widgets.gen_syn_add_button.set_sensitive(sensitive) self._selected = value self.assign_completions_handler('gen_syn_entry', gen_get_completions, on_select=on_select) self.view.connect('gen_syn_add_button', 'clicked', self.on_add_button_clicked) self.view.connect('gen_syn_remove_button', 'clicked', self.on_remove_button_clicked) self.__dirty = False def start(self): raise Exception('genus.SynonymsPresenter cannot be started') def dirty(self): return self.__dirty def init_treeview(self): ''' initialize the gtk.TreeView ''' self.treeview = self.view.widgets.gen_syn_treeview # remove any columns that were setup previous, this became a # problem when we starting reusing the glade files with # utils.GladeLoader, the right way to do this would be to # create the columns in glade instead of here for col in self.treeview.get_columns(): self.treeview.remove_column(col) def _syn_data_func(column, cell, model, iter, data=None): v = model[iter][0] syn = v.synonym cell.set_property('markup', '%s %s (%s)' \ % (Genus.str(syn), utils.xml_safe(unicode(syn.author)), Family.str(syn.family))) # set background color to indicate its new if v.id is None: cell.set_property('foreground', 'blue') else: cell.set_property('foreground', None) cell = gtk.CellRendererText() col = gtk.TreeViewColumn('Synonym', cell) col.set_cell_data_func(cell, _syn_data_func) self.treeview.append_column(col) tree_model = gtk.ListStore(object) for syn in self.model._synonyms: tree_model.append([syn]) self.treeview.set_model(tree_model) self.view.connect(self.treeview, 'cursor-changed', self.on_tree_cursor_changed) def on_tree_cursor_changed(self, tree, data=None): ''' ''' path, column = tree.get_cursor() self.view.widgets.gen_syn_remove_button.set_sensitive(True) def refresh_view(self): """ doesn't do anything """ return def on_add_button_clicked(self, button, data=None): ''' adds the synonym from the synonym entry to the list of synonyms for this species ''' syn = GenusSynonym(genus=self.model, synonym=self._selected) tree_model = self.treeview.get_model() tree_model.append([syn]) self._selected = None entry = self.view.widgets.gen_syn_entry self.pause_completions_handler(entry, True) entry.set_text('') entry.set_position(-1) self.pause_completions_handler(entry, False) self.view.widgets.gen_syn_add_button.set_sensitive(False) self.view.widgets.gen_syn_add_button.set_sensitive(False) self.view.set_accept_buttons_sensitive(True) self.__dirty = True def on_remove_button_clicked(self, button, data=None): ''' removes the currently selected synonym from the list of synonyms for this species ''' # TODO: maybe we should only ask 'are you sure' if the selected value # is an instance, this means it will be deleted from the database tree = self.view.widgets.gen_syn_treeview path, col = tree.get_cursor() tree_model = tree.get_model() value = tree_model[tree_model.get_iter(path)][0] s = Genus.str(value.synonym) msg = _('Are you sure you want to remove %(genus)s as a synonym to ' 'the current genus?\n\nNote: This will not remove the ' 'genus from the database.') % {'genus': s} if utils.yes_no_dialog(msg, parent=self.view.get_window()): tree_model.remove(tree_model.get_iter(path)) self.model.synonyms.remove(value.synonym) utils.delete_or_expunge(value) self.session.flush([value]) self.view.set_accept_buttons_sensitive(True) self.__dirty = True class GenusEditor(editor.GenericModelViewPresenterEditor): label = 'Genus' mnemonic_label = '_Genus' # these response values have to correspond to the response values in # the view RESPONSE_OK_AND_ADD = 11 RESPONSE_NEXT = 22 ok_responses = (RESPONSE_OK_AND_ADD, RESPONSE_NEXT) def __init__(self, model=None, parent=None): ''' @param model: Genus instance or None @param parent: None ''' # the view and presenter are created in self.start() self.view = None self.presenter = None if model is None: model = Genus() super(GenusEditor, self).__init__(model, parent) if not parent and bauble.gui: parent = bauble.gui.window self.parent = parent self._committed = [] def handle_response(self, response): ''' handle the response from self.presenter.start() in self.start() ''' not_ok_msg = _('Are you sure you want to lose your changes?') if response == gtk.RESPONSE_OK or response in self.ok_responses: try: if self.presenter.dirty(): self.commit_changes() self._committed.append(self.model) except SQLError, e: msg = _('Error committing changes.\n\n%s') % \ utils.xml_safe_utf8(e.orig) utils.message_details_dialog(msg, str(e), gtk.MESSAGE_ERROR) return False except Exception, e: msg = _('Unknown error when committing changes. See the '\ 'details for more information.\n\n%s') % \ utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), gtk.MESSAGE_ERROR) return False elif self.presenter.dirty() \ and utils.yes_no_dialog(not_ok_msg) \ or not self.presenter.dirty(): self.session.rollback() return True else: # we get here if when asked if we're sure we want to # Cancel we click No return False # respond to responses more_committed = None if response == self.RESPONSE_NEXT: self.presenter.cleanup() model = Genus(family=self.model.family) e = GenusEditor(model=model, parent=self.parent) more_committed = e.start() elif response == self.RESPONSE_OK_AND_ADD: sp = Species(genus=self.model) e = SpeciesEditor(model=sp, parent=self.parent) more_committed = e.start() if more_committed is not None: if isinstance(more_committed, list): self._committed.extend(more_committed) else: self._committed.append(more_committed) return True def start(self): if self.session.query(Family).count() == 0: msg = _('You must first add or import at least one Family into '\ 'the database before you can add plants.') utils.message_dialog(msg) return self.view = GenusEditorView(parent=self.parent) self.presenter = GenusEditorPresenter(self.model, self.view) # add quick response keys dialog = self.view.dialog self.attach_response(dialog, gtk.RESPONSE_OK, 'Return', gtk.gdk.CONTROL_MASK) self.attach_response(dialog, self.RESPONSE_OK_AND_ADD, 'k', gtk.gdk.CONTROL_MASK) self.attach_response(dialog, self.RESPONSE_NEXT, 'n', gtk.gdk.CONTROL_MASK) # set default focus if self.model.family is None: self.view.widgets.gen_family_entry.grab_focus() else: self.view.widgets.gen_genus_entry.grab_focus() while True: response = self.presenter.start() self.view.save_state() # should view or presenter save state if self.handle_response(response): break self.presenter.cleanup() self.session.close() # cleanup session return self._committed from bauble.plugins.plants.species_model import Species#, species_table # # Infobox and InfoExpanders # class LinksExpander(InfoExpander): """ A collection of link buttons to use for internet searches. """ def __init__(self): InfoExpander.__init__(self, _("Links")) self.tooltips = gtk.Tooltips() buttons = [] self.google_button = gtk.LinkButton("", _("Search Google")) self.tooltips.set_tip(self.google_button, _("Search Google")) buttons.append(self.google_button) self.gbif_button = gtk.LinkButton("", _("Search GBIF")) self.tooltips.set_tip(self.gbif_button, _("Search the Global Biodiversity Information "\ "Facility")) buttons.append(self.gbif_button) self.itis_button = gtk.LinkButton("", _("Search ITIS")) self.tooltips.set_tip(self.itis_button, _("Search the Intergrated Taxonomic "\ "Information System")) buttons.append(self.itis_button) self.ipni_button = gtk.LinkButton("", _("Search IPNI")) self.tooltips.set_tip(self.ipni_button, _("Search the International Plant Names Index")) buttons.append(self.ipni_button) self.bgci_button = gtk.LinkButton("", _("Search BGCI")) self.tooltips.set_tip(self.bgci_button, _("Search Botanic Gardens Conservation " \ "International")) buttons.append(self.bgci_button) for b in buttons: b.set_alignment(0, -1) self.vbox.pack_start(b) def update(self, row): s = str(row) self.gbif_button.set_uri("http://data.gbif.org/search/%s" % \ s.replace(' ', '+')) itis_uri = "http://www.itis.gov/servlet/SingleRpt/SingleRpt?"\ "search_topic=Scientific_Name" \ "&search_value=%(search_value)s" \ "&search_kingdom=Plant" \ "&search_span=containing" \ "&categories=All&source=html&search_credRating=All" \ % {'search_value': s.replace(' ', '%20')} self.itis_button.set_uri(itis_uri) self.google_button.set_uri("http://www.google.com/search?q=%s" % \ s.replace(' ', '+')) bgci_uri = "http://www.bgci.org/plant_search.php?action=Find"\ "&ftrGenus=%s&ftrRedList="\ "&ftrRedList1997=&ftrEpithet=&ftrCWR=&x=0&y=0#results" % s self.bgci_button.set_uri(bgci_uri) ipni_uri = "http://www.ipni.org/ipni/advPlantNameSearch.do?"\ "find_genus=%s&find_isAPNIRecord=on& find_isGCIRecord=on" \ "&find_isIKRecord=on&output_format=normal" % s self.ipni_button.set_uri(ipni_uri) class GeneralGenusExpander(InfoExpander): ''' expander to present general information about a genus ''' def __init__(self, widgets): ''' the constructor ''' InfoExpander.__init__(self, _("General"), widgets) general_box = self.widgets.gen_general_box self.widgets.remove_parent(general_box) self.vbox.pack_start(general_box) self.current_obj = None def on_family_clicked(*args): select_in_search_results(self.current_obj.family) utils.make_label_clickable(self.widgets.gen_fam_data, on_family_clicked) def update(self, row): ''' update the expander @param row: the row to get the values from ''' session = bauble.Session() self.current_obj = row self.set_widget_value('gen_name_data', '%s %s' % \ (row, utils.xml_safe(unicode(row.author)))) self.set_widget_value('gen_fam_data', (utils.xml_safe(unicode(row.family)))) # get the number of species nsp = session.query(Species).join('genus').filter_by(id=row.id).count() self.set_widget_value('gen_nsp_data', nsp) # stop here if no GardenPlugin if 'GardenPlugin' not in pluginmgr.plugins: return from bauble.plugins.garden.accession import Accession from bauble.plugins.garden.plant import Plant # get number of accessions nacc = session.query(Accession).join(['species', 'genus']).\ filter_by(id=row.id).count() if nacc == 0: self.set_widget_value('gen_nacc_data', nacc) else: nsp_in_acc = session.query(Accession.species_id).\ join(['species', 'genus']).\ filter_by(id=row.id).distinct().count() self.set_widget_value('gen_nacc_data', '%s in %s species' \ % (nacc, nsp_in_acc)) # get the number of plants in the genus nplants = session.query(Plant).\ join(['accession', 'species', 'genus']).\ filter_by(id=row.id).count() if nplants == 0: self.set_widget_value('gen_nplants_data', nplants) else: nacc_in_plants = session.query(Plant.accession_id).\ join(['accession', 'species', 'genus']).\ filter_by(id=row.id).distinct().count() self.set_widget_value('gen_nplants_data', '%s in %s accessions' \ % (nplants, nacc_in_plants)) session.close() class SynonymsExpander(InfoExpander): expanded_pref = 'infobox.genus.synonyms.expanded' def __init__(self, widgets): InfoExpander.__init__(self, _("Synonyms"), widgets) synonyms_box = self.widgets.gen_synonyms_box self.widgets.remove_parent(synonyms_box) self.vbox.pack_start(synonyms_box) def update(self, row): ''' update the expander @param row: the row to get the values from ''' syn_box = self.widgets.gen_synonyms_box # remove old labels syn_box.foreach(syn_box.remove) # use True comparison in case the preference isn't set self.set_expanded(prefs[self.expanded_pref] == True) if len(row.synonyms) == 0: self.set_sensitive(False) else: on_clicked = lambda l, e, syn: select_in_search_results(syn) for syn in row.synonyms: # create clickable label that will select the synonym # in the search results box = gtk.EventBox() label = gtk.Label() label.set_alignment(0, .5) label.set_markup(Genus.str(syn, author=True)) box.add(label) utils.make_label_clickable(label, on_clicked, syn) syn_box.pack_start(box, expand=False, fill=False) self.show_all() self.set_sensitive(True) class NotesExpander(InfoExpander): def __init__(self, widgets): InfoExpander.__init__(self, _("Notes"), widgets) notes_box = self.widgets.gen_notes_box self.widgets.remove_parent(notes_box) self.vbox.pack_start(notes_box) def update(self, row): if row.notes is None: self.set_expanded(False) self.set_sensitive(False) else: self.set_expanded(True) self.set_sensitive(True) self.set_widget_value('gen_notes_data', row.notes) class GenusInfoBox(InfoBox): """ """ def __init__(self): InfoBox.__init__(self) glade_file = os.path.join(paths.lib_dir(), 'plugins', 'plants', 'infoboxes.glade') self.widgets = utils.GladeWidgets(gtk.glade.XML(glade_file)) self.general = GeneralGenusExpander(self.widgets) self.add_expander(self.general) self.synonyms = SynonymsExpander(self.widgets) self.add_expander(self.synonyms) self.notes = NotesExpander(self.widgets) self.add_expander(self.notes) self.links = LinksExpander() self.add_expander(self.links) self.props = PropertiesExpander() self.add_expander(self.props) if 'GardenPlugin' not in pluginmgr.plugins: self.widgets.remove_parent('gen_nacc_label') self.widgets.remove_parent('gen_nacc_data') self.widgets.remove_parent('gen_nplants_label') self.widgets.remove_parent('gen_nplants_data') def update(self, row): self.general.update(row) self.synonyms.update(row) self.notes.update(row) self.links.update(row) self.props.update(row) __all__ = ['Genus', 'GenusSynonym', 'GenusEditor', 'GenusInfoBox', 'genus_context_menu', 'genus_markup_func'] bauble-0.9.7/bauble/plugins/plants/editors.glade0000644000175000017500000025762211271417624020711 0ustar brettbrett Family Editor False dialog True True 5 vertical 10 True 10 True vertical 10 True 0 none True 2 12 True 25 True <b>Family</b> True label_item False False 0 True 0 none True 2 12 True True <b>Qualifier</b> True label_item False False 1 False 0 True 0 none True 2 12 True True automatic automatic in True True word True <b>Notes</b> True label_item 1 0 True True True True 0 0.5 12 True vertical 2 True False False 0 True True False 0 True vertical gtk-add True False False False True False False 0 gtk-remove True False True False True False False 1 False False 1 1 True <b>Synonyms</b> True label_item False False 1 2 True end gtk-cancel -6 True False True False True False False 0 gtk-ok -5 True False False True False True False False 1 OK and Add Genera 11 True False False True False True False False 2 22 True False True True False True 0 0 True 2 True gtk-go-forward False False 0 True Next True False False 1 False False 3 False end 0 Genus Editor False dialog True vertical True 5 vertical 10 True True 0 none True 2 12 True True <b>Family</b> True label_item 0 True 0 none True 2 12 True -- True <b>Hybrid</b> True label_item 1 True 0 none True 2 12 True True <b>Genus</b> True label_item 2 True 0 none True 2 12 True True <b>Author</b> True label_item 3 False 0 True True True True 0 0.5 12 True vertical 2 True False False 0 True True False 0 True vertical gtk-add True False False False True False False 0 gtk-remove True False True False True False False 1 False False 1 1 True <b>Synonyms</b> True label_item 1 True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True False automatic automatic True word True <b>Notes</b> True label_item 2 2 True end gtk-cancel -6 True False True False True False False 0 gtk-ok -5 True False False True False True False False 1 OK and Add Species 11 True False False True False True False False 2 22 True False True True False True 0 0 True 2 True gtk-go-forward False False 0 True Next True False False 1 False False 3 False end 0 Plant Species Editor False True dialog True vertical True 5 vertical 5 True 0 3 15 Full name False False 0 True vertical True True 0 none True 2 12 True True <i><b>Genus</b></i> True label_item 0 True 0 none True 2 12 True True <b>Hybrid</b> True label_item 1 True 0 none True 2 12 True True <i><b>Species</b></i> True label_item 2 True 0 none True 2 12 True True <b>Author</b> True label_item 3 False 0 True True 0 none True 2 12 True True <b>Species qualifier</b> True label_item False False 0 1 1 True True True 10 8 True 0 none True 2 12 True True <b>Infraspecific Rank</b> True label_item 0 True 0 none True 2 12 True False True <b>Infraspecific Epithet</b> True label_item 1 True 0 none True 2 12 True False True <b>Cultivar Group</b> True label_item 2 True 0 none True 2 12 True False True <b>Infraspecific Author</b> True label_item 3 True <b>Infraspecific Parts</b> True label_item False 2 True True True 10 vertical 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0.5 True True 0 none True 12 True vertical True -- True False False 0 True <b>Distribution</b> True label_item False 0 True vertical gtk-add True False False True 0 gtk-remove True False False True 1 False False 20 1 False False 0 True 10 True vertical True 2 2 True 0 Vernacular name GTK_FILL True 1 2 True True 1 2 1 2 True 0 Language 1 2 GTK_FILL False False 0 True 5 True 0 True vertical gtk-add True False False False True False False 0 gtk-remove True False True False True False False 1 False False 1 1 0 True False False 1 True vertical True 0 Synonyms False False 0 True False False 1 True True False 0 True vertical gtk-add True False False False True False False 0 gtk-remove True False True False True False False 1 False False 1 2 2 1 True 0 none True 2 12 True True automatic automatic in True True word True <b>Notes</b> True label_item 2 True <b>Meta Information</b> True label_item False 3 2 True end gtk-cancel -6 True False True False True False False 0 gtk-ok -5 True False False True False True False False 1 OK and Add Accessions 11 True False False True False True False False 2 22 True False True True False True 0 0 True 2 True gtk-go-forward False False 0 True Next True False False 1 False False 3 False end 0 bauble-0.9.7/bauble/plugins/plants/__init__.py0000755000175000017500000001103011210626427020327 0ustar brettbrett# -*- coding: utf-8 -*- # # plant plugin # # TODO: there is going to be problem with the accessions MultipleJoin # in Species, plants should really have to depend on garden unless # plants is contained within garden, but what about herbaria, they would # also need to depend on plants, what we could do is have another class # with the same name as the other table that defines new columns/joins # for that class or probably not add new columns but add new joins # dynamically # TODO: should create the table the first time this plugin is loaded, if a new # database is created there should be a way to recreate everything from scratch import os import traceback import bauble import bauble.db as db import bauble.utils as utils import bauble.paths as paths import bauble.pluginmgr as pluginmgr from bauble.utils.log import debug, warning, error from bauble.plugins.plants.family import * from bauble.plugins.plants.genus import * from bauble.plugins.plants.species import * from bauble.plugins.plants.geography import * from bauble.view import SearchView class PlantsPlugin(pluginmgr.Plugin): @classmethod def init(cls): if 'GardenPlugin' in pluginmgr.plugins: species_context_menu = [(_('Edit'), edit_callback), ('--', None), (_('Add accession'), add_accession_callback), ('--', None), (_('Remove'), remove_callback)] vernname_context_menu = [(_('Edit'), call_on_species(edit_callback)), ('--', None), (_('Add accession'), call_on_species(add_accession_callback))] mapper_search = SearchView.get_search_strategy('MapperSearch') mapper_search.add_meta(('family', 'fam'), Family, ['family']) SearchView.view_meta[Family].set(children="genera", infobox=FamilyInfoBox, context_menu=family_context_menu, markup_func=family_markup_func) mapper_search.add_meta(('genus', 'gen'), Genus, ['genus']) SearchView.view_meta[Genus].set(children="species", infobox=GenusInfoBox, context_menu=genus_context_menu, markup_func=genus_markup_func) mapper_search.add_meta(('sp', 'species'), Species, ['sp', 'infrasp']) SearchView.view_meta[Species].set(children=species_get_kids, infobox=SpeciesInfoBox, context_menu=species_context_menu, markup_func=species_markup_func) mapper_search.add_meta(('vernacular', 'vern', 'common'), VernacularName, ['name']) SearchView.view_meta[VernacularName].set(children=vernname_get_kids, infobox=VernacularNameInfoBox, context_menu=vernname_context_menu, markup_func=vernname_markup_func) mapper_search.add_meta(('geography', 'geo'), Geography, ['name']) SearchView.view_meta[Geography].set(children=get_species_in_geography) if bauble.gui is not None: bauble.gui.add_to_insert_menu(FamilyEditor, _('Family')) bauble.gui.add_to_insert_menu(GenusEditor, _('Genus')) bauble.gui.add_to_insert_menu(SpeciesEditor, _('Species')) @classmethod def create_tables(cls): super(PlantsPlugin, cls).create_tables() @classmethod def install(cls, import_defaults=True): """ do any setup and configuration required bt this plugin like creating tables, etc... """ if not import_defaults: return path = os.path.join(paths.lib_dir(), "plugins", "plants", "default") filenames = [os.path.join(path, f) for f in 'family.txt', 'genus.txt', 'genus_synonym.txt', 'geography.txt'] #filenames = [os.path.join(path, 'genus_synonym.txt')] from bauble.plugins.imex.csv_ import CSVImporter csv = CSVImporter() import_error = False import_exc = None csv.start(filenames, metadata=db.metadata, force=True) plugin = PlantsPlugin bauble-0.9.7/bauble/plugins/plants/family.py0000755000175000017500000006505711267165176020106 0ustar brettbrett# # Family table definition # import os import traceback import gtk from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.orm.session import object_session from sqlalchemy.exc import SQLError from sqlalchemy.ext.associationproxy import association_proxy import bauble import bauble.db as db import bauble.pluginmgr as pluginmgr import bauble.editor as editor import bauble.utils.desktop as desktop from datetime import datetime import bauble.utils as utils from bauble.utils.log import debug from bauble.types import Enum from bauble.prefs import prefs def edit_callback(value): """ Family context menu callback """ e = FamilyEditor(model=value) return e.start() != None def add_genera_callback(value): """ Family context menu callback """ e = GenusEditor(model=Genus(family=value)) return e.start() != None def remove_callback(family): """ The callback function to remove a family from the family context menu. """ from bauble.plugins.plants.genus import Genus session = bauble.Session() ngen = session.query(Genus).filter_by(family_id=family.id).count() safe_str = utils.xml_safe_utf8(str(family)) if ngen > 0: msg = _('The family %s has %s genera. Are you sure you want ' 'to remove it?') % (safe_str, ngen) else: msg = _("Are you sure you want to remove the family %s?") \ % safe_str if not utils.yes_no_dialog(msg): return try: obj = session.query(Family).get(family.id) session.delete(obj) session.commit() except Exception, e: msg = _('Could not delete.\n\n%s') % utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), type=gtk.MESSAGE_ERROR) finally: session.close() return True family_context_menu = [(_('Edit'), edit_callback), ('--', None), (_('Add genera'), add_genera_callback), ('--', None), (_('Remove'), remove_callback)] def family_markup_func(family): """ return a string or object with __str__ method to use to markup text in the results view """ return family # # Family # class Family(db.Base): """ :Table name: family :Columns: *family*: The name if the family. Required. *qualifier*: The family qualifier. Possible values: * s. lat.: aggregrate family (senso lato) * s. str.: segregate family (senso stricto) * '': the empty string *notes*: Free text notes about the family. :Properties: *synonyms*: An association to _synonyms that will automatically convert a Family object and create the synonym. :Constraints: The family table has a unique constraint on family/qualifier. """ __tablename__ = 'family' __table_args__ = (UniqueConstraint('family', 'qualifier'), {}) __mapper_args = {'order_by': ['family', 'qualifier']} # columns family = Column(String(45), nullable=False, index=True) # we use the blank string here instead of None so that the # contrains will work properly, qualifier = Column(Enum(values=['s. lat.', 's. str.', '']), default=u'') notes = Column(UnicodeText) # relations synonyms = association_proxy('_synonyms', 'synonym') genera = relation('Genus', backref='family', cascade='all, delete-orphan') _synonyms = relation('FamilySynonym', primaryjoin='FamilySynonym.family_id==Family.id', cascade='all, delete-orphan', uselist=True, backref='family') # this is a dummy relation, it is only here to make cascading work # correctly and to ensure that all synonyms related to this family # get deleted if this family gets deleted __syn = relation('FamilySynonym', primaryjoin='FamilySynonym.synonym_id==Family.id', cascade='all, delete-orphan', uselist=True) def __str__(self): return Family.str(self) @staticmethod def str(family, qualifier=False): if family.family is None: return repr(family) else: return ' '.join([s for s in [family.family, family.qualifier] if s not in (None,'')]) class FamilySynonym(db.Base): """ :Table name: family_synonyms :Columns: *family_id*: *synonyms_id*: :Properties: *synonyms*: *species*: """ __tablename__ = 'family_synonym' __table_args__ = (UniqueConstraint('family_id', 'synonym_id'), {}) # columns family_id = Column(Integer, ForeignKey('family.id'), nullable=False) synonym_id = Column(Integer, ForeignKey('family.id'), nullable=False) # relations synonym = relation('Family', uselist=False, primaryjoin='FamilySynonym.synonym_id==Family.id') def __init__(self, synonym=None, **kwargs): # it is necessary that the first argument here be synonym for # the Family.synonyms association_proxy to work self.synonym = synonym super(FamilySynonym, self).__init__(**kwargs) def __str__(self): return Family.str(self.synonym) # # late imports # from bauble.plugins.plants.genus import Genus, GenusEditor class FamilyEditorView(editor.GenericEditorView): syn_expanded_pref = 'editor.family.synonyms.expanded' _tooltips = { 'fam_family_entry': _('The family name'), 'fam_qualifier_combo': _('The family qualifier helps to remove ' 'ambiguities that might be associated with ' 'this family name'), 'fam_notes_textview': _('Miscelleanous notes about this family.'), 'fam_syn_box': _('A list of synonyms for this family.\n\nTo add a ' 'synonym enter a family name and select one from the ' 'list of completions. Then click Add to add it to '\ 'the list of synonyms.') } def __init__(self, parent=None): super(FamilyEditorView, self).__init__(os.path.join(paths.lib_dir(), 'plugins', 'plants', 'editors.glade'), parent=parent) self.dialog = self.widgets.family_dialog self.dialog.set_transient_for(parent) self.attach_completion('fam_syn_entry')#, self.syn_cell_data_func) self.set_accept_buttons_sensitive(False) self.connect_dialog_close(self.widgets.family_dialog) self.restore_state() def save_state(self): prefs[self.syn_expanded_pref] = \ self.widgets.fam_syn_expander.get_expanded() def restore_state(self): expanded = prefs.get(self.syn_expanded_pref, True) self.widgets.fam_syn_expander.set_expanded(expanded) def get_window(self): ''' ''' return self.widgets.family_dialog def set_accept_buttons_sensitive(self, sensitive): self.widgets.fam_ok_button.set_sensitive(sensitive) self.widgets.fam_ok_and_add_button.set_sensitive(sensitive) self.widgets.fam_next_button.set_sensitive(sensitive) def start(self): return self.dialog.run() class FamilyEditorPresenter(editor.GenericEditorPresenter): widget_to_field_map = {'fam_family_entry': 'family', 'fam_qualifier_combo': 'qualifier', 'fam_notes_textview': 'notes'} def __init__(self, model, view): ''' @param model: should be an instance of class Family @param view: should be an instance of FamilyEditorView ''' super(FamilyEditorPresenter, self).__init__(model, view) self.session = object_session(model) # initialize widgets self.init_enum_combo('fam_qualifier_combo', 'qualifier') self.synonyms_presenter = SynonymsPresenter(self.model, self.view, self.session) self.refresh_view() # put model values in view # connect signals self.assign_simple_handler('fam_family_entry', 'family') self.assign_simple_handler('fam_qualifier_combo', 'qualifier') self.assign_simple_handler('fam_notes_textview', 'notes') # for each widget register a signal handler to be notified when the # value in the widget changes, that way we can do things like sensitize # the ok button self.__dirty = False def set_model_attr(self, field, value, validator=None): #debug('set_model_attr(%s, %s)' % (field, value)) super(FamilyEditorPresenter, self).set_model_attr(field, value, validator) self.__dirty = True sensitive = self.model.family and True or False self.view.set_accept_buttons_sensitive(sensitive) def dirty(self): return self.__dirty or self.synonyms_presenter.dirty() def refresh_view(self): for widget, field in self.widget_to_field_map.iteritems(): value = getattr(self.model, field) self.view.set_widget_value(widget, value) def start(self): r = self.view.start() return r # # TODO: you shouldn't be able to set a family as a synonym of itself # class SynonymsPresenter(editor.GenericEditorPresenter): PROBLEM_INVALID_SYNONYM = 1 def __init__(self, family, view, session): ''' @param model: Family instance @param view: see GenericEditorPresenter @param session: ''' super(SynonymsPresenter, self).__init__(family, view) self.session = session self.init_treeview() # use completions_model as a dummy object for completions, we'll create # seperate SpeciesSynonym models on add completions_model = FamilySynonym() def fam_get_completions(text): query = self.session.query(Family) return query.filter(and_(Family.family.like('%s%%' % text), Family.id != self.model.id)) self._selected = None def on_select(value): # don't set anything in the model, just set self._selected sensitive = True if value is None: sensitive = False self.view.widgets.fam_syn_add_button.set_sensitive(sensitive) self._selected = value self.assign_completions_handler('fam_syn_entry', fam_get_completions, on_select=on_select) self.view.connect('fam_syn_add_button', 'clicked', self.on_add_button_clicked) self.view.connect('fam_syn_remove_button', 'clicked', self.on_remove_button_clicked) self.__dirty = False def dirty(self): return self.__dirty def init_treeview(self): ''' initialize the gtk.TreeView ''' self.treeview = self.view.widgets.fam_syn_treeview # remove any columns that were setup previous, this became a # problem when we starting reusing the glade files with # utils.GladeLoader, the right way to do this would be to # create the columns in glade instead of here for col in self.treeview.get_columns(): self.treeview.remove_column(col) def _syn_data_func(column, cell, model, iter, data=None): v = model[iter][0] cell.set_property('text', str(v)) # just added so change the background color to indicate its new if v.id is None: cell.set_property('foreground', 'blue') else: cell.set_property('foreground', None) cell = gtk.CellRendererText() col = gtk.TreeViewColumn('Synonym', cell) col.set_cell_data_func(cell, _syn_data_func) self.treeview.append_column(col) tree_model = gtk.ListStore(object) for syn in self.model._synonyms: tree_model.append([syn]) self.treeview.set_model(tree_model) self.view.connect(self.treeview, 'cursor-changed', self.on_tree_cursor_changed) def on_tree_cursor_changed(self, tree, data=None): ''' ''' path, column = tree.get_cursor() self.view.widgets.fam_syn_remove_button.set_sensitive(True) def refresh_view(self): """ doesn't do anything """ return def on_add_button_clicked(self, button, data=None): ''' adds the synonym from the synonym entry to the list of synonyms for this species ''' syn = FamilySynonym(family=self.model, synonym=self._selected) tree_model = self.treeview.get_model() tree_model.append([syn]) self._selected = None entry = self.view.widgets.fam_syn_entry self.pause_completions_handler(entry, True) entry.set_text('') entry.set_position(-1) self.pause_completions_handler(entry, False) self.view.widgets.fam_syn_add_button.set_sensitive(False) self.view.widgets.fam_syn_add_button.set_sensitive(False) self.view.set_accept_buttons_sensitive(True) self.__dirty = True def on_remove_button_clicked(self, button, data=None): ''' removes the currently selected synonym from the list of synonyms for this species ''' # TODO: maybe we should only ask 'are you sure' if the selected value # is an instance, this means it will be deleted from the database tree = self.view.widgets.fam_syn_treeview path, col = tree.get_cursor() tree_model = tree.get_model() value = tree_model[tree_model.get_iter(path)][0] # debug('%s: %s' % (value, type(value))) s = Family.str(value.synonym) msg = 'Are you sure you want to remove %s as a synonym to the ' \ 'current family?\n\nNote: This will not remove the family '\ '%s from the database.' % (s, s) if utils.yes_no_dialog(msg, parent=self.view.get_window()): tree_model.remove(tree_model.get_iter(path)) self.model.synonyms.remove(value.synonym) utils.delete_or_expunge(value) self.session.flush([value]) self.view.set_accept_buttons_sensitive(True) self.__dirty = True class FamilyEditor(editor.GenericModelViewPresenterEditor): label = 'Family' mnemonic_label = '_Family' # these have to correspond to the response values in the view RESPONSE_OK_AND_ADD = 11 RESPONSE_NEXT = 22 ok_responses = (RESPONSE_OK_AND_ADD, RESPONSE_NEXT) def __init__(self, model=None, parent=None): ''' @param model: Family instance or None @param parent: the parent window or None ''' if model is None: model = Family() super(FamilyEditor, self).__init__(model, parent) if not parent and bauble.gui: parent = bauble.gui.window self.parent = parent self._committed = [] def handle_response(self, response): ''' @return: return a list if we want to tell start() to close the editor, the list should either be empty or the list of committed values, return None if we want to keep editing ''' not_ok_msg = 'Are you sure you want to lose your changes?' if response == gtk.RESPONSE_OK or response in self.ok_responses: try: if self.presenter.dirty(): self.commit_changes() self._committed.append(self.model) except SQLError, e: msg = _('Error committing changes.\n\n%s') % \ utils.xml_safe_utf8(e.orig) utils.message_details_dialog(msg, str(e), gtk.MESSAGE_ERROR) return False except Exception, e: msg = _('Unknown error when committing changes. See the ' \ 'details for more information.\n\n%s') % \ utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), gtk.MESSAGE_ERROR) return False elif self.presenter.dirty() and utils.yes_no_dialog(not_ok_msg) or \ not self.presenter.dirty(): self.session.rollback() return True else: return False # respond to responses more_committed = None if response == self.RESPONSE_NEXT: self.presenter.cleanup() e = FamilyEditor(parent=self.parent) more_committed = e.start() elif response == self.RESPONSE_OK_AND_ADD: e = GenusEditor(Genus(family=self.model), self.parent) more_committed = e.start() if more_committed is not None: if isinstance(more_committed, list): self._committed.extend(more_committed) else: self._committed.append(more_committed) return True def start(self): self.view = FamilyEditorView(parent=self.parent) self.presenter = FamilyEditorPresenter(self.model, self.view) # add quick response keys dialog = self.view.dialog self.attach_response(dialog, gtk.RESPONSE_OK, 'Return', gtk.gdk.CONTROL_MASK) self.attach_response(dialog, self.RESPONSE_OK_AND_ADD, 'k', gtk.gdk.CONTROL_MASK) self.attach_response(dialog, self.RESPONSE_NEXT, 'n', gtk.gdk.CONTROL_MASK) while True: response = self.presenter.start() self.view.save_state() # should view or presenter save state if self.handle_response(response): break self.presenter.cleanup() self.session.close() # cleanup session return self._committed # # Family infobox # from bauble.view import InfoBox, InfoExpander, PropertiesExpander, \ select_in_search_results import bauble.paths as paths from bauble.plugins.plants.genus import Genus from bauble.plugins.plants.species_model import Species class GeneralFamilyExpander(InfoExpander): ''' generic information about an family like number of genus, species, accessions and plants ''' def __init__(self, widgets): ''' the constructor ''' InfoExpander.__init__(self, _("General"), widgets) general_box = self.widgets.fam_general_box self.widgets.remove_parent(general_box) self.vbox.pack_start(general_box) def update(self, row): ''' update the expander @param row: the row to get the values from ''' self.set_widget_value('fam_name_data', '%s' % row) session = bauble.Session() # get the number of genera ngen = session.query(Genus).filter_by(family_id=row.id).count() self.set_widget_value('fam_ngen_data', ngen) # get the number of species nsp = session.query(Species).join('genus').\ filter_by(family_id=row.id).count() if nsp == 0: self.set_widget_value('fam_nsp_data', 0) else: ngen_in_sp = session.query(Species.genus_id).\ join(['genus', 'family']).\ filter_by(id=row.id).distinct().count() self.set_widget_value('fam_nsp_data', '%s in %s genera' \ % (nsp, ngen_in_sp)) # stop here if no GardenPlugin if 'GardenPlugin' not in pluginmgr.plugins: return # get the number of accessions in the family from bauble.plugins.garden.accession import Accession from bauble.plugins.garden.plant import Plant nacc = session.query(Accession).join(['species', 'genus', 'family']).\ filter_by(id=row.id).count() if nacc == 0: self.set_widget_value('fam_nacc_data', nacc) else: nsp_in_acc = session.query(Accession.species_id).\ join(['species', 'genus', 'family']).\ filter_by(id=row.id).distinct().count() self.set_widget_value('fam_nacc_data', '%s in %s species' \ % (nacc, nsp_in_acc)) # get the number of plants in the family nplants = session.query(Plant).\ join(['accession', 'species', 'genus', 'family']).\ filter_by(id=row.id).count() if nplants == 0: self.set_widget_value('fam_nplants_data', nplants) else: nacc_in_plants = session.query(Plant.accession_id).\ join(['accession', 'species', 'genus','family']).\ filter_by(id=row.id).distinct().count() self.set_widget_value('fam_nplants_data', '%s in %s accessions' \ % (nplants, nacc_in_plants)) session.close() class SynonymsExpander(InfoExpander): expanded_pref = 'infobox.family.synonyms.expanded' def __init__(self, widgets): InfoExpander.__init__(self, _("Synonyms"), widgets) synonyms_box = self.widgets.fam_synonyms_box self.widgets.remove_parent(synonyms_box) self.vbox.pack_start(synonyms_box) def update(self, row): ''' update the expander @param row: the row to get thevalues from ''' syn_box = self.widgets.fam_synonyms_box # remove old labels syn_box.foreach(syn_box.remove) # use True comparison in case the preference isn't set self.set_expanded(prefs[self.expanded_pref] == True) if len(row.synonyms) == 0: self.set_sensitive(False) else: on_clicked = lambda l, e, syn: select_in_search_results(syn) for syn in row.synonyms: # create clickable label that will select the synonym # in the search results box = gtk.EventBox() label = gtk.Label() label.set_alignment(0, .5) label.set_markup(Family.str(syn)) box.add(label) utils.make_label_clickable(label, on_clicked, syn) syn_box.pack_start(box, expand=False, fill=False) self.show_all() self.set_sensitive(True) class NotesExpander(InfoExpander): def __init__(self, widgets): InfoExpander.__init__(self, _("Notes"), widgets) notes_box = self.widgets.fam_notes_box self.widgets.remove_parent(notes_box) self.vbox.pack_start(notes_box) def update(self, row): if row.notes is None: self.set_expanded(False) self.set_sensitive(False) else: self.set_expanded(True) self.set_sensitive(True) self.set_widget_value('fam_notes_data', row.notes) class LinksExpander(InfoExpander): def __init__(self): super(LinksExpander, self).__init__(_('Links')) self.tooltips = gtk.Tooltips() buttons = [] self.google_button = gtk.LinkButton("", _("Search Google")) self.tooltips.set_tip(self.google_button, _("Search Google")) buttons.append(self.google_button) self.gbif_button = gtk.LinkButton("", _("Search GBIF")) self.tooltips.set_tip(self.gbif_button, _("Search the Global Biodiversity Information "\ "Facility")) buttons.append(self.gbif_button) self.itis_button = gtk.LinkButton("", _("Search ITIS")) self.tooltips.set_tip(self.itis_button, _("Search the Intergrated Taxonomic "\ "Information System")) buttons.append(self.itis_button) self.ipni_button = gtk.LinkButton("", _("Search IPNI")) self.tooltips.set_tip(self.ipni_button, _("Search the International Plant Names Index")) buttons.append(self.ipni_button) for b in buttons: b.set_alignment(0, -1) self.vbox.pack_start(b) def update(self, row): s = str(row) self.gbif_button.set_uri("http://data.gbif.org/search/%s" % \ s.replace(' ', '+')) itis_uri = "http://www.itis.gov/servlet/SingleRpt/SingleRpt?"\ "search_topic=Scientific_Name" \ "&search_value=%(search_value)s" \ "&search_kingdom=Plant" \ "&search_span=containing" \ "&categories=All&source=html&search_credRating=All" \ % {'search_value': s.replace(' ', '%20')} self.itis_button.set_uri(itis_uri) self.google_button.set_uri("http://www.google.com/search?q=%s" % \ s.replace(' ', '+')) ipni_uri = "http://www.ipni.org/ipni/advPlantNameSearch.do?"\ "find_family=%s" \ "&find_isAPNIRecord=on& find_isGCIRecord=on" \ "&find_isIKRecord=on&output_format=normal" % s self.ipni_button.set_uri(ipni_uri) class FamilyInfoBox(InfoBox): ''' ''' def __init__(self): ''' ''' InfoBox.__init__(self) glade_file = os.path.join(paths.lib_dir(), 'plugins', 'plants', 'infoboxes.glade') self.widgets = utils.GladeWidgets(gtk.glade.XML(glade_file)) self.general = GeneralFamilyExpander(self.widgets) self.add_expander(self.general) self.synonyms = SynonymsExpander(self.widgets) self.add_expander(self.synonyms) self.notes = NotesExpander(self.widgets) self.add_expander(self.notes) self.links = LinksExpander() self.add_expander(self.links) self.props = PropertiesExpander() self.add_expander(self.props) if 'GardenPlugin' not in pluginmgr.plugins: self.widgets.remove_parent('fam_nacc_label') self.widgets.remove_parent('fam_nacc_data') self.widgets.remove_parent('fam_nplants_label') self.widgets.remove_parent('fam_nplants_data') def update(self, row): ''' ''' self.general.update(row) self.synonyms.update(row) self.notes.update(row) self.links.update(row) self.props.update(row) __all__ = ['Family', 'FamilyEditor', 'FamilySynonym', 'FamilyInfoBox', 'family_context_menu', 'family_markup_func'] bauble-0.9.7/bauble/plugins/plants/default/0000755000175000017500000000000011310570250017635 5ustar brettbrettbauble-0.9.7/bauble/plugins/plants/default/Genus_removed.txt0000644000175000017500000000113711210626427023211 0ustar brettbrett i don't quite know what these mean, is it that Trisiola has two parent synonyms?, if that is the case I would suspect they would have different authors at least but it seems like these names may have been recycled as some point and they are both synonyms for seperate names so i removed them from Genus.txt "id","hybrid","genus","author","synonymID","familyID" 15846,"","Trisiola","Raf.",12925,214 15845,"","Trisiola","Raf.",13361,214 16614,"","Decemium","Raf.","",246 19390,"","Decemium","Raf.",7958,246 11264,"","Parasarcochilus","Dockrill",11391,345 22830,"","Parasarcochilus","Dockrill",11347,345bauble-0.9.7/bauble/plugins/plants/default/genus_synonym.txt0000644000175000017500000035101511237044675023337 0ustar brettbrett"synonym_id","genus_id" 24904,8834 20529,8942 25483,8908 8806,9075 8807,9075 16180,8942 15974,8972 24940,8822 24906,8935 20530,8942 20539,8815 8812,9028 8813,8838 20531,8942 20519,9020 20518,8982 24941,9037 24942,8952 20499,9037 20493,8933 8826,8942 15193,8942 8828,9075 20511,8829 20509,8829 20510,8829 20514,8829 20532,8942 20533,8942 8832,8930 24908,8834 14176,22085 24969,8883 24911,9052 8841,9075 24912,8942 20496,8895 8843,8942 8845,8942 20494,8933 8847,8848 8849,9075 8854,8942 8855,8942 24970,8942 8859,9075 24905,8804 24971,8942 8861,8937 20520,9020 24420,9037 8869,8942 24924,8848 20521,8918 8874,9075 20534,8942 20983,8942 24972,8942 25196,8883 20503,8904 17374,9022 17501,8942 25197,8986 24907,8825 20512,8829 8884,9075 8885,9075 24973,8942 8886,9037 8888,9037 16181,8894 22084,8889 8890,9075 8892,9075 16182,8942 24974,8942 24975,8942 20491,9064 8898,9075 20538,8937 24976,8942 8901,9075 8902,9037 25198,9075 24913,9064 24977,8942 20528,8988 24978,8925 8910,9069 24979,9111 24914,8942 8320,9067 20490,8819 8912,8920 24981,8942 8914,9075 8917,9075 25199,9075 20498,9037 20505,9046 8921,9028 8922,8920 20527,9041 14801,8814 8923,8814 24982,8942 23239,8872 20506,9011 24986,8942 25834,8933 24983,8942 24984,8822 24985,8942 8929,8818 24987,8822 8934,9075 24918,9052 8343,8829 20516,8825 8939,8942 16183,8942 22086,8920 25186,9075 24989,8933 24990,9075 24988,8942 24926,8822 8947,9075 25187,9075 8951,8937 25188,9106 24991,8822 8953,9075 24992,8983 24910,8839 24993,8959 24994,8942 24996,8942 15975,8972 8957,9075 8958,9075 24995,8942 20526,8930 24997,8942 8963,9075 8964,8818 8966,8942 20979,9007 8974,9075 15976,8972 25189,8960 8384,9064 24998,8942 8984,9075 8985,8933 24999,9037 17508,8962 25194,8822 24915,8918 20500,8971 24927,8838 8990,9028 20535,8942 8993,9075 25000,8829 8994,9075 8995,9075 25503,9075 25001,8942 8997,9075 8998,9075 25002,8825 17370,8905 17375,8836 9003,8935 9004,9075 25003,8942 24916,8918 16184,9007 25190,8986 20497,8895 9009,9075 23579,8839 25004,8942 24419,8937 9012,8942 9013,9075 18164,8872 24922,8977 23240,8872 9017,9028 24928,8942 24923,9106 20525,8930 20513,8829 24920,8942 9018,9075 25191,9076 9019,9075 20508,8829 20502,9006 20507,9052 9024,9075 25005,9005 9026,9075 9027,9075 25006,8942 9029,9075 25007,9005 9031,8942 9032,8942 25008,8942 17746,8942 24919,8937 25009,8942 20984,8942 9036,8942 24909,8839 25010,8942 25480,8825 20524,9042 20523,9042 20536,8942 16185,8933 24921,8942 20980,8942 9049,8937 20537,8977 9051,9037 20515,9093 9054,9075 9055,9075 9056,9075 20981,8942 25011,8942 25192,9075 25012,8942 9058,8926 20501,8903 25193,8822 25013,9064 9065,9044 25195,9037 17747,9037 9071,8942 25014,8822 17369,8937 20504,9106 9079,9075 9080,8818 25015,8822 17372,8949 20495,8933 9081,8920 24925,8942 9083,9075 20540,8809 9084,9075 9087,9075 9088,9075 9089,9075 25168,8942 9091,8942 17371,8862 9092,9075 20541,8986 9097,9075 9098,8834 9102,8860 25016,8899 20982,8942 25169,9037 20522,8952 9105,9014 9108,9075 9109,9075 20492,9064 21644,13502 21649,13508 21651,13508 21650,13508 21629,13504 24122,13506 21607,13490 21630,13527 21642,13522 24120,13490 21641,13522 21658,13521 21664,13521 21652,13508 21653,13508 21639,13510 21654,13508 21631,13527 21640,13510 21637,13510 21646,16718 21663,13511 21666,13501 24121,13528 21633,13528 25697,13508 21606,13491 13516,22236 21655,13508 21643,13522 21647,16718 13520,13508 15949,13508 21638,13510 21656,13508 25702,13521 21648,16718 21659,13521 21608,13489 25728,13522 21660,13521 21635,13528 21657,13508 21626,13512 21661,13521 21645,13513 21634,13528 21627,13523 21662,13521 21632,13527 21628,13523 13530,13522 21665,13511 20950,10195 20941,10195 16930,11933 18856,11855 15950,11844 16931,11844 16932,11855 18855,11933 22171,4274 22176,4400 22172,4274 4275,16803 25827,4406 4277,22167 22192,4404 22180,4323 4283,16803 22160,4287 4289,4303 22154,4347 4300,4351 22185,4345 22155,4347 22173,4274 25822,4404 22189,4349 22184,4301 22157,4347 25820,4394 20148,4288 4318,4347 22156,4347 4328,22193 25817,4395 16800,4347 25814,4360 4330,4299 16801,4347 22186,4345 4337,4317 22153,4280 25821,4404 25810,4290 22190,4310 4346,4310 22182,4323 4350,14172 22188,4351 4359,22193 4361,4382 16802,16803 22158,16803 4366,4347 25825,4406 22177,4382 25815,4347 25816,16803 25540,4347 22161,4344 25831,4312 4371,4312 22168,4317 4372,4280 25826,4406 4377,16803 14173,4357 25818,4394 25537,4347 22175,4373 25819,4394 25811,4304 25824,4406 25812,4341 22183,4323 22162,4409 22169,4282 4388,4291 4389,16803 16799,4347 22166,22165 25813,4351 4393,4317 25205,4312 4397,16803 22170,4358 22187,4312 25539,4280 25823,4404 16804,4332 14174,4292 22174,4405 25809,4273 22152,4412 24627,12551 17015,12552 17016,12552 20150,12557 20149,12557 25203,12549 18951,12001 18949,11904 18946,11940 25550,12001 18947,11940 25551,12001 18950,11963 12073,12001 18948,11940 18874,11971 16228,11971 18873,11882 18875,11971 17491,17490 4889,7047 16232,7047 4890,7047 16672,9475 22056,9475 16673,9505 22055,9502 24632,9497 22067,9474 22063,9498 16674,9490 22065,9535 9491,9504 9493,9526 22064,9498 22066,9517 23216,9537 22059,9509 22053,9520 22068,9474 22057,9475 9518,9497 16675,9492 22058,9529 22061,9525 20151,9481 22054,9477 22070,9474 22062,9526 9536,23206 23082,11822 16933,11785 11775,11788 22222,11822 16935,11820 16940,11827 18954,11829 22255,17494 22256,17494 18958,11822 11789,24623 18957,11800 18959,11803 18953,11793 11805,11803 11808,11812 16936,11801 25546,11814 24622,11801 16937,11827 25841,18955 25840,18955 16938,11814 18952,11772 18956,11785 18794,11801 16939,11795 17907,2475 17894,2436 24549,2476 25601,2441 24550,2476 17906,2440 24553,2425 24552,2418 17905,2419 17910,2424 16443,2468 17898,2470 17901,2479 2480,16449 17902,2439 17890,2468 24557,2468 2446,2472 2447,2432 17897,2459 17904,2416 17891,2468 16445,2472 24556,2459 17903,2439 16446,2472 24547,2443 17900,2458 17896,2469 16447,2439 17892,2468 17908,2475 17909,2475 17895,2474 24554,2432 24555,2432 17893,2468 16448,2468 24551,2417 10499,2468 17899,2456 24463,3497 24590,3497 18663,160 18664,143 18704,202 18661,174 25764,230 18671,116 18669,117 118,183 18686,157 18687,157 123,198 18662,160 17564,124 18683,183 18694,236 18705,202 141,129 144,111 147,25523 24690,140 149,183 18681,200 18670,124 18665,143 18676,148 18677,148 25765,112 18695,236 18678,148 18706,178 24797,180 24691,181 168,14179 18707,176 24694,199 18675,148 18657,230 18689,152 18679,200 22074,166 18658,230 18659,230 18672,116 18685,153 18668,236 18693,236 18698,236 18673,116 25766,111 205,236 18660,230 211,175 212,222 18682,111 215,214 18667,115 217,178 24798,180 24688,129 18680,200 18701,188 18666,125 18702,234 18703,234 18674,227 17565,236 25767,230 232,230 18699,230 235,14180 18700,236 18690,236 18691,236 11879,14230 18880,12085 18879,11928 18876,11891 18878,11891 17748,11928 18881,11915 16570,7362 16571,7302 17725,7394 16572,7305 17726,7300 17705,7458 17706,7458 19251,7310 17675,7473 17727,7407 7314,7382 7315,7382 17720,7364 16573,7360 16574,7432 16575,17721 25227,7305 17728,7406 17703,7458 7323,7402 17687,7406 25588,7458 19253,7458 17686,7424 17677,7382 25177,7457 16576,7419 25174,7465 19256,7457 7339,7395 25175,7407 16580,7320 17682,7374 7341,7458 16581,7319 15899,7319 17691,7399 7349,7438 7350,7459 16582,7394 16583,7306 16584,7458 16585,7301 7358,19252 17700,7325 17719,7394 17695,7458 17688,7406 16586,7313 17701,7458 17711,7419 7368,7337 16587,7320 16589,7407 17697,7458 25176,7325 17713,7301 16591,7382 17709,7379 7381,7397 17714,1601 7383,7394 25586,7458 17690,7331 7388,7419 7393,7392 7398,7464 17717,7394 17693,17692 16593,7321 17699,7458 17676,7335 16595,7395 7404,7354 17716,7458 16596,7458 17694,7472 17710,7448 17696,7458 16597,7305 17702,7458 19260,7458 7413,7356 16598,7469 7415,7306 7416,7319 7418,7417 17715,7378 16599,7407 17704,7458 16600,7458 16601,7373 17712,7475 7426,7374 7428,7462 7429,7316 7430,7438 17685,7374 25587,7458 7433,7406 7434,7395 16577,7333 7436,7458 16602,7458 16578,7438 17698,7458 17689,7340 16579,7392 19255,7457 19254,7457 25589,7458 16603,7475 17708,7458 17718,7384 17707,7458 16604,7458 17683,7374 16145,7316 16605,7395 7466,17674 16606,7475 25577,7467 17681,7305 17723,7356 17680,7380 7477,7320 16607,7457 19176,12482 17002,12509 17004,12440 19190,12448 17005,12511 19178,12514 12441,12451 19184,12529 17006,12517 19185,12456 19194,12526 19177,12482 12462,12482 12467,12465 17007,12435 19188,12488 19189,12488 19198,12444 19179,12498 19193,12447 19197,12468 19199,12444 17008,12474 17009,12446 19173,12434 19196,12512 19186,12458 19192,12523 19181,12463 17010,12450 17011,12474 23234,12491 19172,12465 19195,12526 12495,12514 12500,12434 19200,12444 17012,12490 12502,12524 19182,12535 19174,12434 12510,12455 19180,12498 19183,12535 19201,12444 19187,12432 19191,12448 17013,12446 19175,12434 17014,12494 12527,12434 25606,12531 12533,12432 24562,4818 5562,4801 24563,4849 18105,4849 18106,4849 18104,4830 18130,4849 24564,4849 18141,4840 4805,4820 18133,4845 24565,4834 16559,4834 18134,4845 18107,4849 16560,4849 18102,4843 24566,4843 16561,4849 18101,4801 4813,4849 18149,4855 4814,4820 4816,4849 4817,4838 18144,4803 18142,4840 18147,4806 18135,4845 4819,4821 24567,4845 4823,4849 18140,4812 24568,4845 18148,4831 18131,4849 18129,4824 4828,4822 24569,4845 24570,4853 18136,4845 24571,4845 24572,4812 24573,4839 2450,4845 25500,4801 16562,4849 18138,4846 18145,4803 24574,4849 18139,4845 16563,4849 24575,4845 18137,4845 24576,4849 4842,4843 24577,4849 18132,4822 4844,4849 24578,4856 18100,4811 18146,4806 18143,4840 18150,4855 24579,4846 16564,4849 16565,4834 16566,4845 15889,4849 24580,4810 24581,4834 24582,4812 16567,4845 24583,4855 4857,4849 24584,4812 4858,4806 9775,9783 22270,9783 17987,9783 17988,9783 16703,9783 20152,9777 24325,9777 24629,9783 24628,9783 24630,9783 19628,7596 17438,7488 19572,7524 17413,7776 19608,7805 19618,7799 19595,7670 19602,7645 17444,7636 22199,7488 25584,17458 19607,7638 19588,7692 19582,7723 19592,7750 19601,7488 17437,7488 7490,7674 17421,7478 7496,7506 19620,7621 25178,7799 19599,7488 7504,7506 19636,7513 17414,7497 17415,7638 22207,7506 7507,7671 19617,7561 19589,7692 19629,7596 19635,7596 19593,7568 17418,7653 19616,7614 19625,7565 19624,7517 17410,7749 19630,7542 22208,7506 19575,7581 19631,7596 25160,7670 19612,7690 7535,7736 17454,7513 19576,7581 7537,7506 7539,17456 19638,7808 25161,7636 7554,7635 19604,17440 7557,7645 22201,7488 7564,7529 7570,7779 17441,7665 19596,7670 19577,7562 17409,7733 7584,7636 22198,7648 19621,7621 19619,7799 25162,7670 22202,7544 7603,7645 19579,7655 7610,7638 17412,7577 7612,7764 19597,7740 19594,7487 7617,7506 19573,7524 19574,7524 19581,7776 19640,7712 7620,7555 7623,24290 22203,7544 19583,7723 7650,7506 19590,7701 17447,7799 19605,17440 16608,7799 7659,7755 19615,7578 7662,7591 22197,7676 7664,7636 19632,7596 19598,7488 17445,7636 25609,7685 19610,7529 19587,7502 17448,7788 19642,7722 25163,7645 17435,7568 19641,7522 20153,7741 19633,7596 22209,17456 7704,7488 7705,7488 7706,7606 19623,7783 7715,7582 19622,7635 19626,7547 19634,7596 7717,14201 19584,7723 19591,7675 7725,7788 22204,7529 7732,7529 25164,7635 19637,17460 22200,7488 19609,7529 19643,7722 19603,7645 17411,7692 19600,7488 7752,7513 17442,7685 24291,7756 17419,7660 25165,7683 7761,7645 17317,7683 7765,7635 7773,17456 17449,7591 7775,7778 22206,7506 19639,7532 22205,7636 25166,7788 19578,7769 7796,7797 25167,7635 19580,7655 7806,7529 19627,7547 25607,7723 19585,7723 19606,7616 11951,11895 15967,11895 17486,11895 18871,11911 18870,11897 18872,12082 18869,11993 21912,13647 21913,13647 21914,13647 16730,13647 21926,13647 21905,13647 21906,13647 21915,13647 24127,13649 25695,13647 21916,13647 21907,13647 21917,13647 21927,13647 21908,13647 21922,13647 24125,13651 21918,13647 24128,13649 21919,13647 13653,13647 25710,13647 21920,13647 21925,13647 24330,13647 21909,13647 21910,13647 21911,13647 21921,13647 24126,13651 18098,4861 22038,13758 24586,10176 20095,10178 24775,10173 16398,1674 16023,1674 4151,4150 4153,4150 19664,8671 19700,8695 19670,8660 19671,8745 19743,8743 8659,25289 19677,8707 19668,8671 19684,8779 19710,8675 19734,8682 19691,8727 19699,8774 19656,8657 19678,8707 19694,8746 16637,8668 19715,8767 19711,8771 19688,8703 16638,8657 19661,8655 19679,8707 19735,8654 19709,8675 19722,8768 19674,8678 19744,8777 19695,8704 19736,8654 19682,8653 19706,8696 19686,8703 19729,8685 19725,8685 19732,8685 19733,8685 15973,8707 19714,8771 19728,8685 19697,8717 19698,8717 25504,8671 8693,8685 19721,8768 19683,8733 19692,8727 19703,8696 19727,8685 19740,8697 19718,8773 19704,8696 8699,8746 19723,8752 19672,8745 19712,8771 20953,8673 19666,8671 19708,8664 19663,8679 19724,8752 19745,8777 19696,8704 19685,8714 19720,8708 19702,8676 19716,8767 8720,8745 19693,8713 19701,8695 19665,8671 8724,8771 19680,8707 19669,8671 19675,8772 8728,8707 19659,8657 19652,8657 19737,8744 8732,8731 8734,8657 19657,8657 16639,8657 8741,8679 19687,8703 19689,8742 16640,8671 19662,8655 19719,8681 19713,8771 19681,8707 8750,8655 19739,8670 19707,8696 19705,8696 19690,8781 19667,8671 19653,8657 8758,8733 19676,8778 16641,8657 16642,8768 19741,8697 19730,8685 19717,8672 19654,8657 8775,8773 19655,8657 17770,8685 25410,8778 19658,8657 19742,8743 19738,8736 16643,8782 21945,13661 21931,13655 21932,13655 21944,13656 21946,13661 21933,13655 21934,13655 21935,13655 21928,13655 21936,13655 21948,13660 21937,13655 21947,13661 21938,13655 21939,13655 21940,13655 21941,13655 21930,13655 21942,13655 21943,13655 17583,1354 16371,1357 16372,1351 17581,1354 17582,1354 24750,1348 16373,1349 17938,1349 16374,1354 7970,8024 24664,8026 19483,7979 19466,8060 16615,8060 24663,7978 24660,7988 22275,8023 25386,7979 19474,7971 22280,8016 19451,7984 16620,8064 24659,8080 25387,7982 24658,8080 24656,8016 24655,8016 19476,7971 19475,7971 19473,8058 24653,8077 19470,8066 7992,8016 19492,8050 24646,7994 24647,7994 16616,8064 19458,8000 25389,8060 16617,8020 19481,7979 19486,8027 22214,8027 19455,15876 24662,8082 19464,7997 16622,8016 24657,8080 19453,15876 25281,7994 16623,8060 17509,7997 19479,8038 19478,8082 25391,7977 16621,8020 8017,7974 24349,7979 19488,8027 25392,7997 19461,8071 19485,7979 16624,8003 25282,7994 25393,8016 19487,8027 8028,7974 19469,8066 8030,7979 16625,8007 19462,8064 16197,8054 8033,8005 19467,8047 24652,22662 16173,8077 24651,22662 25395,8009 24661,8054 19452,15876 19482,7979 19459,8080 22281,8082 19477,7971 19490,8027 19465,7997 19468,8061 8052,8021 19460,7999 25396,8082 19491,8027 8059,7974 16618,8050 16199,8073 17507,8073 19456,15876 19471,8066 19457,8067 24648,7994 24665,7971 19472,8036 19463,8020 16619,8077 19454,15876 25384,8003 24650,15876 19484,7979 19489,8027 24649,8006 8083,14203 24350,7979 24654,8016 16626,8016 8084,8000 17510,7997 19480,8012 18824,11662 16917,11626 18834,11651 18822,11644 18823,11644 18826,11643 24306,11620 16918,11643 18825,11662 18838,11653 18836,11628 19319,11640 18841,11620 18835,11642 18837,11628 24302,11620 24305,11620 18827,11643 18820,11618 17487,11644 24303,11620 18831,11652 24300,11620 24301,11620 24304,11620 18821,11636 18832,11652 18828,11643 18839,11653 18829,11643 18830,11643 18842,11620 20332,3483 20330,3480 20325,3478 20326,3478 20331,3480 20333,3483 20324,3474 20327,3478 20328,3478 20334,3475 20329,3484 22210,7818 19650,7818 19651,7818 24331,7844 14207,7844 19416,7844 25136,7838 22665,7835 7833,7818 15905,7836 18883,10718 18882,10708 10712,10718 25149,10718 25150,10718 25151,10713 10719,10718 25152,10718 17813,1914 1912,1913 17815,1911 1919,1927 1920,1915 17819,1916 17814,1914 17816,1922 17817,1923 24400,1914 17820,1916 1924,1923 17818,1923 20943,10508 20942,10511 22123,10509 20944,10508 15251,4234 14956,4189 14957,4189 14958,15050 15252,15050 15277,4231 14959,4177 4159,4247 15287,4189 14961,4161 14962,4195 4160,4184 15298,4184 14963,15093 14964,15093 15312,4165 15318,4180 15319,4189 14965,15071 14966,4231 14967,4244 14968,4172 15324,4233 14969,4217 15332,4168 15333,4196 14970,4199 14972,4177 14973,4184 14974,4177 4170,4177 15339,4177 14975,4202 14976,4234 14977,4231 14978,4234 15347,4234 15348,4244 14979,4199 15349,4186 15162,14951 15358,4231 15359,4217 15360,4218 15361,4231 15379,4245 15380,4245 14981,4172 14982,4177 14983,4191 15383,4193 14984,4231 14985,4189 15389,4189 14986,4184 14987,15104 15392,4224 15393,4224 15394,4224 14988,4224 15395,4224 15396,4224 15397,4224 14989,4217 15404,4234 14990,4189 15407,4231 15408,4177 14992,4177 14993,4217 14994,4194 14995,4247 14996,4231 15419,4179 14997,4231 14998,4248 14999,4237 15000,4180 15001,4231 15002,4231 15004,4244 15005,4234 15006,4248 15439,4224 15441,4177 4181,4158 15009,4244 15454,4173 15458,4184 15459,4184 15010,4217 15464,4224 15467,4217 4185,4259 15468,4259 15470,4218 15012,4186 15471,4249 15472,4189 4188,4247 15473,4189 15474,4244 15476,4249 25017,4236 15014,15093 15015,4246 15016,15035 15485,4246 4192,4179 15018,4234 15487,4234 15019,4205 15020,4245 15021,4194 15494,4179 15496,4224 15498,4244 15025,4231 15507,4203 15026,14991 15508,4194 15514,4234 15516,4189 15521,15023 15027,4247 15524,4180 4201,4231 15029,4244 15164,4177 15030,4258 22278,4258 15031,4172 15535,4217 15536,4203 4204,4256 15541,15035 15540,4245 15034,4175 15036,15104 15037,4189 4206,4184 15039,4250 15553,4189 15557,4234 15040,4177 15558,4224 4207,4186 15042,4224 15568,4189 15043,4189 15044,4224 15045,4250 15046,4217 15586,4217 15047,4203 15048,4233 15049,4180 15602,4217 15051,4217 15052,4189 15053,4184 15615,4189 4213,4189 15616,4189 4214,4233 15055,4177 15056,15050 15057,4250 15058,4165 15059,4231 15622,4234 15626,4217 15060,4217 15627,4217 15628,4217 15062,4231 15063,4233 15064,4177 15065,4248 15066,4250 15067,15093 15068,4184 15633,4184 15069,4244 15634,4244 15636,4189 15070,4189 15639,15153 15072,4231 15644,4234 15073,4231 15074,4176 15075,4233 4220,4158 15076,4187 15077,15093 15662,4221 15663,4223 15078,4235 4222,4211 15079,4194 15080,4203 15082,4225 15083,4224 15084,4175 15085,4237 15086,4161 15668,4161 15669,4244 15670,4234 15671,4250 15087,4189 15672,4217 15673,4224 15088,4224 15676,4224 4226,4231 4227,4184 15091,4223 4228,4234 4229,4237 15092,4217 15683,4246 4232,15093 15697,4231 15701,4238 15702,4238 15703,4239 15705,4238 15096,4203 15097,15050 15098,4217 15099,4197 15714,4231 15717,4190 15100,4190 15101,4235 15719,4175 15720,14953 15102,4178 15721,4189 15103,4176 15105,4217 15106,4176 15741,4177 15108,4196 15110,4189 15111,4217 15112,15081 15113,4184 15109,14953 25543,4223 15744,4231 15115,15035 15117,4231 15118,4189 15119,4224 15121,4258 4243,15153 15752,4189 15123,4244 15124,15035 15125,4238 15126,4250 15758,4193 15127,15081 15760,4180 15128,4161 15129,4205 15766,4231 15130,4189 15131,4189 15132,4234 15133,4177 15134,4177 15135,4189 15787,4244 24943,15071 15136,4189 15137,4217 15796,4244 15799,14955 15807,4161 4253,4248 15809,4248 15139,15093 15140,4176 15141,4231 4254,4244 15143,4231 15144,4224 15821,4256 15145,4196 15146,4247 4257,4189 15148,4184 15149,4231 15151,4235 15152,4196 15154,4231 4260,4244 4261,4259 15157,4234 4262,4187 15159,4208 15863,4177 15864,4177 15865,4184 15165,4184 15160,4203 4263,4198 15161,4246 15873,4246 24110,5566 24109,5563 25559,6804 16865,6804 18042,6821 16866,6804 18036,6867 16867,6804 18055,6809 6807,6878 24597,6878 18117,6821 16869,6857 18037,6867 18056,6809 18040,6833 25560,6804 25680,6804 18119,6881 18057,6809 18058,6809 16868,6825 18045,6838 17427,6825 25370,6833 25371,6827 23197,6804 6831,6838 17430,6833 18051,6832 18035,6812 18059,6873 6837,6878 18046,6838 18054,6825 18050,6828 23198,6804 25562,6804 6846,6838 25372,6809 18052,6832 6848,6833 18047,6838 6852,6864 18044,6857 18062,6800 6855,6881 18060,6881 25561,6804 18120,6881 18061,6853 18063,6804 18048,6838 18064,6804 18065,6804 23199,6804 18118,6878 18041,6833 18066,6835 16870,6857 16871,6869 14262,16200 6871,6804 18039,6874 18049,6838 18043,6821 24288,10587 16311,768 769,771 15965,768 773,784 17500,771 779,771 781,764 783,771 15966,768 17504,764 16312,768 16313,771 17502,771 25832,491 794,777 15964,768 24699,771 24698,771 17503,798 17505,762 19493,771 799,771 24280,4882 18099,4875 2077,22663 22147,4028 20915,4027 4894,4895 25717,1011 19538,1034 19541,1011 16318,1020 19533,1031 19537,1009 19531,1018 25716,987 25478,1034 24717,1031 1001,987 19539,987 19534,1031 25419,17571 19540,1011 1004,1018 1005,1023 25476,1011 19535,1039 19536,1031 25477,1011 25475,1011 25746,1002 25745,1002 25502,1002 25718,1011 9528,1020 25287,1011 1030,1031 16326,1011 25719,1011 19532,1018 19530,997 16327,1034 16343,1010 25720,1011 25557,10668 25232,10646 19004,10650 25233,10649 24548,2150 24416,2125 24540,2159 2097,2137 17850,2140 16428,2150 2104,2099 17851,2125 2113,25288 17857,2118 2116,2140 24546,2150 17852,2093 17853,2105 16430,2153 2123,2099 24541,2100 2130,2125 2131,15183 24537,2093 17848,2127 16433,2134 24545,2127 24542,2106 24543,2106 17849,2102 24538,2093 2147,2106 2149,15183 2151,2150 2160,2122 24544,2106 16435,2105 25132,2125 24539,2093 16436,2139 24635,12600 24636,12600 24637,12600 9540,20935 20922,9550 25171,9562 9556,9550 16677,9632 20929,9602 16678,9632 20937,9625 25469,9625 25226,9560 9561,9553 25484,9553 20926,9627 16679,9553 20938,9625 20933,9632 9570,9604 20927,9553 16680,9625 16692,9578 9573,9551 20939,9626 16681,9581 20923,9550 25170,9584 16682,9550 25408,9625 16683,9592 20917,9539 20934,9632 16684,9601 20918,9562 16685,9609 25409,9587 16686,9550 20936,9625 20919,9562 16687,9550 20920,9550 20930,9639 20921,9550 25495,16148 16688,9625 25479,9550 16689,9612 20925,9553 16691,9562 20932,9596 20931,9544 9799,9798 16459,3286 20178,3291 20183,3283 20184,3283 20171,3286 20971,3277 20190,3275 20173,3286 20172,3286 20179,3291 20970,3288 20175,3286 20191,3275 20174,3286 20180,3291 20176,3286 20181,3291 20182,3291 20185,3283 20186,3283 20187,3283 20188,3283 20177,3286 20189,3283 25527,814 19494,813 25526,817 16149,1869 18933,12100 11943,16022 18932,11914 18931,11930 20544,3519 20568,3533 20571,3533 20588,3526 20583,3517 20557,3519 20545,3519 20560,3523 20559,3519 20561,3530 20573,3533 20579,3533 20554,3519 20570,3533 20547,3519 20556,3519 20575,3533 3522,3515 20553,3519 20589,3526 20574,3533 20551,3519 20543,3519 20546,3519 20577,3533 20563,3530 20567,3533 20565,3533 20572,3533 20584,3516 20576,3533 20552,3519 20550,3519 20593,3526 20591,3526 20590,3526 20582,3531 20569,3533 20586,3520 20549,3519 20558,3519 20555,3519 20564,3530 20566,3533 20562,3530 20578,3533 18884,12159 18889,12145 12136,12139 18885,12143 16942,12134 18886,12155 12140,12171 24880,12150 18891,12170 12144,12143 23230,12139 18899,12171 18892,12173 18893,12173 18888,12133 18887,12135 16943,12139 24881,12139 16944,12139 12153,12139 18900,12171 18894,12173 16945,12171 16946,12171 12157,12143 12158,12139 24098,12133 18890,12165 18895,12139 12162,12171 16947,12171 16948,12171 18896,12139 25691,12145 18897,12139 18898,12171 12175,12171 5576,6732 25124,5687 25206,6733 24867,6732 24875,6602 25455,16805 5593,24857 18638,17179 25147,6768 25443,5671 5626,6029 25771,6644 5645,5644 24860,5794 18637,17078 5665,5675 5666,5748 23180,5861 5669,6478 5670,6312 5682,6172 24853,6733 16151,6602 18641,5687 25447,5671 24844,6733 17044,6660 25125,6424 25126,6597 5720,5929 5722,6151 5724,5916 25127,5671 5729,5794 25614,6089 5731,6599 25544,5733 5736,6445 5737,5730 5739,5748 5741,6599 18647,5672 5750,6033 17065,5709 17066,6035 24854,6733 5785,6571 5787,6082 16152,16172 5791,6732 5797,5663 25839,5991 16153,5780 5808,5671 5811,6161 17080,6031 24852,6733 25209,5780 5835,6235 5838,6151 5841,16796 5843,6148 5845,5671 5860,6113 25128,5652 24855,6733 25210,6733 5867,6585 16201,16168 24845,6733 5878,5877 24260,6733 22223,5779 5882,6722 5887,6090 5889,6029 25102,5604 5915,6144 5917,6733 5919,6228 25103,6585 25104,6553 23182,6733 24261,6733 17116,6633 5941,17316 24876,6602 17120,6317 5963,14225 23516,5977 17123,6308 5983,5994 23183,5780 24864,6029 15920,5998 6003,6421 18645,6521 25610,5621 24861,5671 6012,6537 6020,5994 6023,17078 6026,6025 24862,6507 6030,5586 6034,24824 17132,6640 6043,6155 6045,6055 6048,6024 6050,6025 24846,6733 6061,5668 17141,6600 6068,5965 6076,6329 17145,6473 6088,24820 24873,6448 6091,6507 6095,5671 6096,6384 6098,5891 6111,6144 6117,6155 6119,5899 6120,5972 24847,6733 6127,6029 23187,16155 25106,5929 18639,6144 6152,6496 25448,6733 24871,6172 23517,6303 25442,5671 25441,5671 15923,16028 6178,6520 6181,16205 6183,5740 6187,6569 24874,17202 15925,6192 25107,5861 6198,6072 6200,6419 6202,5671 6203,5980 6209,16809 6215,6086 24848,6733 6227,6419 24851,6733 6231,6089 6233,6137 6234,5794 6236,6161 25108,6032 6238,5806 6240,5671 6243,5718 15927,15936 6262,5793 6265,6264 24836,15919 6276,5656 6288,5718 6291,6655 16159,6214 6294,5709 6296,6172 6301,5652 6302,6041 6307,6235 25440,5671 17201,24808 6311,5755 6326,6539 6333,5624 6341,6526 6343,6682 6345,6419 17209,6025 6355,6177 25109,6177 6359,5671 6360,6337 24812,6495 6366,6261 6368,6382 6377,5671 6379,17075 6390,6161 23501,6261 6393,6364 6396,5672 25608,6397 23190,5954 6407,6747 16030,6495 6408,5633 6409,6054 6415,6104 15933,15932 6420,6172 14226,6155 6432,17161 6436,5861 6444,5891 6447,5690 6450,6018 6454,6154 18646,6521 25110,6171 25111,6123 25612,6581 17247,6172 6489,14227 6497,6496 6499,5943 24856,5938 6501,6496 6503,6193 24265,6585 25220,5806 6509,5687 6513,17283 6518,6082 6519,6299 18650,6660 6528,5921 17261,5891 16161,6242 6540,6546 23510,23509 6551,5929 23514,6272 25445,16150 24849,6733 6586,6144 6596,6522 6605,6641 6606,6660 6607,5637 6612,6723 25112,17230 16160,6242 17753,6009 24850,6733 24818,15919 6626,5965 18648,5813 24868,5675 6635,5675 6636,5706 6648,6546 17286,24840 6658,6602 24804,6365 24267,14227 6674,6747 25613,5760 6680,6055 25113,5899 6683,6608 25114,5756 6687,5748 6705,6733 25611,6382 6708,6376 6709,6710 17754,5847 18651,5734 6724,6723 6729,6546 6731,5653 23502,6735 25750,6405 25444,6086 23193,5671 6742,5916 6743,5728 6745,5612 25439,5671 6749,6661 6751,5765 6753,6188 6755,6732 6756,5901 24870,5943 6766,5781 6767,5861 6772,6090 25021,2495 25030,2499 2489,2503 2491,2503 2492,2488 25022,2500 2427,2499 24438,2503 25023,2495 25028,2488 2498,2503 25422,2495 2501,2503 16450,2496 2504,2503 25031,2503 2505,2503 2506,2503 2507,2509 2508,2503 25024,2503 25029,2495 25025,2494 25026,2495 1440,2496 25027,2488 18851,11898 18852,12087 11921,12094 18850,11898 11995,12058 18849,12010 12066,12010 22325,8113 17972,8090 17973,8121 18613,8093 22326,8113 17968,8113 18616,8092 18617,8092 18618,8092 17965,8113 17967,8113 18622,8099 17961,8089 17574,8110 17971,8113 16627,8102 17970,8113 17980,8131 17977,8109 8107,8113 17959,8105 18623,8100 18612,8124 16628,8103 17960,8140 22661,8117 17962,8089 8123,8113 20348,8116 17963,8089 17964,8120 17976,8117 17966,8113 18619,8092 17969,8113 17981,8131 18614,8093 18621,8110 22660,8113 15874,8113 18615,8136 18115,8109 2158,8125 18114,8121 17974,8121 17978,8097 20349,8116 18620,8092 17982,8131 17979,8106 20347,8094 18091,4862 18092,4862 18093,4862 16568,4862 18094,4862 18095,4862 18096,4862 16569,4862 18097,4862 25566,4862 18810,11576 16463,3425 20286,3426 20277,3426 3402,3434 20285,3426 20287,3426 20276,3426 20284,3426 20261,3406 20273,3410 20288,3426 20304,3424 20283,3426 20282,3426 20305,3424 20281,3426 20262,3406 20289,3426 20290,3426 20268,3405 20269,3409 20263,3406 20264,3406 20309,3427 20280,3426 24352,3406 20291,3426 20265,3406 20272,3408 23063,3426 20279,3426 16210,3427 20292,3426 25536,3424 16465,3413 20293,3426 20311,3401 20294,3426 20310,3400 20275,3425 20270,3409 20301,3426 16466,3406 17315,20303 20312,3416 20302,3426 20295,3426 15977,3424 20296,3426 20274,3422 16467,3406 16468,3406 20297,3426 20298,3426 16469,3425 20278,3426 3429,3408 15171,3410 20306,3424 20299,3426 20266,3406 20267,3406 20307,3424 20300,3426 20271,3409 16470,3406 75,24587 18749,497 18788,454 393,753 21510,705 24740,406 405,406 24739,406 25836,24736 25119,684 24728,737 25490,406 18715,424 425,464 428,14181 24726,737 18731,389 436,406 437,574 24767,438 24948,539 442,24768 448,560 450,512 24769,24768 18771,453 456,704 25285,680 24735,25488 25489,461 469,669 18732,389 18757,435 18789,454 25120,700 16287,544 16289,681 18752,497 22216,497 18758,435 18784,514 16291,454 18740,429 18761,612 516,389 18763,406 16292,540 18773,577 24742,406 24732,627 524,396 16296,461 530,16301 15172,534 536,589 543,18781 18759,435 18787,639 546,596 24734,461 18718,510 553,737 16212,464 24765,406 556,574 18736,389 18733,389 18729,417 18730,417 18772,656 18790,454 18744,580 18745,580 24725,737 571,639 573,404 18726,468 18753,497 578,637 18734,389 16299,755 16169,513 581,592 18775,591 14185,24770 18762,612 24730,737 16293,592 18769,592 18791,454 18742,396 18714,651 16300,544 598,404 25121,592 24722,737 18778,702 18723,574 18783,432 611,680 18765,680 25487,574 18754,497 18735,737 24724,737 18755,497 18782,402 16302,454 18720,542 18776,735 18780,700 18728,628 18722,736 18716,741 629,574 18737,16301 636,753 646,528 18770,592 18766,680 16305,694 18748,559 18760,435 657,404 18747,460 18750,497 18719,749 18738,461 18743,396 21511,396 18785,514 667,16308 24720,24719 24727,737 676,464 683,534 18724,574 18764,406 18767,680 24763,24749 18725,574 706,443 708,735 709,753 18751,497 18786,406 713,24770 16307,588 24766,722 725,737 728,14186 21512,731 18768,680 732,16294 24723,737 738,497 740,17546 18774,473 743,396 24741,406 746,406 747,18727 24729,737 750,394 18739,613 751,641 22639,3707 20376,4030 20370,4089 20424,4088 20469,4124 20420,4094 20359,4137 15941,4113 20392,4049 20434,4066 4034,4073 20460,4129 20443,4044 20444,4044 20483,4074 20399,4043 20436,4054 20425,4088 20380,4097 20435,4052 20377,4038 20426,4088 20396,4050 20427,4088 20470,4124 20471,4124 20445,4044 20395,4048 20465,4129 20415,4056 20378,4051 20393,4049 20428,4088 20416,4056 20466,4129 20437,4054 20357,4137 20413,4147 20429,4088 20362,4033 20446,4044 20442,4064 20441,4064 20423,4094 16715,4076 20381,4097 20411,4065 20456,4060 20447,4044 20448,4044 20400,4043 20394,4067 15942,4119 20476,4079 20358,4137 20382,4097 20379,4072 20484,4073 20485,4073 15943,4124 20430,4088 20417,4133 20366,4140 20458,4053 20367,4140 20451,4068 20391,4103 20487,4073 20412,4065 20360,4137 20356,4135 20418,4133 20479,4146 20419,4133 20421,4094 20482,4032 22149,4086 20452,4092 20405,4058 20390,4057 20404,4058 20453,4068 20474,4031 20383,4097 20488,4073 4102,4132 20384,4097 20385,4097 20386,4097 20489,4073 20455,4081 20406,4058 20480,4146 20481,4146 20401,4108 20407,4058 20368,4106 20369,4106 20449,4044 20478,4079 20397,4050 20408,4058 20414,4147 20431,4088 20402,4108 20361,4137 20472,4124 20475,4031 20372,4091 20438,4059 20457,4143 20440,4084 22148,4076 20387,4097 20388,4097 20432,4088 20454,4119 20403,4108 20467,4129 20439,4059 20363,4078 19320,4129 20461,4129 20462,4129 20463,4129 20459,4129 20371,4089 22657,4058 20398,4050 20464,4129 20433,4088 20373,4091 20374,4091 20450,4044 22150,4128 20473,4075 20364,4078 4139,4079 20409,4058 20375,4091 20365,4039 20389,4097 20238,3374 20245,3392 20232,3384 20239,3374 24462,3375 3376,20236 20235,3389 20240,3374 20241,3374 20246,3392 16462,3379 20242,3374 20247,3392 20229,3378 20234,3373 20233,3384 20248,3392 20243,3374 20244,3374 20231,3388 20237,3386 20249,3392 13413,13422 24899,13429 24897,13416 13426,13423 24898,13429 24896,13422 18868,11679 21746,13547 15944,13547 21747,13547 21748,13547 15945,13547 21749,13547 21750,13547 21751,13547 21752,13547 21753,13547 21754,13547 21755,13547 21743,13547 21756,13547 21757,13547 21744,13547 21758,13547 15946,13547 21745,13547 15947,13547 21759,13547 21760,13547 15948,13547 12422,12424 19209,12575 19210,12576 15951,12678 25035,12663 12634,12715 25036,12663 12641,12663 19231,12650 19228,12670 12642,12690 19225,12714 25037,12683 23236,12645 17021,12718 17034,12648 19244,12715 25038,12670 25039,12712 17022,12670 19214,12663 23238,12687 17026,24112 12660,12685 15953,12715 19236,12718 19223,12678 12664,12710 17023,12649 19232,12722 19220,14818 19245,12683 19237,12718 25040,14825 25041,12672 22251,12672 25042,12657 19243,12725 19215,12663 19222,12670 17024,12670 19246,12683 14817,12688 17025,12677 19221,14826 19240,12644 22250,24633 19238,12718 24113,24112 23235,12663 19239,12680 17036,12712 12689,12658 12691,12718 19213,12707 25499,12637 17027,12663 25497,12714 25498,12714 19219,12638 12696,12710 19241,12685 17028,12712 17029,12650 25043,12679 23237,12680 19218,12640 12665,12674 14238,24112 19230,12710 17031,12666 25044,12637 14822,12688 19242,12695 23060,12702 25456,14818 12716,12677 19216,12663 17033,12663 19224,12646 12717,12710 12719,12718 12720,12692 19217,12663 12726,12678 12728,12649 19235,12690 12203,12702 16425,2088 2089,2088 20945,10515 20946,10515 21899,13641 21904,13637 21901,13638 21900,13641 21902,13638 21903,13638 21766,13554 21780,13559 21774,13565 21763,13554 21764,13554 25727,13554 21775,13565 21776,13565 21777,13565 21770,13560 21791,13558 21786,13558 21785,13558 25696,13566 21779,13555 21792,13558 21794,13561 21767,13554 21781,13566 21787,13558 21778,13565 21765,13554 21768,13554 21782,13568 21788,13558 21789,13558 21790,13558 21772,13560 21771,13560 21773,13560 21769,13554 21784,13567 21793,13558 21783,13568 16417,1985 16418,1983 21738,13543 21739,13542 21742,13545 21741,13540 21740,13544 60,67 22071,67 63,71 22072,65 22073,65 72,67 73,67 22120,5558 22118,5558 24595,5556 5557,5558 24929,5558 25280,5553 22119,5558 16864,5558 21762,13552 17563,1203 16350,1211 1199,1203 1201,1211 17922,1200 1204,1211 1206,1212 17925,1211 17923,1215 17926,1211 16352,1203 25431,1215 25429,1215 25430,1215 19322,11946 21869,13576 21871,13614 21877,16720 21855,13611 21860,13589 21842,13621 21845,13621 21870,13576 21846,13621 21843,13621 21858,13593 21875,16720 21876,16720 21861,13589 21862,13589 21856,13611 13584,13621 24124,16723 21847,13621 21863,13589 21864,13589 21848,13621 21872,13614 21841,13581 13592,13621 21873,13614 21849,13621 21865,13589 13600,13621 21850,13621 21879,13585 21859,13589 21840,13597 21851,13621 21852,13621 21853,13621 21867,13589 21868,13589 13617,13621 21844,13621 21857,13611 21874,13614 21878,13612 21839,13608 13619,13621 21880,13585 21854,13621 22195,7253 18028,7253 18029,7253 18030,7253 7255,7253 18027,7253 18031,7253 17039,1510 17040,1513 17041,1513 17042,1510 16381,1513 17308,1510 17309,1510 17310,1508 16878,7038 21546,13461 21547,13461 24212,10045 10066,10045 10073,10045 22136,10081 24213,10045 6885,6884 6886,6971 16875,7009 6894,6971 6896,6895 24599,6975 18067,6897 6898,6926 18071,6929 18072,6929 20885,20884 18073,6929 6907,6919 16872,6883 25369,6930 18076,6883 18068,6946 18624,6916 6920,6960 18633,6906 6925,6923 7003,7013 6927,6926 18626,6994 6928,6960 25730,6929 6935,6987 16247,7012 6937,6936 18075,6918 18123,6954 6941,6975 6947,6960 6952,6926 16876,7013 18074,6999 18069,6946 18081,7010 6956,6913 18122,6944 6959,6922 6961,6999 6963,6883 16873,6926 6965,6883 6966,6906 6967,6929 6969,6926 24600,6905 24601,6905 16245,7005 6977,6999 18080,7014 18079,6906 18625,6905 16874,6986 6998,6918 18070,6946 12587,12595 12588,12595 24634,12593 17017,12593 12597,12593 17774,1536 20220,3354 20221,3351 20217,3365 20218,3363 20219,3363 20226,3358 20227,3358 20222,3359 20225,3360 20223,3359 23352,4863 20224,3359 20215,3357 20228,3364 20972,3367 20973,3367 20216,3357 20123,10466 21439,10183 10184,10183 21201,10437 21127,10419 21105,10246 21198,10329 23241,17318 21285,17318 21450,10378 21399,10498 20060,10325 21470,10376 21137,10190 21323,10227 21508,10468 21173,10264 20043,10325 21338,10356 20017,10325 21329,10356 21113,10482 21112,10482 21218,10382 21217,10382 21216,10382 20018,10325 23225,10280 21478,10494 20117,10334 20139,10334 20995,10466 20019,10325 21170,10409 21228,10292 21363,10280 20041,10325 21415,10232 20065,10394 20020,10325 21472,10494 21085,10270 21064,10502 21195,10461 21196,10461 21302,10312 21053,10357 21054,10357 21109,10246 21381,10280 23227,10208 16895,10488 21350,10280 21248,10433 20009,10325 21392,10280 20106,10187 21222,10326 20042,10325 21099,10256 21103,10306 20034,10325 21018,10218 10217,10433 20114,10371 21249,10433 21269,10433 21090,10220 21092,10220 21393,10280 21341,10280 21093,10220 21091,10220 20044,10325 21263,10433 21362,10280 21361,10280 21309,10312 16896,10339 21419,10324 21408,10498 21394,10280 21422,10324 21461,10378 21039,10492 21364,10280 21174,10264 21382,10280 21074,10458 21038,10455 10230,16033 21417,10232 21418,10232 21286,17318 21026,10212 20070,10234 21474,10494 21058,15901 21410,10232 21446,10198 20037,10325 21441,10198 21199,10329 21154,10242 21155,10242 21159,10278 21376,10280 20131,10334 20133,10334 21304,10312 20120,10466 21007,10225 21009,10225 21144,10363 20066,10394 20999,10385 21141,10363 21386,10280 21307,10312 21326,10227 21434,10183 20069,10234 21061,10200 21010,10225 21017,10500 20082,10244 21153,10496 21050,10343 21171,10320 21067,10330 21208,10349 21497,10465 21342,10280 21335,10356 21271,10433 21429,10183 21106,10246 21012,10413 21202,10271 21070,10358 21145,10247 22264,22263 21239,10433 20061,10325 21192,10449 20121,10466 21183,10483 21003,10254 20063,10325 20008,10325 20110,10467 21175,10264 21421,10324 21008,10225 20143,10433 20067,10446 20068,10446 20056,10325 20144,10433 21068,10358 21443,10198 21279,10433 21188,10450 20071,10234 21190,10388 23224,10280 20089,10269 21233,10429 21507,10468 21167,10473 21047,10393 21083,10270 20125,10389 21084,10270 21502,10468 21203,10271 21451,10378 20128,10334 21325,10227 21388,10280 21445,10198 21442,10198 21142,10363 21452,10378 21328,10356 21283,17318 21391,10280 21223,10326 21187,10451 21252,10433 10277,10276 21498,10465 21426,10183 21029,10212 21206,10291 19994,10427 21119,10262 21385,10280 21118,10262 21078,10273 20064,10325 10287,10393 21428,10183 21330,10356 10288,10492 20021,10325 21294,10312 21383,10280 21131,10391 20985,10325 20010,10325 21224,10188 21204,10291 21351,10280 21423,10324 20040,10325 21229,10490 20145,10433 21082,10236 21096,10256 21097,10256 21098,10256 20015,10325 21076,10327 19997,10427 20141,10334 21210,10349 21211,10349 21257,10433 20045,10325 20986,10325 21147,10367 20146,10433 21462,10378 19999,10325 20122,10466 21135,10190 21300,10312 21132,10391 20036,10325 21505,10468 21299,10312 21352,10280 21063,10502 21209,10349 21482,10415 21200,10186 21460,10378 20073,10457 21454,10378 21504,10468 21065,10502 21046,10317 21045,10317 21349,10280 20147,10433 21405,10498 20038,10325 21368,10280 20137,10334 21264,10433 20057,10325 20113,10206 21258,10433 21181,10483 21128,10265 20011,10325 20987,10325 20046,10325 20047,10325 20001,10325 20000,10325 20058,10325 21369,10280 21320,10227 21219,10477 21495,10465 21235,10433 21291,10243 21290,10243 21305,10312 21072,10283 21389,10280 21177,10253 20012,10325 21430,10183 21321,10227 21287,17318 21370,10280 21180,10483 20994,10467 21265,10433 20079,10244 20135,10334 20132,10334 20085,10269 20108,10467 21037,10455 21500,10468 21308,10312 21436,10183 21496,10465 21220,10480 21384,10280 20134,10334 21166,10350 21356,10280 20142,10489 21459,10378 21043,10491 21486,10415 21484,10415 21194,10449 21324,10227 21281,10433 21295,10312 21236,10433 21354,10280 21041,10492 21353,10280 21444,10198 20119,10466 21088,10197 21069,10358 10342,10280 21266,10433 19998,10427 20116,10371 20115,10371 21031,10346 20076,10399 10348,14212 21121,10379 21296,10312 21032,10346 21221,10240 20124,10466 21122,10379 21331,10356 21080,10273 21057,15901 20990,10269 20022,10325 21237,10433 21390,10280 20002,10325 21087,10258 21357,10280 21400,10498 20023,10325 20074,10233 21310,10312 21377,10280 21162,10268 21456,10378 21479,10494 20059,10325 20093,10269 20086,10269 21270,10433 21019,10218 20094,10269 21355,10280 20024,10325 21108,10246 21020,10218 21447,10198 21071,10283 21477,10494 20078,10204 20048,10325 21476,10494 21396,10280 21475,10494 21433,10183 21297,10312 21312,10312 21313,10312 20105,10187 20136,10334 21267,10433 21006,10225 20025,10325 20989,10398 21332,10356 21165,10350 21398,10280 20055,10325 21273,10433 21277,10433 21380,10280 21214,10347 21215,10347 21123,10379 21465,10376 20109,10467 21469,10376 21371,10280 20013,10325 21036,10478 21125,10194 21293,10243 21288,10243 21289,10243 21238,10433 21111,10310 21438,10183 21365,10280 21336,10356 21107,10246 21051,10343 21014,10235 20993,10203 21327,10227 21501,10468 21030,10212 21134,10314 21280,10433 21276,10433 21133,10314 21395,10280 21333,10356 21172,10252 20026,10325 21387,10280 20092,10269 21272,10433 21176,10253 20080,10244 16898,10396 21114,10281 21480,10415 10407,10404 20127,10389 21157,10219 21401,10498 21282,17318 21402,10498 21143,10363 22265,22263 21250,10433 20027,10325 21240,10433 21278,10433 21372,10280 21432,10183 21094,10220 21207,10349 21481,10415 21262,10433 21148,10367 20062,10325 21184,10483 21268,10433 21339,10280 21464,10376 21013,10413 21378,10280 21311,10312 21156,10404 21467,10376 21315,10312 21427,10183 20087,10269 21075,10327 21136,10190 10423,10221 24603,10421 21416,10232 21102,10306 20039,10325 20126,10389 21179,10497 20081,10244 21358,10280 21232,10429 21316,10312 23228,10429 20052,10325 20107,10467 21412,10232 21468,10376 21241,10433 21077,10273 21100,10431 21322,10227 21373,10280 16899,10322 21458,10378 21284,17318 21366,10280 21055,10396 20016,10325 21374,10280 21420,10324 21048,10393 15196,10325 21413,10232 21168,10473 21042,10440 21403,10498 20996,10385 20129,10334 21191,10449 21146,10504 21161,10268 21317,10312 20028,10325 10452,10239 21242,10433 21160,10268 21178,10253 21243,10433 20075,10399 21205,10291 21275,10433 21027,10212 21138,10189 21437,10183 21117,10262 21298,10312 21073,10333 21424,10324 20072,10457 21244,10433 21483,10415 21150,10496 21453,10378 21028,10212 21340,10280 21193,10449 22257,10354 21494,10465 21089,10197 21506,10468 21021,10218 21259,10433 21231,10429 20088,10269 21435,10183 21471,10494 21449,10198 21348,10280 21490,10465 20003,10325 21169,10409 21491,10465 21359,10280 21095,10220 21489,10465 21407,10498 21186,10267 21052,10343 21049,10343 21301,10312 21230,10429 21035,10377 21256,10433 21081,10229 21306,10312 16901,10398 20090,10269 21104,10306 20991,10269 20049,10325 21033,10346 21025,10212 21493,10465 21448,10198 21213,10434 21463,10378 21015,10235 21110,10310 21185,10321 21079,10273 20118,10466 21130,10391 21254,10433 25421,10466 21499,10465 21466,10376 21406,10498 21023,10218 20130,10334 21163,10268 21044,10491 20112,10206 21379,10280 21375,10280 20029,10325 19992,10427 20050,10325 19995,10427 20004,10325 20030,10325 21115,10262 21116,10262 21011,10352 21126,10194 21411,10232 21503,10468 20014,10325 21149,10496 21492,10465 21255,10433 20054,10325 20051,10325 21347,10280 21360,10280 21404,10498 20031,10325 21409,10498 21414,10232 20083,10244 21246,10433 21251,10433 21431,10183 20032,10325 21367,10280 19993,10427 21056,15901 21197,10329 21001,17318 21212,10349 21158,10219 21261,10433 20998,10385 20033,10325 21005,10430 21260,10433 20035,10325 20138,10334 20091,10269 21337,10356 21473,10494 20005,10325 20997,10385 19528,971 25486,971 24959,10682 19006,10681 24958,10682 19007,10679 19008,10676 25330,10680 19504,877 19498,918 16314,886 16315,856 19509,887 19505,915 19501,888 19499,868 19508,919 874,895 875,895 19503,926 19506,915 19500,879 19512,871 19514,916 19496,891 19515,916 22218,916 19516,858 19511,897 19502,889 19497,854 19518,886 16316,867 19495,914 19519,886 22075,898 19507,873 19517,851 24701,918 19513,871 19510,887 1096,1095 7848,7880 24347,16170 25279,7914 25576,16170 17337,7911 24342,7874 7852,7880 16609,7919 7855,7880 19395,7851 24341,7874 24336,7874 24338,7874 17339,7854 17338,7911 24345,7874 24335,7874 19394,7850 7877,7880 24339,7874 7884,7914 25580,7874 7885,7889 7886,7911 19393,7891 22327,7891 7890,7923 24296,7891 24340,7874 16610,7858 24334,16170 7899,7880 7900,16170 7901,16170 7902,7892 24228,7914 25148,7914 24337,7874 7904,7889 25575,7874 7906,7893 24332,16170 7913,7920 22211,7914 19396,7914 24344,7874 24333,7874 24965,1662 24966,1662 24967,1662 16396,1653 18109,1663 25157,1653 19327,8521 19359,8544 19290,8633 19294,8633 8497,8543 19315,8542 19364,8622 19331,8521 24369,8636 19375,8514 19337,8547 19304,8633 19376,8514 14210,8507 19381,8592 19282,8565 17367,8521 24358,8521 19374,8596 19311,8542 14209,8607 19314,8542 19377,8514 19283,8565 15907,8510 19368,8492 16633,8543 19384,8592 19385,8612 19353,8623 19354,8623 19373,8596 24356,8496 19336,8517 19332,8521 24363,8549 19352,8623 8525,8633 19316,8496 19284,8565 19355,8637 8529,8528 8530,8528 19346,8505 19306,8543 8531,8521 19379,8514 19370,8591 24353,8514 19277,8535 8536,8647 19343,8495 19272,8493 8541,8526 19299,8633 19301,8633 19380,8506 19371,8539 19345,8505 19310,8542 19263,8550 19273,8493 19329,8521 24355,8494 8546,8550 19295,8633 19267,8550 19347,8505 19288,8633 19280,8565 19366,8622 19325,8496 19287,8633 19330,8521 19271,8493 19350,8548 19362,8583 19324,8496 19372,8540 8557,8636 19360,8579 19285,8649 8559,8586 19351,8623 19278,8565 16634,16215 8563,8622 8566,8521 19382,8592 19300,8633 19270,8493 19318,8496 19317,8496 19367,8573 19365,8622 19309,8542 19264,8550 16635,8583 19363,8643 19291,8633 19356,8637 19361,8579 19386,8612 19276,8635 19342,8495 19303,8633 8593,8521 19358,8650 19348,8505 8600,8521 8601,8549 19369,8591 19388,8503 25723,8606 24362,8543 19275,8493 19312,8542 19326,8496 19339,8528 19349,8505 8611,8505 19333,8521 19357,8637 8613,8539 19297,8633 19340,8494 8625,8540 19286,8633 19313,8542 19265,8550 19274,8493 19281,8565 19262,8580 19266,8550 19383,8592 19307,8584 19389,8503 19334,8521 19302,8633 19335,8521 19292,8633 8639,8565 19296,8633 19289,8633 19344,8495 19269,8493 8646,8521 19308,8597 19341,8494 19378,8514 19293,8633 24354,8500 19305,8516 19279,8565 24371,8648 19387,8604 19328,8521 19338,8528 21576,13478 21573,13479 21575,13478 21574,13479 21577,13478 21578,13478 21579,13478 16246,9127 16645,9121 24241,8177 6779,6794 6781,6786 6782,6786 24938,6786 6787,17536 6788,6786 6789,6791 6793,6786 15250,12861 13759,12951 14901,12824 12731,12784 14064,13310 15253,13177 13760,12956 15254,13191 14879,13191 15255,13043 15256,12791 15257,13045 16012,12914 13762,12787 16141,13285 14022,13073 15259,13358 15260,13118 15261,12857 15262,12855 15264,12819 14372,14339 15265,14339 15266,12737 14914,12737 14917,12737 15267,12737 15268,14071 15269,14071 15270,12739 15271,12745 15272,12746 15273,13217 13761,13177 16097,12958 14889,12744 15274,12744 15275,14074 13764,13305 13765,12855 14098,14073 15276,13245 15278,12745 16162,12903 14373,13043 13766,12783 15279,13976 14023,13073 15280,12986 14877,12750 16163,12958 15281,12824 15282,12892 13767,12777 15283,13276 12751,12737 15284,13111 15285,14081 14932,14860 14301,12754 12755,12995 13768,12788 14325,12968 13769,12809 15996,13173 14384,12875 16111,13172 16116,13172 16106,12798 15286,12968 13770,12761 14903,12824 13771,13330 14393,12797 15288,12772 16064,13310 14046,14012 14906,12824 14054,12819 12763,12824 15289,14012 14892,12744 15290,13055 13772,13118 13773,13330 15291,12986 14037,12943 15292,12857 15293,12879 13774,13345 15294,13273 13775,13051 15296,12881 13776,13359 15297,12855 13777,12867 15980,13353 14317,13204 15981,12968 13779,13033 13780,13330 14388,12903 14066,13310 13781,12810 14018,12781 15300,13082 15301,12781 15302,13277 15303,13010 15304,12734 14309,13071 15305,12761 14369,12973 13785,12761 15306,12799 15307,13027 15308,13051 15309,13238 15310,12745 15311,12837 14874,13006 15313,12824 15314,12738 13786,12810 15315,12761 13787,13240 15316,13239 15317,12824 16017,12766 16021,12766 16139,12742 12796,13357 15320,13044 15321,12819 15322,12995 14386,12903 15323,12995 14364,12995 15325,12974 15326,13187 13788,13055 15327,12799 15328,12799 14924,12786 13789,12783 13790,13305 13791,13118 16004,13291 14357,13093 12800,13173 15329,13096 15330,13139 14318,13204 15331,13305 12802,12839 13792,12971 13793,12986 16120,13098 15335,13203 13794,13051 16091,12749 15336,13295 15337,12861 15986,12890 12808,12799 13795,12951 15340,12810 15341,12895 15342,12895 14939,14855 15343,13043 15344,12943 15345,12858 13797,12787 12816,13097 14050,12815 14314,12817 15350,12904 15351,13976 14358,13093 14897,12744 14056,12819 15352,13360 13799,13385 15353,12801 15354,12968 15355,12821 15356,13248 14933,14860 14925,12786 16105,12798 15362,12774 15363,13293 13800,12787 15364,14081 15365,12821 15366,12941 15367,12941 14311,12817 15368,12817 15369,12946 13801,13118 14044,12943 15371,12903 15372,12903 15373,12881 13802,12881 13804,12734 16053,13285 15374,12744 15375,12888 15376,13196 13782,13082 15377,12745 15378,13145 14321,12871 15997,13173 15991,12834 15381,14866 13805,12859 15382,12752 12838,13272 15384,13382 14051,12819 16117,13172 16110,13172 15385,12879 13806,13118 15386,12781 16062,13285 13807,13152 12842,13215 15387,14856 15388,12859 24100,12787 14898,12824 13763,12739 15390,13099 14312,12817 16132,13162 16089,12934 15391,13296 14912,12737 14880,13191 14931,14860 16055,13207 14346,13372 12854,13126 16005,13309 15398,13341 15399,12964 15400,13341 15401,12855 14313,12817 15402,13221 15403,13221 24962,13290 15405,13045 13808,12974 14900,12824 14884,12861 15406,13093 15982,12786 16109,13172 15409,13040 15410,13118 15411,12943 13809,13118 14030,13027 15412,13326 13811,12866 13812,13105 15413,12866 16133,13162 15414,12860 13813,13033 14876,12750 15415,13301 15416,13301 12872,12736 14911,12737 16092,12749 15420,12908 15421,12742 14307,13071 14310,13276 15422,12955 14026,13016 14028,13016 14032,13360 15423,12943 13814,13343 13815,13118 13816,13326 15424,12943 13817,13305 14308,13071 12882,13372 13818,12781 15425,13015 13819,13216 15427,12867 15426,12973 14915,12737 16118,13172 15429,12886 16052,13285 13820,12866 15431,12781 15432,12903 13821,13193 13822,12888 15433,13354 13823,13118 15434,12888 15435,13093 14368,14338 15436,12995 14099,12895 14347,13372 13824,12960 12898,13204 24252,13272 15437,13132 15438,12744 14033,13360 15440,12904 15442,12860 14945,12799 12902,13272 14024,13380 15444,12978 12906,12824 14351,13055 13825,13305 15445,13055 24132,13108 13827,12951 13828,13079 15446,12908 16073,13307 15952,13162 16115,13172 12912,12752 13829,12918 14899,12744 15447,12758 13830,12761 13831,13033 15448,13354 16124,13172 16016,12914 16015,12914 15449,13187 15450,13157 13832,13118 16137,13162 13833,12761 15451,13006 16056,12864 16114,13172 13834,13109 13835,13055 13836,12910 14020,12938 13837,13351 15453,12922 15455,13294 15456,12922 15457,13284 13826,13055 14873,13006 15460,13372 15461,12986 13839,13359 15462,12788 15463,12788 14934,14860 14907,12968 15465,12968 13840,13024 16125,13162 13841,13304 15469,12944 13842,13340 15992,12834 16082,12934 15475,13319 15477,13051 13843,13269 15478,14073 15479,14083 14100,12943 15480,13382 15481,12941 14035,12943 16010,12914 14101,14083 15482,13187 13844,13051 15483,13111 15484,13105 13845,13118 16071,13342 15486,12805 13846,12910 16098,12914 13847,13260 14390,12903 16001,13173 14061,13157 16126,13162 15488,12761 13848,12951 15489,12951 15490,12857 14002,13256 13850,13378 14102,13378 15492,12788 15493,13293 13851,12761 15495,12761 15497,12807 13852,12810 15499,12951 14353,12978 15500,12973 14303,12889 12966,14864 15502,13382 14062,13157 14941,14862 15503,12968 15504,13372 16259,14327 14048,12943 13853,12888 13854,12828 14391,12745 15505,12770 14344,13279 15509,12770 15511,12819 15512,13292 15515,13360 15517,12745 15518,13380 13855,12757 13856,12789 14916,12737 14376,13368 13857,12897 14928,14862 15519,12819 15520,12855 15522,13360 15523,13010 16101,12958 15525,12968 15526,12787 13858,13345 14038,12943 25435,12846 13859,13092 15528,13282 15529,12968 16009,12914 14383,12923 15984,13299 15531,13065 15532,12984 12983,12799 12985,14299 13860,12809 15533,12886 15534,13027 15998,13173 15537,12941 15538,12980 15539,13113 13861,12918 15543,14010 16084,13147 15545,12978 15546,13191 13862,12879 15547,13243 15548,12968 14324,12968 16099,12958 14355,12978 16083,13158 13863,13119 13864,13269 15550,12744 12999,12968 14375,13368 13865,13330 13866,12926 15551,13368 13867,12761 15552,12855 13990,12810 15555,12995 13868,13007 14935,14864 16085,13147 15559,13075 13869,13283 16095,12749 15560,13010 15561,13051 13870,12761 14867,12903 15562,13210 13871,13338 16260,14327 16086,13147 15563,14083 15564,14074 14103,14083 14948,13161 14322,12871 15565,12978 13872,13082 15566,12978 13873,13382 15567,13021 13874,12738 13875,12761 15988,12768 14940,12935 15569,13976 13876,12961 15570,14007 15571,12801 13877,13055 15572,13139 13878,13359 13879,13033 16080,13028 13880,13105 13881,13060 14942,12799 16019,13303 13882,12897 14063,13310 13883,13184 14392,12801 13884,13068 14003,13256 25438,12943 14319,12871 16018,13376 15577,12781 14913,12737 13042,12901 15578,13099 14359,13312 15579,12908 13778,13353 15580,13353 15581,12742 14025,13380 14343,14339 14890,12744 15583,12868 15584,12868 15585,12868 15587,13051 15588,13045 15589,12964 15590,13340 16107,12798 15591,13310 13048,13976 13885,12783 13886,13260 15592,12821 15593,12969 17757,12968 13887,13057 15595,14337 14361,12968 14943,12799 15596,13369 13889,13081 13891,12910 13890,13313 13892,13326 15597,13167 15598,13202 15599,13060 13893,13105 14949,13272 15600,13060 13894,13361 15601,13341 16014,12914 14379,13043 13895,12761 13896,12959 15604,13055 15605,13015 13897,13152 13898,13255 15606,13118 15607,12903 13899,13278 13061,12811 13062,12968 14104,14084 15608,12819 16034,13296 15612,14333 13067,12799 22276,12744 15613,13085 15614,12868 13901,12996 14326,12968 14315,12817 14356,13202 13074,14339 14040,12943 13077,13153 14348,13372 15617,13359 16079,13226 15999,13173 13902,12783 15618,12786 13903,12951 24257,12817 16000,13173 14065,13310 15619,12786 15620,12947 14881,13191 16143,13172 14047,14012 15624,14093 15625,13368 13888,13369 15630,13143 13904,12956 13905,13385 14920,12794 15631,13378 15632,13378 15635,13015 15637,13382 13906,13033 15638,12895 16165,12973 13907,13351 14004,13256 23592,14861 16093,12749 15640,13099 14052,12819 13908,12984 15641,13242 15642,12938 13103,12938 15643,13102 16077,13333 15645,12786 13106,13094 15646,13107 16061,13285 16127,13162 15647,13193 15648,12971 13909,13108 13910,13384 16112,13172 14389,13179 15649,13179 13911,13111 15650,13040 16131,13162 16069,13094 14387,12903 15651,12881 15652,13060 15653,13111 13912,12758 15654,12881 13838,12986 24254,12799 13913,13359 16164,13256 15655,14298 15656,13119 15657,12874 15658,12781 13914,13359 15659,12860 15660,13372 13915,13336 14363,12968 14349,13372 13123,13372 13916,13260 15993,12834 15664,13124 16081,13028 15665,13340 13917,12951 15666,13068 13918,13105 14865,12824 15667,14854 13130,13272 16090,12736 14938,13242 13131,12908 14926,13263 14896,12744 14947,12901 15674,12810 15675,13361 14352,12978 14057,12819 14927,13263 15163,12786 14034,13360 13784,12734 15679,13010 15680,13010 14005,13256 14891,12744 14885,13215 16100,12958 14923,12786 15681,12786 15682,12908 16087,13147 16072,13307 14919,13126 14936,12850 15684,13204 16078,13333 16123,12933 15685,13015 14909,12737 16088,13147 14067,13310 15690,13385 14929,14860 13919,13193 13920,13055 15691,12879 14017,13155 15692,12879 15693,13204 15694,12932 15695,13204 16130,13162 14345,13089 13163,13308 14320,12871 15696,13153 16258,13204 16262,13043 14380,13357 14041,12943 16142,13172 14069,13310 14910,12737 15699,12879 15700,12953 15704,13088 16002,13173 16121,13098 13922,12757 16003,13173 14894,12744 15706,12737 13923,13330 16054,13226 15707,12938 13924,12897 15708,12855 15709,13191 15710,13187 14381,12923 14871,13187 15711,12889 16134,13162 14378,13368 14060,13157 13925,13384 15722,13271 15723,13081 13798,13976 13926,13353 17913,12936 15724,13136 15725,13191 15726,13136 15727,12959 13927,12942 13201,12786 15728,12810 13929,12897 13930,13084 13931,13007 13932,12783 15730,12978 15731,13204 15732,14339 13933,12758 14893,12744 15733,12903 14059,13196 13934,13118 13935,12980 13936,13210 14316,13204 13937,12859 13991,12963 13214,13105 14045,13290 25744,12786 16135,13162 13928,12810 16166,14075 15735,13164 13938,13176 15736,13296 15737,13294 14354,12978 15738,13021 15739,12797 13810,13221 15740,13372 14883,12753 13939,13296 17912,12943 14362,12782 16103,12811 13227,12968 16138,13047 13940,13184 14882,13191 14001,12962 14042,12943 15742,13051 15743,14010 13235,13272 14360,13312 13941,13184 24253,13272 13942,12951 14305,13284 16136,13162 13943,13105 15745,12918 14304,13045 16094,12749 13944,12855 15746,12824 13945,12918 14068,13310 13946,13092 15747,13092 13947,12962 14937,12850 13948,13055 15748,12879 24256,13043 14021,14866 15994,12834 15749,13215 13949,12897 13950,13378 15750,13358 15751,13301 13249,13172 13951,13102 14918,12860 13952,13037 16074,13261 13953,12859 15754,13329 16068,13094 13254,13094 15755,13255 15756,12787 15757,13260 13258,13259 14036,12943 15759,12908 13954,12951 15761,13099 14105,14083 15762,13092 14371,13358 15763,12989 16108,13172 15764,13260 15765,12745 16013,12914 16006,12914 14886,13215 13955,13295 13264,13263 13265,13263 13266,12947 15767,13006 15768,13267 14323,12968 13956,12738 15769,13272 13957,13311 16036,13271 13958,13007 15771,12870 15772,12870 15773,12807 15774,13033 15775,12968 15776,12964 15777,12986 15778,13161 15779,13065 13959,12974 14905,12824 15987,12890 15780,14007 14350,12832 13960,13108 15781,12788 15983,13053 15782,14010 15783,14107 14039,12943 14895,12744 15784,13380 15785,13357 13961,13118 15995,13173 15786,13118 14053,12819 14306,13284 24255,13162 16060,12844 15788,12819 13796,12895 15789,13195 14946,12901 13289,13230 14908,12737 15790,12943 15791,12870 13962,13296 15792,13113 15793,13010 15794,13310 15795,13085 14031,13360 16096,13305 16102,13305 15797,12746 15798,12868 15800,13268 13963,13004 15801,13268 15802,13132 15803,12905 13964,13259 15804,13191 14921,13126 14382,12923 14058,12819 14029,13027 15985,13299 13965,12951 14904,12824 15805,12995 13992,13243 13783,12781 15806,13314 15808,13176 15810,13310 15811,13099 14902,12824 16065,13094 13320,12860 13966,13029 15812,13007 15817,12832 16007,12914 16128,13162 16140,13285 13323,13272 16122,12933 15818,12943 15819,12943 14944,12799 13327,12938 15820,13378 13967,12951 14043,12943 15822,12782 15823,12782 16076,13333 14367,12930 15825,13065 15826,13109 13969,13184 13970,12787 15827,13108 13337,13310 15828,13045 16075,13334 13972,12879 14872,13006 15829,13118 14875,12750 14049,12815 16035,13296 15989,13339 15830,12892 15990,13339 15831,12815 15832,12817 13973,13305 13974,12810 15833,12859 13971,13108 13975,12810 15834,12881 14366,12930 16008,12914 14370,13357 16066,13342 15835,13118 14888,12744 15837,13193 13977,13193 15838,13344 17911,12943 15839,13310 15840,13345 14922,12786 14055,12819 15842,13349 15843,12951 13978,12810 15844,13358 14377,12819 15847,13296 16070,13094 15848,14107 17764,14107 14106,14086 15849,13361 13979,12781 14019,12938 15851,12786 15852,13051 16104,13331 15853,13187 16261,12968 15854,13157 13980,13351 15855,13351 14385,12903 16011,12914 13981,13118 15856,13093 13982,13359 14887,12744 15857,12951 15858,12968 15859,12875 15860,12807 14374,14339 15861,12895 15862,12870 13983,13375 13984,13345 16119,13172 13985,12918 15866,12770 15867,12770 13986,13193 13987,12897 15868,13108 16067,13342 13988,13180 15869,14863 13989,13271 14930,14860 15870,13360 14027,13016 15871,13372 14878,13381 15872,13385 21961,13693 21967,13698 21965,13696 21966,13697 21969,13698 21970,13702 21971,13702 13699,13701 21968,13698 21962,13694 21963,13695 21964,13695 20250,3396 20251,3396 20252,3396 20253,3396 20254,3396 20255,3396 20256,3396 20257,3396 20258,3396 20259,3396 20260,3396 25432,10164 16240,1189 19546,1102 19547,1102 19548,1102 19561,1112 19549,1102 19550,1102 19562,1112 1108,1112 1109,1111 19566,1116 19567,1116 19563,1112 22081,1099 1114,1112 16248,16244 19558,1101 1190,1189 16239,1189 1125,1116 19551,1102 19568,1116 19564,1112 16242,1121 1128,1116 19565,1132 1134,1116 19552,1102 19553,1102 1135,1116 19554,1102 19555,1102 1141,1116 16345,1116 19560,1122 16344,1116 9665,9666 24882,11664 16471,3486 20335,3488 20318,3456 20321,3453 20314,3447 20315,3447 20316,3447 20317,3447 20319,3456 20313,3450 20323,3471 24964,3472 20322,3453 20320,3456 25425,12194 19545,1090 23219,9906 23220,9906 23221,9906 23218,9905 23222,9906 20100,9905 20101,9905 16710,9905 18853,11978 106,99 18944,12035 18940,12022 18939,11996 18945,12035 18943,11986 12026,12011 18941,11948 18942,12062 16238,11903 16230,12095 20213,3339 20209,3342 20214,3339 20212,3343 20210,3342 3345,3338 3347,3349 20211,3342 16912,10690 25202,10701 19207,10701 19206,10697 19205,10690 19208,10701 19392,7961 7950,7961 19391,7962 21685,13539 21728,13538 21724,21723 21725,13538 21686,21691 21704,21681 21720,13538 21705,21681 24123,21681 21706,21681 21690,21691 25693,21723 21702,13539 21733,13538 21699,13539 21679,21681 25692,13538 21710,13539 21698,13539 21700,13539 21692,13539 21711,21681 21707,13539 21703,13539 21729,13538 21708,21681 21688,13539 21713,13539 21721,13538 21726,13538 21701,13539 21731,21681 21694,21681 21727,13538 21734,13538 21687,21691 21697,13539 21714,13539 21696,13539 21735,13538 21715,21683 21684,21681 21695,21681 21716,13539 21736,13538 21737,13538 21717,13539 21718,13539 21682,21681 21689,21691 21709,21681 21693,13539 21680,21681 18857,11834 2021,2048 17840,2069 24410,2022 2023,2024 17838,2032 17847,2053 16421,2030 24413,2069 17837,2030 24415,2070 17839,2032 17841,2069 24411,2024 17833,2034 17832,2049 24414,2069 17842,2069 17845,2057 17844,2074 17834,2052 17835,2038 17836,2071 2072,2030 24412,2043 17843,2069 16422,2028 17831,2051 16423,2075 17846,2064 15173,2030 16424,2030 19544,1064 19543,1060 19542,1044 16919,11718 16920,11689 11687,11718 16921,11761 18912,11759 18630,11695 14288,11695 11697,25045 16922,11728 18921,11734 16923,11690 18917,11702 18902,11725 16924,11701 18923,11726 20355,11706 18924,11718 18928,11707 11709,11716 18915,11685 16925,11763 22254,11718 18925,11718 18929,11763 16926,11719 18930,11990 11724,11718 18913,11759 18904,11725 23084,11695 18903,11725 18907,11725 18919,11708 16927,11718 18908,11735 18927,11762 18926,11762 11737,11718 25087,25045 22253,11718 11740,25045 18920,11695 18906,11725 16928,11753 18922,25045 11755,11753 16929,11763 18918,11747 11760,18916 18914,11710 18905,11725 18909,11703 21543,13459 21544,13459 21545,13459 24373,1538 25405,10656 19005,10658 10663,10656 19009,12200 16236,12198 12697,12197 16949,12200 19794,9349 16174,9355 16650,17733 19800,9397 9234,9245 19761,9271 19788,9394 19752,9374 19783,9321 19804,9329 19789,9394 19767,9335 19785,9394 9240,9402 19751,9294 19759,9318 16659,9228 25373,9302 19801,9381 19757,9374 16249,9248 22221,9266 9251,9395 19821,9229 19812,9357 19810,9312 19750,9356 19753,9374 25374,9302 19799,9397 24935,9380 19762,9271 24281,9282 19784,9228 19754,9374 9269,9376 9270,9380 16652,9233 15195,9419 19808,17731 19769,9327 16653,9376 19780,14256 19796,9268 19790,9394 14254,9316 25376,9302 19817,9288 16655,9397 19813,9357 19782,9375 16656,9264 19758,9250 16658,17733 19746,9352 16661,9258 25377,9302 9304,9412 9305,9227 9306,9419 16662,9317 19770,9263 16663,9388 9310,9413 24936,9380 19772,9383 16665,9312 9313,9329 9315,9316 19815,9367 19814,9322 25352,24932 19803,9398 19773,9345 16666,9321 19774,9355 24930,9355 19809,9316 9332,9285 25375,9302 19811,9338 19765,9258 19797,9268 19747,9237 9347,9356 19755,9374 14257,19816 19778,9395 24931,9355 19766,9346 19807,24932 24934,9274 19763,9271 19798,9397 19748,9237 24933,9367 9368,25761 16667,9322 19764,9271 16660,9230 9377,9394 19768,9335 19802,9381 19749,9272 16668,9291 19795,25761 19786,9394 19779,9371 9385,17733 19791,9394 25378,9283 9393,9397 19787,9394 25379,9302 19792,9394 19818,9288 19756,9374 19771,9263 19781,9311 16669,9321 19760,9232 25457,17731 9409,9287 19805,9415 25380,9397 19793,9394 22105,9881 22100,9877 22092,9867 22087,9865 15896,9890 25725,9867 22099,9876 16707,9888 22097,9872 22103,9881 22106,9881 22098,9873 23211,9872 22107,9882 22101,9877 16708,9885 22102,9877 15897,9867 22094,9872 22108,9882 22088,9867 22114,9891 22095,9872 22112,9890 15898,9881 22089,9867 22104,9881 22113,9890 22109,9882 24321,9890 22096,9872 22116,9898 22093,9871 22117,9902 22111,9884 16709,9864 22115,9895 22110,9883 22090,9867 22091,9867 20762,3669 20766,3665 24480,3667 24479,3681 20765,3681 16488,3681 16489,3683 24475,3672 24477,3672 16490,3664 16491,3681 20757,3679 3680,3676 24476,3672 16493,3682 16492,3676 20764,3681 20761,3679 20734,3683 20758,3679 24478,3673 20763,3681 3686,3681 20759,3679 14723,3039 14724,2958 14725,3002 2962,14190 14726,3000 14727,3022 14702,2973 14728,2983 14703,2973 14729,3080 14730,2973 14731,2973 14732,3099 14733,3067 14704,3067 14734,3087 14735,2996 14736,2996 14737,2999 14738,3025 14705,3002 14706,2983 14739,3087 14740,2997 14741,3004 14742,3032 14743,3094 14744,3087 14745,3088 14746,3087 14432,3019 14747,3087 14707,2973 14748,3019 24439,2989 14792,2983 14708,2983 14749,3087 14750,3046 14709,2961 14751,3082 14794,3090 14710,2973 14711,2961 14752,3087 14712,2973 3049,2974 14753,3052 14754,3028 14713,2983 14755,3018 14756,2983 14757,2983 14758,3009 14759,2958 14760,3087 14761,3064 14762,3036 14763,2999 14714,3067 14764,3071 14715,2973 14765,3087 14716,2973 14766,3110 23580,2983 14767,2983 14768,2996 14769,3087 14770,3023 14771,3051 14772,3050 14773,3087 14774,3062 14775,2997 14776,3002 14717,3051 14777,3051 14718,2973 14778,3028 14779,3087 25461,3002 14491,3084 14780,3036 14781,3087 14782,2989 14783,2983 14784,3087 14719,3005 14785,2996 14720,3031 14786,3073 14721,2961 14722,3002 14787,3087 25290,3107 14788,3087 14789,3005 14671,3113 14672,3113 14790,3143 14673,3126 14674,3121 14394,3116 14675,3113 24431,3127 14654,3116 14676,3140 24440,14791 24432,3121 14656,3119 14677,3125 14678,3113 14657,3136 14679,3130 14680,3113 24433,3130 24429,3114 24443,3143 14658,3119 24436,3146 14681,3112 3139,3112 24310,3157 24444,3162 24441,3143 14682,3113 14683,3143 3145,14191 14659,3119 24445,3143 14684,3113 14685,3143 14686,3113 14687,3118 14688,3119 14689,3136 14660,3119 14661,3116 14662,3116 24437,3149 24434,3130 14690,3155 14663,3151 24430,3114 14691,3113 14664,3116 3158,17724 14665,3116 24442,3143 14695,3130 24422,3113 14693,3140 14666,3116 3161,3143 14694,3113 14667,3116 14697,3113 14668,3157 24435,3130 14669,3157 14698,3113 14670,3136 14700,3113 14701,3168 14509,2550 14510,2538 24427,2760 14416,2947 14395,2831 14511,2896 14512,2835 14513,2578 14514,2713 14396,2902 14515,2855 14397,2812 14516,2734 14517,2722 24455,2819 14398,2813 14518,2868 14519,2538 14399,2564 14520,2550 14521,2703 14522,2550 2552,2582 14523,2943 14400,2516 14401,2516 14402,2614 14524,2550 14525,2867 14526,2636 14403,2748 14404,2760 14405,2628 14527,2796 14528,2625 14406,2549 14529,2550 14530,2599 24425,2733 2576,2759 14531,2765 14532,2806 14407,2578 14408,2706 14409,2902 14533,2628 14534,2844 14535,2582 14536,2758 24454,2771 14411,2674 14412,2655 14537,2925 14413,2902 14414,2703 14538,2628 24450,2686 14539,2645 14540,2708 14541,2516 14542,2550 14543,2925 14415,2943 14544,2550 24452,2686 14545,2637 14417,2722 14418,2538 14546,2827 14547,2666 2629,2628 25468,2774 14548,2591 14549,2550 14550,2550 14551,2586 14419,2824 14552,2550 14553,2896 14554,2896 14555,2654 25464,2805 14556,2655 14557,2754 14420,2550 14558,2550 14559,2811 14560,2882 14561,2943 14562,2655 14421,2760 14422,2538 14423,2766 24451,2686 15466,2732 14564,2647 14424,2902 14425,2829 14426,2902 14566,2703 2680,2582 14427,2942 14428,2759 2694,2774 14429,2566 14567,2920 14430,2812 14431,2921 14568,2932 14433,2703 14569,2550 14434,2902 14435,2634 14436,2705 14570,2550 24446,2550 14437,2655 14438,2943 14571,2550 14439,2655 14440,2760 14441,2760 14572,2516 14573,2550 14574,2550 14442,2634 14575,2510 14576,2550 14577,2655 14579,2550 14443,2760 14580,2628 14581,2594 14582,2844 23054,2698 24426,2733 14445,2601 14446,2884 14583,2550 25467,2774 24447,2550 14447,2760 14448,2769 14449,2902 14584,2550 14585,2745 14586,2604 14587,2950 14450,2649 14451,2532 15594,2812 14589,2645 14590,2759 14452,2882 14591,2943 14453,2759 14454,2732 14592,2550 14455,2607 2761,2659 14593,2919 24534,2925 14594,2774 14456,2644 14457,2703 14595,2812 14458,2812 14596,2697 24458,2932 14597,2709 14598,2733 14599,2542 14600,2550 24449,2686 14459,2835 14460,2697 14461,2655 14601,2818 14602,2529 14603,2655 14604,2550 14605,2839 2791,2628 14462,2934 14463,2655 14606,2873 24561,2882 14607,2550 14464,2666 14608,2550 25474,2550 14609,2812 14465,2745 24448,2550 14466,2518 14467,2655 14610,2550 23055,2654 14468,2807 2826,2925 14611,2649 14612,2806 14469,2808 14471,2582 14793,2634 14472,2649 14613,2550 14614,2550 14615,2550 14473,2829 14474,2538 14616,2844 14617,2550 14618,2882 14475,2812 14476,2728 14477,2610 14619,2829 14620,2607 25473,2655 14478,2760 14621,2812 14622,2550 2857,2628 24456,2920 14479,2634 14623,2951 14480,2807 14481,2760 14624,2800 25471,2774 14483,2685 14484,2868 14485,14258 14625,2550 14626,2634 14627,2601 24423,2950 14628,2564 14486,2808 14487,2703 24457,2920 14488,2812 14489,2835 14629,2811 14630,2739 16175,2645 14631,2516 14492,2625 14632,2925 14633,2896 14493,2550 16176,2645 25472,2599 14494,2663 14495,2782 14634,2884 14635,2871 14497,2703 14498,2758 14636,2686 14499,2760 14637,2550 14500,2649 25470,2713 14638,2525 14639,2812 14640,2920 14501,2812 24453,2771 24428,2538 25466,2774 14505,2935 25465,2931 2937,14192 14641,2693 14642,2733 14643,2665 14502,2760 14503,2902 14504,2674 14644,2942 14645,2942 14646,2866 14647,2858 14506,2943 14507,2838 14508,2591 14648,2947 25463,2805 14649,2887 24311,2931 14650,2550 14651,2841 14652,2873 25172,12541 25173,12541 19822,8490 19823,8490 19824,8490 19825,8490 19826,8490 19827,8490 19828,8490 19829,8490 19830,8490 19831,8490 19832,8490 19833,8490 19834,8490 19835,8490 20951,8490 19836,8490 19837,8490 19838,8490 19839,8490 19840,8490 19841,8490 19842,8490 19843,8490 19844,8490 19845,8490 19846,8490 19847,8490 19848,8490 19849,8490 19850,8490 19851,8490 19852,8490 20952,8490 19853,8490 19854,8490 18937,12093 18938,12007 18934,11960 18935,11960 18936,11960 19204,12561 19203,12559 20882,3989 20892,3992 20883,3989 20886,3989 20902,3981 20887,3989 20888,3989 20894,3986 20898,3993 20900,3981 20896,3988 20901,3981 20890,3983 20891,3983 20899,3993 20897,3988 22567,3982 20903,3981 16520,3983 20889,3989 16885,7830 19647,7832 19648,7832 19645,7829 19646,7821 7826,7824 19644,7830 9164,7837 7831,7827 7840,7822 16886,7846 18854,12111 21895,13630 21889,13628 21887,13635 21890,13628 21886,13631 21891,13628 21896,13630 13629,13628 21888,13628 21892,13628 21897,13630 21893,13628 13633,13630 21894,13628 21898,13634 24148,10044 24184,16337 24157,10072 24186,10112 24147,10095 24195,10105 24171,10106 24196,10105 24149,10044 24198,10105 24197,10105 24178,10120 24176,10064 16887,24141 24153,10043 24199,10105 24158,10072 22129,10079 22130,10079 16892,10078 16891,10078 24172,10106 16893,10043 24159,10072 24168,10049 22131,16336 24185,16337 24209,10041 10061,10043 24204,10105 24160,10072 24190,10111 24146,10119 24173,10058 22125,10095 24143,10088 24200,10105 22126,10095 24161,10072 24162,10072 24201,10105 22135,10101 24144,10088 24182,10065 24202,10105 24177,10064 24163,10072 10080,10079 24164,10072 24187,10112 24169,10113 24174,10058 24189,10053 24210,10041 16338,16330 24203,10105 24175,10058 24205,10105 24206,10105 24217,10119 24179,16335 24188,10087 22124,10098 24154,10043 10092,16336 24192,10101 24193,10101 24145,10098 22133,10111 24165,10072 10100,10089 24170,10113 24211,10041 10102,10043 24191,10111 24155,10043 22132,16337 24180,16335 24207,10105 22134,10111 24152,10078 16889,10111 24156,10043 24183,10065 24166,10072 24167,10072 24142,10069 22128,10103 24181,16335 10116,16336 24150,10044 24151,10044 24194,10101 10122,10043 24208,10105 22127,10043 18816,11616 18817,11616 18818,11616 21519,13456 25807,13456 21518,13456 21520,13456 16237,13456 21525,16144 21517,13456 21521,13456 21524,16144 21516,21513 21514,21513 21522,13456 21526,16144 21523,13456 21515,21513 21527,21513 21528,21513 16508,3925 20829,3925 20838,3933 24508,3937 20830,3925 20836,3927 20837,3927 20833,3928 3930,3940 24507,3931 20840,3931 20835,3927 24506,3931 20839,3933 24957,3943 25482,3949 20831,3949 24503,3928 24504,3928 3942,3938 24502,3928 3945,3940 20841,3946 24509,3937 16507,3949 20832,3949 20842,3939 24505,3940 79,84 80,84 14277,84 16339,84 18656,84 88,86 89,84 90,86 20914,4021 25092,1561 1560,1617 17784,1623 17775,1569 25094,1559 25093,1559 17778,1574 18111,17756 17782,1614 1566,1615 17779,1604 1570,16391 17776,1569 17781,1582 17790,1593 17785,1573 16392,1597 17786,1573 25095,1591 17780,1618 25096,1618 1590,17756 17783,1563 25097,1567 17787,1600 25098,1613 25099,1623 16394,1559 25091,1610 1611,1586 1612,1593 17777,1577 16395,1574 17788,1594 25100,1602 1616,1568 18110,1585 1621,1614 17789,1586 14187,1624 25101,1623 16354,1227 17934,1320 16356,1333 17930,1311 16357,1333 17928,1266 16358,1268 1244,1311 17935,1247 1259,1266 1264,1286 16359,1329 1289,1298 16370,1302 17931,1311 16360,1231 16361,1309 17933,1268 16362,1312 16363,1312 16364,1314 25496,1325 16366,1250 17929,1266 1318,1311 1319,1311 1322,1286 1323,1262 17936,1235 15176,1325 1328,1295 17927,1258 16367,1311 1335,1262 17937,1262 18812,11609 18814,11593 11585,11602 24294,11609 18815,11591 18811,11609 18813,11590 13468,13467 21560,13467 21569,13473 21563,13470 21564,13470 21565,13470 21570,13473 21568,13472 13469,13467 21566,13470 21562,13467 13471,13467 21561,13467 21567,13470 22036,13755 22033,13754 22034,13754 22035,13754 24624,12131 24625,12131 24626,12131 18960,12074 20828,3777 22619,3823 3691,3782 16494,3721 20776,3884 22623,3853 20814,3717 22610,3849 3697,3825 22601,3826 22597,3689 3700,24496 20801,3750 20797,3765 25769,3713 22626,3765 22633,3877 24486,3767 22611,3849 3550,3832 22631,3713 20778,3706 20798,3765 3708,20815 20775,3759 3711,20815 20790,3744 22622,3739 3722,3774 20808,3745 22621,3739 3730,3780 24499,3745 20787,3897 24494,3825 20803,3817 22612,3849 22602,3908 22616,3706 3748,3825 20825,3921 3749,3699 3751,3747 20780,3780 16500,3792 22618,3690 20802,3869 24501,3850 3761,3914 20773,3762 24500,3745 24483,3767 20800,3750 3772,3750 22627,3817 20807,3747 3775,20815 22634,3877 3776,3895 20821,3921 20781,3780 20791,3744 24490,3830 20789,3900 22607,3741 20793,3744 16501,3735 24484,3767 20768,3785 20810,3783 20811,3783 22606,3908 3786,3805 22600,3703 24485,3767 22624,3853 3788,3840 16495,3835 3791,3853 3793,3825 3794,3908 22613,3849 24482,3767 20816,3877 3796,3877 16496,3822 3799,3699 22614,3851 22603,3908 20767,3800 24488,3767 24489,3767 24491,3830 3804,20815 22635,3877 22615,3851 20804,3735 3814,3690 3815,3809 3818,3866 16497,3694 16502,3895 20824,3921 20806,3907 20779,3823 22605,3908 20809,3910 3828,3910 20817,3832 3833,3817 22632,20815 20796,3766 3839,3781 22599,3689 24493,3823 24497,3745 20812,3850 20818,3832 20819,3832 22604,3908 24487,3767 3852,3801 3856,3825 22620,3823 3858,3847 20795,3781 20783,3843 23195,3705 20784,3699 3860,3781 16498,3735 3864,3801 16503,3908 3870,3699 20792,3744 3873,3745 3878,3825 20772,3849 3881,3780 20770,3908 3883,3731 20813,3717 22636,3877 3887,3830 3889,3890 16504,3745 16505,3759 22617,3690 20769,3785 24492,3823 16499,3869 22637,3822 3896,3807 22609,3688 24495,3910 22630,3745 22629,3745 24498,3745 20782,3693 16506,3902 20786,3723 25153,3907 3913,3801 22608,3741 22628,3817 3916,3769 25154,3895 22598,3689 20777,3857 3919,3781 22638,3822 25768,3713 23120,1975 23117,1975 23121,1975 23100,1959 23151,1943 23129,1930 23104,1955 23131,1930 23101,1959 23102,1955 23106,1975 23107,1975 23136,1930 23140,1977 23093,1976 23154,1943 23127,1930 23157,1939 23125,1944 23166,1941 16474,1932 23150,1940 23148,1940 23152,1943 23108,1975 23167,1972 23142,1946 16475,1943 23134,1930 23161,1949 23092,1976 23094,1976 23098,1976 23153,1943 23137,1930 23164,1945 23110,1975 23158,1939 23105,1978 23163,1945 23138,1930 23145,1946 23171,1952 23156,1943 23116,1975 23168,1972 23126,1942 23149,1940 23139,1930 23128,1930 23176,1980 23112,1975 23124,1979 23091,1957 23130,1930 23133,1930 23099,1976 23111,1975 23113,1975 23135,1930 23097,1976 23172,1938 23090,1956 23118,1975 23122,1975 23165,1941 23143,1946 23109,1975 23155,1943 23159,1939 16477,1976 23175,1938 16476,1940 23115,1975 23169,1972 23096,1976 23141,1946 23147,1940 23095,1976 23132,1930 23170,1972 23160,1974 23123,1979 23144,1946 23119,1975 23114,1975 23174,1938 23146,1946 23162,1945 23103,1955 23173,1938 25117,271 246,289 18708,309 16269,242 16272,239 18709,309 16273,290 16274,307 16275,309 16276,291 25118,299 16277,310 16278,310 296,280 305,265 16279,290 311,294 16280,304 17335,7929 17336,7930 21761,13550 24536,24535 10163,24535 25179,4302 22194,16224 23217,9825 18022,9852 18021,9829 25553,9839 18020,9857 10588,10606 16906,10626 16907,10642 25235,10600 25234,10606 25236,10601 10589,10641 10590,10615 10591,10596 18999,10639 16905,10613 10597,17328 25277,10614 10599,10600 25238,10643 25252,10641 10603,10643 25266,10614 17331,10619 18994,10604 25237,10643 18978,10641 10605,10619 25267,10614 10607,10612 10608,10612 10609,10619 10610,10637 25268,10614 10611,10614 18979,10641 25253,10641 25255,10641 25239,10643 18987,10641 25272,10614 25251,10619 18991,10600 25269,10614 25257,10614 16908,10630 18997,10633 25250,10619 19002,10612 10618,10644 18989,10595 25241,10592 25273,10614 10620,10643 10621,10643 25258,10614 25259,10614 10627,10641 18995,10631 18996,10626 10628,10643 18992,10622 18993,10622 25242,10635 25260,10614 10629,10641 16909,10626 25243,10601 19000,10639 24605,10641 25256,10614 25261,10614 24607,10614 18980,10641 16910,10600 10632,10619 25275,10614 25244,17328 18981,10641 19001,10639 25291,10641 18982,10641 18983,10641 25262,10614 10636,10606 18998,10594 25245,10643 18984,10641 10638,10641 18988,10601 25292,10601 25278,10614 25246,10612 19003,10614 25265,10614 25274,10614 25276,10614 18985,10641 25270,10614 18986,10641 25263,10614 25247,10639 25249,10626 25254,10641 24606,10614 25248,10619 25264,10614 25271,10614 14836,5555 14837,5555 25549,11612 9117,9114 20542,9114 18019,9815 24631,9817 7108,7112 15893,7112 16032,7112 25677,7112 18086,7118 7115,7118 7116,7118 14263,7118 7124,7118 25676,7112 15892,7112 18088,7129 25382,7118 25678,7112 24251,7112 25381,7118 18084,7132 16882,7112 18087,7121 7140,7132 16881,7112 7144,7118 7146,7118 25679,7112 3536,3570 16480,3573 3539,3570 3540,3612 20672,3606 20705,3611 20619,3554 20715,3633 16478,3619 20698,3612 20736,3651 20663,3582 20692,3612 20607,3654 3551,3611 20633,3554 20622,3554 20673,23064 20661,3561 20639,3542 20660,3561 20737,3651 3559,3570 20610,3654 20682,3570 20643,3603 3562,3611 20605,3569 20738,3651 3567,3611 20683,3639 20604,3569 20626,3554 20739,3651 20732,3564 20740,3651 20707,3584 20638,3555 20720,3583 20602,3658 20712,3565 20710,3565 20741,3651 20694,3619 3576,3620 3577,3633 20598,3578 20706,3611 20632,3554 20688,3644 20603,3571 20675,3662 20630,3554 20721,3583 20662,3582 20600,3587 20722,3583 20723,3583 20724,3583 3580,14279 20635,3554 20631,3554 20666,3582 20708,3601 20625,3554 20716,3633 20651,23065 20679,3537 20717,3615 20718,3615 20701,3618 23194,3578 20676,3662 20742,3651 20595,3578 16479,3654 20725,3583 20686,3639 20645,3603 20628,3554 20596,3578 20695,3558 20617,3554 20743,3651 20744,3651 20726,3583 20615,3554 20667,3650 20714,3633 20709,3601 20681,3570 20656,3592 20745,3651 3594,3595 3596,3569 20731,3538 20653,3595 20746,3651 20689,3620 20747,3651 20658,3557 3602,3558 20670,3606 20647,3603 20646,3603 20648,3603 3604,3633 20748,3651 25567,3606 16482,3639 20616,3554 20699,3643 20668,3574 16483,3611 20620,3554 20693,3599 16484,3583 3614,3613 3617,3633 20749,3651 20691,3620 20674,3662 20703,3579 20618,3554 3622,3610 20750,3651 20700,3643 20680,3537 20629,3554 3625,3570 16485,3648 20751,3651 20608,3654 20641,3591 20654,20652 20727,3583 3632,3620 20713,3633 20611,3646 20597,3578 20612,3646 3637,3633 3638,3651 16486,3612 20728,3583 20687,3644 20685,3639 20637,3555 20704,3579 3642,3612 24560,3612 16481,3601 3645,3587 20702,3618 20677,3662 20642,3591 20624,3554 16487,3564 20733,3564 20659,3557 20599,3578 3647,20644 20669,3548 20729,3583 20671,3591 20752,3651 20754,3651 20753,3651 20665,3582 3652,3558 20755,3651 20627,3554 20634,3554 20719,3615 25433,3591 20614,3554 20657,3575 20606,3569 20594,3541 20621,3554 20609,3654 3659,3586 20730,3538 23215,9460 9441,9460 16670,9443 18013,9460 9450,9460 16671,9454 9465,9460 18011,9447 18014,9460 18015,9460 15908,9460 18016,9460 18012,9439 22273,9432 18010,9432 24686,336 1876,1903 17810,16411 25130,1891 17809,1892 17812,1886 25789,1891 25787,1880 25791,1891 25784,1882 16412,16411 1887,1898 16413,1893 16414,1898 1889,1898 16415,1898 1894,1898 25790,1891 25786,1888 25788,1891 22220,1879 17811,16411 16416,1898 25131,1882 25785,1882 1904,1898 24402,1997 17821,1997 24406,2001 16419,1998 16420,1998 24403,2001 17822,1997 24401,1997 24407,2011 17826,2008 17827,2008 17825,1994 17823,1997 24409,2011 24404,2001 17824,1997 24408,2011 17828,1990 17829,2006 24405,2001 25602,2011 15263,7274 14108,7288 15295,7276 14109,7276 14110,7274 15334,7285 14111,7282 14112,7271 15338,7274 15357,7292 14113,7276 15370,7282 14114,7271 14115,7274 14116,7288 14117,7271 14118,7283 14119,7271 14120,7271 15443,7273 14121,7287 14122,7280 14123,7280 16884,7273 14124,7276 15513,7271 14125,7274 14126,7284 15549,7290 15573,7279 15574,7279 14127,7276 14128,7287 14129,7280 14130,7292 14131,7292 15609,7292 15610,7292 7281,7271 15621,7271 15629,7276 14132,7271 14133,7276 14134,7282 14135,7271 14136,7279 15661,7283 14137,7291 14138,7279 15677,7285 15678,7286 14139,7274 14140,7276 14141,7276 14159,7288 14142,7287 14143,7280 15698,7288 14144,7276 15712,7289 15713,7289 14145,7280 15716,7289 14146,7287 14148,7287 14149,7286 14150,7275 14151,7286 14152,7276 14153,7288 14154,7287 14155,7287 15824,7271 14158,7280 21882,13625 21883,13625 21881,13625 21884,13626 21885,13626 24592,3957 20869,3960 20853,3973 20854,3973 24519,3973 20843,3965 24525,3968 20856,20855 24513,3961 20878,3964 22566,3964 16513,3960 20851,3962 20879,3964 20870,3972 22654,3959 20880,3964 24515,3972 20871,3972 20873,3972 24518,3972 3963,3971 20844,3965 20845,3965 20848,3962 20857,3960 16509,3972 20858,20855 20859,3973 20876,3966 20852,3962 20860,3973 16514,3962 20863,3973 20861,3960 20872,3972 22141,3971 16515,3972 22649,3965 24510,3965 16516,3973 20864,3973 20874,3972 20846,3965 16517,3973 20862,20855 20847,3965 22647,3965 24517,3972 24511,3961 25155,3962 20865,3973 24521,3973 24522,3973 20875,3972 20849,3962 16518,3973 22143,3971 20866,3973 20850,3962 22144,3971 24516,3972 16511,3971 22653,3964 24514,3972 22646,3965 22652,3965 16519,3973 24512,3961 16512,3971 20867,20855 20877,3966 22650,3965 22142,3971 22645,3965 22651,3965 24523,3960 24524,3960 22648,3965 22644,3965 24520,3973 20868,3973 3976,3964 24116,13465 21554,13464 21551,13466 21555,13464 21557,13464 21558,13464 24117,13465 21552,13466 21559,13464 21553,13466 21556,13464 17830,2016 22329,10852 22330,10741 22331,11281 16913,10725 22332,11156 22333,11305 22334,10949 22335,11489 22336,11346 22337,11156 22338,11181 22339,11305 22340,11057 22341,10937 22342,10775 22343,10832 22344,11001 22345,11523 22346,11268 22347,11225 22348,10740 22349,11018 22350,10761 22351,11450 22352,11323 22353,11141 22354,10837 10745,11058 22355,11018 22356,11123 25619,10949 22357,10837 22358,11015 22359,11012 22360,10937 22361,11012 22362,11305 23530,11305 22364,11253 22365,10765 22366,10761 22368,10832 22369,11141 10764,11464 22993,11012 22371,11371 25633,11232 22372,11481 22373,10812 10769,11329 22374,11078 22992,11141 22375,11443 22376,11250 22377,10960 22378,11310 22380,10949 22991,10777 22381,11230 22382,11153 22383,10780 22384,10940 22385,10874 22386,11440 22990,10785 22387,11015 22388,11018 22389,10881 25636,10786 22299,11466 22391,11220 22989,11078 22392,11444 22393,11068 22394,11012 13993,10837 25654,10949 22988,11397 22312,22311 22396,10937 10799,10950 22397,11193 10803,10933 10805,11440 22398,11068 16914,10937 22400,10881 22998,11142 22401,11068 22402,11148 22403,11293 22404,10812 22405,10949 24617,10906 25621,11229 22406,11225 23589,11096 10827,11305 22408,11018 22409,11093 22410,10832 22411,10832 22412,11376 22413,10837 22414,10918 22415,10940 22997,10940 22416,10838 22417,11015 22418,10949 22419,10858 22420,11018 22421,10935 22996,11015 22422,11321 22423,10842 22424,11161 10844,17347 10845,11281 22426,10937 25646,11018 24609,10832 22427,11142 22428,17345 22429,10849 22430,10840 22431,11305 22432,11068 10854,11450 10856,23571 22433,10837 22434,10837 22435,10756 22436,10949 22437,11018 22438,11016 22995,11080 22439,11141 22440,17392 22442,11078 22443,11156 10873,10916 22444,11281 10877,10776 22445,11068 22994,11232 22446,10765 22447,11058 22448,10940 10891,10832 22450,11048 22295,11401 22452,11450 22454,11498 10898,11450 22455,10832 22456,10949 23546,11450 22453,10908 22458,11012 10910,23590 25635,10911 22459,11268 22460,11305 22461,11018 22462,10776 22463,11018 22310,10915 22464,11255 22465,11212 22466,11058 13994,10920 22468,10920 13995,10918 22470,11083 25641,11450 22471,11156 22472,11281 25660,10940 22473,11305 22474,10953 10925,11368 22476,11310 22479,11131 22480,10761 22481,10849 25675,25627 22483,11277 22484,11429 22485,11104 22486,11018 22487,15191 22488,11018 22489,10937 22491,10937 22492,10936 23533,14231 22493,11229 22494,11310 22490,11027 22496,10922 13996,11331 23002,10842 23003,10837 22294,10945 22499,11526 25657,11490 22500,11330 22501,11498 25662,14232 25618,10949 22502,11018 23001,10740 22503,11068 22504,11149 22505,11093 22506,11033 15954,10853 22508,11443 23000,10956 22509,10949 22510,11171 22511,11161 22512,10832 22513,11012 22514,11156 22515,10961 22516,11068 22517,10979 24612,11018 22518,10980 22519,11142 22520,10832 22521,11293 22522,11068 22523,11397 22524,10973 22525,10743 22526,11351 22527,10980 22528,11068 22529,11141 22530,11142 22531,11141 25640,11403 22533,10949 22534,10949 24610,10949 22536,10858 22537,11440 22538,11012 22539,11012 25642,11111 22540,10980 22541,10980 22543,17392 22542,17392 22544,10858 23545,17345 23029,11271 22545,11058 25656,11285 23494,11450 22546,11141 22547,11141 22548,11171 22549,10949 22550,11220 22551,11068 22552,11033 22553,10832 22554,11012 17363,10832 22555,10832 11014,11001 22556,11317 22557,11016 23027,11020 23028,11020 22558,10949 22559,11018 22560,11080 22561,11059 22562,11059 23026,10825 11028,11224 22287,11062 22565,11083 22568,10949 22569,11476 22570,11001 17380,23496 23497,23496 22571,11018 22572,11012 22573,11507 24608,11293 22574,11199 22575,10940 22576,11151 11034,11018 22578,11357 22579,10949 11038,11403 22580,11061 22581,11330 22582,11232 22583,11166 11042,10823 22584,11016 22585,10978 22586,11044 22587,14232 25645,17407 22588,11277 22589,11141 22590,11277 22591,11173 22592,11058 25649,11305 22593,11058 22594,10832 22595,10837 22596,11220 11049,11052 22669,11068 22670,11068 11053,11174 23025,10949 22672,11058 23523,11420 22673,11498 23024,11278 22674,10949 25661,11403 24611,10949 22675,11391 23554,11431 23584,10822 22676,10812 11065,11293 23023,11229 23021,11440 22677,11440 22936,11068 23587,11068 22678,11068 22679,11146 22680,11041 11069,11007 17385,10832 22681,11523 22682,11212 15542,11189 22684,11277 23520,11440 23560,10840 23561,11377 22685,10937 22686,11068 22687,10832 22688,10949 22689,22290 22690,11161 24313,11523 22691,11310 22692,11401 22693,10832 23562,10859 23020,11397 22694,11088 11090,10760 11091,10906 22695,11235 22696,11443 22697,10923 22698,10832 23019,10975 23563,11507 22699,11084 22700,10940 22701,11027 23559,10920 22702,11104 23519,11440 23018,11141 22297,10949 22703,11458 22704,11139 22705,10936 22706,11218 22707,11068 25625,11229 22708,11302 22709,11251 22710,10936 22711,10813 22288,11425 25622,10957 22713,11013 22714,11115 11116,10879 25617,10949 22715,11117 25663,11450 22716,10741 11119,11305 22718,11068 11126,11450 22719,11012 22720,10798 22721,10949 22732,10949 11127,11081 13998,11308 22723,11041 22724,10937 22725,10975 22726,10761 22727,11356 23566,10836 23011,11141 22728,11139 22729,10960 22730,10960 22731,11342 23010,11058 23549,11323 22734,10837 22735,11293 23555,10905 22736,11383 22737,11027 22738,10776 23009,11418 22739,11229 22740,11435 22741,11084 23582,11327 22742,11327 14237,25763 22743,11160 23008,10832 11152,11450 22744,11293 22745,11293 22746,10825 22747,11477 23567,11068 22748,11175 22749,11216 22750,10832 22751,10761 22752,10949 22753,10920 23007,10850 22754,10832 22755,10874 22756,11161 22757,11054 22759,10917 23538,11293 22758,10832 22760,11161 22303,11525 23016,11255 11167,11450 11168,10823 22761,11148 23547,10775 22762,11141 22763,10776 22764,11023 25643,11012 23495,10760 22765,10949 13999,11156 22767,10937 25639,10823 25653,11012 22292,11177 23006,11466 22768,10751 22769,10849 22770,10949 23005,10761 23556,11523 23557,11078 22771,11093 22772,11068 22773,11440 22774,11205 17391,11498 22775,10849 22777,11018 22778,11018 22779,11146 22780,11230 22781,11508 23014,11392 22783,23571 22784,11122 22785,10729 22786,11319 22787,10918 23013,11068 11201,22305 11203,11106 23542,11293 25632,17346 22788,11207 22789,11358 22790,11321 22791,11207 23543,10775 22792,11317 22793,11199 22794,10842 23004,11012 22795,10922 22306,10963 25647,11220 22796,11110 11221,10765 22797,10832 22798,11229 22799,11352 22800,10821 23532,11518 22801,10949 22802,11440 22803,10842 22804,10926 22805,11247 23558,11058 22806,10949 24689,11347 11236,11161 22807,11478 22808,11027 22809,10978 22810,11048 22811,10740 22812,10832 22813,11048 22814,11305 14000,11476 22816,10832 22817,10949 22818,11305 22819,11250 22820,11277 16915,10936 22822,11249 24618,11250 22823,11141 22824,11305 22825,10917 22826,11229 22827,10837 22828,10973 22829,11015 22831,11389 22832,11061 22833,11436 22834,10761 22835,11156 22836,10949 22837,10832 22838,10978 23552,11161 22839,11058 22840,10947 23586,11293 22841,11277 11276,10836 23522,11012 22842,11068 22843,11305 22844,10756 22845,10822 22846,10832 25638,11339 22847,11305 22848,11305 22849,11023 22850,10949 22851,11492 23039,11018 22852,11291 23585,11293 22853,10927 23040,11310 22854,10950 22855,11027 22856,11310 22857,11141 22858,11481 22859,11012 22860,11305 22861,11284 22862,11016 22863,11041 22864,11142 25659,11342 22865,11278 11316,11315 22866,11278 23570,10813 22867,10837 22868,11012 25644,11001 22869,11012 22870,11021 22873,11305 11337,11293 22871,11334 11338,11032 25652,11081 22875,11156 22876,11153 22874,11235 25651,11319 25634,11235 11343,11305 22879,11161 23540,11523 22881,11229 22882,11161 11348,11450 22883,11281 11353,10906 22884,11231 22885,10738 22886,11401 23536,11186 22887,10812 22888,17392 23534,11080 23553,11171 22889,10953 23531,11080 22890,11154 22891,10920 22892,10920 22893,11305 22894,11131 23544,11478 22895,10861 22896,11160 22897,11251 11381,10806 23537,11212 23030,11212 22898,11093 22899,11478 22900,10940 22901,11440 23539,11058 11390,17345 22904,10832 22905,10890 22906,11013 11393,10953 11395,11442 22907,11305 23529,10905 22908,10949 23036,10949 23569,11498 22909,10949 25658,10940 22910,11383 22911,11321 22912,10890 23043,10776 22913,11093 22914,11027 11417,11012 22915,11418 22916,11154 23044,11001 25650,11401 22917,10832 22919,11161 23568,11293 22918,10875 23045,11253 25637,11450 23583,11349 11430,11444 22920,11435 22921,11012 22922,11305 23046,10832 22925,11441 22923,11278 22924,11278 23550,11491 22926,11443 24613,11212 22927,11212 11446,10808 11447,11012 22928,11445 23047,11453 22929,11141 11455,25843 22930,10940 22932,11523 22931,11232 22933,11141 22934,10837 23012,11005 25655,11450 22935,10837 23035,11278 23541,11399 22938,11392 22939,11491 11467,17346 22941,11305 11468,10858 22942,11277 22944,10832 22945,11242 23526,10949 23551,11377 22946,10949 22947,10812 22948,10888 22949,11478 22950,11027 22951,11206 22952,11218 22953,10846 22954,11229 22955,10920 22956,11032 22957,10949 11486,15957 25620,15957 22958,10832 23034,11018 22959,11018 23588,10975 25648,10992 22960,11440 22961,11349 22962,11523 23521,11342 22963,11012 22964,10789 22965,10949 22966,11093 22967,10825 11502,11293 22968,11058 22969,11440 22970,10942 22971,11018 22972,10881 22973,11282 22974,11018 22975,11058 22976,11219 22977,10975 23049,11131 22978,10883 22979,11229 22980,11229 22981,10832 22982,10858 22983,11018 11520,10820 23528,11232 22984,10931 22985,10832 21571,13475 24118,13475 24119,13475 21572,13475 24382,1668 24389,1668 24387,1668 24383,1668 24384,1668 24388,1668 24380,1668 24386,1668 24381,1668 24681,1666 24385,1668 16950,12207 19012,12264 19026,12206 23232,12365 19087,12247 19117,12370 19097,12275 19120,12290 19114,12400 19062,12282 19156,12276 19163,12223 19045,12306 16951,12250 16952,12259 12214,12333 19089,12344 12217,12393 19148,12393 12219,12393 16953,12220 19029,12262 19084,12404 23233,12271 19161,12223 19165,12221 19107,12313 12225,12393 19127,12288 16954,12259 23231,12249 19053,12329 19130,12258 19102,12334 19078,12218 19052,12304 19144,12260 19099,12280 16955,12247 19058,12368 19016,12251 19017,12251 12255,12393 16956,12250 19122,12359 19040,12307 19131,12258 19145,12260 19168,12242 19031,12263 19048,12327 19110,12274 19070,12250 16957,12238 16958,12276 16959,12262 16960,12296 19042,12293 19158,12210 19060,12368 19037,12352 16961,12272 19022,12312 19071,12250 19085,12295 19109,12289 19133,12273 19079,12218 19027,12388 19010,12399 19150,12211 16962,12250 16963,12250 19129,12265 19044,12293 19043,12293 19094,12335 19171,12356 19072,12250 19155,12325 19105,12378 15167,12233 16964,12250 19023,12366 16965,12258 19038,12352 19033,12263 16966,12216 19028,12233 19149,12318 19077,12218 19138,12355 19108,12289 19160,12223 19121,12286 19170,12283 16967,12259 19095,12335 19096,12335 19082,12404 16968,12397 19166,12221 19034,12382 12298,12340 19115,12400 16969,12283 19119,12285 19128,12229 19139,12342 19075,12250 19061,12249 19068,12250 19146,12393 16970,12250 19056,16978 16971,12285 16972,12324 19134,12273 19106,12240 19151,12222 16973,12250 19041,12232 16974,12383 16975,12250 19104,12215 22249,12344 19093,12254 19091,12373 19157,12210 19100,12365 16976,12291 16977,12250 16979,12250 19086,12391 19143,12301 12328,12318 19135,12227 16981,12250 19125,12216 19142,12301 16982,12250 24619,12250 12332,12285 19046,12306 19030,12405 19136,12227 19057,12339 19066,12250 19067,12250 19015,12412 19123,12359 12343,12282 19101,12365 19055,12323 12346,12356 19035,12352 19051,12238 16983,12286 16984,12240 16985,12250 12348,12345 19025,12206 19021,12312 19092,12254 12357,12216 19090,12320 19152,12222 16996,12259 19147,12393 16986,12250 16987,12280 16988,12370 19124,12359 16989,12288 19132,12377 19162,12223 16990,12372 19065,12394 19140,12401 16991,12274 19064,12394 19137,12236 12379,12393 25758,12283 19118,12370 16992,12280 19050,12238 19049,12238 19111,12274 19076,12218 19054,12371 19047,12327 19059,12368 19019,12314 16993,12222 16994,12238 19080,12246 19116,12370 16995,12397 12389,12344 19126,12294 19112,12274 19073,12250 19069,12250 19074,12250 19141,12351 16997,12370 19024,12366 19063,12291 19018,12324 16998,12283 19032,12263 12395,12267 16999,12253 19011,12253 19020,12299 19013,12259 19014,12259 19081,12246 19159,12210 19167,12221 19098,12275 19113,12400 19169,12283 19088,12408 17000,12408 12409,12314 19103,12334 19083,12404 12410,12356 19154,12222 19164,12223 12411,12238 19039,12352 20948,10517 20949,10517 24604,10519 20947,10518 17526,374 17527,371 24952,354 17528,374 16281,355 18713,360 24372,355 18711,364 16283,364 18712,364 17529,364 376,357 16282,373 380,355 21603,13488 21604,13488 21602,13488 21605,13488 20207,3311 25738,4016 25735,4016 25734,4016 24529,4003 20906,4007 25742,4016 25732,4016 22655,4003 25739,4016 25737,4016 20909,4003 24530,4003 24527,4011 25731,4016 20908,4014 20910,4003 20911,4003 24531,4003 20912,4003 24533,4003 22146,4003 25736,4016 25733,4016 20913,4003 24532,4003 25740,4016 25741,4016 24528,4011 20904,4016 4019,4016 20905,4016 24526,4009 20907,4007 15971,8792 20342,8794 16251,8786 16252,8789 20343,8796 16253,8787 18018,10033 12124,12123 11959,25552 16693,9652 18009,9651 18007,9661 24895,13399 15902,9788 25358,9788 25360,9788 20102,9788 20103,9788 25359,9787 16705,9788 941,936 17423,7064 25518,7074 23058,7074 18124,7074 18125,7068 25424,2485 17377,17376 24218,13434 25032,24222 16697,9752 16698,9717 17997,9719 17996,9740 17989,9757 16700,9729 17992,9758 16701,16699 25365,9721 17994,9717 17990,16699 9741,9732 17995,9717 17993,9717 9754,16699 24105,16699 17991,16699 16702,9729 19401,7946 16612,7937 19406,7940 19412,7933 19407,7940 19398,7935 19404,7943 19403,7943 19397,7947 19399,7937 19411,7944 19408,7936 19402,7943 16613,7943 19413,7934 19410,7948 19405,7943 19400,7937 19414,7934 19409,7936 17522,961 24953,976 17524,951 16317,961 17525,959 25361,9678 17998,9702 18004,9711 24886,9711 18000,24309 9672,24888 24889,9685 24887,9711 18005,9679 24891,9705 16694,9705 24892,9706 16695,9678 24108,9684 25362,9705 16696,9687 9690,9684 24282,24309 9696,9688 17999,9686 18001,24309 22272,9676 9709,9684 24893,9685 24283,24888 18002,9705 18003,24888 21997,13740 22018,13730 22022,13735 22002,13748 21987,13731 22003,13748 22020,13734 21976,13733 22024,13737 22019,13730 21992,13711 22029,13745 22013,13714 22000,13748 22011,13708 13712,13731 21981,13727 13716,13748 13719,13705 21988,13705 22012,13714 22004,13748 21993,13721 21984,13727 22005,13748 21989,13705 13723,13705 21974,13707 22014,13724 21973,13707 21986,13731 21979,13725 22030,13745 22026,13741 25698,13731 22015,13730 21975,13707 22028,13745 22017,13730 13729,13705 25700,13720 21991,13711 23061,13741 22031,13745 22247,13725 21978,13725 21977,13733 22006,13748 21999,13740 22001,13748 22007,13748 21983,13727 21995,13748 21980,13725 25694,13734 21982,13727 13736,13735 13738,13705 21994,13739 25704,13733 22023,13735 22016,13730 22008,13748 25705,13720 25706,13720 22027,13744 24129,13745 13746,13705 21990,13705 21998,13748 22025,13737 22032,13720 22009,13748 22010,13748 13751,13705 25709,13733 13753,13726 25122,1067 16186,1077 1072,1077 16328,1077 24707,1071 24954,1077 16179,1077 16341,1077 1079,1075 24708,16342 1080,1084 24706,1086 1083,1081 7082,7096 18126,7100 18127,7081 18083,7080 7092,7081 18128,7081 18082,7096 25383,7100 7103,7096 16712,9936 18017,9969 22269,9956 16711,9965 24316,9916 21548,13462 21549,13462 21550,13462 21609,13492 21610,13497 21667,13499 21611,13497 21612,13497 21615,13497 13494,13497 21616,13497 21617,13497 21613,13497 21618,13497 21619,13497 21620,13497 21621,13497 21622,13497 21623,13497 21614,13497 21625,13497 21624,13497 22271,9771 25407,9768 25116,44 25491,4 25492,4 24672,47 24668,18 24676,47 24956,4 8,47 17514,18 17515,47 17516,47 15,42 24673,47 16,25545 18655,22 19,18 24669,18 24677,47 25494,22 17517,4 24674,47 25,47 26,41 25493,4 35,41 17513,47 24678,47 17518,24 45,32 17519,51 24675,47 48,51 17520,24 17530,51 17521,5 24670,18 18901,12180 17511,810 17512,810 25795,12605 17020,12613 19211,12608 19212,12626 17862,2226 16437,2179 17868,2185 16438,2191 2187,2186 2188,2185 17865,2214 25596,2225 16188,2216 16441,2203 17867,2217 2202,2185 16439,2195 17864,2186 17869,2191 17870,2191 16440,2216 2206,2216 17866,2179 17863,2227 16442,2190 25415,16225 24471,3502 24465,3501 16472,3502 24464,3501 20340,3505 20341,3505 20338,3500 24466,3501 24470,3502 20336,3512 20337,3500 24474,3502 24467,3501 20339,3509 24472,3502 24473,3502 3513,3501 16473,3502 3171,3205 20954,3245 20955,3245 20957,3245 20958,3245 20160,3241 20168,3264 25180,3264 3178,3236 25181,3255 22228,22227 25182,3186 20164,3208 20959,3245 20960,3245 20961,3245 20161,3241 20157,3255 20159,3274 3190,3241 20162,3241 20169,3264 20163,3241 16189,3256 25183,3258 16452,3266 20963,3245 20154,3219 20170,3223 25184,3205 22277,3241 16453,3236 20166,3254 20167,3254 24459,3174 20964,3245 20155,3218 16190,3180 22226,3264 16457,3222 20156,3218 16454,3228 20969,3229 16456,3205 24235,3205 16455,3229 24461,3245 20965,3245 20158,3205 3233,3241 20966,3245 20968,3244 16458,3206 20165,3256 3242,3256 3243,3236 20967,3245 25534,3241 25798,3210 3259,3258 25535,3244 3270,3236 25533,3205 25762,3241 3272,3241 24460,3174 17462,5504 16754,4903 18448,5325 18158,4988 18166,5403 17365,5403 18282,5255 18175,5224 18174,4959 18530,5109 18327,4936 4900,5183 18160,5515 4908,5051 4914,5449 18558,4921 18389,5405 18437,4917 23242,5109 18270,4896 15166,5003 18232,5137 18253,4927 18424,5441 18478,5390 4920,4964 16749,4922 18401,4922 18472,5102 23244,5111 18596,5111 18597,5111 16750,5390 4925,5250 18202,5415 18169,5452 16751,5460 18458,4928 4930,4929 16752,5253 18598,5111 18188,5103 18348,5439 23246,4933 18479,5390 23247,4937 18285,5358 18287,5516 18288,5516 18159,4988 18449,5325 18603,5062 18155,5243 18539,5360 18346,5398 18599,5111 18193,4939 25368,5050 4943,5183 16753,5250 18268,5253 18295,5011 4944,5250 18442,5170 23251,5162 18358,5114 18359,5114 23252,4948 18360,5114 18573,5460 18574,5460 18196,4949 18469,5031 18319,17464 4950,17464 18604,4933 18344,5491 18216,4937 23253,5460 15200,5460 18273,5168 18271,5168 16756,4965 18592,5336 18546,5446 18187,5028 18274,5123 18385,5511 18406,5218 18559,5346 18408,5504 16757,5015 23254,5128 23255,5014 23256,5015 18170,5452 18480,5390 4971,5390 4975,5179 17466,5491 18481,5390 18305,5151 18341,5491 4978,4987 23257,5021 23258,5114 23259,16234 18482,5390 18517,5117 16758,5362 18379,5511 18416,5003 18275,5123 4984,5187 4985,5168 23261,4986 18212,5525 18357,4987 15177,5390 23262,5390 18153,4964 18151,5428 17678,5418 23263,4987 23264,5460 18611,4993 4994,5439 23265,5241 18254,5156 23266,5170 23267,5390 24326,5330 23268,4933 5004,14222 18219,5056 18199,5362 16760,5390 23269,5214 24593,5214 5010,5427 20351,4977 23270,5204 18457,5389 23271,5313 23272,5405 18296,5011 18516,5053 23273,5461 18177,5224 23274,5023 5024,5491 18321,4906 5026,14166 18330,5083 18332,5083 18333,5083 5030,5432 23275,5254 5036,5168 23276,5325 23277,5002 23278,5297 18201,5046 23279,5183 23280,5283 23281,5223 18343,5491 23282,4918 7345,5083 23284,5083 23285,5516 16761,4933 23286,5372 18519,5190 5052,5068 23287,5190 18534,5309 18361,5114 23288,5068 18483,5390 18547,5446 23289,5183 5060,5460 20353,5128 18235,5137 23290,5448 25156,5137 5067,5397 18567,5068 18575,5460 18585,5391 23291,5068 23292,5330 16762,5244 18576,5460 18380,5511 18237,5137 18429,4945 18231,4982 18381,5511 18535,5309 18543,5241 5072,4913 19250,5249 18433,4977 18394,5128 5077,5231 5078,4938 18484,5390 5079,5190 18276,5123 18301,5133 16763,5399 18262,5214 18252,5184 18485,5390 18239,5137 18548,5446 18525,5427 18526,5427 18568,5068 18425,5441 18395,5128 5085,5296 18244,5293 18328,4912 18391,5185 16764,5293 16765,4964 18563,5088 18194,5089 18382,5511 18473,5102 18586,5090 23293,5224 18390,5405 18569,5068 18184,4972 16766,5491 18527,5258 18312,5140 18392,5442 18258,4927 18157,4988 18374,5511 18412,5504 5094,16755 18306,5151 18549,5283 18553,5021 18183,4972 17468,5390 17469,5390 18307,5151 18409,5504 18486,5390 18554,5021 18487,5390 18308,5151 5097,5137 16767,5452 5098,5325 23295,5099 19249,5099 23296,5102 18189,5103 18185,5144 18467,5014 18342,5491 18347,5398 23297,4964 18351,5272 18470,5031 18471,5031 18531,5109 18278,5438 25565,5390 23298,5273 18572,5273 18577,5460 18601,5111 23300,5111 18488,5390 16768,5390 23301,5224 18325,4906 23302,5114 18322,4906 18323,4906 18518,5117 18544,5241 18245,5293 5120,5048 18489,5390 18550,5283 18552,5283 23304,5283 18551,5283 18190,5103 23305,5371 18246,5293 5122,4896 18277,5123 5127,14296 18197,4949 18578,5460 18490,5390 18491,5390 23306,5390 18176,5224 14847,4922 18461,5250 18462,5250 18345,17549 18396,5128 18397,5128 5134,14171 18263,5141 18410,5504 18411,5504 16769,5068 18313,5140 18421,5093 18329,4912 18570,5068 18453,5015 18609,5448 18222,5055 18309,5151 5149,5170 18420,5330 23307,5330 5152,5014 16770,5452 5153,5102 18200,5362 18451,5289 5163,5274 18579,5460 16771,4906 5166,5250 18492,5390 23308,5168 18393,5171 24591,5022 18302,5133 18340,5506 18297,5011 18580,5460 5176,4948 5177,5137 18247,5293 18213,5525 18430,4945 19247,5007 18310,5151 23309,5185 18362,5114 18172,5162 18334,5372 18452,5289 18354,4987 23310,5289 18561,4981 18269,5253 18171,5219 5191,5158 18398,5128 18403,5275 18283,5255 18607,5344 5194,5143 18536,5309 5196,5015 17476,4987 18241,5137 25414,5205 18203,5415 18298,5011 18223,5055 18248,5293 5211,4979 18432,4977 18178,5224 5216,5309 18249,5137 18182,5146 18259,4927 18154,5243 18493,5390 18529,5227 18555,5021 18335,5372 18289,5516 18399,5128 18593,5336 18594,5336 18371,5307 18494,5390 18317,5328 18595,5517 18524,4913 18417,5223 18324,4906 18520,5190 18542,5303 5234,5014 5236,16234 18243,5137 23311,5238 18407,5218 18528,5258 18439,16234 16790,5293 23312,5298 16850,4979 18265,5298 23313,5258 5260,5261 18496,5390 18497,5390 18179,5224 18180,5224 16791,5390 18356,4987 18383,5511 18474,5102 18413,5504 18608,5344 5268,5183 5277,5232 16792,5511 5280,5224 5281,4913 18454,5015 18498,5390 18225,5332 18565,5287 18560,5346 16846,5313 18521,5190 18566,5287 15891,5328 18266,5298 16847,5390 18512,5313 5290,4953 18522,5190 18581,5460 23314,5305 18311,5151 5295,5014 18475,5102 18387,5044 5301,5044 18513,5313 18226,5332 20350,4968 18161,5515 18191,5033 18557,5113 23315,5031 18515,5418 5310,5529 18291,5422 19248,5527 18441,5170 18443,5170 23316,5156 16848,5015 18426,5037 18427,5037 18459,5389 16773,5243 5319,5460 18284,5374 18444,5170 18292,5422 18460,5481 23317,5325 20352,5031 23318,5031 23319,5311 18556,5021 18229,5423 16774,5330 18418,5330 18545,5241 16775,5390 23320,5415 18204,5415 5340,5164 18440,16234 18272,5168 18376,5164 23321,5345 18230,5522 23322,5352 18363,5114 16776,4916 18540,5360 18541,5360 18349,5439 18152,5263 16777,5263 18377,5164 23323,5114 18264,5462 23324,5412 18499,5390 17479,5007 18455,5015 18286,5358 18537,5224 18463,5250 18255,5156 5363,14168 18221,5204 18500,5390 18414,5504 25460,5167 18281,5167 18224,4929 18314,4948 5369,5022 18415,5504 18336,5372 23325,5102 5377,5510 18533,5109 16852,5511 23326,4918 16779,5000 18173,5025 5386,5397 18260,4927 18261,4927 18456,5015 14167,4896 18435,4977 23327,5380 18501,5390 23328,5460 18220,5454 18372,5110 18331,5083 18165,5007 18209,5406 18337,5372 23329,5398 18162,5515 18538,5309 18378,5186 18514,5313 18218,5125 5411,17464 18404,4953 23330,5412 18591,5412 18464,5250 18502,5390 18503,5390 18384,5511 16780,5398 18388,5044 18610,5448 18606,5042 18562,5297 23331,5420 18405,4953 18423,5002 18364,5114 18186,5144 5426,5491 18523,5190 23332,5128 18564,5159 18326,4906 5431,5056 18445,5170 18589,5218 23333,5412 18587,5242 16781,5253 18428,5037 18210,4941 18217,4937 18293,5422 18294,5422 18234,5137 18236,5137 18316,5328 18214,5525 18299,5011 15890,5452 18446,5170 18447,5170 16853,5309 18422,5001 18215,5209 18338,5372 16854,5099 5457,5015 18267,5253 18582,5460 23334,5460 18465,5250 18375,5164 18168,5452 18339,5372 18588,5242 18504,5390 18238,5137 23335,5137 18256,5156 5470,4922 18511,5313 18156,5243 18192,5099 18466,5250 23336,5250 18505,5390 16782,5390 18402,4922 18352,4902 18353,4902 18366,5114 18476,5102 16855,5390 18532,5109 16783,5137 5486,5405 18373,4997 18303,5133 18304,5133 16785,5305 18506,5390 23337,5102 18583,5460 18198,4949 16786,5143 23338,5133 16787,5275 16856,5218 18584,5460 5496,5129 18477,5102 5497,5050 18350,5439 18250,5293 18251,5293 16788,4906 5499,5102 23339,4949 5501,5170 18367,5114 5503,5023 18300,5011 16789,5128 18507,5390 16857,5404 18602,5111 5513,5390 18571,5068 16858,5014 18279,5438 23341,5515 18508,5390 18280,5438 18163,5515 16859,5517 18181,5224 18368,5114 18436,5518 18450,5325 18227,5332 18228,5332 16860,5522 23342,5454 18509,5390 23343,5183 18320,17464 18400,5128 18211,4941 23344,5491 18290,5516 5523,4969 18369,5114 18318,5328 23346,5491 18240,5137 18242,5137 18206,5415 16861,5374 23348,5518 5528,5529 5532,5151 18355,4987 18370,5114 18207,5415 18208,5415 5533,5378 18510,5390 16862,5491 17795,1705 17794,1684 18112,1678 17798,1775 17797,1741 1712,1825 17793,1687 17800,1821 16400,1773 16401,1738 16402,1839 17799,1758 16404,1778 16403,1837 1760,1677 25331,1773 1776,1808 25598,1808 16405,1698 1788,1766 1799,1678 16407,1690 15729,1708 17679,1811 17796,1761 25603,1808 16406,1829 1817,1703 25599,1808 1826,1837 1827,1828 1830,1748 16408,1738 16911,10684 18026,7294 18025,7294 18024,7295 22196,7295 18023,7295 22037,13757 20096,10162 16747,10149 10139,10158 20098,10133 23223,10158 10142,10137 20099,10159 17874,2323 17875,2323 17876,2323 17873,2394 2254,14827 2263,2291 17883,2320 2269,2303 25417,2271 2272,2350 2273,2303 2279,17887 2280,2250 2288,2283 2293,2329 17877,2323 2296,2295 17884,2324 2305,2268 17878,2323 2311,2303 2312,2243 25604,2323 17879,2323 2333,2303 2336,2335 2340,2277 17880,2323 14828,2385 17886,2256 2351,2350 2356,2369 17885,2284 2464,2301 17881,2323 17888,2344 2367,2259 2372,2350 17889,2393 17882,2323 2378,2258 2389,24559 23386,7218 23450,7230 7152,7233 7153,7218 7154,7179 7155,7241 17737,7185 7156,7230 7157,7223 17738,7230 23482,7252 23401,7240 23490,17742 23363,7179 23493,7249 23393,7240 23407,7215 7164,7241 23372,7241 7165,7230 23406,7215 23424,7230 23434,7230 23449,7230 7166,7191 7167,7220 23460,7230 23376,7191 23483,7252 7170,7240 23425,7230 7172,17744 23409,7215 23355,7179 7173,7230 23431,7230 7174,7240 23451,7230 7176,7171 23475,7229 23413,7230 7177,7171 23388,7218 23362,7179 23479,7233 23369,7223 7180,7179 23484,16026 23404,7228 7181,7240 23365,7179 23358,7179 23421,7230 23411,7215 23410,7215 23396,7240 23466,7210 7183,7228 7184,7240 23443,7230 23446,7230 23361,7179 7188,7243 23397,7240 23453,7230 23381,7218 23470,7220 23353,7160 23438,7230 7192,17742 23447,7230 23370,7179 23437,7230 23429,7230 7195,7228 23360,7179 23366,7179 7196,7215 23430,7230 7198,7231 23441,7230 23415,7230 23357,7179 23491,23178 24558,7240 23476,7229 23468,7212 23416,7230 23458,7230 7199,7215 7200,7220 7203,7230 7204,7226 23480,7233 23408,7215 7205,7201 23383,7220 23474,7229 7206,7230 7207,7230 7208,7230 23489,17740 23442,7230 7214,7230 23403,7240 23422,7230 23390,7218 7217,7230 16024,7218 7219,7179 16025,7240 23572,16026 23444,7230 23464,7185 17739,7240 23389,7218 23382,7218 23385,7218 23423,7230 23440,7230 23448,7230 23375,7191 23461,7230 23478,7231 7221,7230 23387,7218 23467,7211 7224,23492 7225,7218 23356,7179 23481,7245 23418,7230 23368,7223 23417,7230 7227,7241 23428,7230 23488,16026 23465,7190 16027,7230 23420,7230 23469,7213 23456,7230 17741,7230 23487,16026 23436,7230 23445,7230 23433,7230 23477,7231 23359,7179 23414,7230 23378,7191 23439,7230 23454,7230 7232,7241 23462,7230 23419,7230 23472,7220 23427,7230 7234,7179 7235,7240 17743,17742 23426,7230 23391,7240 23392,7240 23373,7241 23455,7230 7236,7218 23354,7171 23402,7240 23573,7240 7238,7223 23471,7220 7239,7230 23384,7218 23435,7230 23400,7240 23399,7240 23394,7240 23485,16026 23486,16026 23371,7241 23379,7218 23380,7218 7242,7230 23395,7240 7244,7191 23405,7228 7246,7233 23367,7223 7247,7241 23432,7230 23457,7230 23473,7226 23412,7215 23364,7179 7248,7241 7250,7211 23377,7191 23459,7230 23374,7191 16353,1218 18710,345 18006,9797 3296,3314 20204,3299 20199,3313 25423,3331 20198,3322 3308,3322 20192,3297 20205,3327 20194,3300 20200,3313 20201,3313 20202,3313 20206,3331 20203,3313 16460,3305 20195,3302 20196,3302 20197,3302 20193,3318 21583,13486 21586,13483 21587,13483 21588,13483 21601,13485 21589,13483 21590,13483 21584,13484 21585,13484 21599,13483 21592,13484 21593,13484 21580,13486 21594,13484 21581,13486 21595,13484 21600,13483 21596,13484 21582,13486 21591,13483 21597,13484 21598,13484 19444,8285 19447,8422 19426,8379 8239,8252 8240,8313 19449,8484 19450,8484 24783,8401 25792,8329 24784,8401 24785,8464 8256,8253 25133,8264 19418,8332 8257,8332 19422,8235 19432,8359 25366,8355 19439,8326 8259,8465 25134,14812 19429,8252 19428,8252 19435,15969 8269,8465 16216,8463 19445,8404 16218,8276 19419,8448 8857,8272 8277,8359 25595,8456 8287,25283 8292,14208 19441,14812 8296,8760 24968,8395 8297,8254 25808,8375 8309,25284 19425,8366 19437,8368 19438,8264 19436,8467 24779,8368 8319,8359 19443,14812 25135,8246 8322,17771 19417,8254 24782,9124 25137,8370 8331,8359 25138,8370 14204,8276 8342,8252 23591,8359 24298,24297 16219,8347 24789,8401 19423,8410 23073,8330 8350,8465 24790,8401 19424,8426 24786,8258 24781,8368 24791,8464 19427,8252 19448,9128 8378,8252 8382,8443 19434,8308 25139,8432 23074,8357 24780,8368 24792,8469 15188,25412 19446,8386 25481,8386 25140,8250 24793,8464 25594,8399 25830,8401 16178,8484 23075,8357 8412,25144 24772,24795 8418,8279 24963,8275 25141,8463 24883,8254 25142,24140 8427,8359 25143,8359 23076,8433 8436,19440 8437,8313 19430,8327 19421,8448 24774,14163 8441,8463 8442,8264 8446,8359 25145,8327 25724,25144 25146,8357 25418,8359 19431,8359 8462,8368 17957,1515 17958,1515 17956,1515 21529,13458 21530,13458 21531,13458 21532,13458 21533,13458 21534,13458 21535,13458 21536,13458 21537,13458 21538,13458 21539,13458 21540,13458 21541,13458 21542,13458 17806,1860 1847,1861 17804,1841 16409,1846 18113,1864 17803,1862 17801,1864 1855,1846 17807,1860 17808,1868 17805,1865 17802,1864 20940,10512 18848,11981 19857,8143 19911,8233 19900,8208 8142,8143 19871,8188 19966,8199 19874,8225 19872,8188 19947,8166 19858,8143 19875,8225 19876,8225 19859,8143 8152,8225 19878,8225 19953,8209 19944,8150 19903,8216 19967,8199 16630,8225 22323,8218 16631,8158 8159,19931 19935,8198 22314,8187 19879,8225 19948,8166 19925,8179 19926,8179 19877,8225 19915,8144 19894,8165 19981,8185 19984,8156 19880,8225 19932,19931 19929,8170 19927,8179 19904,8216 19860,8143 19939,8181 19940,8181 19881,8225 8171,8191 19991,8146 19954,8191 19950,8157 19989,8169 19916,8144 19917,8144 19968,8199 22315,8187 19938,8229 19986,8158 19959,8161 19861,8143 19960,8161 19901,8208 22313,8170 8180,14175 17349,14175 22316,8187 19922,8176 19923,8176 19969,8199 19898,8148 19955,8182 19965,8232 19970,8199 25400,8143 8184,8185 20975,22322 19983,8215 19941,8181 19873,8188 24115,8233 19987,8218 19988,8218 19882,8225 8194,8191 8195,8157 19961,8161 19985,8192 19863,8143 19883,8225 19884,8225 22317,8187 19912,8233 19899,8148 19855,8143 22274,8186 19885,8225 19864,8143 19895,8165 22318,8187 16632,8186 19886,8225 19962,8161 19918,8144 19936,8198 19902,8208 19971,8199 19865,8143 19942,8214 19887,8225 19888,8225 22284,22283 19937,8198 19913,8233 19896,8165 19919,8144 8210,8216 19972,8199 19945,8228 19956,8182 19889,8225 19951,8157 19943,8175 19914,8233 19856,8143 19930,8207 19964,8153 19973,8199 19957,8182 19890,8225 19909,8155 19974,8199 19979,8200 19891,8225 8224,8225 19893,8225 19866,8143 20978,8219 19980,8200 20976,22322 20977,8206 19949,8166 19933,19931 19946,8223 19975,8199 19976,8199 19867,8143 22319,8187 19934,19931 8227,8181 19920,8144 19921,8144 25401,8143 19958,8182 19924,8176 19928,8179 19868,8143 19977,8199 19963,8161 19869,8143 19870,8143 25413,1907 1755,2406 18793,11873 16375,1377 17939,1403 15913,1428 17944,1382 17945,1382 17941,1384 16376,1385 17946,1419 1388,1401 16377,1392 17942,1393 16378,1400 1413,1404 1418,1380 16380,1410 1424,1416 1327,1415 16379,1446 17940,1403 1437,1428 17943,1438 1445,1430 25200,1436 18032,7267 18033,7267 18034,7268 16941,11863 20345,20344 24227,13442 18861,11683 18858,11678 18859,11678 18864,11684 18866,11682 18860,11681 18863,11680 18867,11682 18865,11682 18862,11680 24585,2408 17914,1171 24755,1171 24754,1162 7187,1166 24756,1171 24757,1171 16347,1166 17917,1162 17916,1169 24758,1171 24753,1162 24759,1171 16346,1149 25416,1166 25204,1157 17918,1150 16348,1154 24760,1171 24751,1152 17919,1150 24421,1169 24761,1171 17920,1150 17915,1152 24762,1171 24752,1162 17921,1150 21954,13684 21956,13688 21955,13684 13672,13684 21951,13690 21953,13679 21949,13681 21957,13688 21958,13687 21952,13676 25699,13664 21960,13662 21959,13687 21950,13686 18090,7150 18089,7148 16883,7149 18116,7148 9975,9994 16743,9994 16744,9996 22039,10024 22045,10007 22044,10025 22052,10022 22050,9974 22043,9982 22047,9991 16746,9994 22049,10010 22040,10024 22048,9991 22051,10000 22041,10024 16745,9994 10021,9994 22042,10024 1447,1448 16386,1503 1451,1503 1456,1458 16382,1504 17949,1459 17947,1466 16387,1459 16388,1503 25459,1454 17953,1503 16385,1463 17954,1503 25722,1458 25721,1458 16389,1463 16390,1475 1488,1473 1489,1485 17948,1466 17952,1461 16383,1504 25842,1500 17955,1475 25201,1452 25458,1504 16384,1473 17950,1500 4874,25426 18846,11870 19529,972 9858,9859 24667,24666 19202,12543 24317,12546 25715,15850 16521,4001 18973,10584 25020,10572 18977,10573 18975,10570 18976,10573 10579,10569 17326,10571 18974,10582 16522,4481 4428,25047 16523,4684 4448,4463 17605,4666 4455,25049 4456,25049 4461,4516 4464,4558 4465,14219 17558,4558 4471,24879 17559,4459 16525,4473 4472,4552 17562,4454 17561,4500 17579,4653 17580,4438 4480,4426 16526,4485 17584,25053 4497,4438 17587,4613 17585,4574 17586,4516 16527,4501 17588,4516 17589,4610 4507,4544 17590,4652 4509,4698 4511,4706 4513,4613 17591,4613 17592,4676 25729,4681 17594,4713 17595,4686 17596,4768 17597,4473 17598,4522 4528,4708 16528,4790 17599,4567 4532,4654 4535,4739 16532,4662 17602,4672 4548,4552 17560,4558 17604,4666 16533,4559 25508,16196 17606,4438 4566,4684 17607,4426 4569,4680 17608,4708 17609,4708 17610,4447 17611,4768 16535,25055 17612,4562 4584,4582 4586,4769 4587,4578 17619,4501 16537,4698 4590,17603 4596,4699 17624,4752 4603,4613 16221,4510 17628,4539 17629,4739 17630,4739 4614,4553 4615,4644 17631,4790 16539,4439 16540,4552 17632,4463 4630,17601 4631,4768 17633,4552 4637,4451 24277,4698 25507,25078 24327,4738 17634,4648 4651,25046 17635,4676 17637,4642 4660,4691 17639,4438 25079,25078 16529,4794 17640,4544 17641,4561 16542,4635 16530,4438 16543,4798 17643,4684 4688,4738 16544,4694 17644,4672 17645,4520 16545,4438 17646,4696 16546,4739 16547,4690 17648,17647 17649,4684 4716,16524 17651,16196 4720,25080 16549,4725 4726,25077 17652,4530 4727,14221 16550,4490 4733,4552 4735,4477 17654,4552 17656,4741 16551,4599 17657,4684 4750,4552 16552,4684 4757,4594 16553,4648 4764,4777 16554,4672 4767,4552 4772,14220 4773,25065 17660,4664 16531,4684 16555,24879 17661,4684 17662,4684 17663,4786 16556,4642 17664,4483 17665,4581 4789,25062 4791,4642 17668,4451 16557,4648 17670,4473 17671,4662 4793,4438 25402,10548 17379,17378 16902,10531 18963,10541 10536,10559 18966,10540 18964,10541 18972,10565 18967,10540 18970,10543 18969,10527 10549,10557 18971,10554 25185,10541 18965,10531 25404,10551 16903,10544 25403,10541 10564,17378 18968,10562 16904,10553 16461,3329 16863,5542 18636,18635 17768,11860 25683,9163 19570,9139 9209,9216 16646,9138 15909,9190 9158,25684 16647,9144 8965,9198 15960,9142 16648,9180 17984,9167 17986,9152 8634,9144 25501,9180 9188,9142 17985,9180 17983,9196 25688,9187 16649,9192 820,819 17537,836 824,829 17538,829 24700,839 17539,826 830,833 17540,829 15912,15911 17541,829 17542,836 22139,10099 24216,10124 22138,10076 24214,10059 24215,10076 22137,10046 22140,10099 17872,2232 17871,2236 25605,2236 21676,13536 21672,13537 21671,13537 21675,13535 21668,13533 21670,13532 21669,13533 21673,13537 21674,13537 21677,13536 24711,967 24712,967 24714,970 24709,965 24710,965 24715,970 24713,967 24716,970 24884,970 91,97 92,97 94,97 25516,97 24682,93 96,97 24683,93 24684,95 21823,13587 21801,13605 21824,13587 21806,13582 21816,13601 21829,13587 21825,13587 21802,13605 21804,13591 21805,13591 21807,13582 21808,13582 21809,13582 21820,13578 21827,13587 21830,13587 21817,13601 21810,13582 21811,13582 21821,13586 21813,13623 21831,13587 21832,13587 21838,13596 21833,13587 21828,13587 25701,21826 21834,13587 21835,13587 21818,13601 21795,13602 21814,13623 21812,13623 21822,13578 21819,13578 21796,13602 21836,13587 21798,13602 21799,13602 21803,13605 21837,13587 23062,13582 21800,13602 21797,13602 25708,13587 21815,13623 11527,16222 18802,11529 24393,11529 11533,11552 24394,11529 11536,11548 18803,11529 11539,11529 18798,11571 18797,11571 16916,11530 18804,11529 18805,11529 18799,11532 11546,16222 18806,11529 24397,11529 18807,11529 18800,11569 24396,11529 18808,11529 24395,11529 11560,16222 11561,11529 18801,16222 18809,25759 24399,11529 11573,11567 24398,11529 17791,1635 24377,1631 24374,1629 18634,1626 25833,1628 24376,1631 24379,1650 24375,1631 17735,24378 bauble-0.9.7/bauble/plugins/plants/default/geography.txt0000644000175000017500000025330611210626427022403 0ustar brettbrett"id","name","tdwg_code","iso_code","parent_id" 1,"Europe","1,00",, 2,"Africa","2,00",, 3,"Asia-Temperate","3,00",, 4,"Asia-Tropical","4,00",, 5,"Australasia","5,00",, 6,"Pacific","6,00",, 7,"Northern America","7,00",, 8,"Southern America","8,00",, 9,"Antarctic","9,00",, 10,"Northern Europe","10,00","",1 11,"Middle Europe","11,00","",1 12,"Southwestern Europe","12,00","",1 13,"Southeastern Europe","13,00","",1 14,"Eastern Europe","14,00","",1 15,"Northern Africa","20,00","",2 16,"Macaronesia","21,00","",2 17,"West Tropical Africa","22,00","",2 18,"West-Central Tropical Africa","23,00","",2 19,"Northeast Tropical Africa","24,00","",2 20,"East Tropical Africa","25,00","",2 21,"South Tropical Africa","26,00","",2 22,"Southern Africa","27,00","",2 23,"Middle Atlantic Ocean","28,00","",2 24,"Western Indian Ocean","29,00","",2 25,"Siberia","30,00","",3 26,"Russian Far East","31,00","",3 27,"Middle Asia","32,00","",3 28,"Caucasus","33,00","",3 29,"Western Asia","34,00","",3 30,"Arabian Peninsula","35,00","",3 31,"China","36,00","",3 32,"Mongolia","37,00","",3 33,"Eastern Asia","38,00","",3 34,"Indian Subcontinent","40,00","",4 35,"Indo-China","41,00","",4 36,"Malesia","42,00","",4 37,"Papuasia","43,00","",4 38,"Australia","50,00","",5 39,"New Zealand","51,00","",5 40,"Southwestern Pacific","60,00","",6 41,"South-Central Pacific","61,00","",6 42,"Northwestern Pacific","62,00","",6 43,"North-Central Pacific","63,00","",6 44,"Subarctic America","70,00","",7 45,"Western Canada","71,00","",7 46,"Eastern Canada","72,00","",7 47,"Northwestern U.S.A.","73,00","",7 48,"North-Central U.S.A.","74,00","",7 49,"Northeastern U.S.A.","75,00","",7 50,"Southwestern U.S.A.","76,00","",7 51,"South-Central U.S.A.","77,00","",7 52,"Southeastern U.S.A.","78,00","",7 53,"Mexico","79,00","",7 54,"Central America","80,00","",8 55,"Caribbean","81,00","",8 56,"Northern South America","82,00","",8 57,"Western South America","83,00","",8 58,"Brazil","84,00","",8 59,"Southern South America","85,00","",8 60,"Subantarctic Islands","90,00","",9 61,"Antarctic Continent","91,00","",9 62,"Alberta","ABT","CA",45 63,"Afghanistan","AFG","AF",29 64,"Argentina Northeast","AGE","AR",59 65,"Argentina South","AGS","AR",59 66,"Argentina Northwest","AGW","AR",59 67,"Alabama","ALA","US",52 68,"Albania","ALB","AL",13 69,"Aldabra","ALD","SC",24 70,"Algeria","ALG","DZ",15 71,"Altay","ALT","RU",25 72,"Aleutian Is.","ALU","US",44 73,"Amur","AMU","RU",26 74,"Andaman Is.","AND","",35 75,"Angola","ANG","AO",21 76,"Antarctica","ANT","AQ",61 77,"Arizona","ARI","US",50 78,"Arkansas","ARK","US",52 79,"Aruba","ARU","AW",55 80,"Ascension","ASC","SH",23 81,"Alaska","ASK","US",44 82,"Amsterdam-St.Paul Is.","ASP","TF",60 83,"Assam","ASS","IN",34 84,"Antipodean Is.","ATP","NZ",39 85,"Austria","AUT","",11 86,"Azores","AZO","PT",16 87,"Bahamas","BAH","BS",55 88,"Baleares","BAL","ES",12 89,"Bangladesh","BAN","BD",34 90,"Benin","BEN","BJ",17 91,"Bermuda","BER","BM",55 92,"Belgium","BGM","",11 93,"Bismarck Archipelago","BIS","PG",37 94,"Burkina","BKN","BF",17 95,"Belarus","BLR","RU",14 96,"Baltic States","BLT","",14 97,"Belize","BLZ","BZ",54 98,"Bolivia","BOL","BO",57 99,"Borneo","BOR","",36 100,"Botswana","BOT","BW",22 101,"Bouvet I.","BOU","BV",60 102,"British Columbia","BRC","CA",45 103,"Buryatiya","BRY","RU",25 104,"Bulgaria","BUL","BG",13 105,"Burundi","BUR","BI",18 106,"Brazil West-Central","BZC","BR",58 107,"Brazil Northeast","BZE","BR",58 108,"Brazil Southeast","BZL","BR",58 109,"Brazil North","BZN","BR",58 110,"Brazil South","BZS","BR",58 111,"Cabinda","CAB","AO",18 112,"Central African Republic","CAF","CF",18 113,"California","CAL","US",50 114,"Cayman Is.","CAY","KY",55 115,"Cambodia","CBD","KH",35 116,"Chagos Archipelago","CGS","IO",24 117,"Chad","CHA","TD",19 118,"China South-Central","CHC","CN",31 119,"Hainan","CHH","CN",31 120,"Inner Mongolia","CHI","CN",31 121,"Manchuria","CHM","CN",31 122,"China North-Central","CHN","CN",31 123,"Qinghai","CHQ","CN",31 124,"China Southeast","CHS","",31 125,"Tibet","CHT","CN",31 126,"Xinjiang","CHX","CN",31 127,"Cocos (Keeling) Is.","CKI","CC",36 128,"Chile Central","CLC","CL",59 129,"Colombia","CLM","CO",57 130,"Chile North","CLN","CL",59 131,"Chile South","CLS","CL",59 132,"Cameroon","CMN","CM",18 133,"Connecticut","CNT","US",49 134,"Canary Is.","CNY","ES",16 135,"Colorado","COL","US",47 136,"Comoros","COM","",24 137,"Congo","CON","CG",18 138,"Cook Is.","COO","CK",41 139,"Corse","COR","FR",12 140,"Costa Rica","COS","CR",54 141,"Central American Pacific Is.","CPI","",54 142,"Cape Provinces","CPP","ZA",22 143,"Caprivi Strip","CPV","NA",22 144,"Caroline Is.","CRL","",42 145,"Crozet Is.","CRZ","TF",60 146,"Chita","CTA","RU",25 147,"Chatham Is.","CTM","NZ",39 148,"Cuba","CUB","CU",55 149,"Cape Verde","CVI","CV",16 150,"Cyprus","CYP","CY",29 151,"Czechoslovakia","CZE","CS",11 152,"Delaware","DEL","US",52 153,"Denmark","DEN","DK",10 154,"Djibouti","DJI","DJ",19 155,"Dominican Republic","DOM","DO",55 156,"Desventurados Is.","DSV","CL",59 157,"East Aegean Is.","EAI","GR",29 158,"Easter Is.","EAS","CL",41 159,"Ecuador","ECU","EC",57 160,"Egypt","EGY","EG",15 161,"East Himalaya","EHM","",34 162,"El Salvador","ELS","SV",54 163,"Equatorial Guinea","EQG","GQ",18 164,"Eritrea","ERI","ER",19 165,"Ethiopia","ETH","ET",19 166,"Falkland Is.","FAL","FK",60 167,"Fiji","FIJ","FJ",40 168,"Finland","FIN","FI",10 169,"Florida","FLA","US",52 170,"Føroyar","FOR","FO",10 171,"France","FRA","",12 172,"French Guiana","FRG","GF",56 173,"Gabon","GAB","GA",18 174,"Galápagos","GAL","EC",57 175,"Gambia, The","GAM","GM",17 176,"Georgia","GEO","US",52 177,"Germany","GER","DE",11 178,"Gulf of Guinea Is.","GGI","",18 179,"Ghana","GHA","GH",17 180,"Gilbert Is.","GIL","KI",40 181,"Guinea-Bissau","GNB","GW",17 182,"Greenland","GNL","GL",44 183,"Great Britain","GRB","UK",10 184,"Greece","GRC","GR",13 185,"Gulf States","GST","",30 186,"Guatemala","GUA","GT",54 187,"Guinea","GUI","GN",17 188,"Guyana","GUY","GY",56 189,"Haiti","HAI","",55 190,"Hawaii","HAW","",43 191,"Howland-Baker Is.","HBI","UM",40 192,"Heard-McDonald Is.","HMD","HM",60 193,"Honduras","HON","HN",54 194,"Hungary","HUN","HU",11 195,"Iceland","ICE","IS",10 196,"Idaho","IDA","US",47 197,"Illinois","ILL","US",48 198,"India","IND","IN",34 199,"Indiana","INI","US",49 200,"Iowa","IOW","US",48 201,"Ireland","IRE","",10 202,"Irkutsk","IRK","RU",25 203,"Iran","IRN","IR",29 204,"Iraq","IRQ","IQ",29 205,"Italy","ITA","",13 206,"Ivory Coast","IVO","CI",17 207,"Jamaica","JAM","JM",55 208,"Japan","JAP","JP",33 209,"Jawa","JAW","ID",36 210,"Juan Fernández Is.","JNF","CL",59 211,"Kamchatka","KAM","RU",26 212,"Kansas","KAN","US",48 213,"Kazakhstan","KAZ","KZ",27 214,"Kerguelen","KEG","TF",60 215,"Kenya","KEN","KE",20 216,"Kermadec Is.","KER","NZ",39 217,"Kirgizistan","KGZ","KG",27 218,"Khabarovsk","KHA","RU",26 219,"Korea","KOR","",33 220,"Krasnoyarsk","KRA","RU",25 221,"Kriti","KRI","GR",13 222,"Krym","KRY","UA",14 223,"Kentucky","KTY","US",52 224,"Kuril Is.","KUR","RU",26 225,"Kuwait","KUW","KW",30 226,"Kazan-retto","KZN","JP",33 227,"Labrador","LAB","CA",46 228,"Laos","LAO","LA",35 229,"Liberia","LBR","LR",17 230,"Lebanon-Syria","LBS","",29 231,"Libya","LBY","LY",15 232,"Laccadive Is.","LDV","IN",34 233,"Leeward Is.","LEE","",55 234,"Lesotho","LES","LS",22 235,"Line Is.","LIN","",41 236,"Louisiana","LOU","US",52 237,"Lesser Sunda Is.","LSI","",36 238,"Magadan","MAG","RU",26 239,"Maine","MAI","US",49 240,"Manitoba","MAN","CA",45 241,"Macquarie Is.","MAQ","AU",60 242,"Masachusettes","MAS","US",49 243,"Mauritius","MAU","MU",24 244,"Mozambique Channel Is.","MCI","RE",24 245,"Marcus I.","MCS","JP",42 246,"Madagascar","MDG","MG",24 247,"Madeira","MDR","PT",16 248,"Maldives","MDV","MV",34 249,"Michigan","MIC","US",49 250,"Minnesota","MIN","US",48 251,"Mali","MLI","ML",17 252,"Malawi","MLW","MW",21 253,"Malaya","MLY","",36 254,"Montana","MNT","US",47 255,"Maluku","MOL","ID",36 256,"Mongolia","MON","MN",32 257,"Morocco","MOR","",15 258,"Mozambique","MOZ","MZ",21 259,"Marion-Prince Edward Is.","MPE","ZA",60 260,"Marianas","MRN","",42 261,"Marquesas","MRQ","PF",41 262,"Marshall Is.","MRS","MH",42 263,"Maryland","MRY","US",52 264,"Mississippi","MSI","US",52 265,"Missouri","MSO","US",48 266,"Mauritania","MTN","MR",17 267,"Mexico Central","MXC","MX",53 268,"Mexico Northeast","MXE","MX",53 269,"Mexico Gulf","MXG","MX",53 270,"Mexican Pacific Is.","MXI","MX",53 271,"Mexico Northwest","MXN","MX",53 272,"Mexico Southwest","MXS","MX",53 273,"Mexico Southeast","MXT","MX",53 274,"Myanmar","MYA","MM",35 275,"Namibia","NAM","ZA",22 276,"KwaZulu-Natal","NAT","ZA",22 277,"New Brunswick","NBR","CA",46 278,"North Carolina","NCA","US",52 279,"Nicobar Is.","NCB","IN",35 280,"North Caucasus","NCS","RU",28 281,"North Dakota","NDA","US",48 282,"Nebraska","NEB","US",48 283,"Nepal","NEP","NP",34 284,"Netherlands","NET","NL",11 285,"Nevada","NEV","US",50 286,"Norfolk Is.","NFK","",38 287,"Newfoundland","NFL","",46 288,"Nigeria","NGA","NG",17 289,"Niger","NGR","NE",17 290,"Nicaragua","NIC","NI",54 291,"Netherlands Antilles","NLA","AN",55 292,"Nansei-shoto","NNS","JP",33 293,"Norway","NOR","NO",10 294,"Nauru","NRU","NR",40 295,"Nova Scotia","NSC","CA",46 296,"New South Wales","NSW","AU",38 297,"Northern Territory","NTA","AU",38 298,"Niue","NUE","NU",40 299,"Nunavut","NUN","CA",44 300,"New Caledonia","NWC","NC",40 301,"New Guinea","NWG","",37 302,"New Hampshire","NWH","US",49 303,"New Jersey","NWJ","US",49 304,"New Mexico","NWM","US",51 305,"Northwest Territories","NWT","CA",44 306,"New York","NWY","US",49 307,"New Zealand North","NZN","NZ",39 308,"New Zealand South","NZS","NZ",39 309,"Free State","OFS","ZA",22 310,"Ogasawara-shoto","OGA","JP",33 311,"Ohio","OHI","US",49 312,"Oklahoma","OKL","US",48 313,"Oman","OMA","OM",30 314,"Ontario","ONT","CA",46 315,"Oregon","ORE","US",47 316,"Pakistan","PAK","PK",34 317,"Palestine","PAL","",29 318,"Panamá","PAN","PA",54 319,"Paraguay","PAR","PY",59 320,"Prince Edward I.","PEI","CA",46 321,"Pennsylvania","PEN","US",49 322,"Peru","PER","PE",57 323,"Philippines","PHI","PH",36 324,"Phoenix Is.","PHX","KI",40 325,"Pitcairn Is.","PIT","PN",41 326,"Poland","POL","PL",11 327,"Portugal","POR","PT",12 328,"Primorye","PRM","RU",26 329,"Puerto Rico","PUE","PR",55 330,"Queensland","QLD","AU",38 331,"Québec","QUE","CA",46 332,"Réunion","REU","RE",24 333,"Rhode I.","RHO","US",49 334,"Rodrigues","ROD","MU",24 335,"Romania","ROM","RO",13 336,"Central European Russia","RUC","RU",14 337,"East European Russia","RUE","RU",14 338,"North European Russia","RUN","RU",14 339,"South European Russia","RUS","",14 340,"Northwest European Russia","RUW","RU",14 341,"Rwanda","RWA","RW",18 342,"Sakhalin","SAK","RU",26 343,"Samoa","SAM","",40 344,"Sardegna","SAR","IT",12 345,"Saskatchewan","SAS","CA",45 346,"Saudi Arabia","SAU","SA",30 347,"South Carolina","SCA","US",52 348,"Society Is.","SCI","PF",41 349,"South China Sea","SCS","",35 350,"Santa Cruz Is.","SCZ","SB",40 351,"South Dakota","SDA","US",48 352,"Selvagens","SEL","PT",16 353,"Senegal","SEN","SN",17 354,"Seychelles","SEY","SC",24 355,"South Georgia","SGE","GS",60 356,"Sicilia","SIC","",13 357,"Sierra Leone","SIE","SL",17 358,"Sinai","SIN","EG",29 359,"South Australia","SOA","AU",38 360,"Socotra","SOC","YE",19 361,"Solomon Is.","SOL","",37 362,"Somalia","SOM","SO",19 363,"Spain","SPA","",12 364,"Sri Lanka","SRL","LK",34 365,"South Sandwich Is.","SSA","GS",60 366,"St.Helena","STH","SH",23 367,"Sudan","SUD","SD",19 368,"Sulawesi","SUL","ID",36 369,"Sumatera","SUM","ID",36 370,"Suriname","SUR","SR",56 371,"Svalbard","SVA","SJ",10 372,"Southwest Caribbean","SWC","",55 373,"Sweden","SWE","SE",10 374,"Switzerland","SWI","CH",11 375,"Swaziland","SWZ","SZ",22 376,"Taiwan","TAI","TW",33 377,"Tanzania","TAN","TZ",20 378,"Tasmania","TAS","AU",38 379,"Turks-Caicos Is.","TCI","TC",55 380,"Transcaucasus","TCS","",28 381,"Tristan da Cunha","TDC","SH",60 382,"Tennessee","TEN","US",52 383,"Texas","TEX","US",51 384,"Thailand","THA","TH",35 385,"Turkmenistan","TKM","TM",27 386,"Togo","TOG","TG",17 387,"Tokelau-Manihiki","TOK","",40 388,"Tonga","TON","TO",40 389,"Trinidad-Tobago","TRT","TT",55 390,"Tuamotu","TUA","PF",41 391,"Tubuai Is.","TUB","PF",41 392,"Turkey-in-Europe","TUE","TR",13 393,"Tunisia","TUN","TN",15 394,"Turkey","TUR","TR",29 395,"Tuvalu","TUV","TV",40 396,"Tuva","TVA","RU",25 397,"Northern Provinces","TVL","ZA",22 398,"Tadzhikistan","TZK","TJ",27 399,"Uganda","UGA","UG",20 400,"Ukraine","UKR","",14 401,"Uruguay","URU","UY",59 402,"Utah","UTA","US",50 403,"Uzbekistan","UZB","UZ",27 404,"Vanuatu","VAN","VU",40 405,"Venezuela","VEN","VE",56 406,"Vermont","VER","US",49 407,"Victoria","VIC","AU",38 408,"Vietnam","VIE","VN",35 409,"Venezuelan Antilles","VNA","VE",55 410,"Virginia","VRG","US",52 411,"Wake I.","WAK","UM",42 412,"Wallis-Futuna Is.","WAL","WF",40 413,"Washington","WAS","US",47 414,"Western Australia","WAU","AU",38 415,"District of Columbia","WDC","US",52 416,"West Himalaya","WHM","",34 417,"Windward Is.","WIN","",55 418,"Wisconsin","WIS","US",48 419,"Western Sahara","WSA","EH",15 420,"West Siberia","WSB","RU",25 421,"West Virginia","WVA","US",49 422,"Wyoming","WYO","US",47 423,"Christmas I.","XMS","CX",36 424,"Yakutskiya","YAK","RU",25 425,"Yemen","YEM","YE",30 426,"Yugoslavia","YUG","YU",13 427,"Yukon","YUK","CA",44 428,"Zaire","ZAI","CD",18 429,"Zambia","ZAM","ZM",21 430,"Zimbabwe","ZIM","ZW",21 431,"Alberta","ABT-OO","CA",62 432,"Afghanistan","AFG-OO","AF",63 433,"Buenos Aires","AGE-BA","AR",64 434,"Chaco","AGE-CH","AR",64 435,"Corrientes","AGE-CN","AR",64 436,"Córdoba","AGE-CO","AR",64 437,"Argentina Distrito Federal","AGE-DF","AR",64 438,"Entre Ríos","AGE-ER","AR",64 439,"Formosa","AGE-FO","AR",64 440,"La Pampa","AGE-LP","AR",64 441,"Misiones","AGE-MI","AR",64 442,"Chubut","AGS-CB","AR",65 443,"Neuquén","AGS-NE","AR",65 444,"Rio Negro","AGS-RN","AR",65 445,"Santa Cruz","AGS-SC","AR",65 446,"Santa Fé","AGS-SF","AR",65 447,"Tierra del Fuego (Argentina)","AGS-TF","AR",65 448,"Catamarca","AGW-CA","AR",66 449,"Jujuy","AGW-JU","AR",66 450,"La Rioja","AGW-LR","AR",66 451,"Mendoza","AGW-ME","AR",66 452,"Salta","AGW-SA","AR",66 453,"Santiago del Estero","AGW-SE","AR",66 454,"San Juan","AGW-SJ","AR",66 455,"San Luis","AGW-SL","AR",66 456,"Tucuman","AGW-TU","AR",66 457,"Alabama","ALA-OO","US",67 458,"Albania","ALB-OO","AL",68 459,"Aldabra","ALD-OO","SC",69 460,"Algeria","ALG-OO","DZ",70 461,"Altay","ALT-OO","RU",71 462,"Aleutian Is.","ALU-OO","US",72 463,"Amur","AMU-OO","RU",73 464,"Andaman Is.","AND-AN","IN",74 465,"Coco Is.","AND-CO","BU",74 466,"Angola","ANG-OO","AO",75 467,"Antarctica","ANT-OO","AQ",76 468,"Arizona","ARI-OO","US",77 469,"Arkansas","ARK-OO","US",78 470,"Aruba","ARU-OO","AW",79 471,"Ascension","ASC-OO","SH",80 472,"Alaska","ASK-OO","US",81 473,"Amsterdam-St.Paul Is.","ASP-OO","TF",82 474,"Assam","ASS-AS","IN",83 475,"Manipur","ASS-MA","IN",83 476,"Meghalaya","ASS-ME","IN",83 477,"Mizoram","ASS-MI","IN",83 478,"Nagaland","ASS-NA","IN",83 479,"Tripura","ASS-TR","IN",83 480,"Antipodean Is.","ATP-OO","NZ",84 481,"Austria","AUT-AU","AT",85 482,"Liechtenstein","AUT-LI","LI",85 483,"Açôres","AZO-OO","PT",86 484,"Bahamas","BAH-OO","BS",87 485,"Baleares","BAL-OO","ES",88 486,"Bangladesh","BAN-OO","BD",89 487,"Benin","BEN-OO","BJ",90 488,"Bermuda","BER-OO","BM",91 489,"Belgium","BGM-BE","BE",92 490,"Luxembourg","BGM-LU","LU",92 491,"Bismarck Archipelago","BIS-OO","PG",93 492,"Burkina","BKN-OO","BF",94 493,"Belarus","BLR-OO","RU",95 494,"Estonia","BLT-ES","EE",96 495,"Kaliningrad","BLT-KA","RU",96 496,"Latvia","BLT-LA","RU",96 497,"Lithuania","BLT-LI","LT",96 498,"Belize","BLZ-OO","BZ",97 499,"Bolivia","BOL-OO","BO",98 500,"Brunei","BOR-BR","BN",99 501,"Kalimantan","BOR-KA","ID",99 502,"Sabah","BOR-SB","MY",99 503,"Sarawak","BOR-SR","MY",99 504,"Botswana","BOT-OO","BW",100 505,"Bouvet I.","BOU-OO","BV",101 506,"British Columbia","BRC-OO","CA",102 507,"Buryatiya","BRY-OO","RU",103 508,"Bulgaria","BUL-OO","BG",104 509,"Burundi","BUR-OO","BI",105 510,"Brazilia Distrito Federal","BZC-DF","BR",106 511,"Goiás","BZC-GO","BR",106 512,"Mato Grosso do Sul","BZC-MS","BR",106 513,"Mato Grosso","BZC-MT","BR",106 514,"Alagoas","BZE-AL","BR",107 515,"Bahia","BZE-BA","BR",107 516,"Ceará","BZE-CE","BR",107 517,"Fernando de Noronha","BZE-FN","BR",107 518,"Maranhao","BZE-MA","BR",107 519,"Paraíba","BZE-PB","BR",107 520,"Pernambuco","BZE-PE","BR",107 521,"Piauí","BZE-PI","BR",107 522,"Rio Grande do Norte","BZE-RN","BR",107 523,"Sergipe","BZE-SE","BR",107 524,"Espirito Santo","BZL-ES","BR",108 525,"Minas Gerais","BZL-MG","BR",108 526,"Rio de Janeiro","BZL-RJ","BR",108 527,"São Paulo","BZL-SP","BR",108 528,"Trindade","BZL-TR","BR",108 529,"Acre","BZN-AC","BR",109 530,"Amazonas","BZN-AM","BR",109 531,"Amapá","BZN-AP","BR",109 532,"Pará","BZN-PA","BR",109 533,"Roraima","BZN-RM","BR",109 534,"Rondônia","BZN-RO","BR",109 535,"Tocantins","BZN-TO","BR",109 536,"Paraná","BZS-PR","BR",110 537,"Rio Grande do Sul","BZS-RS","BR",110 538,"Santa Catarina","BZS-SC","BR",110 539,"Cabinda","CAB-OO","AO",111 540,"Central African Republic","CAF-OO","CF",112 541,"California","CAL-OO","US",113 542,"Cayman Is.","CAY-OO","KY",114 543,"Cambodia","CBD-OO","KH",115 544,"Chagos Archipelago","CGS-OO","IO",116 545,"Chad","CHA-OO","TD",117 546,"Guizhou","CHC-GZ","CN",118 547,"Hubei","CHC-HU","CN",118 548,"Sichuan","CHC-SC","CN",118 549,"Yunnan","CHC-YN","CN",118 550,"Hainan","CHH-OO","CN",119 551,"Nei Mongol","CHI-NM","CN",120 552,"Ningxia","CHI-NX","CN",120 553,"Heilongjiang","CHM-HJ","CN",121 554,"Jilin","CHM-JL","CN",121 555,"Liaoning","CHM-LN","CN",121 556,"Beijing","CHN-BJ","CN",122 557,"Gansu","CHN-GS","CN",122 558,"Hebei","CHN-HB","CN",122 559,"Shaanxi","CHN-SA","CN",122 560,"Shandong","CHN-SD","CN",122 561,"Shanxi","CHN-SX","CN",122 562,"Tianjin","CHN-TJ","CN",122 563,"Qinghai","CHQ-OO","CN",123 564,"Anhui","CHS-AH","CN",124 565,"Fujian","CHS-FJ","CN",124 566,"Guangdong","CHS-GD","CN",124 567,"Guangxi","CHS-GX","CN",124 568,"Henan","CHS-HE","CN",124 569,"Hong Kong","CHS-HK","HK",124 570,"Hunan","CHS-HN","CN",124 571,"Jiangsu","CHS-JS","CN",124 572,"Jiangxi","CHS-JX","CN",124 573,"Kin-Men","CHS-KI","TW",124 574,"Macau","CHS-MA","MO",124 575,"Ma-tsu-Pai-chúan","CHS-MP","TW",124 576,"Shanghai","CHS-SH","CN",124 577,"Zhejiang","CHS-ZJ","CN",124 578,"Tibet","CHT-OO","CN",125 579,"Xinjiang","CHX-OO","CN",126 580,"Cocos (Keeling) Is.","CKI-OO","CC",127 581,"Biobío","CLC-BI","CL",128 582,"Coquimbo","CLC-CO","CL",128 583,"La Araucania","CLC-LA","CL",128 584,"Maule","CLC-MA","CL",128 585,"O'Higgins","CLC-OH","CL",128 586,"Santiago","CLC-SA","CL",128 587,"Valparaíso","CLC-VA","CL",128 588,"Colombia","CLM-OO","CO",129 589,"Antofagasta","CLN-AN","CL",130 590,"Atacama","CLN-AT","CL",130 591,"Tarapaca","CLN-TA","CL",130 592,"Aisén","CLS-AI","CL",131 593,"Los Lagos","CLS-LL","CL",131 594,"Magellanes","CLS-MG","CL",131 595,"Cameroon","CMN-OO","CM",132 596,"Connecticut","CNT-OO","US",133 597,"Canary Is.","CNY-OO","ES",134 598,"Colorado","COL-OO","US",135 599,"Comoros","COM-CO","KM",136 600,"Mayotte","COM-MA","YT",136 601,"Congo","CON-OO","CG",137 602,"Cook Is.","COO-OO","CK",138 603,"Corse","COR-OO","FR",139 604,"Costa Rica","COS-OO","CR",140 605,"Clipperton I.","CPI-CL","PF",141 606,"Cocos I.","CPI-CO","CR",141 607,"Malpelo I.","CPI-MA","CO",141 608,"Eastern Cape Province","CPP-EC","ZA",142 609,"Northern Cape Province","CPP-NC","ZA",142 610,"Western Cape Province","CPP-WC","ZA",142 611,"Caprivi Strip","CPV-OO","NA",143 612,"Micronesia Federated States","CRL-MF","FM",144 613,"Palau","CRL-PA","PW",144 614,"Crozet Is.","CRZ-OO","TF",145 615,"Chita","CTA-OO","RU",146 616,"Chatham Is.","CTM-OO","NZ",147 617,"Cuba","CUB-OO","CU",148 618,"Cape Verde","CVI-OO","CV",149 619,"Cyprus","CYP-OO","CY",150 620,"Czech Republic","CZE-CZ","SK",151 621,"Slovakia","CZE-SK","CZ",151 622,"Delaware","DEL-OO","US",152 623,"Denmark","DEN-OO","DK",153 624,"Djibouti","DJI-OO","DJ",154 625,"Dominican Republic","DOM-OO","DO",155 626,"Desventurados Is.","DSV-OO","CL",156 627,"East Aegean Is.","EAI-OO","GR",157 628,"Easter Is.","EAS-OO","CL",158 629,"Ecuador","ECU-OO","EC",159 630,"Egypt","EGY-OO","EG",160 631,"Arunachal Pradesh","EHM-AP","IN",161 632,"Bhutan","EHM-BH","BT",161 633,"Darjiling","EHM-DJ","IN",161 634,"Sikkim","EHM-SI","IN",161 635,"El Salvador","ELS-OO","SV",162 636,"Equatorial Guinea","EQG-OO","GQ",163 637,"Eritrea","ERI-OO","ER",164 638,"Ethiopia","ETH-OO","ET",165 639,"Falkland Is.","FAL-OO","FK",166 640,"Fiji","FIJ-OO","FJ",167 641,"Finland","FIN-OO","FI",168 642,"Florida","FLA-OO","US",169 643,"Føroyar","FOR-OO","FO",170 644,"Channel Is.","FRA-CI","UK",171 645,"France","FRA-FR","FR",171 646,"Monaco","FRA-MO","MC",171 647,"French Guiana","FRG-OO","GF",172 648,"Gabon","GAB-OO","GA",173 649,"Galápagos","GAL-OO","EC",174 650,"Gambia, The","GAM-OO","GM",175 651,"Georgia","GEO-OO","US",176 652,"Germany","GER-OO","DE",177 653,"Annobón","GGI-AN","GQ",178 654,"Bioko","GGI-BI","GQ",178 655,"Principe","GGI-PR","ST",178 656,"São Tomé","GGI-ST","ST",178 657,"Ghana","GHA-OO","GH",179 658,"Gilbert Is.","GIL-OO","KI",180 659,"Guinea-Bissau","GNB-OO","GW",181 660,"Greenland","GNL-OO","GL",182 661,"Great Britain","GRB-OO","UK",183 662,"Greece","GRC-OO","GR",184 663,"Bahrain","GST-BA","BH",185 664,"Qatar","GST-QA","QA",185 665,"United Arab Emirates","GST-UA","AE",185 666,"Guatemala","GUA-OO","GT",186 667,"Guinea","GUI-OO","GN",187 668,"Guyana","GUY-OO","GY",188 669,"Haiti","HAI-HA","HT",189 670,"Navassa I.","HAI-NI","PR",189 671,"Hawaiian Is.","HAW-HI","US",190 672,"Johnston I.","HAW-JI","UM",190 673,"Midway Is.","HAW-MI","UM",190 674,"Howland-Baker Is.","HBI-OO","UM",191 675,"Heard-McDonald Is.","HMD-OO","HM",192 676,"Honduras","HON-OO","HN",193 677,"Hungary","HUN-OO","HU",194 678,"Iceland","ICE-OO","IS",195 679,"Idaho","IDA-OO","US",196 680,"Illinois","ILL-OO","US",197 681,"Andhra Pradesh","IND-AP","IN",198 682,"Bihar","IND-BI","IN",198 683,"Chandigarh","IND-CH","IN",198 684,"Dadra-Nagar-Haveli","IND-DD","IN",198 685,"Delhi","IND-DE","IN",198 686,"Diu","IND-DI","IN",198 687,"Daman","IND-DM","IN",198 688,"Goa","IND-GO","IN",198 689,"Gujarat","IND-GU","IN",198 690,"Haryana","IND-HA","IN",198 691,"Kerala","IND-KE","IN",198 692,"Karaikal","IND-KL","IN",198 693,"Karnataka","IND-KT","IN",198 694,"Mahé","IND-MH","IN",198 695,"Madhya Pradesh","IND-MP","IN",198 696,"Maharashtra","IND-MR","IN",198 697,"Orissa","IND-OR","IN",198 698,"Pondicherry","IND-PO","IN",198 699,"Punjab","IND-PU","IN",198 700,"Rajasthan","IND-RA","IN",198 701,"Tamil Nadu","IND-TN","IN",198 702,"Uttar Pradesh","IND-UP","IN",198 703,"West Bengal","IND-WB","IN",198 704,"Yanam","IND-YA","IN",198 705,"Indiana","INI-OO","US",199 706,"Iowa","IOW-OO","US",200 707,"Ireland","IRE-IR","IE",201 708,"Northern Ireland","IRE-NI","UK",201 709,"Irkutsk","IRK-OO","RU",202 710,"Iran","IRN-OO","IR",203 711,"Iraq","IRQ-OO","IQ",204 712,"Italy","ITA-IT","IT",205 713,"San Marino","ITA-SM","SM",205 714,"Vatican City","ITA-VC","VA",205 715,"Ivory Coast","IVO-OO","CI",206 716,"Jamaica","JAM-OO","JM",207 717,"Hokkaido","JAP-HK","JP",208 718,"Honshu","JAP-HN","JP",208 719,"Kyushu","JAP-KY","JP",208 720,"Shikoku","JAP-SH","JP",208 721,"Jawa","JAW-OO","ID",209 722,"Juan Fernández Is.","JNF-OO","CL",210 723,"Kamchatka","KAM-OO","RU",211 724,"Kansas","KAN-OO","US",212 725,"Kazakhstan","KAZ-OO","KZ",213 726,"Kerguelen","KEG-OO","TF",214 727,"Kenya","KEN-OO","KE",215 728,"Kermadec Is.","KER-OO","NZ",216 729,"Kirgizistan","KGZ-OO","KG",217 730,"Khabarovsk","KHA-OO","RU",218 731,"North Korea","KOR-NK","KP",219 732,"South Korea","KOR-SK","KR",219 733,"Krasnoyarsk","KRA-OO","RU",220 734,"Kriti","KRI-OO","GR",221 735,"Krym","KRY-OO","UA",222 736,"Kentucky","KTY-OO","US",223 737,"Kuril Is.","KUR-OO","RU",224 738,"Kuwait","KUW-OO","KW",225 739,"Kazan-retto","KZN-OO","JP",226 740,"Labrador","LAB-OO","CA",227 741,"Laos","LAO-OO","LA",228 742,"Liberia","LBR-OO","LR",229 743,"Lebanon","LBS-LB","LB",230 744,"Syria","LBS-SY","SY",230 745,"Libya","LBY-OO","LY",231 746,"Laccadive Is.","LDV-OO","IN",232 747,"Antigua-Barbuda","LEE-AB","AG",233 748,"Anguilla","LEE-AG","AI",233 749,"Aves I.","LEE-AV","VE",233 750,"British Virgin Is.","LEE-BV","VG",233 751,"Guadeloupe","LEE-GU","GP",233 752,"Montserrat","LEE-MO","MS",233 753,"Netherlands Leeward Is.","LEE-NL","AN",233 754,"St.Kitts-Nevis","LEE-SK","KN",233 755,"St.Martin-St.Barthélémy","LEE-SM","GP",233 756,"Virgin Is.","LEE-VI","VI",233 757,"Lesotho","LES-OO","LS",234 758,"Kiribati Line Is.","LIN-KI","KI",235 759,"U.S. Line Is.","LIN-US","UM",235 760,"Louisiana","LOU-OO","US",236 761,"Bali","LSI-BA","ID",237 762,"East Timor","LSI-ET","TP",237 763,"Lesser Sunda Is.","LSI-LS","ID",237 764,"Magadan","MAG-OO","RU",238 765,"Maine","MAI-OO","US",239 766,"Manitoba","MAN-OO","CA",240 767,"Macquarie Is.","MAQ-OO","AU",241 768,"Masachusettes","MAS-OO","US",242 769,"Mauritius","MAU-OO","MU",243 770,"Mozambique Channel Is.","MCI-OO","RE",244 771,"Marcus I.","MCS-OO","JP",245 772,"Madagascar","MDG-OO","MG",246 773,"Madeira","MDR-OO","PT",247 774,"Maldives","MDV-OO","MV",248 775,"Michigan","MIC-OO","US",249 776,"Minnesota","MIN-OO","US",250 777,"Mali","MLI-OO","ML",251 778,"Malawi","MLW-OO","MW",252 779,"Peninsular Malaysia","MLY-PM","MY",253 780,"Singapore","MLY-SI","SG",253 781,"Montana","MNT-OO","US",254 782,"Maluku","MOL-OO","ID",255 783,"Mongolia","MON-OO","MN",256 784,"Morocco","MOR-MO","MA",257 785,"Spanish North African Territories","MOR-SP","ES",257 786,"Mozambique","MOZ-OO","MZ",258 787,"Marion-Prince Edward Is.","MPE-OO","ZA",259 788,"Guam","MRN-GU","GU",260 789,"Northern Marianas","MRN-NM","MP",260 790,"Marquesas","MRQ-OO","PF",261 791,"Marshall Is.","MRS-OO","MH",262 792,"Maryland","MRY-OO","US",263 793,"Mississippi","MSI-OO","US",264 794,"Missouri","MSO-OO","US",265 795,"Mauritania","MTN-OO","MR",266 796,"Mexico Distrito Federal","MXC-DF","MX",267 797,"México State","MXC-ME","MX",267 798,"Morelos","MXC-MO","MX",267 799,"Puebla","MXC-PU","MX",267 800,"Tlaxcala","MXC-TL","MX",267 801,"Aguascalientes","MXE-AG","MX",268 802,"Coahuila","MXE-CO","MX",268 803,"Chihuahua","MXE-CU","MX",268 804,"Durango","MXE-DU","MX",268 805,"Guanajuato","MXE-GU","MX",268 806,"Hidalgo","MXE-HI","MX",268 807,"Nuevo León","MXE-NL","MX",268 808,"Querétaro","MXE-QU","MX",268 809,"San Luis Potosí","MXE-SL","MX",268 810,"Tamaulipas","MXE-TA","MX",268 811,"Zacatecas","MXE-ZA","MX",268 812,"Veracruz","MXG-VC","MX",269 813,"Guadalupe I.","MXI-GU","MX",270 814,"Rocas Alijos","MXI-RA","MX",270 815,"Revillagigedo Is.","MXI-RG","MX",270 816,"Baja California","MXN-BC","MX",271 817,"Baja California Sur","MXN-BS","MX",271 818,"Sinaloa","MXN-SI","MX",271 819,"Sonora","MXN-SO","MX",271 820,"Colima","MXS-CL","MX",272 821,"Guerrero","MXS-GR","MX",272 822,"Jalisco","MXS-JA","MX",272 823,"Michoacán","MXS-MI","MX",272 824,"Nayarit","MXS-NA","MX",272 825,"Oaxaca","MXS-OA","MX",272 826,"Campeche","MXT-CA","MX",273 827,"Chiapas","MXT-CI","MX",273 828,"Quintana Roo","MXT-QR","MX",273 829,"Tabasco","MXT-TB","MX",273 830,"Yucatán","MXT-YU","MX",273 831,"Myanmar","MYA-OO","MM",274 832,"Namibia","NAM-OO","ZA",275 833,"KwaZulu-Natal","NAT-OO","ZA",276 834,"New Brunswick","NBR-OO","CA",277 835,"North Carolina","NCA-OO","US",278 836,"Nicobar Is.","NCB-OO","IN",279 837,"Dagestan","NCS-DA","RU",280 838,"Kabardino-Balkariya","NCS-KB","RU",280 839,"Karacheyevo-Cherkessiya","NCS-KC","RU",280 840,"Krasnodar","NCS-KR","RU",280 841,"Severo-Osetiya","NCS-SO","RU",280 842,"Stavropol","NCS-ST","RU",280 843,"North Dakota","NDA-OO","US",281 844,"Nebraska","NEB-OO","US",282 845,"Nepal","NEP-OO","NP",283 846,"Netherlands","NET-OO","NL",284 847,"Nevada","NEV-OO","US",285 848,"Lord Howe I.","NFK-LH","AU",286 849,"Norfolk I.","NFK-NI","NF",286 850,"Newfoundland","NFL-NE","CA",287 851,"St.Pierre-Miquelon","NFL-SP","PM",287 852,"Nigeria","NGA-OO","NG",288 853,"Niger","NGR-OO","NE",289 854,"Nicaragua","NIC-OO","NI",290 855,"Bonaire","NLA-BO","AN",291 856,"Curaçao","NLA-CU","AN",291 857,"Nansei-shoto","NNS-OO","JP",292 858,"Norway","NOR-OO","NO",293 859,"Nauru","NRU-OO","NR",294 860,"Nova Scotia","NSC-OO","CA",295 861,"Australian Capital Territory","NSW-CT","AU",296 862,"New South Wales","NSW-NS","AU",296 863,"Northern Territory","NTA-OO","AU",297 864,"Niue","NUE-OO","NU",298 865,"Nunavut","NUN-OO","CA",299 866,"New Caledonia","NWC-OO","NC",300 867,"Irian Jaya","NWG-IJ","ID",301 868,"Papua New Guinea","NWG-PN","PG",301 869,"New Hampshire","NWH-OO","US",302 870,"New Jersey","NWJ-OO","US",303 871,"New Mexico","NWM-OO","US",304 872,"Northwest Territories","NWT-OO","CA",305 873,"New York","NWY-OO","US",306 874,"New Zealand North","NZN-OO","NZ",307 875,"New Zealand South","NZS-OO","NZ",308 876,"Free State","OFS-OO","ZA",309 877,"Ogasawara-shoto","OGA-OO","JP",310 878,"Ohio","OHI-OO","US",311 879,"Oklahoma","OKL-OO","US",312 880,"Oman","OMA-OO","OM",313 881,"Ontario","ONT-OO","CA",314 882,"Oregon","ORE-OO","US",315 883,"Pakistan","PAK-OO","PK",316 884,"Israel","PAL-IS","IL",317 885,"Jordan","PAL-JO","JO",317 886,"Panamá","PAN-OO","PA",318 887,"Paraguay","PAR-OO","PY",319 888,"Prince Edward I.","PEI-OO","CA",320 889,"Pennsylvania","PEN-OO","US",321 890,"Peru","PER-OO","PE",322 891,"Philippines","PHI-OO","PH",323 892,"Phoenix Is.","PHX-OO","KI",324 893,"Pitcairn Is.","PIT-OO","PN",325 894,"Poland","POL-OO","PL",326 895,"Portugal","POR-OO","PT",327 896,"Primorye","PRM-OO","RU",328 897,"Puerto Rico","PUE-OO","PR",329 898,"Coral Sea Is. Territory","QLD-CS","AU",330 899,"Queensland","QLD-QU","AU",330 900,"Québec","QUE-OO","CA",331 901,"Réunion","REU-OO","RE",332 902,"Rhode I.","RHO-OO","US",333 903,"Rodrigues","ROD-OO","MU",334 904,"Romania","ROM-OO","RO",335 905,"Central European Russia","RUC-OO","RU",336 906,"East European Russia","RUE-OO","RU",337 907,"North European Russia","RUN-OO","RU",338 908,"South European Russia","RUS-OO","RU",339 909,"Northwest European Russia","RUW-OO","RU",340 910,"Rwanda","RWA-OO","RW",341 911,"Sakhalin","SAK-OO","RU",342 912,"American Samoa","SAM-AS","AS",343 913,"Samoa","SAM-WS","WS",343 914,"Sardegna","SAR-OO","IT",344 915,"Saskatchewan","SAS-OO","CA",345 916,"Saudi Arabia","SAU-OO","SA",346 917,"South Carolina","SCA-OO","US",347 918,"Society Is.","SCI-OO","PF",348 919,"Paracel Is.","SCS-PI","PI",349 920,"Spratly Is.","SCS-SI","SI",349 921,"Santa Cruz Is.","SCZ-OO","SB",350 922,"South Dakota","SDA-OO","US",351 923,"Selvagens","SEL-OO","PT",352 924,"Senegal","SEN-OO","SN",353 925,"Seychelles","SEY-OO","SC",354 926,"South Georgia","SGE-OO","GS",355 927,"Malta","SIC-MA","MT",356 928,"Sicilia","SIC-SI","IT",356 929,"Sierra Leone","SIE-OO","SL",357 930,"Sinai","SIN-OO","EG",358 931,"South Australia","SOA-OO","AU",359 932,"Socotra","SOC-OO","YE",360 933,"North Solomons","SOL-NO","PG",361 934,"South Solomons","SOL-SO","SB",361 935,"Somalia","SOM-OO","SO",362 936,"Andorra","SPA-AN","AD",363 937,"Gilbraltar","SPA-GI","GI",363 938,"Spain","SPA-SP","ES",363 939,"Sri Lanka","SRL-OO","LK",364 940,"South Sandwich Is.","SSA-OO","GS",365 941,"St.Helena","STH-OO","SH",366 942,"Sudan","SUD-OO","SD",367 943,"Sulawesi","SUL-OO","ID",368 944,"Sumatera","SUM-OO","ID",369 945,"Surinam","SUR-OO","SR",370 946,"Svalbard","SVA-OO","SJ",371 947,"Colombian Caribbean Is.","SWC-CC","CO",372 948,"Honduran Caribbean Is.","SWC-HC","HN",372 949,"Nicaraguan Caribbean Is.","SWC-NC","NI",372 950,"Sweden","SWE-OO","SE",373 951,"Switzerland","SWI-OO","CH",374 952,"Swaziland","SWZ-OO","SZ",375 953,"Taiwan","TAI-OO","TW",376 954,"Tanzania","TAN-OO","TZ",377 955,"Tasmania","TAS-OO","AU",378 956,"Turks-Caicos Is.","TCI-OO","TC",379 957,"Abkhaziya","TCS-AB","GE",380 958,"Adzhariya","TCS-AD","GE",380 959,"Armenia","TCS-AR","AM",380 960,"Azerbaijan","TCS-AZ","AZ",380 961,"Georgia","TCS-GR","GE",380 962,"Nakhichevan","TCS-NA","AZ",380 963,"Nagorno Karabakh","TCS-NK","AZ",380 964,"Tristan da Cunha","TDC-OO","SH",381 965,"Tennessee","TEN-OO","US",382 966,"Texas","TEX-OO","US",383 967,"Thailand","THA-OO","TH",384 968,"Turkmenistan","TKM-OO","TM",385 969,"Togo","TOG-OO","TG",386 970,"Manihiki Is.","TOK-MA","CK",387 971,"Swains I.","TOK-SW","AS",387 972,"Tokelau","TOK-TO","TK",387 973,"Tonga","TON-OO","TO",388 974,"Trinidad-Tobago","TRT-OO","TT",389 975,"Tuamotu","TUA-OO","PF",390 976,"Tubuai Is.","TUB-OO","PF",391 977,"Turkey-in-Europe","TUE-OO","TR",392 978,"Tunisia","TUN-OO","TN",393 979,"Turkey","TUR-OO","TR",394 980,"Tuvalu","TUV-OO","TV",395 981,"Tuva","TVA-OO","RU",396 982,"Gauteng","TVL-GA","ZA",397 983,"Mpumalanga","TVL-MP","ZA",397 984,"Northern Province","TVL-NP","ZA",397 985,"North-West Province","TVL-NW","ZA",397 986,"Tadzhikistan","TZK-OO","TJ",398 987,"Uganda","UGA-OO","UG",399 988,"Moldova","UKR-MO","MD",400 989,"Ukraine","UKR-UK","UA",400 990,"Uruguay","URU-OO","UY",401 991,"Utah","UTA-OO","US",402 992,"Uzbekistan","UZB-OO","UZ",403 993,"Vanuatu","VAN-OO","VU",404 994,"Venezuela","VEN-OO","VE",405 995,"Vermont","VER-OO","US",406 996,"Victoria","VIC-OO","AU",407 997,"Vietnam","VIE-OO","VN",408 998,"Venezuelan Antilles","VNA-OO","VE",409 999,"Virginia","VRG-OO","US",410 1000,"Wake I.","WAK-OO","UM",411 1001,"Wallis-Futuna Is.","WAL-OO","WF",412 1002,"Washington","WAS-OO","US",413 1003,"Ashmore-Cartier Is.","WAU-AC","AU",414 1004,"Western Australia","WAU-WA","AU",414 1005,"District of Columbia","WDC-OO","US",415 1006,"Himachal Pradesh","WHM-HP","IN",416 1007,"Jammu-Kashmir","WHM-JK","IN",416 1008,"Uttaranchal","WHM-UT","IN",416 1009,"Barbados","WIN-BA","BB",417 1010,"Dominica","WIN-DO","DM",417 1011,"Grenada","WIN-GR","GD",417 1012,"Martinique","WIN-MA","MQ",417 1013,"St.Lucia","WIN-SL","LC",417 1014,"St.Vincent","WIN-SV","VC",417 1015,"Wisconsin","WIS-OO","US",418 1016,"Western Sahara","WSA-OO","EH",419 1017,"West Siberia","WSB-OO","RU",420 1018,"West Virginia","WVA-OO","US",421 1019,"Wyoming","WYO-OO","US",422 1020,"Christmas I.","XMS-OO","CX",423 1021,"Yakutskiya","YAK-OO","RU",424 1022,"North Yemen","YEM-NY","YE",425 1023,"South Yemen","YEM-SY","YE",425 1024,"Bosnia-Herzegovina","YUG-BH","YU",426 1025,"Croatia","YUG-CR","HR",426 1026,"Kosovo","YUG-KO","YU",426 1027,"Macedonia","YUG-MA","MK",426 1028,"Montenegro","YUG-MN","YU",426 1029,"Serbia","YUG-SE","YU",426 1030,"Slovenia","YUG-SL","SL",426 1031,"Yukon","YUK-OO","CA",427 1032,"Zaire","ZAI-OO","CD",428 1033,"Zambia","ZAM-OO","ZM",429 1034,"Zimbabwe","ZIM-OO","ZW",430 1035,"Jharkhand","IND-JK","IN",198 1036,"Chattisgarh","IND-CT","IN",198 1037,"Chechnya","NCS-CH","RU",280 1038,"Ingushetiya","NCS-IN","RU",280 1039,"Chongqing","CHC-CQ","CN",118 1040,"Afghanistan","2",,432 1041,"Åland Is.","4",,641 1042,"Albania","5",,458 1043,"Aleutian Is.","6",,462 1044,"Algeria","7",,460 1045,"American Samoa","8",,912 1046,"Andorra","9",,936 1047,"Angola","10",,466 1048,"Anguilla","11",,748 1049,"Antigua-Barbuda","12",,747 1050,"Armeniya","14",,959 1051,"Aruba","15",,470 1052,"Ascension","16",,471 1053,"Ashmore and Cartier Is.","17",,1003 1054,"Australian Antarctic Territory","19",,467 1055,"Austria","20",,481 1056,"Azores","22",,483 1057,"Bahamas","23",,484 1058,"Bahrain","24",,663 1059,"Bangladesh","26",,486 1060,"Barbados","27",,1009 1061,"Belgium","29",,489 1062,"Belize","30",,498 1063,"Benin","32",,487 1064,"Bermuda","33",,488 1065,"Bhutan","34",,632 1066,"Bioko","35",,654 1067,"Bolivia","36",,499 1068,"Bonaire","37",,855 1069,"Bophutatswana","39",,22 1070,"Borneo","40",,99 1071,"Botswana","42",,504 1072,"Bougainville","43",,933 1073,"British Antarctic Territory","45",,467 1074,"British Indian Ocean Territory","46",,544 1075,"Brunei","47",,500 1076,"Bulgaria","48",,508 1077,"Burkina","49",,492 1078,"Burundi","51",,509 1079,"Cambodia","52",,543 1080,"Abemama","332",,658 1081,"Acklins I.","335",,484 1082,"Açôres","336",,483 1083,"Acre","337",,529 1084,"Actaeon Group","338",,975 1085,"Addu Atoll","339",,774 1086,"Aden","340",,1023 1087,"Admiralty Is.","341",,491 1088,"Adygeysk","342",,840 1089,"Adzhariya","343",,958 1090,"Agalega","345",,769 1091,"Aginsky Buryat","346",,615 1092,"Agrihan","347",,789 1093,"Aguascalientes","348",,801 1094,"Aisén","350",,592 1095,"Aitutaki","351",,602 1096,"Al Fujayrah","352",,665 1097,"Al Manamah","353",,663 1098,"Alabama","354",,457 1099,"Alagoas","355",,514 1100,"Alamagan","356",,789 1101,"Alaska","357",,472 1102,"Alberta","358",,431 1103,"Alboran","359",,938 1104,"Albuquerque Cay","360",,947 1105,"Aldabra I.","361",,459 1106,"Alderney","362",,644 1107,"Alegranza","363",,597 1108,"Alejandro Selkirk I.","364",,722 1109,"Alexander Archipelago","365",,472 1110,"Alexander I.","366",,467 1111,"Alofi","367",,1001 1112,"Alor Is.","368",,763 1113,"Alphonse I.","369",,459 1114,"Altay","371",,461 1115,"Altayskiy Kray","372",,461 1116,"Amami O-shima","373",,857 1117,"Amapá","374",,531 1118,"Amazonas","375",,530 1119,"Ambergris Cays","376",,956 1120,"Ambitle I.","377",,933 1121,"Ambon","378",,782 1122,"Amboyna Cay","379",,920 1123,"Ambrym","380",,993 1124,"Amindivi Is.","382",,746 1125,"Amirante group","383",,459 1126,"Amorgos","384",,662 1127,"Amsterdam I.","385",,473 1128,"Amsterdam-St.Paul Is.","386",,473 1129,"Amur","387",,463 1130,"Anafi","389",,662 1131,"Anambas Is.","390",,501 1132,"Anatahan","391",,789 1133,"Anatom","392",,993 1134,"Andaman Is.","394",,464 1135,"Andhra Pradesh","395",,681 1136,"Andikithira","396",,662 1137,"Andipsara","397",,627 1138,"Andros","398",,484 1139,"Andros","399",,662 1140,"Anegada","400",,750 1141,"Anhui","404",,564 1142,"Annam","406",,997 1143,"Annobón","407",,653 1144,"Antarctica","408",,467 1145,"Antigua","409",,747 1146,"Antipodean Is.","410",,480 1147,"Antipodes Is.","411",,480 1148,"Antofagasta","412",,589 1149,"Aoba","413",,993 1150,"Aoga-shima","414",,718 1151,"Arab Emirates","415",,665 1152,"Aranuka","417",,658 1153,"Argentina Northeast","418",,64 1154,"Argentina Northwest","419",,66 1155,"Argentina South","420",,65 1156,"Aride I.","421",,925 1157,"Arizona","422",,468 1158,"Arkansas","423",,469 1159,"Arkhangelsk","424",,907 1160,"Armathia","425",,734 1161,"Arorae","428",,658 1162,"Aru Is.","429",,867 1163,"Arunachal Pradesh","431",,631 1164,"Ash Shariquah","432",,665 1165,"Ashmore Reef","433",,1003 1166,"Asia Is.","434",,867 1167,"Assam","435",,474 1168,"Assumption I.","436",,459 1169,"Astakidha","437",,662 1170,"Astipalaia","438",,662 1171,"Astove I.","439",,459 1172,"Astrakhan","440",,908 1173,"Asuncion","441",,789 1174,"Ata","442",,973 1175,"Atacama","443",,590 1176,"Atafu","444",,972 1177,"Atiu","445",,602 1178,"Atol das Rocas","446",,517 1179,"Auckland I.","447",,480 1180,"Aunuu","448",,912 1181,"Australian Capital Territory","450",,861 1182,"Avarau","451",,602 1183,"Aves I.","452",,749 1184,"Aves, Islas Las","453",,998 1185,"Avgo","454",,662 1186,"Avgo","455",,734 1187,"Ayios Evstratios","456",,662 1188,"Ayu Is.","457",,867 1189,"Az Zuqur I.","458",,1023 1190,"Azerbaydzhan","460",,960 1191,"Babar Is.","462",,763 1192,"Babase I.","463",,933 1193,"Babelthaup","464",,613 1194,"Badu I.","465",,899 1195,"Baffin I.","466",,872 1196,"Bahawalpur","467",,883 1197,"Bahia","468",,515 1198,"Bahia Is.","469",,948 1199,"Bahia Isabel","470",,649 1200,"Baja California","472",,816 1201,"Baja California Sur","473",,817 1202,"Baja Nuevo","474",,947 1203,"Baker I.","475",,674 1204,"Balabac","476",,891 1205,"Baleares","477",,485 1206,"Bali","478",,761 1207,"Ball's Pyramid","479",,848 1208,"Balleny Is.","480",,467 1209,"Baltic States","481",,96 1210,"Baltistan","482",,1007 1211,"Baluchistan","483",,883 1212,"Banaba","484",,658 1213,"Banda Is.","485",,782 1214,"Banggai Is.","486",,943 1215,"Bangka","487",,944 1216,"Banks I.","488",,899 1217,"Banks Is.","489",,993 1218,"Barat Daya Is.","490",,763 1219,"Barbuda","491",,747 1220,"Barotseland","492",,1033 1221,"Barren I.","493",,464 1222,"Bashkiriya","494",,906 1223,"Bassas da India","496",,770 1224,"Basse Terre","497",,751 1225,"Batan Is.","499",,891 1226,"Bathurst I.","500",,863 1227,"Bawean","501",,721 1228,"Becerro Cays","503",,948 1229,"Bechuanaland, British","505",,609 1230,"Beijing","506",,558 1231,"Belau Is.","507",,613 1232,"Belep I.","508",,866 1233,"Belgorod","511",,905 1234,"Belitung","512",,944 1235,"Bellona","513",,934 1236,"Belarus","514",,493 1237,"Bequia","516",,1014 1238,"Beveridge Reef","517",,864 1239,"Biak","519",,867 1240,"Bihar","520",,682 1241,"Bikini","521",,791 1242,"Bimini Is.","522",,484 1243,"Biobío","523",,581 1244,"Bird I.","524",,925 1245,"Bird I.","525",,749 1246,"Birnie I.","527",,892 1247,"Bishop and Clerk Is.","528",,767 1248,"Bismark Archipelago","529",,491 1249,"Bjørnøya","530",,946 1250,"Blanquilla Is.","531",,998 1251,"Bohol","532",,891 1252,"Boigu I.","533",,899 1253,"Bombom I.","534",,655 1254,"Bonerate Is.","536",,943 1255,"Bora-Bora","538",,918 1256,"Bornholm","540",,623 1257,"Bounty I.","543",,480 1258,"Bouvet I.","544",,505 1259,"Bozcaada","546",,979 1260,"Brazil North","547",,109 1261,"Brazil Northeast","548",,107 1262,"Brazil South","549",,110 1263,"Brazil Southeast","550",,108 1264,"Brazil West-Central","551",,106 1265,"Brazilia Distrito Federal","552",,510 1266,"Bristow I.","553",,868 1267,"British Cameroons North","555",,852 1268,"British Cameroons South","556",,595 1269,"British Columbia","557",,506 1270,"British Somaliland","561",,935 1271,"British Virgin Is.","562",,750 1272,"Bryansk","564",,905 1273,"Buenos Aires","565",,433 1274,"Bugio","567",,773 1275,"Buka","568",,933 1276,"Bunguran Is.","569",,501 1277,"Bunguran Selatan Is.","570",,501 1278,"Buru","572",,782 1279,"Buryatiya","573",,507 1280,"Byelorussiya","575",,493 1281,"Cabinda","576",,539 1282,"Cabras Is.","578",,656 1283,"Cabrera","579",,485 1284,"Cagayan Is.","580",,891 1285,"Caicos Is.","581",,956 1286,"Cajones Cays","582",,948 1287,"Calamian Is.","583",,891 1288,"California","584",,541 1289,"Cambodge","585",,543 1290,"Cameroon","586",,595 1291,"Campbell I.","588",,480 1292,"Campeche","589",,826 1293,"Canary Is.","591",,597 1294,"Canouan","592",,1014 1295,"Cape Province","595",,142 1296,"Cape Verde","596",,618 1297,"Caprivi Strip","597",,611 1298,"Caratasca Cays","598",,948 1299,"Cargados Carajos","599",,769 1300,"Caroco Is.","600",,655 1301,"Caroline I.","601",,758 1302,"Caroline Is.","602",,144 1303,"Carriacao","604",,1011 1304,"Cartier Is.","605",,1003 1305,"Cat I.","606",,484 1306,"Catamarca","607",,448 1307,"Cato","608",,898 1308,"Caucasus, North","610",,280 1309,"Cay Sal Bank","611",,484 1310,"Cayenne","612",,647 1311,"Cayman Brac","613",,542 1312,"Cayman Is.","614",,542 1313,"Ceará","615",,516 1314,"Cebu","616",,891 1315,"Cedros I.","617",,816 1316,"Central African Republic","620",,540 1317,"Central American Pacific Is.","621",,141 1318,"Ceuta","624",,785 1319,"Chaco","626",,434 1320,"Chad","627",,545 1321,"Chagos Archipelago","628",,544 1322,"Chandigarh","629",,683 1323,"Channel Is.","630",,644 1324,"Channel Is.","631",,541 1325,"Charcot I.","632",,467 1326,"Chari","633",,540 1327,"Chatham Is.","634",,616 1328,"Cheju Do","636",,732 1329,"Chelyabinsk","638",,1017 1330,"Cherry I.","639",,921 1331,"Chesterfield Is.","640",,866 1332,"Chiapas","641",,827 1333,"Chichijima","642",,877 1334,"Chihuahua","643",,803 1335,"Chilcott I.","644",,898 1336,"Chile North","645",,130 1337,"Chile South","646",,131 1338,"China North-central","648",,122 1339,"China South-central","649",,118 1340,"China South-east","650",,124 1341,"Chita","652",,615 1342,"Chitral","654",,883 1343,"Chittagong","655",,486 1344,"Choiseul","656",,934 1345,"Chongqing","657",,548 1346,"Christmas I.","658",,1020 1347,"Christmas I.","659",,758 1348,"Chubut","660",,442 1349,"Chukota","661",,764 1350,"Chuvashiya","663",,905 1351,"Ciskei","664",,608 1352,"Clarence I.","666",,467 1353,"Clipperton I.","667",,605 1354,"Coahuila","668",,802 1355,"Coats I.","669",,865 1356,"Coche I.","670",,998 1357,"Cochin Chine","671",,997 1358,"Cochons, Isle aux","673",,614 1359,"Coco I., Great","674",,465 1360,"Coco Is.","675",,465 1361,"Cocos (Keeling) Is.","676",,580 1362,"Cocos I.","677",,606 1363,"Cöetivy","678",,459 1364,"Colima","679",,820 1365,"Colombia","680",,588 1366,"Colombian Caribbean Is.","681",,947 1367,"Colón I.","682",,886 1368,"Colón Archipelago","683",,649 1369,"Colorado","684",,598 1370,"Comoros","686",,136 1371,"Comoros","687",,599 1372,"Con Son","688",,997 1373,"Condore Is.","689",,997 1374,"Congo","690",,601 1375,"Connecticut","693",,596 1376,"Cook Is.","695",,602 1377,"Coquimbo","696",,582 1378,"Coral Sea Is. Territory","697",,898 1379,"Córdoba","698",,436 1380,"Coringa Is.","701",,898 1381,"Corisco I.","702",,636 1382,"Coronation I.","704",,467 1383,"Corrientes","705",,435 1384,"Corse","706",,603 1385,"Corvo","708",,483 1386,"Cosmoledo","710",,459 1387,"Costa Rica","711",,604 1388,"Cozumel I.","714",,828 1389,"Crab I.","715",,897 1390,"Croatia","719",,1025 1391,"Crooked I.","720",,484 1392,"Crozet Is.","721",,614 1393,"Cuba","722",,617 1394,"Cubagua","723",,998 1395,"Culebra I.","724",,897 1396,"Culpepper I.","725",,649 1397,"Curaçao","726",,856 1398,"Curtis I.","727",,728 1399,"Cyprus","729",,619 1400,"Czechoslovakia","730",,151 1401,"D'Arros I.","731",,459 1402,"D'Entrecastaux Is.","732",,868 1403,"Dadra","733",,684 1404,"Dadra-Nagar-Haveli","734",,684 1405,"Dagestan","735",,837 1406,"Dahlak Is.","737",,637 1407,"Daito Is.","739",,857 1408,"Daman","740",,687 1409,"Darjiling","744",,633 1410,"Darsa I.","745",,932 1411,"Daru I.","746",,868 1412,"Dauan I.","747",,899 1413,"Delaware","748",,622 1414,"Delhi","749",,685 1415,"Denis I.","751",,925 1416,"Denmark","752",,623 1417,"Deserta Grande","753",,773 1418,"Desirade, La","754",,751 1419,"Desroches I.","755",,459 1420,"Desventurados Is.","756",,626 1421,"Dhilos","757",,662 1422,"Dhodekanisos","758",,627 1423,"Dia","760",,734 1424,"Diamond Islets","761",,898 1425,"Diego Garcia","762",,544 1426,"Disappearing I.","763",,671 1427,"Disappointment Is.","764",,975 1428,"District of Columbia","765",,1005 1429,"Diu","766",,686 1430,"Djibouti","767",,624 1431,"Dog I.","768",,748 1432,"Dominica","770",,1010 1433,"Dominican Republic","771",,625 1434,"Dongsha Qundao","772",,566 1435,"Dubayy","775",,665 1436,"Ducie I.","776",,893 1437,"Duff Is.","777",,921 1438,"Duke of Gloucester Is.","778",,975 1439,"Duke of York Is.","779",,491 1440,"Durango","780",,804 1441,"Dzungaria","783",,579 1442,"E.S.E., Cayos del","784",,947 1443,"Eaglestone Reef","785",,1001 1444,"East Aegean Is.","786",,627 1445,"East Germany","787",,652 1446,"East Timor","789",,762 1447,"Easter I.","790",,628 1448,"Easter Is.","791",,628 1449,"Eastern I.","792",,673 1450,"Ecuador","793",,629 1451,"Efate","794",,993 1452,"Egadi Is.","795",,928 1453,"Egypt","796",,630 1454,"Eiao","797",,790 1455,"El Salvador","799",,635 1456,"Elba","800",,712 1457,"Elephant I.","801",,467 1458,"Eleuthera","802",,484 1459,"Elizabeth Reef","803",,848 1460,"Ellesmere I.","804",,872 1461,"Ellsworth I.","806",,467 1462,"Elobey Grande","807",,636 1463,"Emae","808",,993 1464,"Enderbury I.","809",,892 1465,"Enderby Land","810",,467 1466,"Enewetak","811",,791 1467,"Enggano","812",,944 1468,"England","813",,661 1469,"Entre Ríos","815",,438 1470,"Equatorial Guinea","817",,636 1471,"Erromango","820",,993 1472,"Espanola I.","822",,649 1473,"Espírito Santo","823",,524 1474,"Espiritu Santo","824",,993 1475,"Estonia","825",,494 1476,"Ethiopia","827",,638 1477,"Eua","828",,973 1478,"Europa I.","830",,770 1479,"Evenki","831",,733 1480,"Evvoia","832",,662 1481,"Faial","835",,483 1482,"Fais","836",,612 1483,"Fakaofo","837",,972 1484,"Fakarava","838",,975 1485,"Falkland Is.","839",,639 1486,"Fangatau","840",,975 1487,"Farallon de Medinilla","843",,789 1488,"Farasan Is.","844",,916 1489,"Faraulep","845",,612 1490,"Farquhar I.","846",,459 1491,"Fatu Hiva","847",,790 1492,"Fauro","848",,934 1493,"Feni Is.","850",,933 1494,"Fernando de Noronha","851",,517 1495,"Fiji","853",,640 1496,"Finland","854",,641 1497,"Flat I.","855",,769 1498,"Flint I.","856",,758 1499,"Flores","857",,483 1500,"Flores","858",,763 1501,"Florida","859",,642 1502,"Florida Is.","860",,934 1503,"Formentera","861",,485 1504,"Formosa","862",,439 1505,"Formosa","863",,953 1506,"Føroyar","864",,643 1507,"France","866",,645 1508,"France","867",,171 1509,"Franklin","868",,872 1510,"French Cameroons","870",,595 1511,"French Guiana","872",,647 1512,"French Morocco","874",,784 1513,"Frigate I.","877",,925 1514,"Fuerteventura","878",,597 1515,"Fujian","881",,565 1516,"Funafuti","883",,980 1517,"Futuna","884",,1001 1518,"Futuna","885",,993 1519,"Gabon","886",,648 1520,"Gaidhouronisi","890",,734 1521,"Galápagos","891",,649 1522,"Gambia, The","892",,650 1523,"Gambier Is.","893",,975 1524,"Gan","894",,774 1525,"Gansu","895",,557 1526,"Gardner Pinnacles","897",,671 1527,"Gavdhopoula","898",,734 1528,"Gavdhos","899",,734 1529,"Gaza Strip","900",,884 1530,"Genovesa I.","901",,649 1531,"Georgia","903",,651 1532,"Germany","904",,652 1533,"Ghana","905",,657 1534,"Gibraltar","906",,937 1535,"Gilbert Is.","907",,658 1536,"Gilgit","908",,1007 1537,"Glorieuses Is.","909",,770 1538,"Goa","911",,688 1539,"Goiás","912",,511 1540,"Gokçeada","913",,977 1541,"Gomera","915",,597 1542,"Gonave I.","916",,669 1543,"Gonzalez I.","917",,626 1544,"Gorno-Badakhshan","919",,986 1545,"Gotland","920",,950 1546,"Gough I.","921",,964 1547,"Gozo","922",,927 1548,"Graciosa","923",,483 1549,"Graciosa","924",,597 1550,"Graham Land","925",,467 1551,"Gran Canaria","926",,597 1552,"Grand Bahama","927",,484 1553,"Grand Cayman","928",,542 1554,"Grande Terre","929",,751 1555,"Great Abaco","930",,484 1556,"Great Britain","931",,661 1557,"Great Camanoe","932",,750 1558,"Great Coco I.","933",,465 1559,"Great Exuma","934",,484 1560,"Great Inagua","935",,484 1561,"Greece","936",,662 1562,"Green Is.","937",,933 1563,"Greenland","938",,660 1564,"Grenada","940",,1011 1565,"Grenadines of Grenada","941",,1011 1566,"Grenadines of St.Vincent","942",,1014 1567,"Gruziya","943",,961 1568,"Guadalcanal","944",,934 1569,"Guadeloupe","945",,751 1570,"Guadelupe I.","946",,813 1571,"Guam","947",,788 1572,"Guana I.","948",,750 1573,"Guanaja","949",,948 1574,"Guanajuato","950",,805 1575,"Guangdong","951",,566 1576,"Guangxi","952",,567 1577,"Guangzhou","953",,566 1578,"Guatemala","954",,666 1579,"Guernsey","955",,644 1580,"Guerrero","956",,821 1581,"Guinea","957",,667 1582,"Guinea-Bissau","958",,659 1583,"Guizhou","959",,546 1584,"Gujarat","960",,689 1585,"Gulf of Guinea Is.","961",,178 1586,"Gulf States","962",,185 1587,"Gunners Quoin","963",,769 1588,"Gunungapi","964",,782 1589,"Guyana","965",,668 1590,"Ha'apai Is.","967",,973 1591,"Habomai-shoto","968",,737 1592,"Hachijo-jima","969",,718 1593,"Hahajima","970",,877 1594,"Hainan","971",,550 1595,"Haiti","972",,669 1596,"Haiti","973",,189 1597,"Hall I.","975",,612 1598,"Halmahera","976",,782 1599,"Hanish al Kabir","977",,1023 1600,"Hao","979",,975 1601,"Haryana","980",,690 1602,"Hawai'i","982",,190 1603,"Hawai'i","983",,671 1604,"Hawai'ian Is.","984",,671 1605,"Heard I.","985",,675 1606,"Heard-McDonald Is.","986",,675 1607,"Hebei","987",,558 1608,"Heilongjiang","988",,553 1609,"Helen Reef","990",,613 1610,"Henan","991",,568 1611,"Henderson I.","992",,893 1612,"Herzegovina","993",,1024 1613,"Hereheretue","994",,975 1614,"Herm","995",,644 1615,"Hermanos, Los","996",,998 1616,"Hermit Is.","997",,491 1617,"Hervey I.","998",,602 1618,"Hidalgo","999",,806 1619,"Hierro","1000",,597 1620,"Himachal Pradesh","1001",,1006 1621,"Hiva Oa","1004",,790 1622,"Hokkaido","1005",,717 1623,"Hon Panjang","1007",,997 1624,"Honduran Caribbean Is.","1009",,948 1625,"Honduras","1010",,676 1626,"Hong Kong","1011",,569 1627,"Honshu","1012",,718 1628,"Hoorn Is.","1013",,1001 1629,"Howland I.","1016",,674 1630,"Howland-Baker Is.","1017",,674 1631,"Huahine","1019",,918 1632,"Hubei","1020",,547 1633,"Hunan","1023",,570 1634,"Hungary","1024",,677 1635,"Hunter Is.","1025",,866 1636,"Huon I.","1026",,866 1637,"Ibiza","1028",,485 1638,"Iceland","1029",,678 1639,"Idaho","1030",,679 1640,"Ifni","1031",,784 1641,"Ikaria","1032",,627 1642,"Iles du Vent","1034",,918 1643,"Iles sous le Vent","1035",,918 1644,"Iliodhromia","1036",,662 1645,"Illinois","1037",,680 1646,"Inaccessible I.","1040",,964 1647,"Inagua Is.","1041",,484 1648,"Inamba-jima","1042",,718 1649,"India","1043",,198 1650,"Indiana","1044",,705 1651,"Inhaca I.","1046",,786 1652,"Inner Mongolia","1047",,120 1653,"Ioinianisia","1048",,662 1654,"Ionioi Nisoi","1050",,662 1655,"Voriai","1051",,662 1656,"Iowa","1052",,706 1657,"Iran","1053",,710 1658,"Iraq","1054",,711 1659,"Ireland","1055",,707 1660,"Ireland","1056",,201 1661,"Irian Jaya","1058",,867 1662,"Iriomote","1059",,857 1663,"Irkutsk","1060",,709 1664,"Isabela I.","1062",,649 1665,"Ishigaki","1063",,857 1666,"Isle of Man","1064",,661 1667,"Isle of Pines","1065",,866 1668,"Israel","1066",,884 1669,"Italian Somaliland","1068",,935 1670,"Italy","1069",,205 1671,"Italy","1070",,712 1672,"Ivanovo","1071",,905 1673,"Ivory Coast","1073",,715 1674,"Iwo Jima","1074",,739 1675,"Jalisco","1075",,822 1676,"Jalpaiguri","1076",,703 1677,"Jaluit","1077",,791 1678,"Jamaica","1078",,716 1679,"Jammu-Kashmir","1079",,1007 1680,"Jan Mayen I.","1080",,946 1681,"Japan","1081",,208 1682,"Jarvis I.","1082",,759 1683,"Jawa","1084",,721 1684,"Jersey","1085",,644 1685,"Jiangsu","1087",,571 1686,"Jiangxi","1088",,572 1687,"Jilin","1090",,554 1688,"Johnston I.","1091",,672 1689,"Jordan","1093",,885 1690,"Jost van Dyke","1094",,750 1691,"Juan Fernández Is.","1095",,722 1692,"Juan de Nova","1096",,770 1693,"Judge and Clerk Is.","1097",,767 1694,"Jujuy","1099",,449 1695,"Juventud, Isla de la","1100",,617 1696,"Kabara","1101",,640 1697,"Kabardino-Balkariya","1102",,838 1698,"Kadavu","1103",,640 1699,"Kahoolawe","1104",,671 1700,"Kai Is.","1105",,782 1701,"Kalaotoa","1106",,943 1702,"Kalimantan","1107",,501 1703,"Kalimnos","1108",,627 1704,"Kaliningrad","1110",,495 1705,"Kaluga","1112",,905 1706,"Kamaran Is.","1113",,1023 1707,"Kamchatka","1115",,723 1708,"Kamodo","1116",,763 1709,"Kangaroo I.","1119",,931 1710,"Kangean Is.","1120",,721 1711,"Kaniet Is.","1121",,491 1712,"Kansas","1122",,724 1713,"Kanton I.","1124",,892 1714,"Kapingamaringi","1125",,612 1715,"Kara-Kalpakiya","1127",,992 1716,"Karacheyevo-Cherkessiya","1128",,839 1717,"Karaikal","1129",,692 1718,"Karelia","1130",,907 1719,"Karkaralong Is.","1131",,943 1720,"Karnataka","1132",,693 1721,"Kárpathos","1133",,734 1722,"Kasos","1134",,734 1723,"Kauai","1135",,671 1724,"Kazakhstan","1136",,725 1725,"Kazan-retto","1137",,739 1726,"Kedah","1138",,779 1727,"Keewatin","1140",,865 1728,"Kelantan","1141",,779 1729,"Kemerovo","1142",,1017 1730,"Kentucky","1143",,736 1731,"Kenya","1144",,727 1732,"Kerala","1146",,691 1733,"Kerguelen","1147",,726 1734,"Kérkira","1148",,662 1735,"Kermadec Is.","1149",,728 1736,"Khabarovsk","1150",,730 1737,"Khakassiya","1151",,733 1738,"Khalki","1152",,627 1739,"Khamili","1153",,662 1740,"Khanty-Mansi","1154",,1017 1741,"Khios","1155",,627 1742,"Khristiana","1157",,662 1743,"Kikai-shima","1160",,857 1744,"Kikladhes","1161",,662 1745,"Kilinailau","1162",,933 1746,"Kin-Men","1163",,573 1747,"King George Is.","1164",,975 1748,"King George V Land","1165",,467 1749,"Kingman Reef","1166",,759 1750,"Kingsmill Is.","1167",,658 1751,"Kirgizistan","1169",,729 1752,"Kiribati Line Is.","1171",,758 1753,"Kiritimati","1173",,758 1754,"Kirov","1175",,906 1755,"Kita Daito","1176",,857 1756,"Kita Iwo","1177",,739 1757,"Kitalo","1178",,739 1758,"Kithira","1179",,662 1759,"Kittery I.","1180",,671 1760,"Ko Way","1181",,997 1761,"Kobisho","1182",,857 1762,"Koch Bihar","1183",,703 1763,"Kodiak I.","1184",,472 1764,"Komandor Is.","1185",,723 1765,"Komba","1186",,763 1766,"Komi","1187",,907 1767,"Korea","1189",,219 1768,"Korea, People's Democratic Republic of","1190",,731 1769,"Korea, Republic of","1191",,732 1770,"Koryanskiy","1192",,723 1771,"Kos","1193",,627 1772,"Kosovo","1194",,1026 1773,"Kosrae","1195",,612 1774,"Kostroma","1196",,905 1775,"Koufonisi","1197",,734 1776,"Kozu-shima","1198",,718 1777,"Krasnodar","1199",,840 1778,"Krasnoyarsk","1200",,733 1779,"Kriti","1201",,734 1780,"Krym","1202",,735 1781,"Kuchino-shima","1203",,857 1782,"Kure I.","1204",,673 1783,"Kurgan","1205",,1017 1784,"Kuria","1206",,658 1785,"Kuria Muria Is.","1207",,880 1786,"Kuril Is.","1208",,737 1787,"Kursk","1209",,905 1788,"Kuwait","1211",,738 1789,"Kwajalein","1213",,791 1790,"Kyushu","1218",,719 1791,"La Araucania","1219",,583 1792,"La Desirade","1220",,751 1793,"La Digue I.","1221",,925 1794,"La Palma","1222",,597 1795,"La Pampa","1223",,440 1796,"La Rioja","1224",,450 1797,"Labrador","1225",,740 1798,"Labuan","1226",,502 1799,"Laccadive Is.","1227",,746 1800,"Ladakh","1228",,1007 1801,"Lampedusa","1231",,928 1802,"Lan Hsu","1233",,953 1803,"Lanai","1234",,671 1804,"Langkawi","1235",,779 1805,"Langkesi Is.","1236",,943 1806,"Lanzarote","1237",,597 1807,"Laos","1238",,741 1808,"Las Aves Is.","1240",,998 1809,"Latvia","1241",,496 1810,"Lau Is.","1242",,640 1811,"Laughlan Is.","1243",,868 1812,"Laurie I.","1244",,467 1813,"Laut Kecil Is.","1246",,501 1814,"Laysan I.","1247",,671 1815,"Lebanon","1248",,743 1816,"Lebanon-Syria","1249",,230 1817,"Leeward I.","1250",,480 1818,"Leeward Is.","1251",,233 1819,"Leeward Is.","1252",,918 1820,"Leningrad","1254",,909 1821,"Leros","1255",,627 1822,"Lesotho","1257",,757 1823,"Lesser Sunda Is.","1259",,763 1824,"Lesvos","1260",,627 1825,"Leti Is.","1261",,763 1826,"Levitha","1262",,662 1827,"Liaoning","1264",,555 1828,"Liberia","1265",,742 1829,"Libya","1266",,745 1830,"Liechtenstein","1267",,482 1831,"Lihir Is.","1268",,491 1832,"Likhoma Is.","1269",,778 1833,"Limnos","1270",,662 1834,"Line Is.","1271",,235 1835,"Lingga Is.","1272",,944 1836,"Linosa","1273",,928 1837,"Lipari Is.","1274",,928 1838,"Lipetsk","1275",,905 1839,"Lipsoi","1276",,627 1840,"Lisianski I.","1277",,671 1841,"Lithuania","1278",,497 1842,"Little Cayman","1280",,542 1843,"Little Coco I.","1281",,465 1844,"Little Inagua","1282",,484 1845,"Loma-i-Viti Is.","1283",,640 1846,"Lombok","1284",,763 1847,"Long I.","1285",,868 1848,"Long I.","1286",,484 1849,"Lopevi","1287",,993 1850,"Lord Howe I.","1289",,848 1851,"Los Hermanos Is.","1291",,998 1852,"Los Lagos","1292",,593 1853,"Los Roques Is.","1293",,998 1854,"Los Testigos Is.","1294",,998 1855,"Louisa Reef","1296",,920 1856,"Louisiade Archipelago","1297",,868 1857,"Louisiana","1298",,760 1858,"Low Archipelago","1299",,975 1859,"Loyauté Is.","1301",,866 1860,"Lucipara Is.","1302",,782 1861,"Lusancay Is.","1303",,868 1862,"Luxembourg","1304",,490 1863,"Luzon","1305",,891 1864,"Ma-tsu-Pai-chúan","1306",,575 1865,"Macau","1307",,574 1866,"Macauley I.","1309",,728 1867,"Macedonia","1311",,1027 1868,"Mackenzie","1313",,872 1869,"Macquarie Is.","1314",,767 1870,"MacRobertson Land","1315",,467 1871,"Madagascar","1316",,772 1872,"Madeira","1317",,773 1873,"Madhya Pradesh","1318",,695 1874,"Madura","1319",,721 1875,"Maewo","1320",,993 1876,"Mafia I.","1321",,954 1877,"Magadan","1322",,764 1878,"Magellanes","1323",,594 1879,"Maharashtra","1324",,696 1880,"Mahé","1325",,694 1881,"Mahé","1326",,925 1882,"Maiana","1327",,658 1883,"Maine","1328",,765 1884,"Maio","1329",,918 1885,"Maiz Is.","1330",,949 1886,"Majuro","1332",,791 1887,"Makatea","1333",,975 1888,"Makedhonia","1334",,662 1889,"Makemo","1336",,975 1890,"Malaita","1342",,934 1891,"Malakula","1343",,993 1892,"Malawi","1344",,778 1893,"Malaya","1345",,253 1894,"Malden I.","1347",,758 1895,"Maldives","1348",,774 1896,"Mali","1349",,777 1897,"Mallorca","1351",,485 1898,"Maloelap","1352",,791 1899,"Malpelo I.","1353",,607 1900,"Malta","1354",,927 1901,"Maluku","1355",,782 1902,"Man, Isle of","1358",,661 1903,"Manchuria","1360",,121 1904,"Mangaia","1361",,602 1905,"Mangareva","1362",,975 1906,"Manihiki","1363",,970 1907,"Manihiki Is.","1364",,970 1908,"Manipur","1365",,475 1909,"Manitoba","1366",,766 1910,"Manra","1367",,892 1911,"Mansel I.","1368",,865 1912,"Manu'a","1369",,912 1913,"Manus Is.","1370",,491 1914,"Mapia I.","1371",,867 1915,"Maranhão","1372",,518 1916,"Marchena I.","1373",,649 1917,"Marcus I.","1374",,771 1918,"Margarita I.","1375",,998 1919,"Mari","1376",,906 1920,"Marianas","1377",,260 1921,"Marias Is.","1378",,824 1922,"Marie Byrd Land","1379",,467 1923,"Marie Galante","1380",,751 1924,"Marie Louise I.","1381",,459 1925,"Marion I.","1382",,787 1926,"Marion-Prince Edward Is.","1383",,787 1927,"Maro Reef","1385",,671 1928,"Marotiri","1387",,976 1929,"Marquesas","1388",,790 1930,"Marshall Is.","1389",,791 1931,"Martin Vas Is.","1390",,528 1932,"Martinique","1391",,1012 1933,"Maryland","1392",,792 1934,"Masalembu Besar","1395",,721 1935,"Masachusettes","1396",,768 1936,"Mato Grosso","1397",,513 1937,"Mato Grosso do Sul","1398",,512 1938,"Matthew Is.","1399",,866 1939,"Maug Is.","1400",,789 1940,"Maui","1401",,671 1941,"Mauke","1402",,602 1942,"Maule","1403",,584 1943,"Maupiti","1404",,918 1944,"Mauritania","1405",,795 1945,"Mauritius","1406",,769 1946,"Mayaguana","1407",,484 1947,"Mayotte","1408",,600 1948,"Mayreau","1409",,1014 1949,"Mbengga","1410",,640 1950,"McDonald I.","1411",,675 1951,"McKean I.","1412",,892 1952,"Media Luna Reefs","1413",,948 1953,"Meghalaya","1414",,476 1954,"Mehetia","1415",,918 1955,"Melaka","1416",,779 1956,"Melilla","1417",,785 1957,"Melville I.","1418",,863 1958,"Mendoza","1419",,451 1959,"Menorca","1420",,485 1960,"Mentawai Is.","1421",,944 1961,"Mergui Archipelago","1422",,831 1962,"Merit I.","1423",,613 1963,"Mexican Pacific Is.","1425",,270 1964,"Mexico Central","1427",,267 1965,"Mexico Distrito Federal","1428",,796 1966,"Mexico Northeast","1429",,268 1967,"Mexico Northwest","1430",,271 1968,"Mexico Southeast","1431",,273 1969,"Mexico Southwest","1432",,272 1970,"México State","1433",,797 1971,"Michigan","1434",,775 1972,"Michoacán","1435",,823 1973,"Micronesia Federated States","1436",,612 1974,"Middle I.","1438",,964 1975,"Middleton Reef","1439",,848 1976,"Midway Is.","1440",,673 1977,"Mikura-jima","1441",,718 1978,"Milos","1442",,662 1979,"Minas Gerais","1444",,525 1980,"Mindanao","1445",,891 1981,"Mindoro","1446",,891 1982,"Minicoy Is.","1447",,746 1983,"Minnesota","1448",,776 1984,"Misiones","1450",,441 1985,"Miskito Cays","1451",,949 1986,"Misool","1452",,867 1987,"Mississippi","1453",,793 1988,"Missouri","1454",,794 1989,"Mitre I.","1455",,921 1990,"Miyake-jima","1456",,718 1991,"Miyako","1457",,857 1992,"Mizoram","1458",,477 1993,"Moa I.","1459",,899 1994,"Moldova","1462",,988 1995,"Molokai","1463",,671 1996,"Mona I.","1465",,897 1997,"Monaco","1466",,646 1998,"Mongolia","1467",,783 1999,"Mongolia, Inner","1468",,120 2000,"Mono I.","1470",,934 2001,"Montana","1471",,781 2002,"Montenegro","1472",,1028 2003,"Montserrat","1473",,752 2004,"Moorea","1474",,918 2005,"Morant Cays","1475",,716 2006,"Mordoviya","1476",,905 2007,"Morelos","1477",,798 2008,"Morocco","1478",,784 2009,"Morocco","1479",,257 2010,"Mortlock I.","1480",,612 2011,"Moscow","1482",,905 2012,"Mozambique","1483",,786 2013,"Mozambique Channel Is.","1484",,770 2014,"Muko-jima","1486",,877 2015,"Murmansk","1488",,907 2016,"Murray I.","1489",,899 2017,"Mururoa","1490",,975 2018,"Muscat","1491",,880 2019,"Mussau","1492",,491 2020,"Mustique","1493",,1014 2021,"Myanmar","1494",,831 2022,"Myojin-jima","1495",,718 2023,"Nagaland","1496",,478 2024,"Nagar Haveli","1497",,684 2025,"Nagorno Karabakh","1498",,963 2026,"Nakano-shima","1499",,857 2027,"Nakhichevan","1500",,962 2028,"Namibia","1502",,832 2029,"Namonuito","1503",,612 2030,"Nan-sha","1504",,920 2031,"Nansei-Shoto","1506",,857 2032,"Nanumanga","1507",,980 2033,"Nanumea","1508",,980 2034,"Nanusa Is.","1509",,943 2035,"Narcondom I.","1510",,464 2036,"Nassau I.","1511",,970 2037,"Natuna Is.","1513",,501 2038,"Nauru","1514",,859 2039,"Navassa I.","1515",,670 2040,"Naxos","1516",,662 2041,"Nayarit","1517",,824 2042,"Ndeni I.","1518",,921 2043,"Near I.","1519",,462 2044,"Nebraska","1520",,844 2045,"Necker I.","1521",,671 2046,"Negeri Sembilan","1522",,779 2047,"Negros","1525",,891 2048,"Nei Mongol","1526",,551 2049,"Nepal","1527",,845 2050,"Netherlands","1528",,846 2051,"Netherlands Antilles","1529",,291 2052,"Netherlands Leeward Is.","1531",,753 2053,"Neuquén","1532",,443 2054,"Nevada","1533",,847 2055,"Nevis","1534",,754 2056,"New Brunswick","1535",,834 2057,"New Britain","1536",,491 2058,"New Caledonia","1537",,866 2059,"New Georgia","1538",,934 2060,"New Guinea","1539",,301 2061,"New Hampshire","1540",,869 2062,"New Hanover","1541",,491 2063,"New Ireland","1543",,491 2064,"New Jersey","1544",,870 2065,"New Mexico","1545",,871 2066,"New Providence","1546",,484 2067,"New South Wales","1548",,862 2068,"New South Wales","1549",,296 2069,"New York","1550",,873 2070,"New Zealand North","1551",,874 2071,"New Zealand South","1552",,875 2072,"Newfoundland I.","1553",,850 2073,"Newfoundland","1554",,287 2074,"Ngatik","1555",,612 2075,"Nias","1556",,944 2076,"Nicaragua","1557",,854 2077,"Nicaraguan Caribbean Is.","1558",,949 2078,"Nicholson I.","1559",,864 2079,"Nicobar Is.","1560",,836 2080,"Niger","1561",,853 2081,"Nigeria","1562",,852 2082,"Nightingale I.","1563",,964 2083,"Nihoa","1564",,671 2084,"Nii-jima","1565",,718 2085,"Niihua","1566",,671 2086,"Nikumaroro","1567",,892 2087,"Nikunau","1568",,658 2088,"Ningxia","1570",,552 2089,"Ninigo Is.","1571",,491 2090,"Nishino-shima","1572",,877 2091,"Nissan","1573",,933 2092,"Niuafoou","1574",,973 2093,"Niuatoputapu","1575",,973 2094,"Niue","1576",,864 2095,"Niulakita","1577",,980 2096,"Niutao","1578",,980 2097,"Nizhny Novgorod","1579",,905 2098,"Nomuka","1580",,973 2099,"Norfolk I.","1581",,849 2100,"North Carolina","1584",,835 2101,"North Caucasus","1585",,280 2102,"North Dakota","1586",,843 2103,"North Korea","1587",,731 2104,"North Solomons","1588",,933 2105,"North Yemen","1589",,1022 2106,"Northern Ireland","1590",,708 2107,"Northern Marianas","1591",,789 2108,"Northern Territory","1593",,863 2109,"Northwest Territories","1594",,305 2110,"Norway","1595",,858 2111,"Norwegian Antarctic Territory","1596",,467 2112,"Nottingham I.","1597",,872 2113,"Nova Scotia","1598",,860 2114,"Novaya Zemlya","1599",,1017 2115,"Novgorod","1600",,909 2116,"Novosibirsk","1601",,1017 2117,"Novosibirskiye Ostrova","1602",,1021 2118,"Nueva Esparta","1603",,998 2119,"Nuevo León","1604",,807 2120,"Nuguria Is.","1605",,933 2121,"Nui","1606",,980 2122,"Nuku Hiva","1607",,790 2123,"Nukufetau","1608",,980 2124,"Nukulaelae","1609",,980 2125,"Nukumanu Is.","1610",,933 2126,"Nukunono","1612",,972 2127,"Nukuoro","1613",,612 2128,"Nupani I.","1614",,921 2129,"Oahu","1617",,671 2130,"Oaxaca","1618",,825 2131,"Obi Is.","1619",,782 2132,"Oeno I.","1622",,893 2133,"Ofu","1623",,912 2134,"Ogasawara-shoto","1624",,877 2135,"O'Higgins","1625",,585 2136,"Ohio","1626",,878 2137,"Oki","1627",,718 2138,"Okina Daito","1628",,857 2139,"Okinawa","1629",,857 2140,"Okinoeraba-shima","1630",,857 2141,"Oklahoma","1631",,879 2142,"Olosega","1632",,912 2143,"Oman","1633",,880 2144,"Omsk","1634",,1017 2145,"Onotoa","1635",,658 2146,"Ontario","1636",,881 2147,"Ontong Java","1637",,934 2148,"Orchila I.","1639",,998 2149,"Oregon","1640",,882 2150,"Orel","1641",,905 2151,"Orenburg","1642",,906 2152,"Orissa","1643",,697 2153,"Orkney Is.","1644",,661 2154,"Oroluk","1646",,612 2155,"Orona","1647",,892 2156,"O-shima","1648",,857 2157,"O-shima","1649",,718 2158,"Osumi-shoto","1651",,719 2159,"Pagan","1655",,789 2160,"Pahang","1656",,779 2161,"Pakistan","1657",,883 2162,"Pakistan East","1658",,486 2163,"Palau","1659",,613 2164,"Palau Is.","1660",,613 2165,"Palawan","1661",,891 2166,"Palestine","1662",,317 2167,"Palliser Is.","1663",,975 2168,"Palmyra I.","1665",,759 2169,"Panamá","1666",,886 2170,"Panamá Canal Zone","1667",,886 2171,"Panay","1668",,891 2172,"Pandaidori Is.","1669",,867 2173,"Pandora Bank","1670",,921 2174,"Pantelleria","1672",,928 2175,"Papua New Guinea","1673",,868 2176,"Pará","1674",,532 2177,"Paracel Is.","1675",,919 2178,"Paraguay","1676",,887 2179,"Paraíba","1677",,519 2180,"Paraná","1678",,536 2181,"Parang","1679",,721 2182,"Parece Vela","1680",,739 2183,"Paros","1681",,662 2184,"Parry Is.","1682",,872 2185,"Patagonia","1684",,65 2186,"Patmos","1685",,627 2187,"Patos I.","1686",,994 2188,"Paumotu","1687",,975 2189,"Peale I.","1688",,1000 2190,"Pedra da Gale","1689",,655 2191,"Pedro Cays","1690",,716 2192,"Pelagie Is.","1692",,928 2193,"Peloponnisos","1693",,662 2194,"Pemba I.","1694",,954 2195,"P'eng-hu Lieh-tao","1696",,953 2196,"Penida","1697",,761 2197,"Pennisular Malaysia","1698",,779 2198,"Penju Is.","1699",,782 2199,"Pennsylvania","1700",,889 2200,"Pentecost I.","1702",,993 2201,"Penza","1703",,905 2202,"Perak","1704",,779 2203,"Perim","1705",,1023 2204,"Perlas Is.","1706",,886 2205,"Perlis","1707",,779 2206,"Perm","1708",,906 2207,"Pernambuco","1709",,520 2208,"Peru","1711",,890 2209,"Peter I Oy","1713",,467 2210,"Petite Terre, Isles de la","1714",,751 2211,"Philippines","1715",,891 2212,"Phillip I.","1716",,849 2213,"Phoenix Is.","1717",,892 2214,"Phu Quoc","1718",,997 2215,"Piauí","1719",,521 2216,"Pico","1720",,483 2217,"Pinang","1721",,779 2218,"Pingelap","1723",,612 2219,"Pinipel I.","1724",,933 2220,"Pins, Ile des","1726",,866 2221,"Pinta I.","1727",,649 2222,"Pitcairn","1728",,893 2223,"Pitcairn Is.","1729",,893 2224,"Pitt I.","1730",,616 2225,"Platte Is.","1731",,459 2226,"Pohnpei","1732",,612 2227,"Poivre","1733",,459 2228,"Poland","1734",,894 2229,"Pondicherry","1736",,698 2230,"Porto Santo","1738",,773 2231,"Portugal","1739",,895 2232,"Portuguese Congo","1740",,466 2233,"Possession I.","1745",,614 2234,"Praslin I.","1747",,925 2235,"Preparis I.","1750",,465 2236,"Pribilov Is.","1751",,472 2237,"Primorye","1753",,896 2238,"Prince Edward I.","1754",,888 2239,"Prince Edward I.","1755",,787 2240,"Prince of Wales I.","1756",,472 2241,"Prince of Wales I.","1757",,872 2242,"Prince of Wales I.","1759",,899 2243,"Princess Elizabeth Land","1760",,467 2244,"Principe","1761",,655 2245,"Providence group","1762",,459 2246,"Providence I.","1763",,459 2247,"Providencia I.","1764",,947 2248,"Psara","1765",,627 2249,"Pskov","1766",,909 2250,"Puebla","1767",,799 2251,"Puerto Rico","1768",,897 2252,"Pukapuka","1769",,970 2253,"Pukapuka","1770",,975 2254,"Pulo Ana","1771",,613 2255,"Punjab","1772",,699 2256,"Punjab","1773",,883 2257,"Purdy Is.","1774",,491 2258,"Qatar","1775",,664 2259,"Qinghai","1776",,123 2260,"Québec","1777",,900 2261,"Queen Charlotte Is.","1778",,506 2262,"Queen Elizabeth Is.","1779",,872 2263,"Queen Mary Land","1780",,467 2264,"Queensland","1781",,899 2265,"Queensland","1782",,330 2266,"Querétaro","1785",,808 2267,"Quintana Roo","1786",,828 2268,"Quita Sueño","1787",,947 2269,"Rabi","1788",,640 2270,"Raeffsky Is.","1789",,975 2271,"Ragged I.","1790",,484 2272,"Raiatea","1791",,918 2273,"Raivavae","1792",,976 2274,"Rajasthan","1793",,700 2275,"Rajaswaree Reef","1794",,459 2276,"Rakahanga","1795",,970 2277,"Ralik chain","1796",,791 2278,"Rangiroa","1798",,975 2279,"Raoul I.","1799",,728 2280,"Rapa-Iti","1802",,976 2281,"Raroia","1803",,975 2282,"Rarotonga","1804",,602 2283,"Rasa-shima","1806",,857 2284,"Ratak chain","1807",,791 2285,"Rawaki","1808",,892 2286,"Redonda","1809",,747 2287,"Remire","1811",,459 2288,"Rennell I.","1812",,934 2289,"Réunion","1813",,901 2290,"Revillagigedo Is.","1814",,815 2291,"Rhode I.","1815",,902 2292,"Riau Is.","1820",,944 2293,"Rimatara","1821",,976 2294,"Rio de Janeiro","1822",,526 2295,"Rio Grande do Norte","1824",,522 2296,"Rio Grande do Sul","1825",,537 2297,"Rio Negro","1827",,444 2298,"Roatan","1828",,948 2299,"Robinson Crusoe I.","1829",,722 2300,"Roca Catedral","1830",,626 2301,"Rocas Alijos","1831",,814 2302,"Rockall","1832",,661 2303,"Rhodos","1833",,627 2304,"Rodrigues","1834",,903 2305,"Rolas Is.","1835",,656 2306,"Romania","1836",,904 2307,"Roncador Cay","1837",,947 2308,"Ronde","1838",,1011 2309,"Rondônia","1839",,534 2310,"Roraima","1841",,533 2311,"Rose I.","1842",,912 2312,"Ross Dependency","1843",,467 2313,"Rossel I.","1844",,868 2314,"Rostov","1845",,908 2315,"Rota","1846",,789 2316,"Rotuma","1847",,640 2317,"Round I.","1848",,769 2318,"Rurutu","1851",,976 2319,"Russell Is.","1852",,934 2320,"Rwanda","1859",,910 2321,"Ryazan","1860",,905 2322,"Ryukyu Is.","1861",,857 2323,"Saba","1862",,753 2324,"Sabah","1863",,502 2325,"Sabalana Is.","1864",,943 2326,"Sable I.","1865",,860 2327,"Sable I.","1866",,866 2328,"Saibai I.","1867",,899 2329,"Saintes, Iles des","1868",,751 2330,"Saipan","1869",,789 2331,"Sakala","1870",,721 2332,"Sakhalin","1871",,911 2333,"Sakishima-gunto","1872",,857 2334,"Sala y Gomez","1873",,628 2335,"Salta","1874",,452 2336,"Salvador, El","1875",,635 2337,"Salvage Is.","1876",,923 2338,"Samana Cay","1877",,484 2339,"Samar","1878",,891 2340,"Samara","1879",,906 2341,"Samhah I.","1880",,932 2342,"Samoa","1881",,343 2343,"Samos","1882",,627 2344,"Samothraki","1884",,662 2345,"San Ambrosio I.","1885",,626 2346,"San Andrés I.","1886",,947 2347,"San Clemente I.","1887",,541 2348,"San Cristobal","1888",,649 2349,"San Cristobal","1889",,934 2350,"San Felix I.","1890",,626 2351,"San Juan","1891",,454 2352,"San Luis","1892",,455 2353,"San Luis Potosí","1893",,809 2354,"San Marino","1894",,713 2355,"San Miguel I.","1895",,541 2356,"San Nicolas I.","1896",,541 2357,"San Salvador","1897",,484 2358,"San Salvador","1898",,649 2359,"Sanak I.","1899",,462 2360,"Sand I.","1900",,673 2361,"Sangir Is.","1902",,943 2362,"Santa Catalina I.","1903",,541 2363,"Santa Catarina","1904",,538 2364,"Santa Cruz I.","1905",,541 2365,"Santa Cruz I.","1906",,649 2366,"Santa Cruz Is.","1907",,921 2367,"Santa Cruz","1908",,445 2368,"Santa Fé","1909",,446 2369,"Santa Isabel","1910",,934 2370,"Santa Maria","1911",,483 2371,"Santa Maria I.","1912",,993 2372,"Santa Maria I.","1913",,649 2373,"Santa Rosa I.","1914",,541 2374,"Santiago","1916",,586 2375,"Santiago del Estero","1917",,453 2376,"Sao Jorge","1919",,483 2377,"São Paulo","1920",,527 2378,"São Pedro e São Paulo","1921",,517 2379,"São Tomé","1922",,656 2380,"Sarangani Is.","1923",,891 2381,"Saratov","1924",,908 2382,"Sarawak","1925",,503 2383,"Sardegna","1926",,914 2384,"Saria","1928",,734 2385,"Sarigan","1929",,789 2386,"Sark","1930",,644 2387,"Saskatchewan","1931",,915 2388,"Saudi Arabia","1932",,916 2389,"Savaii","1933",,913 2390,"Savu","1934",,763 2391,"Scotland","1937",,661 2392,"Scott I.","1938",,467 2393,"Seal Cays","1939",,956 2394,"Seal I.","1940",,671 2395,"Selangor","1942",,779 2396,"Selvagens","1943",,923 2397,"Senegal","1944",,924 2398,"Senkaku-gunto","1945",,857 2399,"Sepanjang","1946",,721 2400,"Seram","1947",,782 2401,"Serbia","1948",,1029 2402,"Sergeya Kirova Ostrova","1949",,733 2403,"Sergipe","1950",,523 2404,"Sermata Is.","1951",,763 2405,"Serrana Bank","1952",,947 2406,"Serranilla Bank","1953",,947 2407,"Sete Pedras Is.","1954",,656 2408,"Severnaya Zemlya","1955",,733 2409,"Severo-Osetiya","1956",,841 2410,"Seychelles","1957",,925 2411,"Shaanxi","1958",,559 2412,"Shag Rocks","1959",,926 2413,"Shandong","1960",,560 2414,"Shanghai","1961",,571 2415,"Shantarskiye Ostrova","1963",,730 2416,"Shanxi","1965",,561 2417,"Shepherd I.","1968",,993 2418,"Shetland Is.","1969",,661 2419,"Shikine-jima","1970",,718 2420,"Shikoku","1971",,720 2421,"Shikotan","1972",,737 2422,"Shortland Is.","1973",,934 2423,"Sichuan","1976",,548 2424,"Sicilia","1977",,928 2425,"Sicilia","1978",,356 2426,"Sicily","1979",,928 2427,"Sierra Leone","1980",,929 2428,"Sikkim","1981",,634 2429,"Silhouette I.","1982",,925 2430,"Simeulue","1983",,944 2431,"Simi","1984",,627 2432,"Sinai","1985",,930 2433,"Sinaloa","1986",,818 2434,"Sind","1987",,883 2435,"Singapore","1988",,780 2436,"Sint Eustatius","1991",,753 2437,"Sint Maarten","1992",,753 2438,"Sirna","1993",,662 2439,"Skiros","1995",,662 2440,"Skopelos Kaloyeroi","1996",,662 2441,"Smolensk","1998",,905 2442,"Snake I.","1999",,748 2443,"Snares I.","2000",,875 2444,"Society Is.","2001",,918 2445,"Socotra","2002",,932 2446,"Sofu-gan","2003",,718 2447,"Solomon Is.","2005",,361 2448,"Solor Is.","2006",,763 2449,"Somalia","2007",,935 2450,"Somaliland, British","2009",,935 2451,"Somaliland, Italian","2011",,935 2452,"Sombrero","2012",,748 2453,"Sonora","2013",,819 2454,"Sonsorol","2014",,613 2455,"South Australia","2017",,931 2456,"South Carolina","2018",,917 2457,"South China Sea","2019",,349 2458,"South Dakota","2020",,922 2459,"South Georgia","2021",,926 2460,"South Korea","2022",,732 2461,"South Orkney Is.","2023",,467 2462,"South Sandwich Is.","2024",,940 2463,"South Shetland Is.","2025",,467 2464,"South Solomons","2026",,934 2465,"South Yemen","2028",,1023 2466,"Southampton I.","2029",,865 2467,"Southwest Caribbean","2031",,372 2468,"Spain","2032",,938 2469,"Spain","2033",,363 2470,"Spitsbergen","2038",,946 2471,"Spratly Is.","2040",,920 2472,"Sri Lanka","2042",,939 2473,"St.Anne I.","2043",,925 2474,"St.Barthélémy","2044",,755 2475,"St.Brandon","2046",,769 2476,"St.Croix","2048",,756 2477,"St.Helena","2050",,941 2478,"St.John","2051",,756 2479,"St.Kilda","2052",,661 2480,"St.Kitts-Nevis","2053",,754 2481,"St.Kitts","2054",,754 2482,"St.Lawrence I.","2055",,472 2483,"St.Lucia","2056",,1013 2484,"St.Martin-St.Barthélémy","2057",,755 2485,"St.Martin","2058",,755 2486,"St.Matthew I.","2060",,472 2487,"St.Matthias Is.","2061",,491 2488,"St.Paul I.","2062",,473 2489,"St.Pierre","2064",,459 2490,"St.Pierre-Miquelon","2065",,851 2491,"St.Thomas","2066",,756 2492,"St.Vincent","2067",,1014 2493,"Starbuck I.","2068",,758 2494,"Stavropol","2069",,842 2495,"Stewart I.","2070",,875 2496,"Stewart Is.","2071",,934 2497,"Stoltenhoff I.","2072",,964 2498,"Stromboli","2073",,928 2499,"Sudan","2074",,942 2500,"Sula Is.","2075",,782 2501,"Sulawesi","2076",,943 2502,"Sulu Is.","2077",,891 2503,"Sumatera","2078",,944 2504,"Sumba","2080",,763 2505,"Sumbawa","2081",,763 2506,"Sumisu-jima","2082",,718 2507,"Sunda","2083",,763 2508,"Surinam","2085",,945 2509,"Suvorov I.","2086",,970 2510,"Suwanose-jima","2087",,857 2511,"Svalbard","2089",,946 2512,"Sverdlovsk","2090",,1017 2513,"Swains I.","2092",,971 2514,"Swallow Is.","2093",,921 2515,"Swallow Reef","2094",,920 2516,"Swan Is.","2095",,948 2517,"Swat","2096",,883 2518,"Swaziland","2097",,952 2519,"Sweden","2098",,950 2520,"Switzerland","2099",,951 2521,"Sylhet","2101",,486 2522,"Syria","2102",,744 2523,"Tabar Is.","2105",,491 2524,"Tabasco","2106",,829 2525,"Tabiteuea","2107",,658 2526,"Table I.","2108",,465 2527,"Tabuaeran","2109",,758 2528,"Tadzhikistan","2110",,986 2529,"Tafahi","2111",,973 2530,"Tahaa","2112",,918 2531,"Tahiti","2113",,918 2532,"Taiwan","2114",,953 2533,"Talaud Is.","2116",,943 2534,"Tamana","2117",,658 2535,"Tamaulipas","2118",,810 2536,"Tambelan Is.","2119",,501 2537,"Tambov","2120",,905 2538,"Tamil Nadu","2121",,701 2539,"Tanega","2123",,857 2540,"Tanga Is.","2124",,491 2541,"Tanimbar Is.","2127",,763 2542,"Tanna","2128",,993 2543,"Tanzania","2129",,954 2544,"Tarapacá","2130",,591 2545,"Tarawa","2131",,658 2546,"Tasmania","2133",,955 2547,"Tartariya","2134",,906 2548,"Tau","2135",,912 2549,"Tauu Is.","2136",,933 2550,"Taveuni","2137",,640 2551,"Tawitawi","2138",,891 2552,"Taymyr","2139",,733 2553,"Tenasserim","2141",,831 2554,"Tenerife","2143",,597 2555,"Tengah Is.","2144",,943 2556,"Tennessee","2145",,965 2557,"Teraina","2146",,758 2558,"Terceira","2147",,483 2559,"Terengganu","2148",,779 2560,"Terra Adelie","2149",,467 2561,"Terre de Bas","2150",,751 2562,"Terre de Haut","2151",,751 2563,"Testigos, Los","2152",,998 2564,"Tetiaroa","2153",,918 2565,"Texas","2154",,966 2566,"Thailand","2155",,967 2567,"Thasos","2156",,662 2568,"The Gambia","2157",,650 2569,"The Netherlands","2158",,846 2570,"Thira","2159",,662 2571,"Thitu Is.","2160",,920 2572,"Three Kings Is.","2161",,874 2573,"Thursday I.","2162",,899 2574,"Tianjin","2163",,558 2575,"Tibet-Qinghai","2165",,125 2576,"Tierra del Fuego (Argentina)","2168",,447 2577,"Tierra del Fuego (Chile)","2169",,594 2578,"Tikopia I.","2170",,921 2579,"Tilos","2171",,627 2580,"Timor","2172",,763 2581,"Tinhosa I.","2173",,655 2582,"Tinian","2174",,789 2583,"Tinos","2175",,662 2584,"Tlaxcala","2176",,800 2585,"To-shima","2177",,718 2586,"Tobago","2178",,974 2587,"Tobago I.","2179",,750 2588,"Tobi","2180",,613 2589,"Tocantins","2181",,535 2590,"Tofua","2182",,973 2591,"Togo","2183",,969 2592,"Tok-to","2184",,718 2593,"Tokara-retto","2185",,857 2594,"Tokuno-shima","2187",,857 2595,"Tolokiwa I.","2188",,491 2596,"Tomsk","2189",,1017 2597,"Tonga","2190",,973 2598,"Tongareva","2191",,970 2599,"Tongatapu Is.","2192",,973 2600,"Tonkin","2193",,997 2601,"Tori-shima","2194",,718 2602,"Torres Is.","2195",,993 2603,"Tortola","2196",,750 2604,"Tortuga, La","2197",,998 2605,"Transcaucasus","2198",,380 2606,"Transkei","2200",,608 2607,"Treasury Is.","2202",,934 2608,"Tregosse Islets","2203",,898 2609,"Trindade","2205",,528 2610,"Trinidad","2206",,974 2611,"Trinidad-Tobago","2207",,974 2612,"Tripura","2208",,479 2613,"Tristan da Cunha","2209",,964 2614,"Trobriand Is.","2210",,868 2615,"Tromelin I.","2211",,901 2616,"Truk","2213",,612 2617,"Tsushima","2215",,719 2618,"Tuamotu","2216",,975 2619,"Tubuai I.","2217",,976 2620,"Tucumán","2218",,456 2621,"Tukangbesi Is.","2219",,943 2622,"Tula","2220",,908 2623,"Tunisia","2221",,978 2624,"Turkey","2222",,979 2625,"Turkey-in-Europe","2223",,977 2626,"Turkmenistan","2224",,968 2627,"Turks Is.","2226",,956 2628,"Turks-Caicos Is.","2227",,956 2629,"Turtle I.","2228",,898 2630,"Turtle I.","2229",,1004 2631,"Tutuila","2230",,912 2632,"Tuva","2231",,981 2633,"Tuvalu","2232",,980 2634,"Tuvinskaya A.S.S.R.","2233",,981 2635,"Tver","2234",,905 2636,"Tyumen","2235",,1017 2637,"U.S. Line Is.","2236",,759 2638,"Ua Huka","2237",,790 2639,"Ubangui","2239",,540 2640,"Udmurtiya","2241",,906 2641,"Uganda","2242",,987 2642,"Ukraine","2245",,989 2643,"Ullung do","2246",,732 2644,"Ulyanovsk","2247",,905 2645,"Umboi","2248",,491 2646,"Umm Al-Qaywayn","2249",,665 2647,"Unimak I.","2250",,462 2648,"Union Is.","2251",,972 2649,"Union","2252",,1014 2650,"United Arab Emirates","2253",,665 2651,"Ust-Ordinskiy Buryat","2259",,709 2652,"Ustica","2260",,928 2653,"Utah","2261",,991 2654,"Uttar Pradesh","2262",,702 2655,"Utupua I.","2263",,921 2656,"Uvea","2264",,1001 2657,"Uzbekistan","2265",,992 2658,"Vaitupu","2266",,980 2659,"Valparaíso","2267",,587 2660,"Vancouver I.","2268",,506 2661,"Vanikoro I.","2269",,921 2662,"Vanua Lava","2270",,993 2663,"Vamua Levu","2271",,640 2664,"Vanuatu","2272",,993 2665,"Vatican City","2274",,714 2666,"Vatoa Is.","2275",,640 2667,"Vatulele","2276",,640 2668,"Vavau Is.","2277",,973 2669,"Venda","2278",,397 2670,"Venezuela","2279",,994 2671,"Venezuelan Antilles","2280",,998 2672,"Veracruz","2281",,812 2673,"Vereker Banks","2282",,566 2674,"Vermont","2283",,995 2675,"Victoria","2284",,996 2676,"Vieques I.","2285",,897 2677,"Vietnam","2286",,997 2678,"Vietnam, North","2287",,997 2679,"Vietnam, South","2288",,997 2680,"Virgin Gorda","2289",,750 2681,"Virgin Is.","2290",,756 2682,"Virgin Is.","2291",,750 2683,"Virginia","2292",,999 2684,"Viti Levu","2293",,640 2685,"Vladimir","2295",,905 2686,"Vojvodina","2296",,1029 2687,"Volgograd","2298",,908 2688,"Vologda","2299",,907 2689,"Voriai Sporadhes","2300",,662 2690,"Voronezh","2301",,905 2691,"Vostok I.","2302",,758 2692,"Vrangelya Ostrova","2303",,764 2693,"Waigeo","2304",,867 2694,"Wake I.","2305",,1000 2695,"Wales","2306",,661 2696,"Walfish Bay","2307",,832 2697,"Wallis Is.","2308",,1001 2698,"Wallis-Futuna Is.","2309",,1001 2699,"Walpole I.","2310",,866 2700,"Walvis Bay","2311",,832 2701,"Washington DC","2312",,1005 2702,"Washington I.","2313",,758 2703,"Washington","2314",,1002 2704,"Wenman I.","2316",,649 2705,"West Bengal","2317",,703 2706,"West Berlin","2318",,652 2707,"West Germany","2320",,652 2708,"West Kazakhstan","2322",,908 2709,"West Siberia","2324",,1017 2710,"West Virginia","2325",,1018 2711,"Western Australia","2326",,1004 2712,"Western Australia","2327",,414 2713,"Western Sahara","2328",,1016 2714,"Western Samoa","2329",,913 2715,"Wetar","2330",,763 2716,"White Russia","2332",,493 2717,"Wilkes I.","2333",,1000 2718,"Wilkes Land","2334",,467 2719,"Willis Is.","2335",,898 2720,"Windward Is.","2336",,417 2721,"Windward Is.","2337",,480 2722,"Windward Is.","2338",,918 2723,"Winslow Reef","2339",,892 2724,"Wisconsin","2340",,1015 2725,"Witu Is.","2341",,491 2726,"Woleai","2342",,612 2727,"Woodlark I.","2343",,868 2728,"Wotje","2344",,791 2729,"Wuvulu I.","2346",,491 2730,"Wyoming","2347",,1019 2731,"Xinjiang","2349",,579 2732,"Xizang","2351",,563 2733,"Yaku-shima","2352",,719 2734,"Yakutskiya","2353",,1021 2735,"Yamalo-Nenets","2354",,1017 2736,"Yanam","2355",,704 2737,"Yap","2356",,612 2738,"Yapen","2357",,867 2739,"Yaroslavl","2358",,905 2740,"Yasawa Is.","2359",,640 2741,"Yemen","2361",,425 2742,"Yemen, People's Democratic Republic of","2362",,1023 2743,"Yevreysk","2363",,730 2744,"Yianisadhes","2364",,734 2745,"Yonaguni","2365",,857 2746,"Young I.","2366",,467 2747,"Yucatán","2367",,830 2748,"Yugo-Osetiya","2368",,961 2749,"Yugoslavia","2369",,426 2750,"Yukon","2370",,1031 2751,"Yunnan","2371",,549 2752,"Zacatecas","2372",,811 2753,"Zafora","2373",,662 2754,"Zaire","2374",,1032 2755,"Zakinthos","2375",,662 2756,"Zambia","2376",,1033 2757,"Zanzibar","2378",,954 2758,"Zhejiang","2380",,577 2759,"Zimbabwe","2381",,1034 2760,"Zufar","2382",,880 2761,"Zululand","2383",,833 2762,"African Is.","2387",,459 2763,"Arabian Peninsula","2389",,30 2764,"Bendel Province, Nigeria","2390",,852 2765,"Islas las Aves","2391",,998 2766,"Kefallinia","2393",,662 2767,"Zemlya Frantsa-Iosifa","2394",,1017 2768,"Johor","2395",,779 2769,"Kalmykyia","2396",,908 2770,"Mamanuca Is.","2397",,640 2771,"Ile des Pins","2398",,866 2772,"Isla de Juventud","2399",,617 2773,"Ra's al Khaymah","2400",,665 2774,"Tanger","2401",,784 2775,"Uruguay","2402",,990 2776,"Lindsay Is.","2405",,934 2777,"Czech Republic","2407",,620 2778,"Slovakia","2408",,621 2779,"Slovenia","2409",,1030 2780,"Islas Chafarinas","2410",,785 2781,"Penon de Velez de la Gomera","2412",,785 2782,"Penon de Alhucemas","2413",,785 2783,"Northern Cape Province","2414",,609 2784,"Eastern Cape Province","2415",,608 2785,"Western Cape Province","2416",,610 2786,"Northern Province","2417",,984 2787,"North West Province","2418",,985 2788,"Gauteng","2419",,982 2789,"Mpumalanga","2420",,983 2790,"Northern Provinces","2421",,397 2791,"Free State","2422",,876 2792,"KwaZulu Natal","2423",,833 2793,"Garhwal","2424",,1008 2794,"Kumaon","2425",,1008 2795,"Uttaranchal","2426",,1008 2796,"West Himalaya","2428",,416 2797,"East Himalaya","2429",,161 2798,"Tokelau","2431",,972 2799,"Tokelau-Manihiki","2432",,387 2800,"Chile Central","2433",,128 2801,"Sado I.","2434",,718 2802,"Awaji-shoto","2435",,718 2803,"Shodo-shoto","2436",,720 2804,"Ie-shima","2437",,718 2805,"Te-shima","2438",,720 2806,"Yashiro-jima","2439",,718 2807,"Nako-jima","2440",,720 2808,"Kurahashi-jima","2441",,718 2809,"Uoshima","2442",,720 2810,"Omi-shoto","2443",,720 2811,"Inno-shima","2444",,718 2812,"Hakata-shima","2445",,720 2813,"Heigun-to","2446",,718 2814,"Ya-shima","2447",,718 2815,"Hime-shima","2448",,719 2816,"Naga-shima","2449",,718 2817,"Koshiki-jima","2450",,719 2818,"Goto-retto","2451",,719 2819,"Iki","2452",,719 2820,"Rebun-to","2453",,717 2821,"Rishiri-to","2455",,717 2822,"Izu Is.","2456",,718 2823,"Oki Is.","2457",,718 2824,"Dozen","2458",,718 2825,"Dogo","2459",,718 2826,"Gaja-jima","2460",,857 2827,"Io-jima","2461",,739 2828,"Kita-io-jima","2462",,739 2829,"Minami-io-jima","2463",,739 2830,"Yome-jima","2464",,877 2831,"Yonakuni","2465",,857 2832,"Fukue","2466",,719 2833,"Okushiri-to","2467",,717 2834,"Ukraine","2473",,400 2835,"Eritrea","2474",,637 2836,"Central European Russia","2475",,336 2837,"East European Russia","2476",,906 2838,"North European Russia","2477",,907 2839,"Northwest European Russia","2480",,909 2840,"Jharkhand","2487",,1035 2841,"Chattisgarh","2488",,1036 2842,"Cultivated",,, bauble-0.9.7/bauble/plugins/plants/default/family.txt0000644000175000017500000002314611210626427021674 0ustar brettbrett"id","family" 1,"Acanthaceae" 2,"Aceraceae" 3,"Achariaceae" 4,"Achatocarpaceae" 5,"Acoraceae" 6,"Actinidiaceae" 7,"Actiniopteridaceae" 8,"Adiantaceae" 9,"Adoxaceae" 10,"Aextoxicaceae" 11,"Agavaceae" 12,"Agdestidaceae" 13,"Aizoaceae" 14,"Akaniaceae" 15,"Alangiaceae" 16,"Alismataceae" 17,"Alliaceae" 18,"Aloaceae" 19,"Alseuosmiaceae" 20,"Alstroemeriaceae" 21,"Alzateaceae" 22,"Amaranthaceae" 23,"Amaryllidaceae" 24,"Amborellaceae" 25,"Anacardiaceae" 26,"Anarthriaceae" 27,"Ancistrocladaceae" 28,"Anisophylleaceae" 29,"Annonaceae" 30,"Anthericaceae" 31,"Aphyllanthaceae" 32,"Apocynaceae" 33,"Aponogetonaceae" 34,"Aquifoliaceae" 35,"Araceae" 36,"Araliaceae" 37,"Aralidiaceae" 38,"Araucariaceae" 39,"Aristolochiaceae" 40,"Asclepiadaceae" 41,"Asparagaceae" 42,"Asphodelaceae" 43,"Aspleniaceae" 44,"Asteliaceae" 45,"Asteropeiaceae" 46,"Aucubaceae" 47,"Austrobaileyaceae" 48,"Avicenniaceae" 49,"Azollaceae" 50,"Balanitaceae" 51,"Balanopaceae" 52,"Balanophoraceae" 53,"Balsaminaceae" 54,"Barbeuiaceae" 55,"Barbeyaceae" 56,"Basellaceae" 57,"Bataceae" 58,"Begoniaceae" 59,"Berberidaceae" 60,"Betulaceae" 61,"Bignoniaceae" 62,"Bixaceae" 63,"Blandfordiaceae" 64,"Blechnaceae" 65,"Bombacaceae" 66,"Boraginaceae" 67,"Boweniaceae" 68,"Bretschneideraceae" 69,"Bromeliaceae" 70,"Brunelliaceae" 71,"Bruniaceae" 72,"Buddlejaceae" 73,"Burmanniaceae" 74,"Burseraceae" 75,"Butomaceae" 76,"Buxaceae" 77,"Byblidaceae" 78,"Cabombaceae" 79,"Cactaceae" 80,"Calectasiaceae" 81,"Callitrichaceae" 82,"Calycanthaceae" 83,"Calyceraceae" 84,"Campanulaceae" 85,"Canellaceae" 86,"Cannabaceae" 87,"Cannaceae" 88,"Canotiaceae" 89,"Capparaceae" 90,"Caprifoliaceae" 91,"Cardiopteridaceae" 92,"Caricaceae" 93,"Carlemanniaceae" 94,"Caryocaraceae" 95,"Caryophyllaceae" 96,"Casuarinaceae" 97,"Cecropiaceae" 98,"Celastraceae" 99,"Centrolepidaceae" 100,"Cephalotaceae" 101,"Cephalotaxaceae" 102,"Ceratophyllaceae" 103,"Cercidiphyllaceae" 104,"Cheiropleuriaceae" 105,"Chenopodiaceae" 106,"Chloranthaceae" 107,"Chrysobalanaceae" 108,"Circaeasteraceae" 109,"Cistaceae" 110,"Clethraceae" 111,"Cneoraceae" 112,"Cobaeaceae" 113,"Cochlospermaceae" 114,"Colchicaceae" 115,"Columelliaceae" 116,"Combretaceae" 117,"Commelinaceae" 118,"Asteraceae" 119,"Connaraceae" 120,"Convallariaceae" 121,"Convolvulaceae" 122,"Coriariaceae" 123,"Cornaceae" 124,"Corsiaceae" 125,"Corylaceae" 126,"Corynocarpaceae" 127,"Costaceae" 128,"Crassulaceae" 129,"Crossosomataceae" 130,"Brassicaceae" 131,"Crypteroniaceae" 132,"Ctenolophonaceae" 133,"Cucurbitaceae" 134,"Cunoniaceae" 135,"Cupressaceae" 136,"Cyanastraceae" 137,"Cyatheaceae" 138,"Cycadaceae" 139,"Cyclanthaceae" 140,"Cyclocheilaceae" 141,"Cymodoceaceae" 142,"Cynomoriaceae" 143,"Cyperaceae" 144,"Cyrillaceae" 145,"Daphniphyllaceae" 146,"Dasypogonaceae" 147,"Datiscaceae" 148,"Davalliaceae" 149,"Davidsoniaceae" 150,"Degeneriaceae" 151,"Dennstaedtiaceae" 152,"Dialypetalanthaceae" 153,"Diapensiaceae" 154,"Dichapetalaceae" 155,"Dicksoniaceae" 156,"Didiereaceae" 157,"Didymelaceae" 158,"Diegodendraceae" 159,"Dilleniaceae" 160,"Dioncophyllaceae" 161,"Dioscoreaceae" 162,"Dipentodontaceae" 163,"Dipsacaceae" 164,"Dipteridaceae" 165,"Dipterocarpaceae" 166,"Doryanthaceae" 167,"Dracaenaceae" 168,"Droseraceae" 169,"Dryopteridaceae" 170,"Duckeodendraceae" 171,"Ebenaceae" 172,"Ecdeiocoleaceae" 173,"Elaeagnaceae" 174,"Elaeocarpaceae" 175,"Elatinaceae" 176,"Emblingiaceae" 177,"Empetraceae" 178,"Epacridaceae" 179,"Ephedraceae" 180,"Equisetaceae" 181,"Eremolepidaceae" 182,"Eremosynaceae" 183,"Ericaceae" 184,"Eriocaulaceae" 185,"Eriospermaceae" 186,"Erythroxylaceae" 187,"Escalloniaceae" 188,"Eucommiaceae" 189,"Eucryphiaceae" 190,"Euphorbiaceae" 191,"Euphroniaceae" 192,"Eupomatiaceae" 193,"Eupteleaceae" 194,"Fagaceae" 195,"Flacourtiaceae" 196,"Flagellariaceae" 197,"Fouquieriaceae" 198,"Frankeniaceae" 199,"Garryaceae" 200,"Geissolomataceae" 201,"Gentianaceae" 202,"Geraniaceae" 203,"Gesneriaceae" 204,"Ginkgoaceae" 205,"Gisekiaceae" 206,"Glaucidiaceae" 207,"Gleicheniaceae" 208,"Globulariaceae" 209,"Gnetaceae" 210,"Goetzeaceae" 211,"Gomortegaceae" 212,"Goodeniaceae" 213,"Goupiaceae" 214,"Poaceae" 215,"Grammitidaceae" 216,"Greyiaceae" 217,"Griseliniaceae" 218,"Grossulariaceae" 219,"Grubbiaceae" 220,"Gunneraceae" 221,"Clusiacea" 222,"Gyrostemonaceae" 223,"Haemodoraceae" 224,"Halophytaceae" 225,"Haloragaceae" 226,"Hamamelidaceae" 227,"Hanguanaceae" 228,"Hectorellaceae" 229,"Heliconiaceae" 230,"Helwingiaceae" 231,"Hemerocallidaceae" 232,"Hernandiaceae" 233,"Herreriaceae" 234,"Himantandraceae" 235,"Hippocastanaceae" 236,"Hippuridaceae" 237,"Hoplestigmataceae" 238,"Hostaceae" 239,"Huaceae" 240,"Humiriaceae" 241,"Hyacinthaceae" 242,"Hydatellaceae" 243,"Hydnoraceae" 244,"Hydrangeaceae" 245,"Hydrocharitaceae" 246,"Hydrophyllaceae" 247,"Hydrostachyaceae" 248,"Hymenophyllaceae" 249,"Hymenophyllopsidaceae" 250,"Hypoxidaceae" 251,"Icacinaceae" 252,"Idiospermaceae" 253,"Illecebraceae" 254,"Illiciaceae" 255,"Iridaceae" 256,"Irvingiaceae" 257,"Isoetaceae" 258,"Ixioliriaceae" 259,"Ixonanthaceae" 260,"Joinvilleaceae" 261,"Juglandaceae" 262,"Juncaceae" 263,"Juncaginaceae" 264,"Krameriaceae" 265,"Lamiaceae" 266,"Lacistemataceae" 267,"Lactoridaceae" 268,"Lanariaceae" 269,"Lardizabalaceae" 270,"Lauraceae" 271,"Lecythidaceae" 272,"Leeaceae" 273,"Fabaceae" 274,"Leitneriaceae" 275,"Lemnaceae" 276,"Lennoaceae" 277,"Lentibulariaceae" 278,"Lepidobotryaceae" 279,"Lilaeaceae" 280,"Liliaceae" 281,"Limnanthaceae" 282,"Limnocharitaceae" 283,"Linaceae" 284,"Lissocarpaceae" 285,"Loasaceae" 286,"Loganiaceae" 287,"Lomandraceae" 288,"Lomariopsidaceae" 289,"Lophopyxidaceae" 290,"Loranthaceae" 291,"Lowiaceae" 292,"Loxsomataceae" 293,"Lycopodiaceae" 294,"Lythraceae" 295,"Magnoliaceae" 296,"Malesherbiaceae" 297,"Malpighiaceae" 298,"Malvaceae" 299,"Marantaceae" 300,"Marattiaceae" 301,"Marcgraviaceae" 302,"Marsileaceae" 303,"Matoniaceae" 304,"Mayacaceae" 305,"Medusagynaceae" 306,"Medusandraceae" 307,"Melanophyllaceae" 308,"Melanthiaceae" 309,"Melastomataceae" 310,"Meliaceae" 311,"Melianthaceae" 312,"Meliosmaceae" 313,"Menispermaceae" 314,"Menyanthaceae" 315,"Metaxyaceae" 316,"Misodendraceae" 317,"Molluginaceae" 318,"Monimiaceae" 319,"Montiniaceae" 320,"Moraceae" 321,"Morinaceae" 322,"Moringaceae" 323,"Musaceae" 324,"Myoporaceae" 325,"Myricaceae" 326,"Myristicaceae" 327,"Myrothamnaceae" 328,"Myrsinaceae" 329,"Myrtaceae" 330,"Nelumbonaceae" 331,"Nepenthaceae" 332,"Nesogenaceae" 333,"Neuradaceae" 334,"Nyctaginaceae" 335,"Nymphaeaceae" 336,"Ochnaceae" 337,"Olacaceae" 338,"Oleaceae" 339,"Oleandraceae" 340,"Oliniaceae" 341,"Onagraceae" 342,"Oncothecaceae" 343,"Ophioglossaceae" 344,"Opiliaceae" 345,"Orchidaceae" 346,"Osmundaceae" 347,"Oxalidaceae" 348,"Paeoniaceae" 349,"Arecaceae" 350,"Pandaceae" 351,"Pandanaceae" 352,"Papaveraceae" 353,"Paracryphiaceae" 354,"Parkeriaceae" 355,"Parnassiaceae" 356,"Passifloraceae" 357,"Pedaliaceae" 358,"Pellicieraceae" 359,"Penaeaceae" 360,"Pentaphragmataceae" 361,"Pentaphylacaceae" 362,"Penthoraceae" 363,"Peridiscaceae" 364,"Petermanniaceae" 365,"Phellinaceae" 366,"Philesiaceae" 367,"Philydraceae" 368,"Phormiaceae" 369,"Phrymaceae" 370,"Phyllocladaceae" 371,"Physenaceae" 372,"Phytolaccaceae" 373,"Pinaceae" 374,"Piperaceae" 375,"Pittosporaceae" 376,"Plagiogyriaceae" 377,"Plagiopteraceae" 378,"Plantaginaceae" 379,"Platanaceae" 380,"Platyzomataceae" 381,"Plumbaginaceae" 382,"Podoaceae" 383,"Podocarpaceae" 384,"Podostemaceae" 385,"Polemoniaceae" 386,"Polygalaceae" 387,"Polygonaceae" 388,"Polypodiaceae" 389,"Pontederiaceae" 390,"Portulacaceae" 391,"Posidoniaceae" 392,"Potamogetonaceae" 393,"Primulaceae" 394,"Proteaceae" 395,"Psilotaceae" 396,"Ptaeroxylaceae" 397,"Pteridaceae" 398,"Pterostemonaceae" 399,"Quiinaceae" 400,"Rafflesiaceae" 401,"Ranunculaceae" 402,"Rapateaceae" 403,"Resedaceae" 404,"Restionaceae" 405,"Retziaceae" 406,"Rhabdodendraceae" 407,"Rhamnaceae" 408,"Rhipogonaceae" 409,"Rhizophoraceae" 410,"Rhoipteleaceae" 411,"Rhynchocalycaceae" 412,"Roridulaceae" 413,"Rosaceae" 414,"Rubiaceae" 415,"Ruscaceae" 416,"Rutaceae" 417,"Sabiaceae" 418,"Saccifoliaceae" 419,"Salicaceae" 420,"Salvadoraceae" 421,"Salviniaceae" 422,"Santalaceae" 423,"Sapindaceae" 424,"Sapotaceae" 425,"Sarcolaenaceae" 426,"Sargentodoxaceae" 427,"Sarraceniaceae" 428,"Saururaceae" 429,"Saxifragaceae" 430,"Scheuchzeriaceae" 431,"Schisandraceae" 432,"Schizaeaceae" 433,"Scrophulariaceae" 434,"Scyphostegiaceae" 435,"Scytopetalaceae" 436,"Selaginellaceae" 437,"Simaroubaceae" 438,"Simmondsiaceae" 439,"Smilacaceae" 440,"Solanaceae" 441,"Sphaerosepalaceae" 442,"Sphenostemonaceae" 443,"Stachyuraceae" 444,"Stackhousiaceae" 445,"Stangeriaceae" 446,"Staphyleaceae" 447,"Stegnospermataceae" 448,"Stemonaceae" 449,"Sterculiaceae" 450,"Stilbaceae" 451,"Strasburgeriaceae" 452,"Strelitziaceae" 453,"Stromatopteridaceae" 454,"Stylidiaceae" 455,"Stylobasiaceae" 456,"Styracaceae" 457,"Surianaceae" 458,"Symplocaceae" 459,"Taccaceae" 460,"Tamaricaceae" 461,"Taxaceae" 462,"Taxodiaceae" 463,"Tecophilaeaceae" 464,"Tepuianthaceae" 465,"Tetracentraceae" 466,"Tetrachondraceae" 467,"Tetrameristaceae" 468,"Theaceae" 469,"Theligonaceae" 470,"Thelypteridaceae" 471,"Theophrastaceae" 472,"Thurniaceae" 473,"Thymelaeaceae" 474,"Ticodendraceae" 475,"Tiliaceae" 476,"Torricelliaceae" 477,"Tovariaceae" 478,"Trapaceae" 479,"Tremandraceae" 480,"Trichopodaceae" 481,"Trigoniaceae" 482,"Trilliaceae" 483,"Trimeniaceae" 484,"Triplostegiaceae" 485,"Triuridaceae" 486,"Trochodendraceae" 487,"Tropaeolaceae" 488,"Turneraceae" 489,"Typhaceae" 490,"Ulmaceae" 491,"Apiaceae" 492,"Urticaceae" 493,"Vahliaceae" 494,"Valerianaceae" 495,"Velloziaceae" 496,"Verbenaceae" 497,"Violaceae" 498,"Viscaceae" 499,"Vitaceae" 500,"Vittariaceae" 501,"Vochysiaceae" 502,"Welwitschiaceae" 503,"Winteraceae" 504,"Woodsiaceae" 505,"Xanthorrhoeaceae" 506,"Xyridaceae" 507,"Zamiaceae" 508,"Zannichelliaceae" 509,"Zingiberaceae" 510,"Zosteraceae" 511,"Zygophyllaceae" bauble-0.9.7/bauble/plugins/plants/default/genus.txt0000644000175000017500000334514111210626427021541 0ustar brettbrett"id","hybrid","genus","author","family_id" 24904,"","Acanthodium","Delile",1 8801,"","Acanthopale","C.B.Clarke",1 8802,"","Acanthopsis","Harv.",1 15961,"","Acanthostelma","Bidgood & Brummitt",1 8803,"","Acanthura","Lindau",1 8804,"","Acanthus","L.",1 20529,"","Acelica","Rizzini",1 8805,"","Achyrocalyx","Benoist",1 25483,"","Adelaster","Lindl. ex Veitch",1 8806,"","Adenacanthus","Nees",1 8807,"","Adenostachya","Bremek.",1 16180,"","Adhatoda","Mill.",1 8808,"","Aechmanthera","Nees",1 8809,"","Afrofittonia","Lindau",1 15974,"","Afromendoncia","Gilg ex Lindau",1 24940,"","Amathea","Raf.",1 8810,"","Ambongia","Benoist",1 24906,"","Amphiestes","S.Moore",1 20530,"","Amphiscopia","Nees",1 20539,"","Ancalanthus","Balf.f.",1 8811,"","Ancistranthus","Lindau",1 8812,"","Ancylacanthus","Lindau",1 8813,"","Androcentrum","Lem.",1 8814,"","Andrographis","Wall. ex Nees",1 8815,"","Angkalanthus","Balf.f.",1 8816,"","Anisacanthus","Nees",1 8817,"","Anisosepalum","E.Hossain",1 20531,"","Anisostachya","Nees",1 8818,"","Anisotes","Nees",1 8819,"","Anomacanthus","R.D.Good",1 8820,"","Anthacanthus","Nees",1 20519,"","Antheliacanthus","Ridl.",1 8821,"","Apassalus","Kobuski",1 20518,"","Aphanandrium","Lindau",1 22324,"","Aphanosperma","T.F.Daniel",1 8822,"","Aphelandra","R.Br.",1 8823,"","Aphelandrella","Mildbr.",1 24941,"","Aphragmia","Nees",1 24942,"","Apolepsis","(Blume) Hassk.",1 20499,"","Arrhostoxylum","Nees",1 8824,"","Ascotheca","Heine",1 20493,"","Asteracantha","Nees",1 8825,"","Asystasia","Blume",1 20517,"","Asystasiella","Lindau",1 8826,"","Aulojusticia","Lindau",1 15193,"","Averia","Leonard",1 8827,"","Ballochia","Balf.f.",1 8828,"","Baphicacanthus","Bremek.",1 8829,"","Barleria","L.",1 20511,"","Barleriacanthus","Oerst.",1 20509,"","Barlerianthus","Oerst.",1 8830,"","Barleriola","Oerst.",1 20510,"","Barleriosiphon","Oerst.",1 20514,"","Barlerites","Oerst.",1 20532,"","Beloperone","Nees",1 8831,"","Benoicanthus","Heine & A.Raynal",1 20533,"","Bentia","Rolfe",1 8832,"","Berginia","Harv.",1 8833,"","Blechum","P.Browne",1 24908,"","Blepharacanthus","Nees ex Lindl.",1 8834,"","Blepharis","Juss.",1 8835,"","Borneacanthus","Bremek.",1 8836,"","Boutonia","DC.",1 8837,"","Brachystephanus","Nees",1 8838,"","Bravaisia","DC.",1 14176,"","Bremekampia","Sreem.",1 8839,"","Brillantaisia","P.Beauv.",1 24969,"","Brochosiphon","Nees",1 22083,"","Brunoniella","Bremek.",1 8840,"","Buceragenia","Greenm.",1 24911,"","Butayea","De Wild.",1 8841,"","Buteraea","Nees",1 8842,"","Calacanthus","T.Anderson ex Benth.",1 24912,"","Calliaspidia","Bremek.",1 20496,"","Calophanes","D.Don",1 8843,"","Calophanoides","(C.B.Clarke) Ridl.",1 8844,"","Calycacanthus","K.Schum.",1 8845,"","Calymmostachya","Bremek.",1 8846,"","Camarotea","Scott-Elliot",1 20494,"","Cardanthera","Buch.-Ham. ex Benth.",1 8847,"","Cardiacanthus","Nees & Schauer",1 8848,"","Carlowrightia","A.Gray",1 8849,"","Carvia","Bremek.",1 8850,"","Celerina","Benoist",1 8851,"","Centrilla","Lindau",1 8852,"","Cephalacanthus","Lindau",1 8853,"","Chaetacanthus","Nees",1 8854,"","Chaetochlamys","Lindau",1 8855,"","Chaetothylax","Nees",1 24970,"","Chaetothylopsis","Oerst.",1 8856,"","Chalarothyrsus","Lindau",1 8858,"","Chamaeranthemum","Nees",1 8859,"","Championella","Bremek.",1 24905,"","Cheilopsis","Moq.",1 8860,"","Chileranthemum","Oerst.",1 24971,"","Chiloglossa","Oerst.",1 8861,"","Chingiacanthus","Hand.-Mazz.",1 8862,"","Chlamydacanthus","Lindau",1 8863,"","Chlamydocardia","Lindau",1 14199,"","Chlamydostachya","Mildbr.",1 20520,"","Chrestienia","Montrouz.",1 8864,"","Chroesthes","Benoist",1 8865,"","Clinacanthus","Nees",1 8866,"","Clistax","Mart.",1 8867,"","Codonacanthus","Nees",1 8868,"","Conocalyx","Benoist",1 24420,"","Copioglossa","Miers",1 8869,"","Corymbostachys","Lindau",1 8870,"","Cosmianthemum","Bremek.",1 8871,"","Crabbea","Harv.",1 24924,"","Croftia","Small",1 8872,"","Crossandra","Salisb.",1 8873,"","Crossandrella","C.B.Clarke",1 20521,"","Cryptophragmium","Nees",1 8874,"","Ctenopaepale","Bremek.",1 8875,"","Cyclacanthus","S.Moore",1 8876,"","Cylindrosolenium","Lindau",1 8877,"","Cyphacanthus","Leonard",1 20534,"","Cyphisia","Rizzini",1 20983,"","Cyrtanthera","Nees",1 24972,"","Cyrtantherella","Oerst.",1 8878,"","Cystacanthus","T.Anderson",1 25196,"","Dactylostegium","Nees",1 20503,"","Daedalacanthus","T.Anderson",1 8879,"","Danguya","Benoist",1 8880,"","Dasytropis","Urb.",1 17374,"","Delphinacanthus","Benoist",1 17501,"","Dianthera","L.",1 25197,"","Diateinacanthus","Lindau",1 24907,"","Dicentranthera","T.Anderson",1 8881,"","Dichazothece","Lindau",1 8882,"","Dicladanthera","F.Muell.",1 8883,"","Dicliptera","Juss.",1 20512,"","Dicranacanthus","Oerst.",1 8884,"","Didyplosandra","Wight ex Bremek.",1 8885,"","Diflugossa","Bremek.",1 24973,"","Dimanisa","Raf.",1 8886,"","Dinteracanthus","C.B.Clarke ex Schinz",1 8887,"","Diotacanthus","Benth.",1 8888,"","Dipteracanthus","Nees",1 8889,"","Dischistocalyx","T.Anderson ex Benth.",1 16181,"","Disperma","J.F.Gmel.",1 22084,"","Distichocalyx","Benth.",1 8890,"","Ditrichospermum","Bremek.",1 8891,"","Dolichostachys","Benoist",1 8892,"","Dossifluga","Bremek.",1 8893,"","Drejera","Nees",1 16182,"","Drejerella","Lindau",1 8894,"","Duosperma","Dayton",1 24974,"","Duvernoia","E.Mey. ex Nees",1 8895,"","Dyschoriste","Nees",1 24975,"","Dyspemptemorion","Bremek.",1 20491,"","Ebermaiera","Nees",1 8896,"","Ecbolium","Kurz",1 8897,"","Echinacanthus","Nees",1 8898,"","Echinopaepale","Bremek.",1 20538,"","Ecteinanthus","T.Anderson",1 8899,"","Elytraria","Michx.",1 24976,"","Emularia","Raf.",1 8900,"","Encephalosphaera","Lindau",1 8901,"","Endopogon","Nees",1 8902,"","Endosiphon","T.Anderson ex Benth.",1 8903,"","Epiclastopelma","Lindau",1 8904,"","Eranthemum","L.",1 8905,"","Eremomastax","Lindau",1 25198,"","Eriostrobilus","Bremek.",1 24913,"","Erythracanthus","Nees",1 24977,"","Ethesia","Raf.",1 8906,"","Eusiphon","Benoist",1 8907,"","Filetia","Miq.",1 8908,"","Fittonia","Coem.",1 8909,"","Forcipella","Baill.",1 20528,"","Forsythiopsis","Baker",1 24978,"","Gantelbua","Bremek.",1 8910,"","Gastranthus","Moritz ex Benth. & Hook.",1 24979,"","Gatesia","A.Gray",1 8911,"","Geissomeria","Lindl.",1 24914,"","Gendarussa","Nees",1 8320,"","Gerardia","Benth.",1 20490,"","Gilletiella","De Wild. & T.Durand",1 8912,"","Glockeria","Nees",1 24981,"","Glosarithys","Rizzini",1 8913,"","Glossochilus","Nees",1 24980,"","Golaea","Chiov.",1 8914,"","Goldfussia","Nees",1 8915,"","Graphandra","J.B.Imlay",1 8916,"","Graptophyllum","Nees",1 8917,"","Gutzlaffia","Hance",1 25199,"","Gymapsis","Bremek.",1 20498,"","Gymnacanthus","Oerst.",1 8918,"","Gymnostachyum","Nees",1 8919,"","Gynocraterium","Bremek.",1 17422,"","Gypsacanthus","Lott, V.Jaram. & Rzed.",1 8920,"","Habracanthus","Nees",1 20505,"","Haemacanthus","S.Moore",1 8921,"","Hallieracantha","Stapf",1 8922,"","Hansteinia","Oerst.",1 20527,"","Haplanthera","Hochst.",1 22085,"","Haplanthodes","Kuntze",1 14801,"","Haplanthoides","H.W.Li",1 8923,"","Haplanthus","Nees",1 24982,"","Harnieria","Solms",1 8924,"","Harpochilus","Nees",1 23239,"","Harrachia","Jacq.",1 20506,"","Haselhoffia","Lindau",1 24986,"","Heinzelia","Nees",1 25834,"","Hemiadelphis","Nees",1 24983,"","Hemichoriste","Nees",1 8925,"","Hemigraphis","Nees",1 24984,"","Hemisandra","Scheidw.",1 8926,"","Henrya","Nees",1 8927,"","Herpetacanthus","Nees",1 8928,"","Heteradelphia","Lindau",1 24985,"","Heteraspidia","Rizzini",1 8929,"","Himantochilus","T.Anderson ex Benth.",1 8930,"","Holographis","Nees",1 8931,"","Hoverdenia","Nees",1 8932,"","Hulemacanthus","S.Moore",1 24987,"","Hydromestus","Scheidw.",1 8933,"","Hygrophila","R.Br.",1 8934,"","Hymenochlaena","Bremek.",1 8935,"","Hypoestes","Sol. ex R.Br.",1 15968,"","Indoneesiella","Sreem.",1 8936,"","Ionacanthus","Benoist",1 24918,"","Isacanthus","Nees",1 8343,"","Isaloa","Humbert",1 20516,"","Isochoriste","Miq.",1 8937,"","Isoglossa","Oerst.",1 8938,"","Isotheca","Turrill",1 8939,"","Ixtlania","M.E.Jones",1 16183,"","Jacobinia","Nees ex Moric.",1 8940,"","Jadunia","Lindau",1 8941,"","Juruasia","Lindau",1 8942,"","Justicia","L.",1 22086,"","Kalbreyeracanthus","Wassh.",1 8943,"","Kalbreyeriella","Lindau",1 25186,"","Kanjarum","Ramam.",1 24989,"","Kita","A.Chev.",1 24990,"","Kjellbergia","Bremek.",1 8944,"","Kolobochilus","Lindau",1 8945,"","Kosmosiphon","Lindau",1 8946,"","Kudoacanthus","Hosok.",1 24988,"","Kuestera","Regel",1 24926,"","Lagochilium","Nees",1 8947,"","Lamiacanthus","Kuntze",1 8948,"","Lankesteria","Lindl.",1 25187,"","Larsenia","Bremek.",1 8949,"","Lasiocladus","Bojer ex Nees",1 8950,"","Leandriella","Benoist",1 8951,"","Leda","C.B.Clarke",1 25188,"","Leiophaca","Lindau",1 24991,"","Lepidacanthus","C.Presl",1 8952,"","Lepidagathis","Willd.",1 8953,"","Leptacanthus","Nees",1 8954,"","Leptosiphonium","F.Muell.",1 17531,"","Leptostachya","Nees",1 24992,"","Leucobarleria","Lindau",1 24910,"","Leucoraphis","Nees",1 24993,"","Liberatia","Rizzini",1 24994,"","Libonia","K.Koch",1 8955,"","Linariantha","B.L.Burtt & R.M.Sm.",1 8956,"","Lindauea","Rendle",1 24996,"","Linocalyx","Lindau",1 15975,"","Lirayea","Pierre",1 8957,"","Lissospermum","Bremek.",1 8958,"","Listrobanthes","Bremek.",1 8959,"","Lophostachys","Pohl",1 24995,"","Lophothecium","Rizzini",1 8960,"","Louteridium","S.Watson",1 20526,"","Lundellia","Leonard",1 24997,"","Lustrinia","Raf.",1 8961,"","Lychniothyrsus","Lindau",1 8962,"","Mackaya","Harv.",1 8963,"","Mackenziea","Nees",1 8964,"","Macrorungia","C.B.Clarke",1 8966,"","Mananthes","Bremek.",1 17729,"","Marcania","J.B.Imlay",1 8967,"","Megalochlamys","Lindau",1 8968,"","Megalostoma","Leonard",1 8969,"","Megaskepasma","Lindau",1 8970,"","Melittacanthus","S.Moore",1 8971,"","Mellera","S.Moore",1 8972,"","Mendoncia","Vell. ex Vand.",1 14200,"","Metarungia","Baden",1 14245,"","Mexacanthus","T.F.Daniel",1 8973,"","Meyenia","Nees",1 20979,"","Micranthus","J.C.Wendl.",1 8974,"","Microstrobilus","Bremek.",1 8975,"","Mimulopsis","Schweinf.",1 8976,"","Mirandea","Rzed.",1 15976,"","Monachochlamys","Baker",1 8977,"","Monechma","Hochst.",1 8978,"","Monothecium","Hochst.",1 8979,"","Morsacanthus","Rizzini",1 8980,"","Nelsonia","R.Br.",1 8981,"","Neohallia","Hemsl.",1 25189,"","Neolindenia","Baill.",1 8384,"","Neozenkerina","Mildbr.",1 8982,"","Neriacanthus","Benth.",1 8983,"","Neuracanthus","Nees",1 24998,"","Nicoteba","Lindau",1 8984,"","Nilgirianthus","Bremek.",1 8985,"","Nomaphila","Blume",1 24999,"","Nothoruellia","Bremek.",1 8986,"","Odontonema","Nees",1 17508,"","Odontonemella","Lindau",1 25194,"","Odontophyllum","Sreem.",1 24915,"","Odontostigma","Zoll. & Moritzi",1 20500,"","Onus","Gilli",1 24927,"","Onychacanthus","Nees",1 8987,"","Ophiorrhiziphyllon","Kurz",1 8988,"","Oplonia","Raf.",1 8989,"","Oreacanthus","Benth.",1 8990,"","Oreothyrsus","Lindau",1 8991,"","Orophochilus","Lindau",1 20535,"","Orthotactus","Nees",1 8992,"","Pachystachys","Nees",1 8993,"","Pachystrobilus","Bremek.",1 25000,"","Parabarleria","Baill.",1 8994,"","Parachampionella","Bremek.",1 8995,"","Paragoldfussia","Bremek.",1 25503,"","Paragutzlaffia","H.P.Tsui",1 25001,"","Parajusticia","Benoist",1 8996,"","Pararuellia","Bremek.",1 8997,"","Parastrobilanthes","Bremek.",1 8998,"","Parasympagis","Bremek.",1 25002,"","Parasystasia","Baill.",1 17370,"","Paulowilhelmia","Hochst.",1 8999,"","Pelecostemon","Leonard",1 9000,"","Pentstemonacanthus","Nees",1 9001,"","Perenideboles","Ram.Goyena",1 17375,"","Periblema","DC.",1 9002,"","Pericalypta","Benoist",1 9003,"","Periestes","Baill.",1 9004,"","Perilepta","Bremek.",1 9005,"","Peristrophe","Nees",1 25003,"","Petalanthera","Raf.",1 9006,"","Petalidium","Nees",1 24916,"","Petracanthus","Nees",1 9007,"","Phaulopsis","Willd.",1 16184,"","Phaylopsis","Willd.",1 9008,"","Phialacanthus","Benth.",1 25190,"","Phidiasia","Urb.",1 20497,"","Phillipsia","Rolfe",1 9009,"","Phlebophyllum","Nees",1 9010,"","Phlogacanthus","Nees",1 9011,"","Physacanthus","Benth.",1 23579,"","Plaesianthera","(C.B.Clarke) Livera",1 25004,"","Plagiacanthus","Nees",1 24419,"","Plagiotheca","Chiov.",1 9012,"","Plegmatolemma","Bremek.",1 9013,"","Pleocaulus","Bremek.",1 18164,"","Pleuroblepharis","Baill.",1 9014,"","Podorungia","Baill.",1 24922,"","Pogonospermum","Hochst.",1 9015,"","Poikilacanthus","Lindau",1 9016,"","Polylychnis","Bremek.",1 23240,"","Polythrix","Nees",1 9017,"","Polytrema","C.B.Clarke",1 17373,"","Populina","Baill.",1 24928,"","Porphyrocoma","Scheidw. ex Hook.",1 24923,"","Pounguia","Benoist",1 16171,"","Pranceacanthus","Wassh.",1 20525,"","Pringleophytum","A.Gray",1 20513,"","Prionitis","Oerst.",1 24920,"","Psacadocalymma","Bremek.",1 9018,"","Psacadopaepale","Bremek.",1 25191,"","Pseudacanthopale","Benoist",1 9019,"","Pseudaechmanthera","Bremek.",1 9020,"","Pseuderanthemum","Radlk.",1 20508,"","Pseudo-Barleria","Oerst.",1 20502,"","Pseudobarleria","T.Anderson",1 20507,"","Pseudoblepharis","Baill.",1 9021,"","Pseudocalyx","Radlk.",1 9022,"","Pseudodicliptera","Benoist",1 9023,"","Pseudoruellia","Benoist",1 9024,"","Pseudostenosiphonium","Lindau",1 9025,"","Psilanthele","Lindau",1 25005,"","Psiloesthes","Benoist",1 9026,"","Pteracanthus","(Nees) Bremek.",1 9027,"","Pteroptychia","Bremek.",1 9028,"","Ptyssiglottis","T.Anderson",1 14268,"","Pulchranthus","V.M.Baum, Reveal & Nowicke",1 25006,"","Pupilla","Rizzini",1 9029,"","Pyrrothrix","Bremek.",1 25007,"","Ramusia","Nees",1 9030,"","Razisea","Oerst.",1 9031,"","Rhacodiscus","Lindau",1 9032,"","Rhaphidospora","Nees",1 9033,"","Rhinacanthus","Nees",1 25008,"","Rhiphidosperma","G.Don",1 9034,"","Rhombochlamys","Lindau",1 17746,"","Rhyticalymma","Bremek.",1 24919,"","Rhytiglossa","Nees ex Lindl.",1 9035,"","Ritonia","Benoist",1 25009,"","Rodatia","Raf.",1 20984,"","Rostellaria","Nees",1 9036,"","Rostellularia","Rchb.",1 9037,"","Ruellia","L.",1 24909,"","Ruelliola","Baill.",1 9038,"","Ruelliopsis","C.B.Clarke",1 9039,"","Rungia","Nees",1 9040,"","Ruspolia","Lindau",1 9041,"","Ruttya","Harv.",1 25010,"","Saglorithys","Rizzini",1 24307,"","Saintpauliopsis","Staner",1 25480,"","Salpinctium","T.J.Edwards",1 20524,"","Salpingantha","Lem.",1 20523,"","Salpinxantha","Urb.",1 9042,"","Salpixantha","Hook.",1 20536,"","Salviacanthus","Lindau",1 9043,"","Samuelssonia","Urb. & Ekman",1 9044,"","Sanchezia","Ruiz & Pav.",1 16185,"","Santapaua","N.P.Balakr. & Subr.",1 9045,"","Sapphoa","Urb.",1 24921,"","Sarojusticia","Bremek.",1 20980,"","Sarotheca","Nees",1 9046,"","Satanocrater","Schweinf.",1 9047,"","Sautiera","Decne.",1 9048,"","Schaueria","Nees",1 9049,"","Schliebenia","Mildbr.",1 20537,"","Schwabea","Endl.",1 9050,"","Sciaphyllum","Bremek.",1 9051,"","Sclerocalyx","Nees",1 9052,"","Sclerochiton","Harv.",1 20515,"","Scytanthus","T.Anderson ex Benth.",1 9053,"","Sebastiano-Schaueria","Nees",1 9054,"","Semnostachya","Bremek.",1 9055,"","Semnothyrsus","Bremek.",1 9056,"","Sericocalyx","Bremek.",1 20981,"","Sericographis","Nees",1 25011,"","Simonisia","Nees",1 25192,"","Sinthroblastes","Bremek.",1 9057,"","Siphonoglossa","Oerst.",1 25012,"","Solenochasma","Fenzl",1 9058,"","Solenoruellia","Baill.",1 20501,"","Sooia","Pocs",1 9059,"","Spathacanthus","Baill.",1 9060,"","Sphacanthus","Benoist",1 9061,"","Sphinctacanthus","Benth.",1 9062,"","Spirostigma","Nees",1 25193,"","Sreemadhavana","Rauschert",1 9063,"","Standleyacanthus","Leonard",1 9064,"","Staurogyne","Wall.",1 25013,"","Staurogynopsis","Mangenot & Ake Assi",1 9065,"","Steirosanchezia","Lindau",1 9066,"","Stenandriopsis","S.Moore",1 9067,"","Stenandrium","Nees",1 25195,"","Stenoschista","Bremek.",1 9068,"","Stenosiphonium","Nees",1 9069,"","Stenostephanus","Nees",1 9070,"","Stenothyrsus","C.B.Clarke",1 17747,"","Stephanophysum","Pohl",1 9071,"","Stethoma","Raf.",1 9072,"","Streblacanthus","Kuntze",1 9073,"","Streptosiphon","Mildbr.",1 9074,"","Strobilacanthus","Griseb.",1 9075,"","Strobilanthes","Blume",1 9076,"","Strobilanthopsis","S.Moore",1 25014,"","Strobilorhachis","Klotzsch",1 17369,"","Strophacanthus","Lindau",1 9077,"","Styasasia","S.Moore",1 20504,"","Stylarthropus","Baill.",1 9078,"","Suessenguthia","Merxm.",1 9079,"","Sympagis","(Nees) Bremek.",1 9080,"","Symplectochilus","Lindau",1 25015,"","Synandra","Schrad.",1 17372,"","Synchoriste","Baill.",1 20495,"","Synnema","Benth.",1 9081,"","Syringidium","Lindau",1 24925,"","Tabascina","Baill.",1 9082,"","Tacoanthus","Baill.",1 9083,"","Taeniandra","Bremek.",1 20540,"","Talbotia","S.Moore",1 9084,"","Tarphochlamys","Bremek.",1 9085,"","Teliostachya","Nees",1 9086,"","Tessmanniacanthus","Mildbr.",1 9087,"","Tetraglochidium","Bremek.",1 9088,"","Tetragoga","Bremek.",1 9089,"","Tetragompha","Bremek.",1 9090,"","Tetramerium","Nees",1 25168,"","Thalestris","Rizzini",1 9091,"","Thamnojusticia","Mildbr.",1 17371,"","Theileamea","Baill.",1 9092,"","Thelepaepale","Bremek.",1 9093,"","Thomandersia","Baill.",1 9094,"","Thunbergia","Retz.",1 20541,"","Thyrsacanthus","Nees",1 9095,"","Thysanostigma","J.B.Imlay",1 9096,"","Tremacanthus","S.Moore",1 9097,"","Triaenacanthus","Nees",1 9098,"","Trichacanthus","Zoll. & Moritzi",1 9099,"","Trichanthera","Kunth",1 9100,"","Trichocalyx","Balf.f.",1 9101,"","Trichosanchezia","Mildbr.",1 9102,"","Trybliocalyx","Lindau",1 25016,"","Tubiflora","J.F.Gmel.",1 20982,"","Tyloglossa","Hochst.",1 25169,"","Ulleria","Bremek.",1 9103,"","Vavara","Benoist",1 9104,"","Vindasia","Benoist",1 20522,"","Volkensiophyton","Lindau",1 9105,"","Warpuria","Stapf",1 9106,"","Whitfieldia","Hook.",1 9107,"","Xantheranthemum","Lindau",1 9108,"","Xanthostachya","Bremek.",1 9109,"","Xenacanthus","Bremek.",1 9110,"","Xerothamnella","C.T.White",1 9111,"","Yeatesia","Small",1 20492,"","Zenkerina","Engl.",1 9112,"","Zygoruellia","Baill.",1 2398,"","Acer","L.",2 2399,"","Dipteronia","Oliv.",2 4022,"","Acharia","Thunb.",3 4023,"","Ceratiosicyos","Nees",3 4024,"","Guthriea","Bolus",3 934,"","Achatocarpus","Triana",4 935,"","Phaulothamnus","A.Gray",4 12429,"","Acorus","L.",5 1183,"","Actinidia","Lindl.",6 1184,"","Clematoclethra","(Franch.) Maxim.",6 1185,"","Saurauia","Willd.",6 13498,"","Actiniopteris","Link",7 21644,"","Adenogramma","Link ex Engl.",8 13500,"","Adiantopsis","Fee",8 13501,"","Adiantum","L.",8 21649,"","Aleuritopteris","Fee",8 21651,"","Allosorus","Bernh.",8 13502,"","Anogramma","Link",8 21650,"","Argyrochosma","(J.Sm.) Windham",8 13503,"","Aspidotis","(Nutt. ex Hook.) Copel.",8 21629,"","Aspleniopsis","Mett. ex Kuhn",8 13504,"","Austrogramme","E.Fourn.",8 24122,"","Bakeropteris","Kuntze",8 13505,"","Bommeria","E.Fourn.",8 21607,"","Botryogramme","Fee",8 21630,"","Callogramme","Fee",8 21642,"","Calomelanos","(C.Presl) Lindl.",8 13506,"","Cassebeera","Kaulf.",8 24120,"","Ceratodactylis","J.Sm.",8 21641,"","Ceropteris","Link",8 13507,"","Cerosora","(Baker) Domin",8 13508,"","Cheilanthes","Sw.",8 13509,"","Cheiloplecton","Fee",8 21658,"","Cheilosoria","Trevis.",8 21664,"","Choristosoria","Mett. ex Kuhn",8 21652,"","Chrysochosma","(J.Sm.) Kummerle",8 21653,"","Cincinalis","Gled. ex Desv.",8 21639,"x","Coniodictyogramme","Nakai",8 13510,"","Coniogramme","Fee",8 21654,"","Cosentinia","Tod.",8 21631,"","Craspedodictyum","Copel.",8 13489,"","Cryptogramma","R.Br.",8 21640,"","Dictyogramme","Fee",8 13511,"","Doryopteris","J.Sm.",8 21637,"","Dyctiogramme","C.Presl",8 22235,"x","Eriosonia","Pic.Serm.",8 13512,"","Eriosorus","Fee",8 21646,"","Gymnogramma","Desv.",8 16718,"","Gymnopteris","Bernh.",8 13513,"","Hemionitis","L.",8 21663,"","Heteropteris","Fee",8 21666,"","Hewardia","J.Sm.",8 24121,"","Holttumia","Copel.",8 21633,"","Holttumiella","Copel.",8 13514,"","Jamesonia","Hook. & Grev.",8 25697,"","Leptolepidium","K.H.Hsing & S.K.Wu",8 21606,"","Leptostegia","D.Don",8 13490,"","Llavea","Lag.",8 13515,"","Mildella","Trevis.",8 13516,"","Monachosorella","Hayata",8 13517,"","Monachosorum","Kunze",8 21655,"","Myriopteris","Fee",8 13518,"","Negripteris","Pic.Serm.",8 13519,"","Nephopteris","Lellinger",8 21643,"","Nesoris","Raf.",8 21647,"","Neurogramma","Link",8 13520,"","Neurosoria","Mett. ex Kuhn",8 15949,"","Notholaena","R.Br.",8 21638,"","Notogramme","C.Presl",8 21656,"","Oeosporangium","Vis.",8 13491,"","Onychium","Kaulf.",8 25702,"","Ormopteris","J.Sm.",8 21648,"","Paraceterach","Copel.",8 13521,"","Pellaea","Link",8 21659,"","Pellaeopsis","J.Sm.",8 25703,"","Pentagramma","Yatsk., Windham & E.Wollenw.",8 21608,"","Phorolobus","Desv.",8 13522,"","Pityrogramma","Link",8 25728,"x","Pityromeria","L.D.Gomez",8 21660,"","Platyloma","J.Sm.",8 21635,"","Platytaenia","Kuhn",8 21657,"","Pomatophytum","M.E.Jones",8 21626,"","Psilogramme","Kuhn",8 21661,"","Pteridella","Mett. ex Kuhn",8 13523,"","Pterozonium","Fee",8 22236,"","Ptilopteris","Hance",8 13525,"","Saffordia","Maxon",8 21645,"","Schizogramma","Link",8 21634,"","Schizolepton","Fee",8 13526,"","Sinopteris","C.Chr. & Ching",8 13527,"","Syngramma","J.Sm.",8 21627,"","Syngrammatopsis","Alston",8 21662,"","Synochlamys","Fee",8 13528,"","Taenitis","Willd. ex Schkuhr",8 21632,"","Toxopteris","Trevis.",8 13529,"","Trachypteris","Andre ex H.Christ",8 21628,"","Trichiogramme","Kuhn",8 13530,"","Trismeria","Fee",8 21665,"","Tryonella","Pic.Serm.",8 4891,"","Adoxa","L.",9 4892,"","Sinadoxa","C.Y.Wu, Z.L.Wu & R.F.Huang",9 16738,"","Tetradoxa","C.Y.Wu",9 20950,"","Aegotoxicum","Endl.",10 20941,"","Aegtoxicon","Molina",10 10195,"","Aextoxicon","Ruiz & Pav.",10 11844,"","Agave","L.",11 11845,"","Beschorneria","Kunth",11 11846,"","Bravoa","Lex.",11 11847,"","Clistoyucca","(Engelm.) Trel.",11 16930,"","Cohnia","Kunth",11 11933,"","Cordyline","Comm. ex R.Br.",11 11849,"","Furcraea","Vent.",11 11850,"","Hesperaloe","Engelm.",11 18856,"","Hesperoyucca","Baker",11 15950,"","Manfreda","Salisb.",11 11851,"","Polianthes","L.",11 11852,"","Prochnyanthes","S.Watson",11 11853,"","Pseudobravoa","Rose",11 16931,"","Runyonia","Rose",11 11854,"","Samuela","Trel.",11 16932,"","Sarcoyucca","(Engelm.) Linding.",11 18855,"","Taetsia","Medik.",11 11855,"","Yucca","L.",11 9669,"","Agdestis","Moc. & Sesse ex DC.",12 22171,"","Acaulon","N.E.Br.",13 4268,"","Acrodon","N.E.Br.",13 4269,"","Acrosanthes","Eckl. & Zeyh.",13 4271,"","Aethephyllum","N.E.Br.",13 22176,"","Agnirictus","Schwantes",13 22172,"","Aistocaulon","Poelln.",13 4272,"","Aizoanthemum","Dinter ex Friedrich",13 4273,"","Aizoon","L.",13 4274,"","Aloinopsis","Schwantes",13 4275,"","Amoebophyllum","N.E.Br.",13 4276,"","Amphibolia","L.Bolus ex A.G.J.Herre",13 25827,"","Ancistrostigma","Fenzl",13 4277,"","Anisocalyx","L.Bolus",13 22192,"","Anisostigma","Schinz",13 4278,"","Antegibbaeum","Schwantes ex C.Weber",13 22159,"","Antimima","N.E.Br.",13 4279,"","Apatesia","N.E.Br.",13 4280,"","Aptenia","N.E.Br.",13 4281,"","Arenifera","A.G.J.Herre",13 22180,"","Argeta","N.E.Br.",13 4282,"","Argyroderma","N.E.Br.",13 4283,"","Aridaria","N.E.Br.",13 4284,"","Aspazoma","N.E.Br.",13 4285,"","Astridia","Dinter",13 4286,"","Bergeranthus","Schwantes",13 14265,"","Berrisfordia","L.Bolus",13 4287,"","Bijlia","N.E.Br.",13 22160,"","Bolusanthemum","Schwantes",13 4288,"","Braunsia","Schwantes",13 25541,"","Brownanthus","Schwantes",13 4289,"","Calamophyllum","Schwantes",13 22154,"","Callistigma","Dinter & Schwantes",13 4290,"","Carpanthea","N.E.Br.",13 4291,"","Carpobrotus","N.E.Br.",13 4292,"","Carruanthus","(Schwantes) Schwantes",13 4293,"","Caryotophora","Leistner",13 4294,"","Cephalophyllum","(Haw.) N.E.Br.",13 4295,"","Cerochlamys","N.E.Br.",13 4296,"","Chasmatophyllum","(Schwantes) Dinter & Schwantes",13 4297,"","Cheiridopsis","N.E.Br.",13 25794,"","Circandra","N.E.Br.",13 14172,"","Cleretum","N.E.Br.",13 4299,"","Conicosia","N.E.Br.",13 4300,"","Conophyllum","Schwantes",13 4301,"","Conophytum","N.E.Br.",13 22165,"","Corpuscularia","Schwantes",13 22185,"","Crocanthus","L.Bolus",13 22155,"","Cryophytum","N.E.Br.",13 4303,"","Cylindrophyllum","Schwantes",13 4304,"","Cypselea","Turpin",13 4305,"","Dactylopsis","N.E.Br.",13 22173,"","Deilanthe","N.E.Br.",13 4306,"","Delosperma","N.E.Br.",13 25822,"","Demidovia","Pall.",13 22189,"","Depacarpus","N.E.Br.",13 22184,"","Derenbergia","Schwantes",13 22157,"","Derenbergiella","Schwantes",13 4307,"","Dicrocaulon","N.E.Br.",13 4308,"","Didymaotus","N.E.Br.",13 4309,"","Dinteranthus","Schwantes",13 25820,"","Diplochonium","Fenzl",13 4310,"","Diplosoma","Schwantes",13 4311,"","Disphyma","N.E.Br.",13 4312,"","Dorotheanthus","Schwantes",13 22178,"","Dracophilus","(Schwantes) Dinter & Schwantes",13 22167,"","Drosanthemopsis","Rauschert",13 4313,"","Drosanthemum","Schwantes",13 4314,"","Eberlanzia","Schwantes",13 4315,"","Ebracteola","Dinter & Schwantes",13 20148,"","Echinus","L.Bolus",13 4316,"","Enarganthe","N.E.Br.",13 4317,"","Erepsia","N.E.Br.",13 22163,"","Esterhuysenia","L.Bolus",13 4318,"","Eurystigma","L.Bolus",13 4319,"","Faucaria","Schwantes",13 4320,"","Fenestraria","N.E.Br.",13 4321,"","Frithia","N.E.Br.",13 4322,"","Galenia","L.",13 22156,"","Gasoul","Adans.",13 4323,"","Gibbaeum","Haw.",13 4327,"","Glottiphyllum","Haw.",13 4328,"","Gunnia","F.Muell.",13 22193,"","Gunniopsis","Pax",13 25817,"","Gymnopoma","N.E.Br.",13 16800,"","Halenbergia","Dinter",13 14834,"","Hallianthus","H.E.K.Hartmann",13 25814,"","Henricia","L.Bolus",13 4329,"","Hereroa","(Schwantes) Dinter & Schwantes",13 4330,"","Herrea","Schwantes",13 4331,"","Herreanthus","Schwantes",13 16801,"","Hydrodea","N.E.Br.",13 22186,"","Hymenocyclus","Dinter & Schwantes",13 4332,"","Hymenogyne","Haw.",13 22181,"","Imitaria","N.E.Br.",13 4334,"","Jacobsenia","L.Bolus & Schwantes",13 4335,"","Jensenobotrya","A.G.J.Herre",13 14835,"","Jordaaniella","H.E.K.Hartmann",13 4336,"","Juttadinteria","Schwantes",13 4337,"","Kensitia","Fedde",13 4338,"","Khadia","N.E.Br.",13 4339,"","Lampranthus","N.E.Br.",13 4340,"","Lapidaria","(Dinter & Schwantes) N.E.Br.",13 4341,"","Leipoldtia","L.Bolus",13 4342,"","Lithops","N.E.Br.",13 22153,"","Litocarpus","L.Bolus",13 25821,"","Ludolfia","Adans.",13 4344,"","Machairophyllum","Schwantes",13 25810,"","Macrocaulon","N.E.Br.",13 4345,"","Malephora","N.E.Br.",13 22190,"","Maughania","N.E.Br.",13 4346,"","Maughaniella","L.Bolus",13 22182,"","Mentocalyx","N.E.Br.",13 4347,"","Mesembryanthemum","L.",13 4348,"","Mestoklema","N.E.Br. ex Glen",13 4349,"","Meyerophytum","Schwantes",13 4350,"","Micropterum","Schwantes",13 22188,"","Mimetophytum","L.Bolus",13 4351,"","Mitrophyllum","Schwantes",13 4353,"","Monilaria","Schwantes",13 4354,"","Mossia","N.E.Br.",13 4355,"","Muiria","N.E.Br.",13 4356,"","Namaquanthus","L.Bolus",13 22179,"","Namibia","(Schwantes) Dinter & Schwantes",13 4357,"","Nananthus","N.E.Br.",13 4358,"","Nelia","Schwantes",13 4359,"","Neogunnia","Pax & K.Hoffm.",13 4360,"","Neohenricia","L.Bolus",13 4361,"","Neorhine","Schwantes",13 16802,"","Nycteranthus","Rothm.",13 22158,"","Nycterianthemum","Haw.",13 4362,"","Octopoma","N.E.Br.",13 4363,"","Odontophorus","N.E.Br.",13 4364,"","Oophytum","N.E.Br.",13 4365,"","Ophthalmophyllum","Dinter & Schwantes",13 4366,"","Opophytum","N.E.Br.",13 4367,"","Orthopterum","L.Bolus",13 4368,"","Oscularia","Schwantes",13 4369,"","Ottosonderia","L.Bolus",13 25825,"","Papularia","Forssk.",13 22177,"","Peersia","L.Bolus",13 25815,"","Pentacoilanthus","Rappa & Camarrone 1953",13 25816,"","Pentacoilanthus","Rappa & Camarrone 1960",13 25540,"","Perapentacoilanthus","Rappa & Camarrone",13 22161,"","Perissolobus","N.E.Br.",13 25831,"","Pherelobus","Jacobsen",13 4371,"","Pherolobus","N.E.Br.",13 16803,"","Phyllobolus","N.E.Br.",13 22168,"","Piquetia","N.E.Br.",13 4372,"","Platythyra","N.E.Br.",13 4373,"","Pleiospilos","N.E.Br.",13 4374,"","Plinthus","Fenzl",13 4376,"","Polymita","N.E.Br.",13 25826,"","Portulacastrum","Juss. ex Medik.",13 4377,"","Prenia","N.E.Br.",13 14173,"","Prepodesma","N.E.Br.",13 25818,"","Psammanthe","Hance",13 4378,"","Psammophora","Dinter & Schwantes",13 25542,"","Pseudobrownanthus","Ihlenf. & Bittrich",13 4380,"","Psilocaulon","N.E.Br.",13 25537,"","Pteropentacoilanthus","Rappa & Camarrone",13 22175,"","Punctillaria","N.E.Br.",13 25819,"","Pyxipoma","Fenzl",13 4381,"","Rabiea","N.E.Br.",13 25811,"","Radiana","Raf.",13 25824,"","Reme","Adans.",13 4382,"","Rhinephyllum","N.E.Br.",13 4383,"","Rhombophyllum","(Schwantes) Schwantes",13 25812,"","Rhopalocyclus","Schwantes",13 22183,"","Rimaria","N.E.Br.",13 22162,"","Rimaria","L.Bolus",13 22169,"","Roodia","N.E.Br.",13 4384,"","Ruschia","Schwantes",13 4385,"","Ruschianthemum","Friedrich",13 4386,"","Ruschianthus","L.Bolus",13 4387,"","Saphesia","N.E.Br.",13 4388,"","Sarcozona","J.M.Black",13 4389,"","Sceletium","N.E.Br.",13 16799,"","Schickia","Tischer",13 4390,"","Schlechteranthus","Schwantes",13 22166,"","Schonlandia","L.Bolus",13 25813,"","Schwantesia","L.Bolus",13 4391,"","Schwantesia","Dinter",13 4392,"","Scopelogena","L.Bolus",13 4393,"","Semnanthe","N.E.Br.",13 4394,"","Sesuvium","L.",13 25205,"","Sineoperculum","Van Jaarsv.",13 4395,"","Skiatophytum","L.Bolus",13 4396,"","Smicrostigma","N.E.Br.",13 4397,"","Sphalmanthus","N.E.Br.",13 4398,"","Stayneria","L.Bolus",13 22170,"","Sterropetalum","N.E.Br.",13 22187,"","Stigmatocarpum","L.Bolus",13 4399,"","Stoeberia","Dinter & Schwantes",13 4400,"","Stomatium","Schwantes",13 4402,"","Synaptophyllum","N.E.Br.",13 22279,"","Tanquana","H.E.K.Hartmann & Liede",13 25539,"","Tetracoilanthus","Rappa & Camarrone",13 25823,"","Tetragonella","Miq.",13 4404,"","Tetragonia","L.",13 16804,"","Thyrasperma","N.E.Br.",13 14174,"","Tischleria","Schwantes",13 4405,"","Titanopsis","Schwantes",13 4406,"","Trianthema","L.",13 4407,"","Tribulocarpus","S.Moore",13 4408,"","Trichodiadema","Schwantes",13 4409,"","Vanheerdea","L.Bolus ex H.E.K.Hartmann",13 4410,"","Vanzijlia","L.Bolus",13 22174,"","Verrucifera","N.E.Br.",13 25809,"","Veslingia","Heist. ex Fabr.",13 4411,"","Wooleya","L.Bolus",13 22152,"","Zaleja","Burm.f.",13 4412,"","Zaleya","Burm.f.",13 4413,"","Zeuktophyllum","N.E.Br.",13 2407,"","Akania","Hook.f.",14 4869,"","Alangium","Lam.",15 24627,"","Actinocarpus","R.Br.",16 17015,"","Albidella","Pichon",16 12547,"","Alisma","L.",16 12548,"","Baldellia","Parl.",16 12549,"","Burnatia","Micheli",16 12550,"","Caldesia","Parl.",16 12551,"","Damasonium","Mill.",16 12552,"","Echinodorus","Rich. ex Engelm.",16 17016,"","Helanthium","(Benth.) Engelm. ex Britton",16 12553,"","Limnophyton","Miq.",16 20150,"","Lophiocarpus","(Kunth) Miq.",16 20149,"","Lophotocarpus","T.Durand",16 12554,"","Luronium","Raf.",16 12555,"","Machaerocarpus","Small",16 12556,"","Ranalisma","Stapf",16 25203,"","Rautanenia","Buchenau",16 12557,"","Sagittaria","L.",16 12558,"","Wiesneria","Micheli",16 11875,"","Agapanthus","L'Her.",17 11881,"","Allium","L.",17 11886,"","Ancrumia","Harv. ex Baker",17 11889,"","Androstephium","Torr.",17 18951,"","Beauverdia","Herter",17 18949,"","Behria","Greene",17 11904,"","Bessera","Schult.",17 11906,"","Bloomeria","Kellogg",17 18946,"","Brevoortia","A.W.Wood",17 11910,"","Brodiaea","Sm.",17 11918,"","Caloscordum","Herb.",17 25550,"","Chrysocoryne","Zoellner",17 11936,"","Dandya","H.E.Moore",17 11940,"","Dichelostemma","Kunth",17 18947,"","Dipterostemon","Rydb.",17 11954,"","Erinna","Phil.",17 11963,"","Garaventia","Looser",17 11966,"","Gethyum","Phil.",17 11967,"","Gilliesia","Lindl.",17 11988,"","Ipheion","Raf.",17 11998,"","Latace","Phil.",17 12001,"","Leucocoryne","Lindl.",17 12016,"","Miersia","Lindl.",17 12017,"","Milla","Cav.",17 12019,"","Milula","Prain",17 12020,"","Muilla","S.Watson ex Benth.",17 12025,"","Nectaroscordum","Lindl.",17 12033,"","Nothoscordum","Kunth",17 25551,"","Pabellonia","Quezada & Martic.",17 12041,"","Petronymphe","H.E.Moore",17 12068,"","Solaria","Phil.",17 12070,"","Speea","Loes.",17 18950,"","Steinmannia","Phil.",17 12073,"","Stemmatium","Phil.",17 18948,"","Stropholirion","Torr.",17 12084,"","Trichlora","Baker",17 12089,"","Tristagma","Poepp.",17 12090,"","Triteleia","Douglas ex Lindl.",17 12091,"","Triteleiopsis","Hoover",17 12092,"","Tulbaghia","L.",17 11882,"","Aloe","L.",18 18874,"","Apicra","Willd.",18 16228,"","Astroloba","Uitewaal",18 18873,"","Chamaealoe","A.Berger",18 18875,"","Chortolirion","A.Berger",18 17490,"x","Gasteraloe","Guillaumin",18 25593,"x","Gasterhaworthia","G.D.Rowley",18 11964,"","Gasteria","Duval",18 17491,"x","Gastrolea","E.Walther",18 11971,"","Haworthia","Duval",18 12008,"","Lomatophyllum","Willd.",18 16229,"","Poellnitzia","Uitewaal",18 4888,"","Alseuosmia","A.Cunn.",19 16231,"","Crispiloba","Steenis",19 4889,"","Memecylanthus","Gilg & Schltr.",19 16232,"","Pachydiscus","Gilg & Schltr.",19 4890,"","Periomphale","Baill.",19 7047,"","Wittsteinia","F.Muell.",19 11840,"","Alstroemeria","L.",20 11841,"","Bomarea","Mirb.",20 11842,"","Leontochir","Phil.",20 11843,"","Schickendantzia","Pax",20 3924,"","Alzatea","Ruiz & Pav.",21 16672,"","Acanthochiton","Torr.",22 9469,"","Achyranthes","L.",22 9470,"","Achyropsis","(Moq.) Hook.f.",22 22056,"","Acnida","L.",22 9471,"","Aerva","Forssk.",22 9472,"","Allmania","R.Br. ex Wight",22 9473,"","Allmaniopsis","Suess.",22 9474,"","Alternanthera","Forssk.",22 9475,"","Amaranthus","L.",22 16673,"","Apterantha","C.H.Wright",22 9476,"","Arthraerua","(Kuntze) Schinz",22 22055,"","Banalia","Moq.",22 17314,"","Blutaparon","Raf.",22 9477,"","Bosea","L.",22 24632,"","Bragantia","Vand.",22 22067,"","Brandesia","Mart.",22 22063,"","Brayulinea","Small",22 9478,"","Calicorema","Hook.f.",22 9479,"","Celosia","L.",22 9480,"","Centema","Hook.f.",22 9481,"","Centemopsis","Schinz",22 9482,"","Centrostachys","Wall.",22 9483,"","Chamissoa","Kunth",22 9484,"","Charpentiera","Gaudich.",22 9485,"","Chionothrix","Hook.f.",22 16674,"","Cladostachys","D.Don",22 22065,"","Cladothrix","(Moq.) Hook.f.",22 9487,"","Cyathula","Blume",22 9489,"","Dasysphaera","Volkens ex Gilg",22 9490,"","Deeringia","R.Br.",22 9491,"","Dicraurus","Hook.f.",22 9492,"","Digera","Forssk.",22 9493,"","Dipteranthemum","F.Muell.",22 9494,"","Eriostylos","C.C.Towns.",22 9495,"","Froelichia","Moench",22 9496,"","Froelichiella","R.E.Fr.",22 9497,"","Gomphrena","L.",22 22064,"","Gossypianthus","Hook.",22 9498,"","Guilleminea","Kunth",22 22066,"","Hebantha","Mart.",22 9499,"","Henonia","Moq.",22 9500,"","Herbstia","Sohmer",22 9501,"","Hermbstaedtia","Rchb.",22 9502,"","Indobanalia","A.N.Henry & B.Roy",22 9503,"","Irenella","Suess.",22 9504,"","Iresine","P.Browne",22 23216,"","Kentrosphaera","Volkens",22 9488,"","Kyphocarpa","(Fenzl ex Endl.) Lopr.",22 9505,"","Lagrezia","Moq.",22 9506,"","Leucosphaera","Gilg",22 9507,"","Lithophila","Sw.",22 9508,"","Lopriorea","Schinz",22 22059,"","Marcellia","Baill.",22 9509,"","Marcelliopsis","Schinz",22 9510,"","Mechowia","Schinz",22 22053,"","Melanocarpum","Hook.f.",22 22068,"","Mogiphanes","Mart.",22 22057,"","Montelia","A.Gray",22 9511,"","Nelsia","Schinz",22 9512,"","Neocentema","Schinz",22 9513,"","Nothosaerva","Wight",22 9514,"","Nototrichium","(A.Gray) W.F.Hillebr.",22 9515,"","Nyssanthes","R.Br.",22 9516,"","Pandiaka","(Moq.) Hook.f.",22 9517,"","Pfaffia","Mart.",22 9518,"","Philoxerus","R.Br.",22 9520,"","Pleuropetalum","Hook.f.",22 9521,"","Pleuropterantha","Franch.",22 17313,"","Polyrhabda","C.C.Towns.",22 16675,"","Pseudodigera","Chiov.",22 9522,"","Pseudogomphrena","R.E.Fr.",22 9523,"","Pseudoplantago","Suess.",22 16676,"","Pseudosericocoma","Cavaco",22 22058,"","Psilodigera","Suess.",22 22061,"","Psilostachys","Hochst.",22 9524,"","Psilotrichopsis","C.C.Towns.",22 9525,"","Psilotrichum","Blume",22 9526,"","Ptilotus","R.Br.",22 9527,"","Pupalia","Juss.",22 25525,"","Quaternella","Pedersen",22 20151,"","Robynsiella","Suess.",22 22054,"","Rodetia","Moq.",22 25033,"","Rosifax","C.C.Towns.",22 9529,"","Saltia","R.Br. ex Moq.",22 9530,"","Sericocoma","Fenzl",22 9531,"","Sericocomopsis","Schinz",22 9532,"","Sericorema","(Hook.f.) Lopr.",22 9533,"","Sericostachys","Gilg & Lopr.",22 24324,"","Siamosia","K.Larsen & Pedersen",22 9534,"","Stilbanthus","Hook.f.",22 22070,"","Telanthera","R.Br.",22 9535,"","Tidestromia","Standl.",22 22062,"","Trichinium","R.Br.",22 23206,"","Trichuriella","Bennet",22 9536,"","Trichurus","C.C.Towns.",22 9537,"","Volkensinia","Schinz",22 9538,"","Woehleria","Griseb.",22 17494,"x","Amarcrinum","Coutts",23 17495,"x","Amarine","Sealy",23 11768,"","Amaryllis","L.",23 11769,"","Ammocharis","Herb.",23 23082,"","Anax","Ravenna",23 16933,"","Anoiganthus","Baker",23 11770,"","Apodolirion","Baker",23 16254,"","Bokkeveldia","D.Mull.-Doblies & U.Mull.-Doblies",23 11771,"","Boophone","Herb.",23 11772,"","Braxireon","Raf.",23 11773,"","Brunsvigia","Heist.",23 24299,"x","Calicharis","Meerow",23 16934,"","Caliphruria","Herb.",23 11775,"","Callipsyche","Herb.",23 22222,"","Callithauma","Herb.",23 11776,"","Calostemma","R.Br.",23 11777,"","Carpolyza","Salisb.",23 11778,"","Castellanoa","Traub",23 11779,"","Chapmanolirion","Dinter",23 11780,"","Chlidanthus","Herb.",23 16935,"","Choananthus","Rendle",23 11781,"","Clivia","Lindl.",23 16940,"","Collania","Schult. & Schult.f.",23 18954,"","Cooperia","Herb.",23 22255,"x","Crindonna","Ragion.",23 22256,"x","Crinodonna","Stapf",23 11782,"","Crinum","L.",23 18958,"","Crocopsis","Pax",23 11783,"","Cryptostephanus","Welw. ex Baker",23 11784,"","Cybistetes","Milne-Redh. & Schweick.",23 11785,"","Cyrtanthus","Aiton",23 11786,"","Elisena","Herb.",23 11787,"","Eucharis","Planch. & Linden",23 11788,"","Eucrosia","Ker Gawl.",23 11789,"","Eurycles","Salisb. ex Schult. & Schult.f.",23 11790,"","Eustephia","Cav.",23 18957,"","Eustephiopsis","R.E.Fr.",23 11791,"","Famatina","Ravenna",23 11792,"","Galanthus","L.",23 16255,"","Gemmaria","Salisb.",23 11793,"","Gethyllis","L.",23 11794,"","Griffinia","Ker Gawl.",23 11795,"","Habranthus","Herb.",23 11796,"","Haemanthus","L.",23 11797,"","Hannonia","Braun-Blanq. & Maire",23 11798,"","Haylockia","Herb.",23 11799,"","Hessea","Herb.",23 11800,"","Hieronymiella","Pax",23 11801,"","Hippeastrum","Herb.",23 11802,"","Hyline","Herb.",23 11803,"","Hymenocallis","Salisb.",23 18959,"","Ismene","Salisb. ex Herb.",23 25838,"","Kamiesbergia","Snijman",23 18953,"","Klingia","Schonl.",23 11804,"","Lapiedra","Lag.",23 11805,"","Leptochiton","Sealy",23 11806,"","Leucojum","L.",23 11807,"","Lycoris","Herb.",23 17745,"","Mathieua","Klotzsch",23 11808,"","Mizonia","A.Chev.",23 16936,"","Moldenkea","Traub",23 16256,"","Namaquanula","D.Mull.-Doblies & U.Mull.-Doblies",23 11809,"","Narcissus","L.",23 25546,"","Neostricklandia","Rauschert",23 11810,"","Nerine","Herb.",23 11811,"","Pamianthe","Stapf",23 11812,"","Pancratium","L.",23 11813,"","Paramongaia","Velarde",23 11814,"","Phaedranassa","Herb.",23 24622,"","Phycella","Lindl.",23 11815,"","Placea","Miers",23 11816,"","Plagiolirion","Baker",23 24623,"","Proiphys","Herb.",23 11817,"","Pseudostenomesson","Velarde",23 16937,"","Pseudourceolina","Vargas",23 11818,"","Pyrolirion","Herb.",23 11819,"","Rauhia","Traub",23 25841,"","Rhodolirion","Dalla Torre & Harms",23 25840,"","Rhodolirium","Phil.",23 18955,"","Rhodophiala","C.Presl",23 11820,"","Scadoxus","Raf.",23 11821,"","Sprekelia","Heist.",23 11822,"","Stenomesson","Herb.",23 11823,"","Sternbergia","Waldst. & Kit.",23 16938,"","Stricklandia","Baker",23 11824,"","Strumaria","Jacq. ex Willd.",23 18952,"","Tapeinanthus","Herb.",23 16257,"","Tedingea","D.Mull.-Doblies & U.Mull.-Doblies",23 11825,"","Traubia","Moldenke",23 11826,"","Ungernia","Bunge",23 17496,"x","Urceocharis","Mast.",23 11827,"","Urceolina","Rchb.",23 11828,"","Vagaria","Herb.",23 18956,"","Vallota","Salisb. ex Herb.",23 18794,"","Worsleya","(Traub) Traub",23 16939,"","Zephyranthella","(Pax) Pax",23 11829,"","Zephyranthes","Herb.",23 9820,"","Amborella","Baill.",24 2412,"","Actinocheita","F.A.Barkley",25 17907,"","Allospondias","(Pierre) Stapf",25 16449,"","Amphipterygium","Schiede ex Standl.",25 2413,"","Anacardium","L.",25 17894,"","Anaphrenium","E.Mey. ex Endl.",25 24549,"","Anauxanopetalum","Teijsm. & Binn.",25 2414,"","Androtium","Stapf",25 2415,"","Antrocaryon","Pierre",25 25601,"","Apterokarpos","Rizzini",25 2416,"","Astronium","Jacq.",25 24550,"","Astropetalum","Griff.",25 2483,"","Blepharocarya","F.Muell.",25 14249,"","Bonetiella","Rzed.",25 17906,"","Botryceras","Willd.",25 2417,"","Bouea","Meisn.",25 2418,"","Buchanania","Spreng.",25 2419,"","Campnosperma","Thwaites",25 2420,"","Cardenasiodendron","F.A.Barkley",25 2421,"","Choerospondias","B.L.Burtt & A.W.Hill",25 24553,"","Comeurya","Baill.",25 2422,"","Comocladia","P.Browne",25 24552,"","Coniogeton","Blume",25 2423,"","Cotinus","Mill.",25 2424,"","Cyrtocarpa","Kunth",25 17905,"","Cyrtospermum","Benth.",25 17910,"","Dasycarya","Liebm.",25 2425,"","Dracontomelon","Blume",25 2426,"","Drimycarpus","Hook.f.",25 16443,"","Duckera","F.A.Barkley",25 17898,"","Duvaua","Kunth",25 17901,"","Emiliomarcetia","T.Durand & H.Durand",25 2428,"","Euleria","Urb.",25 2429,"","Euroschinus","Hook.f.",25 2430,"","Faguetia","Marchand",25 2431,"","Fegimanra","Pierre",25 2432,"","Gluta","L.",25 2433,"","Haematostaphis","Hook.f.",25 2434,"","Haplorhus","Engl.",25 2435,"","Harpephyllum","Bernh. ex Krauss",25 2436,"","Heeria","Meisn.",25 2437,"","Holigarna","Buch.-Ham. ex Roxb.",25 2480,"","Juliania","Schltdl.",25 2438,"","Koordersiodendron","Engl.",25 2439,"","Lannea","A.Rich.",25 17902,"","Lanneoma","Delile",25 2440,"","Laurophyllus","Thunb.",25 16444,"","Lithraea","Miers ex Hook. & Arn.",25 2441,"","Loxopterygium","Hook.f.",25 2442,"","Loxostylis","A.Spreng. ex Rchb.",25 17890,"","Malosma","(Nutt.) Raf.",25 2443,"","Mangifera","L.",25 2444,"","Mauria","Kunth",25 2445,"","Melanochyla","Hook.f.",25 24557,"","Melanococca","Blume",25 2446,"","Melanocommia","Ridl.",25 2447,"","Melanorrhoea","Wall.",25 2448,"","Metopium","P.Browne",25 2449,"","Micronychia","Oliv.",25 17897,"","Microstemon","Engl.",25 2451,"","Mosquitoxylum","Krug & Urb.",25 17904,"","Myracrodruon","Allemao",25 17891,"","Neostyphonia","Shafer",25 2452,"","Nothopegia","Blume",25 16445,"","Nothopegiopsis","Lauterb.",25 24556,"","Nothoprotium","Miq.",25 2453,"","Ochoterenaea","F.A.Barkley",25 17903,"","Odina","Roxb.",25 16446,"","Oncocarpus","A.Gray",25 2454,"","Operculicarya","H.Perrier",25 2481,"","Orthopterygium","Hemsl.",25 2455,"","Ozoroa","Delile",25 2456,"","Pachycormus","Coville ex Standl.",25 2457,"","Parishia","Hook.f.",25 2458,"","Pegia","Colebr.",25 2459,"","Pentaspadon","Hook.f.",25 24547,"","Phanrangia","Tardieu",25 17900,"","Phlebochiton","Wall.",25 2460,"","Pistacia","L.",25 2461,"","Pleiogynium","Engl.",25 2462,"","Poupartia","Comm. ex Juss.",25 2463,"","Protorhus","Engl.",25 2465,"","Pseudosmodingium","Engl.",25 2466,"","Pseudospondias","Engl.",25 17896,"","Quebrachia","Griseb.",25 2467,"","Rhodosphaera","Engl.",25 2468,"","Rhus","L.",25 16447,"","Scassellatia","Chiov.",25 2469,"","Schinopsis","Engl.",25 2470,"","Schinus","L.",25 2471,"","Sclerocarya","Hochst.",25 17892,"","Searsia","F.A.Barkley",25 2472,"","Semecarpus","L.f.",25 17908,"","Skoliostigma","Lauterb.",25 2473,"","Smodingium","E.Mey. ex Sond.",25 17909,"","Solenocarpus","Wight & Arn.",25 2474,"","Sorindeia","Thouars",25 17895,"","Sorindeiopsis","Engl.",25 2475,"","Spondias","L.",25 24554,"","Stagmaria","Jack",25 2476,"","Swintonia","Griff.",25 24555,"","Syndesmis","Wall.",25 2477,"","Tapirira","Aubl.",25 17893,"","Terminthia","Bernh.",25 2478,"","Thyrsodium","Salzm. ex Benth.",25 16448,"","Toxicodendron","Mill.",25 2479,"","Trichoscypha","Hook.f.",25 24551,"","Tropidopetalum","Turcz.",25 10499,"","Trujanoa","La Llave",25 17899,"","Veatchia","A.Gray",25 12633,"","Anarthria","R.Br.",26 1216,"","Ancistrocladus","Wall.",27 3497,"","Anisophyllea","R.Br. ex Sabine",28 24463,"","Anisophyllum","G.Don",28 3504,"","Combretocarpus","Hook.f.",28 3510,"","Poga","Pierre",28 3511,"","Polygonanthus","Ducke",28 24590,"","Tetracarpaea","Benth.",28 18663,"","Aberemoa","Aubl.",29 108,"","Afroguatteria","Boutique",29 18664,"","Alcmene","Urb.",29 109,"","Alphonsea","Hook.f. & Thomson",29 18704,"","Alphonseopsis","Baker f.",29 110,"","Ambavia","Le Thomas",29 111,"","Anaxagorea","A.St.-Hil.",29 24687,"","Ancana","F.Muell.",29 25523,"","Annickia","Setten & Maas",29 112,"","Annona","L.",29 113,"","Anomianthus","Zoll.",29 114,"","Anonidium","Engl. & Diels",29 18661,"","Ararocarpus","Scheff.",29 25764,"","Armenteria","Thouars ex Baill.",29 115,"","Artabotrys","R.Br.",29 18671,"","Asimia","Kunth",29 116,"","Asimina","Adans.",29 117,"","Asteranthe","Engl. & Diels",29 18669,"","Asteranthopsis","Kuntze",29 118,"","Atopostema","Boutique",29 18686,"","Atrutegia","Bedd.",29 119,"","Balonga","Le Thomas",29 18687,"","Beccariodendron","Warb.",29 120,"","Bocagea","A.St.-Hil.",29 121,"","Bocageopsis","R.E.Fr.",29 122,"","Boutiquea","Le Thomas",29 123,"","Brieya","De Wild.",29 124,"","Cananga","(DC.) Hook.f. & Thomson",29 18662,"","Cananga","Aubl.",29 17564,"","Canangium","Baill.",29 125,"","Cardiopetalum","Schltdl.",29 18688,"","Chieniodendron","Tsiang & P.T.Li",29 18683,"","Clathrospermum","Planch. ex Benth.",29 126,"","Cleistochlamys","Oliv.",29 127,"","Cleistopholis","Pierre ex Engl.",29 18694,"","Coelocline","A.DC.",29 128,"","Cremastosperma","R.E.Fr.",29 129,"","Cyathocalyx","Champ. ex Hook.f. & Thomson",29 130,"","Cyathostemma","Griff.",29 131,"","Cymbopetalum","Benth.",29 132,"","Dasoclema","J.Sinclair",29 133,"","Dasymaschalon","(Hook.f. & Thomson) Dalla Torre & Harms",29 134,"","Deeringothamnus","Small",29 14179,"","Dendrokingstonia","Rauschert",29 135,"","Dennettia","Baker f.",29 136,"","Desmopsis","Saff.",29 137,"","Desmos","Lour.",29 138,"","Diclinanona","Diels",29 18705,"","Dielsina","Kuntze",29 139,"","Dielsiothamnus","R.E.Fr.",29 140,"","Disepalum","Hook.f.",29 141,"","Drepananthus","Maingay ex Hook.f.",29 142,"","Duckeanthus","R.E.Fr.",29 143,"","Duguetia","A.St.-Hil.",29 144,"","Eburopetalum","Becc.",29 145,"","Ellipeia","Hook.f. & Thomson",29 146,"","Ellipeiopsis","R.E.Fr.",29 147,"","Enantia","Oliv.",29 24690,"","Enicosanthellum","Ban",29 148,"","Enicosanthum","Becc.",29 149,"","Enneastemon","Exell",29 150,"","Ephedranthus","S.Moore",29 151,"","Exellia","Boutique",29 18681,"","Fenerivia","Diels",29 152,"","Fissistigma","Griff.",29 16266,"","Fitzalania","F.Muell.",29 18670,"","Fitzgeraldia","F.Muell.",29 153,"","Friesodielsia","Steenis",29 154,"","Froesiodendron","R.E.Fr.",29 155,"","Fusaea","(Baill.) Saff.",29 18665,"","Geanthemum","(R.E.Fr.) Saff.",29 156,"","Gilbertiella","Boutique",29 157,"","Goniothalamus","(Blume) Hook.f. & Thomson",29 158,"","Greenwayodendron","Verdc.",29 18676,"","Griffithia","Maingay ex King",29 18677,"","Griffithianthus","Merr.",29 159,"","Guamia","Merr.",29 25765,"","Guanabanus","Mill.",29 160,"","Guatteria","Ruiz & Pav.",29 161,"","Guatteriella","R.E.Fr.",29 162,"","Guatteriopsis","R.E.Fr.",29 18695,"","Habzelia","A.DC.",29 163,"","Haplostichanthus","F.Muell.",29 18678,"","Henicosanthum","Dalla Torre & Harms",29 164,"","Heteropetalum","Benth.",29 165,"","Hexalobus","A.DC.",29 166,"","Hornschuchia","Nees",29 18706,"","Hyalostemma","Wall. ex Meisn.",29 167,"","Isolona","Engl.",29 24797,"","Kentia","Blume",29 24691,"","Kinginda","Kuntze",29 168,"","Kingstonia","Hook.f. & Thomson",29 169,"","Letestudoxa","Pellegr.",29 170,"","Lettowianthus","Diels",29 18707,"","Lonchomera","Hook.f. & Thomson",29 24694,"","Macania","Blanco",29 171,"","Malmea","R.E.Fr.",29 18675,"","Marcuccia","Becc.",29 18657,"","Marenteria","Thouars",29 172,"","Marsypopetalum","Scheff.",29 173,"","Meiocarpidium","Engl. & Diels",29 174,"","Meiogyne","Miq.",29 175,"","Melodorum","Lour.",29 18689,"","Melodorum","(Dunal) Hook.f. & Thomson",29 176,"","Mezzettia","Becc.",29 177,"","Mezzettiopsis","Ridl.",29 178,"","Miliusa","Lesch. ex A.DC.",29 179,"","Mischogyne","Exell",29 180,"","Mitrella","Miq.",29 181,"","Mitrephora","(Blume) Hook.f. & Thomson",29 182,"","Mkilua","Verdc.",29 183,"","Monanthotaxis","Baill.",29 184,"","Monocarpia","Miq.",29 185,"","Monocyclanthus","Keay",29 186,"","Monodora","Dunal",29 18679,"","Monoon","Miq.",29 22074,"","Mosenodendron","R.E.Fr.",29 18658,"","Narum","Adans.",29 18659,"","Naruma","Raf.",29 187,"","Neo-Uvaria","Airy Shaw",29 188,"","Neostenanthera","Exell",29 189,"","Oncodostigma","Diels",29 190,"","Onychopetalum","R.E.Fr.",29 191,"","Ophrypetalum","Diels",29 18672,"","Orchidocarpum","Michx.",29 192,"","Oreomitra","Diels",29 193,"","Orophea","Blume",29 194,"","Oxandra","A.Rich.",29 18685,"","Oxymitra","(Blume) Hook.f. & Thomson",29 195,"","Pachypodanthium","Engl. & Diels",29 196,"","Papualthia","Diels",29 18668,"","Parabotrys","Mull.Hal.",29 18693,"","Parartabotrys","Miq.",29 18698,"","Patonia","Wight",29 16268,"","Petalolophus","K.Schum.",29 197,"","Phaeanthus","Hook.f. & Thomson",29 16264,"","Phoenicanthus","Alston",29 198,"","Piptostigma","Oliv.",29 18673,"","Pityothamnus","Small",29 199,"","Platymitra","Boerl.",29 25766,"","Pleuripetalum","T.Durand",29 200,"","Polyalthia","Blume",29 201,"","Polyaulax","Backer",29 202,"","Polyceratocarpus","Engl. & Diels",29 203,"","Popowia","Endl.",29 204,"","Porcelia","Ruiz & Pav.",29 205,"","Pseudannona","(Baill.) Saff.",29 206,"","Pseudartabotrys","Pellegr.",29 24695,"","Pseudephedranthus","Aristeg.",29 207,"","Pseudoxandra","R.E.Fr.",29 208,"","Pseuduvaria","Miq.",29 18660,"","Pyragma","Noronha",29 209,"","Pyramidanthe","Miq.",29 210,"","Raimondia","Saff.",29 211,"","Rauwenhoffia","Scheff.",29 212,"","Reedrollinsia","J.W.Walker",29 18682,"","Rhopalocarpus","Teijsm. & Binn. ex Miq.",29 213,"","Richella","A.Gray",29 214,"","Rollinia","A.St.-Hil.",29 215,"","Rolliniopsis","Saff.",29 18667,"","Ropalopetalum","Griff.",29 216,"","Ruizodendron","R.E.Fr.",29 217,"","Saccopetalum","Benn.",29 218,"","Sageraea","Dalzell",29 219,"","Sapranthus","Seem.",29 220,"","Schefferomitra","Diels",29 24798,"","Schnittspahnia","Rchb.",29 24688,"","Soala","Blanco",29 18684,"","Sphaerocoryne","(Boerl.) Scheff. ex Ridl.",29 18680,"","Sphaerothalamus","Hook.f.",29 221,"","Stelechocarpus","Hook.f. & Thomson",29 222,"","Stenanona","Standl.",29 18701,"","Stenanthera","Engl. & Diels",29 18666,"","Stormia","S.Moore",29 223,"","Tetrameranthus","R.E.Fr.",29 224,"","Tetrapetalum","Miq.",29 18702,"","Tetrastemma","Diels ex H.Winkl.",29 18703,"","Thonnera","De Wild.",29 225,"","Toussaintia","Boutique",29 226,"","Tridimeris","Baill.",29 227,"","Trigynaea","Schltdl.",29 18674,"","Trigyneia","Rchb.",29 228,"","Trivalvaria","(Miq.) Miq.",29 17565,"","Unona","L.f.",29 229,"","Unonopsis","R.E.Fr.",29 25767,"","Uva","Kuntze",29 230,"","Uvaria","L.",29 231,"","Uvariastrum","Engl.",29 232,"","Uvariella","Ridl.",29 233,"","Uvariodendron","(Engl. & Diels) R.E.Fr.",29 234,"","Uvariopsis","Engl.",29 18699,"","Waria","Aubl.",29 235,"","Woodiella","Merr.",29 14180,"","Woodiellantha","Rauschert",29 236,"","Xylopia","L.",29 18700,"","Xylopiastrum","Roberty",29 18690,"","Xylopicron","Adans.",29 18691,"","Xylopicrum","P.Browne",29 11877,"","Alania","Endl.",30 11879,"","Alectorurus","Makino",30 11890,"","Anemarrhena","Bunge",30 11891,"","Anthericum","L.",30 11893,"","Arnocrinum","Endl. & Lehm.",30 11894,"","Arthropodium","R.Br.",30 11907,"","Borya","Labill.",30 18880,"","Bottionea","Colla",30 11915,"","Caesia","R.Br.",30 11924,"","Chamaescilla","F.Muell. ex Benth.",30 11928,"","Chlorophytum","Ker Gawl.",30 14230,"","Comospermum","Rauschert",30 11934,"","Corynotheca","F.Muell. ex Benth.",30 18879,"","Dasystachys","Baker",30 18876,"","Debesia","Kuntze",30 18878,"","Diamena","Ravenna",30 11941,"","Dichopogon","Kunth",30 18877,"","Diora","Ravenna",30 17748,"","Diuranthera","Hemsl.",30 11950,"","Echeandia","Ortega",30 11952,"","Eremocrinum","M.E.Jones",30 17493,"","Hagenbachia","Nees & Mart.",30 11976,"","Hensmania","W.Fitzg.",30 11977,"","Herpolirion","Hook.f.",30 11983,"","Hodgsoniola","F.Muell.",30 11992,"","Johnsonia","R.Br.",30 11999,"","Laxmannia","R.Br.",30 12002,"","Leucocrinum","Nutt. ex A.Gray",30 12021,"","Murchisonia","Brittan",30 18881,"","Nanolirion","Benth.",30 12039,"","Pasithea","D.Don",30 12069,"","Sowerbaea","Sm.",30 12072,"","Stawellia","F.Muell.",30 12080,"","Thysanotus","R.Br.",30 12085,"","Trichopetalum","Lindl.",30 12086,"","Tricoryne","R.Br.",30 11892,"","Aphyllanthes","L.",31 7297,"","Acokanthera","G.Don",32 7298,"","Adenium","Roem. & Schult.",32 7299,"","Aganonerion","Pierre ex Spire",32 7300,"","Aganosma","(Blume) G.Don",32 16570,"","Aladenia","Pichon",32 7301,"","Alafia","Thouars",32 7302,"","Allamanda","L.",32 16571,"","Allemanda","L.",32 7303,"","Allomarkgrafia","Woodson",32 7304,"","Allowoodsonia","Markgr.",32 7305,"","Alstonia","R.Br.",32 7306,"","Alyxia","Banks ex R.Br.",32 7307,"","Amalocalyx","Pierre",32 7308,"","Ambelania","Aubl.",32 17725,"","Amblyanthera","Mull.Arg.",32 16572,"","Amblyocalyx","Benth.",32 17726,"","Amphineurion","(A.DC.) Pichon",32 7309,"","Amsonia","Walter",32 17705,"","Anacampta","Miers",32 17706,"","Anartia","Miers",32 7310,"","Ancylobothrys","Pierre",32 19251,"","Ancylobotrys","Pierre",32 17675,"","Ancylocladus","Wall.",32 7311,"","Anechites","Griseb.",32 7312,"","Angadenia","Miers",32 17727,"","Anisolobus","A.DC.",32 7313,"","Anodendron","A.DC.",32 7314,"","Anthoclitandra","(Pierre) Pichon",32 7315,"","Aphanostylis","Pierre",32 7316,"","Apocynum","L.",32 17720,"","Aptotheca","Miers",32 16573,"","Argyronerium","Pit.",32 7317,"","Artia","Guillaumin",32 7318,"","Asketanthera","Woodson",32 7319,"","Aspidosperma","Mart. & Zucc.",32 7320,"","Baissea","A.DC.",32 7321,"","Beaumontia","Wall.",32 16574,"","Belandra","S.F.Blake",32 16575,"","Bisquamaria","Pichon",32 25227,"","Blaberopus","A.DC.",32 17728,"","Bleekeria","Hassk.",32 17703,"","Bonafousia","A.DC.",32 7322,"","Bousigonia","Pierre",32 7323,"","Bracea","Britton",32 7324,"","Cabucala","Pichon",32 7325,"","Callichilia","Stapf",32 7326,"","Calocrater","K.Schum.",32 17687,"","Calpicarpum","G.Don",32 7327,"","Cameraria","L.",32 25588,"","Camerunia","(Pichon) Boiteau",32 19253,"","Capuronetta","Markgr.",32 7328,"","Carissa","L.",32 17686,"","Carpodinopsis","Pichon",32 17677,"","Carpodinus","R.Br. ex G.Don",32 7329,"","Carruthersia","Seem.",32 7330,"","Carvalhoa","K.Schum.",32 7331,"","Catharanthus","G.Don",32 7332,"","Cerbera","L.",32 7333,"","Cerberiopsis","Vieill. ex Pancher & Sebert",32 25177,"","Cercocoma","Wall. ex G.Don",32 16576,"","Chaetosus","Benth.",32 7334,"","Chamaeclitandra","(Stapf) Pichon",32 25174,"","Chavannesia","A.DC.",32 7335,"","Chilocarpus","Blume",32 7336,"","Chonemorpha","G.Don",32 19256,"","Christya","Ward & Harv.",32 19257,"","Chunechites","Tsiang",32 7337,"","Cleghornia","Wight",32 7338,"","Clitandra","Benth.",32 7339,"","Clitandropsis","S.Moore",32 25175,"","Codonechites","Markgr.",32 16580,"","Codonura","K.Schum.",32 17682,"","Comularia","Pichon",32 7340,"","Condylocarpon","Desf.",32 7341,"","Conopharyngia","G.Don",32 7342,"","Couma","Aubl.",32 16581,"","Coutinia","Vell.",32 7343,"","Craspidospermum","Bojer ex A.DC.",32 7344,"","Crioceras","Pierre",32 15899,"","Cufodontia","Woodson",32 7346,"","Cycladenia","Benth.",32 7347,"","Cyclocotyla","Stapf",32 7348,"","Cylindropsis","Pierre",32 17691,"","Cylindrosperma","Ducke",32 7349,"","Cyrtosiphonia","Miq.",32 7350,"","Daturicarpa","Stapf",32 7351,"","Delphyodon","K.Schum.",32 7352,"","Dewevrella","De Wild.",32 7353,"","Dictyophleba","Pierre",32 16582,"","Dipladenia","A.DC.",32 7354,"","Diplorhynchus","Welw. ex Ficalho & Hiern",32 16583,"","Discalyxia","Markgr.",32 16584,"","Domkeocarpa","Markgr.",32 7355,"","Dyera","Hook.f.",32 7356,"","Ecdysanthera","Hook. & Arn.",32 7357,"","Echites","P.Browne",32 16585,"","Ectinocladus","Benth.",32 7358,"","Ellertonia","Wight",32 7359,"","Elytropus","Mull.Arg.",32 17700,"","Ephippiocarpa","Markgr.",32 7360,"","Epigynum","Wight",32 17719,"","Eriadenia","Miers",32 17695,"","Ervatamia","(A.DC.) Stapf",32 7361,"","Eucorymbia","Stapf",32 17688,"","Excavatia","Markgr.",32 7362,"","Farquharia","Stapf",32 7363,"","Fernaldia","Woodson",32 16586,"","Formosia","Pichon",32 7364,"","Forsteronia","G.Mey.",32 7365,"","Funtumia","Stapf",32 17701,"","Gabunia","K.Schum. ex Stapf",32 7366,"","Galactophora","Woodson",32 17711,"","Gastranthus","F.Muell.",32 7367,"","Geissospermum","Allemao",32 7368,"","Giadotrum","Pichon",32 7369,"","Gonioma","E.Mey.",32 19258,"","Grisseea","Bakh.f.",32 16587,"","Guerkea","K.Schum.",32 7370,"","Hancornia","Gomes",32 16588,"","Hanghomia","Gagnep. & Thenint",32 16589,"","Haplophandra","Pichon",32 7371,"","Haplophyton","A.DC.",32 17697,"","Hazunta","Pichon",32 25176,"","Hedranthera","(Stapf) Pichon",32 7372,"","Himatanthus","Willd. ex Schult.",32 17713,"","Holalafia","Stapf",32 7373,"","Holarrhena","R.Br.",32 7374,"","Hunteria","Roxb.",32 16590,"","Hymenolophus","Boerl.",32 7375,"","Ichnocarpus","R.Br.",32 7376,"","Isonema","R.Br.",32 7377,"","Ixodonerium","Pit.",32 16591,"","Jasminochyla","(Stapf) Pichon",32 19252,"","Kamettia","Kostel.",32 17709,"","Kentrochrosia","K.Schum. & Lauterb.",32 7378,"","Kibatalia","G.Don",32 7379,"","Kopsia","Blume",32 7380,"","Lacmellea","H.Karst.",32 7381,"","Lamechites","Markgr.",32 7382,"","Landolphia","P.Beauv.",32 17714,"","Lanugia","N.E.Br.",32 7383,"","Laseguea","A.DC.",32 7384,"","Laubertia","A.DC.",32 17721,"","Laxoplumeria","Markgr.",32 7385,"","Lepinia","Decne.",32 7386,"","Lepiniopsis","Valeton",32 25586,"","Leptopharyngia","(Stapf) Boiteau",32 7387,"","Leuconotis","Jack",32 17690,"","Lochnera","Endl.",32 7388,"","Lyonsia","R.Br.",32 7389,"","Macoubea","Aubl.",32 7390,"","Macropharynx","Rusby",32 7391,"","Macrosiphonia","Mull.Arg.",32 7392,"","Malouetia","A.DC.",32 7393,"","Malouetiella","Pichon",32 7394,"","Mandevilla","Lindl.",32 1601,"","Mascarenhasia","A.DC.",32 7395,"","Melodinus","J.R.Forst. & G.Forst.",32 7396,"","Mesechites","Mull.Arg.",32 7397,"","Micrechites","Miq.",32 7398,"","Microchonea","Pierre",32 7399,"","Microplumeria","Baill.",32 17717,"","Mitozus","Miers",32 16592,"","Molongum","Pichon",32 17693,"","Morleya","Woodson",32 17692,"","Mortoniella","Woodson",32 7400,"","Motandra","A.DC.",32 16593,"","Muantum","Pichon",32 23068,"","Mucoa","Zarucchi",32 17699,"","Muntafara","Pichon",32 7401,"","Neisosperma","Raf.",32 7402,"","Neobracea","Britton",32 16594,"","Neocouma","Pierre",32 17676,"","Neokeithia","Steenis",32 16595,"","Neowollastonia","Wernham ex Ridl.",32 7403,"","Nerium","L.",32 7404,"","Neurolobium","Baill.",32 7405,"","Nouettea","Pierre",32 17716,"","Ochronerium","Baill.",32 7406,"","Ochrosia","Juss.",32 7407,"","Odontadenia","Benth.",32 16596,"","Oistanthera","Markgr.",32 7408,"","Oncinotis","Benth.",32 17694,"","Orchipeda","Blume",32 17710,"","Orthechites","Urb.",32 7409,"","Orthopichonia","H.Huber",32 7410,"","Pachypodium","Lindl.",32 7411,"","Pacouria","Aubl.",32 17696,"","Pagiantha","Markgr.",32 16597,"","Paladelpha","Pichon",32 17702,"","Pandaca","Thouars",32 19260,"","Pandacastrum","Pichon",32 7412,"","Papuechites","Markgr.",32 7413,"","Parabarium","Pierre",32 16598,"","Parabeaumontia","Pichon",32 7414,"","Parahancornia","Ducke",32 7415,"","Paralstonia","Baill.",32 7416,"","Paralyxia","Baill.",32 7417,"","Parameria","Benth.",32 7418,"","Parameriopsis","Pichon",32 17715,"","Paravallaris","Pierre",32 7419,"","Parsonsia","R.Br.",32 7420,"","Peltastes","Woodson",32 17674,"","Pentalinon","Voigt",32 16599,"","Perictenia","Miers",32 17704,"","Peschiera","A.DC.",32 7421,"","Petchia","Livera",32 25338,"","Pezisicarpus","Vernet",32 16600,"","Phrissocarpus","Miers",32 16601,"","Physetobasis","Hassk.",32 17712,"","Piaggiaea","Chiov.",32 7422,"","Picralima","Pierre",32 7423,"","Plectaneia","Thouars",32 7424,"","Pleiocarpa","Benth.",32 7425,"","Pleioceras","Baill.",32 7426,"","Pleuranthemum","(Pichon) Pichon",32 7427,"","Plumeria","L.",32 7428,"","Plumeriopsis","Rusby & Woodson",32 7429,"","Poacynum","Baill.",32 7430,"","Podochrosia","Baill.",32 17685,"","Polyadoa","Stapf",32 7431,"","Pottsia","Hook. & Arn.",32 7432,"","Prestonia","R.Br.",32 25587,"","Protogabunia","Boiteau",32 7433,"","Pseudochrosia","Blume",32 7434,"","Pseudowillughbeia","Markgr.",32 7435,"","Pteralyxia","K.Schum.",32 16577,"","Pterochrosia","Baill.",32 7436,"","Pterotaberna","Stapf",32 7437,"","Pycnobotrya","Benth.",32 16602,"","Quadricasaea","Woodson",32 25579,"","Quiotania","Zarucchi",32 7438,"","Rauvolfia","L.",32 16578,"","Rauwolfia","L.",32 17698,"","Rejoua","Gaudich.",32 7439,"","Rhabdadenia","Mull.Arg.",32 7440,"","Rhazya","Decne.",32 7441,"","Rhigospira","Miers",32 17689,"","Rhipidia","Markgr.",32 7442,"","Rhodocalyx","Mull.Arg.",32 7443,"","Rhynchodia","Benth.",32 16579,"","Robbia","A.DC.",32 19255,"","Roupellia","Wall. & Hook.",32 19254,"","Roupellina","(Baill.) Pichon",32 7444,"","Saba","(Pichon) Pichon",32 7445,"","Salpinctes","Woodson",32 25589,"","Sarcopharyngia","(Stapf) Boiteau",32 7447,"","Schizozygia","Baill.",32 16603,"","Scleranthera","Pichon",32 7448,"","Secondatia","A.DC.",32 7449,"","Sindechites","Oliv.",32 7450,"","Skytanthus","Meyen",32 7451,"","Spirolobium","Baill.",32 19259,"","Spongiosperma","Zarucchi",32 7452,"","Stemmadenia","Benth.",32 17708,"","Stenosolen","(Mull.Arg.) Markgr.",32 7453,"","Stephanostegia","Baill.",32 7454,"","Stephanostema","K.Schum.",32 7455,"","Stipecoma","Mull.Arg.",32 7456,"","Strempeliopsis","Benth.",32 17718,"","Streptotrachelus","Greenm.",32 7457,"","Strophanthus","DC.",32 17707,"","Taberna","Miers",32 7458,"","Tabernaemontana","L.",32 7459,"","Tabernanthe","Baill.",32 7460,"","Temnadenia","Miers",32 16604,"","Testudipes","Markgr.",32 17683,"","Tetradoa","Pichon",32 7461,"","Thenardia","Kunth",32 7462,"","Thevetia","L.",32 25339,"","Thyrsanthella","Pichon",32 15900,"","Tintinnabularia","Woodson",32 7463,"","Tonduzia","Pittier",32 7464,"","Trachelospermum","Lem.",32 16145,"","Trachomitum","Woodson",32 16605,"","Trichostomantherium","Domin",32 7465,"","Urceola","Roxb.",32 7466,"","Urechites","Mull.Arg.",32 7467,"","Urnularia","Stapf",32 7468,"","Vahadenia","Stapf",32 19261,"","Vallariopsis","Woodson",32 7469,"","Vallaris","Burm.f.",32 7470,"","Vallesia","Ruiz & Pav.",32 7471,"","Vinca","L.",32 7472,"","Voacanga","Thouars",32 16606,"","Walidda","(A.DC.) Pichon",32 7473,"","Willughbeia","Roxb.",32 25577,"","Willughbeiopsis","Rauschert",32 17681,"","Winchia","A.DC.",32 7474,"","Woytkowskia","Woodson",32 7475,"","Wrightia","R.Br.",32 7476,"","Xylinabaria","Pierre",32 17723,"","Xylinabariopsis","Pit.",32 17680,"","Zschokkea","Mull.Arg.",32 7477,"","Zygodia","Benth.",32 16607,"","Zygonerion","Baill.",32 12569,"","Aponogeton","L.f.",33 2082,"","Ilex","L.",34 2083,"","Nemopanthus","Raf.",34 19176,"","Adelonema","Schott",35 17002,"","Afrorhaphidophora","Engl.",35 12430,"","Aglaodorum","Schott",35 12431,"","Aglaonema","Schott",35 17003,"","Alloschemone","Schott",35 12432,"","Alocasia","(Schott) G.Don",35 17004,"","Amauriella","Rendle",35 12433,"","Ambrosina","Bassi",35 12434,"","Amorphophallus","Blume ex Decne.",35 12435,"","Amydrium","Schott",35 12436,"","Anadendrum","Schott",35 17543,"","Anaphyllopsis","A.Hay",35 12437,"","Anaphyllum","Schott",35 12438,"","Anchomanes","Schott",35 19190,"","Andromycia","A.Rich.",35 17005,"","Anepsias","Schott",35 12439,"","Anthurium","Schott",35 12440,"","Anubias","Schott",35 19178,"","Apatemone","Schott",35 12441,"","Aphyllarum","S.Moore",35 12442,"","Aridarum","Ridl.",35 12443,"","Ariopsis","Nimmo",35 12444,"","Arisaema","Mart.",35 12445,"","Arisarum","Mill.",35 19184,"","Arodendron","Werth",35 12446,"","Arophyton","Jum.",35 17006,"","Aropsis","Rojas Acosta",35 12447,"","Arum","L.",35 12448,"","Asterostigma","Fisch. & C.A.Mey.",35 12449,"","Biarum","Schott",35 17312,"","Bognera","Mayo & Nicolson",35 12450,"","Bucephalandra","Schott",35 19185,"","Caladiopsis","Engl.",35 12451,"","Caladium","Vent.",35 12452,"","Calla","L.",35 12453,"","Callopsis","Engl.",35 19194,"","Calyptrocoryne","Schott",35 12454,"","Carlephyton","Jum.",35 12455,"","Cercestis","Schott",35 19177,"","Chamaecladon","Miq.",35 12456,"","Chlorospatha","Engl.",35 12457,"","Colletogyne","Buchet",35 12458,"","Colocasia","Schott",35 12459,"","Cryptocoryne","Fisch. ex Wydler",35 12460,"","Culcasia","P.Beauv.",35 12461,"","Cyrtosperma","Griff.",35 12462,"","Diandriella","Engl.",35 12463,"","Dieffenbachia","Schott",35 12464,"","Dracontioides","Engl.",35 12465,"","Dracontium","L.",35 12466,"","Dracunculus","Mill.",35 12467,"","Echidnium","Schott",35 12468,"","Eminium","(Blume) Schott",35 17007,"","Epipremnopsis","Engl.",35 12469,"","Epipremnum","Schott",35 19188,"","Felipponia","Hicken",35 19189,"","Felipponiella","Hicken",35 12470,"","Filarum","Nicolson",35 19198,"","Flagellarisaema","Nakai",35 12471,"","Furtadoa","M.Hotta",35 19179,"","Gamogyne","N.E.Br.",35 12472,"","Gearum","N.E.Br.",35 12473,"","Gonatanthus","Klotzsch",35 12474,"","Gonatopus","Hook.f. ex Engl.",35 12475,"","Gorgonidium","Schott",35 19193,"","Gymnomesium","Schott",35 12476,"","Gymnostachys","R.Br.",35 12477,"","Hapaline","Schott",35 12478,"","Helicodiceros","Schott ex K.Koch",35 19197,"","Helicophyllum","Schott",35 12479,"","Heteroaridarum","M.Hotta",35 19199,"","Heteroarisaema","Nakai",35 17008,"","Heterolobium","Peter",35 12480,"","Heteropsis","Kunth",35 12481,"","Holochlamys","Engl.",35 12482,"","Homalomena","Schott",35 12483,"","Hottarum","Bogner & Nicolson",35 17009,"","Humbertina","Buchet",35 19173,"","Hydrosme","Schott",35 19196,"","Jaimenostia","Guinea & Gomez Mor.",35 12484,"","Jasarum","Bunting",35 12485,"","Lagenandra","Dalzell",35 12486,"","Lasia","Lour.",35 17544,"","Lasimorpha","Schott",35 19186,"","Leucocasia","Schott",35 19192,"","Lilloa","Speg.",35 12487,"","Lysichiton","Schott",35 19181,"","Maguirea","A.D.Hawkes",35 12488,"","Mangonia","Schott",35 17010,"","Microcasia","Becc.",35 17011,"","Microculcas","Peter",35 12489,"","Monstera","Adans.",35 12490,"","Montrichardia","Crueg.",35 12491,"","Nephthytis","Schott",35 23234,"","Oligogynium","Engl.",35 19172,"","Ophione","Schott",35 12492,"","Orontium","L.",35 19195,"","Pauella","Ramam. & Sebastine",35 25337,"","Pedicellarum","M.Hotta",35 12493,"","Peltandra","Raf.",35 12494,"","Philodendron","Schott",35 12495,"","Philonotion","Schott",35 12496,"","Phymatarum","M.Hotta",35 12497,"","Pinellia","Ten.",35 12498,"","Piptospatha","N.E.Br.",35 12499,"","Pistia","L.",35 12500,"","Plesmonium","Schott",35 19200,"","Pleuriarum","Nakai",35 17012,"","Pleurospa","Raf.",35 12501,"","Podolasia","N.E.Br.",35 12502,"","Porphyrospatha","Engl.",35 12503,"","Pothoidium","Schott",35 12504,"","Pothos","L.",35 12505,"","Protarum","Engl.",35 12506,"","Pseudodracontium","N.E.Br.",35 19182,"","Pseudohomalomena","A.D.Hawkes",35 12507,"","Pseudohydrosme","Engl.",35 12508,"","Pycnospatha","Thorel ex Gagnep.",35 8617,"","Remusatia","Schott",35 12509,"","Rhaphidophora","Hassk.",35 19174,"","Rhaphiophallus","Schott",35 12510,"","Rhektophyllum","N.E.Br.",35 12511,"","Rhodospatha","Poepp.",35 19180,"","Rhynchopyle","Engl.",35 19183,"","Richardia","Kunth",35 19201,"","Ringentiarum","Nakai",35 12512,"","Sauromatum","Schott",35 12513,"","Scaphispatha","Brongn. ex Schott",35 12514,"","Schismatoglottis","Zoll. & Moritzi",35 19187,"","Schizocasia","Schott",35 12515,"","Scindapsus","Schott",35 12516,"","Spathantheum","Schott",35 12517,"","Spathicarpa","Hook.",35 12518,"","Spathiphyllum","Schott",35 19191,"","Staurostigma","Scheidw.",35 12519,"","Stenospermation","Schott",35 12520,"","Steudnera","K.Koch",35 12521,"","Stylochaeton","Lepr.",35 12522,"","Symplocarpus","Salisb. ex Nutt.",35 17013,"","Synandrogyne","Buchet",35 12523,"","Synandrospadix","Engl.",35 19175,"","Synantherias","Schott",35 12524,"","Syngonium","Schott",35 12525,"","Taccarum","Brongn. ex Schott",35 17014,"","Thaumatophyllum","Schott",35 12526,"","Theriophonum","Blume",35 12527,"","Thomsonia","Wall.",35 12528,"","Typhonium","Schott",35 12529,"","Typhonodorum","Schott",35 12530,"","Ulearum","Engl.",35 12531,"","Urospatha","Schott",35 25606,"","Urospathella","Bunting",35 12532,"","Xanthosoma","Schott",35 12533,"","Xenophya","Schott",35 12534,"","Zamioculcas","Schott",35 12535,"","Zantedeschia","Spreng.",35 12536,"","Zomicarpa","Schott",35 12537,"","Zomicarpella","N.E.Br.",35 24562,"","Acanthopanax","(Decne. & Planch.) Witte",36 5562,"","Acanthophora","Merr.",36 24563,"","Actinomorphe","(Miq.) Miq.",36 18105,"","Actinophyllum","Ruiz & Pav.",36 18106,"","Agalma","Miq.",36 4799,"","Anakasia","Philipson",36 18104,"","Anomopanax","Harms",36 4800,"","Apiopetalum","Baill.",36 4801,"","Aralia","L.",36 4803,"","Arthrophyllum","Blume",36 18130,"","Astropanax","Seem.",36 4804,"","Astrotricha","DC.",36 24564,"","Bakeria","Seem.",36 18141,"","Boerlagiodendron","Harms",36 4805,"","Boninofatsia","Nakai",36 18133,"","Bonnierella","R.Vig.",36 24565,"","Botryodendrum","Endl.",36 16559,"","Botryomeryta","R.Vig.",36 18134,"","Botryopanax","Miq.",36 18107,"","Brassaia","Endl.",36 4806,"","Brassaiopsis","Decne. & Planch.",36 4807,"","Cephalaralia","Harms",36 16560,"","Cephaloschefflera","(Harms) Merr.",36 4808,"","Cheirodendron","Nutt. ex Seem.",36 18102,"","Coemansia","Marchal",36 24566,"","Coudenbergia","Marchal",36 16561,"","Crepinella","Marchal",36 4809,"","Cuphocarpus","Decne. & Planch.",36 4810,"","Cussonia","Thunb.",36 18101,"","Cwangayana","Rauschert",36 4811,"","Delarbrea","Vieill.",36 4812,"","Dendropanax","Decne. & Planch.",36 4813,"","Didymopanax","Decne. & Planch.",36 18149,"","Dipanax","Seem.",36 4814,"","Diplofatsia","Nakai",36 4816,"","Dizygotheca","N.E.Br.",36 4817,"","Echinopanax","Decne. & Planch.",36 4818,"","Eleutherococcus","Maxim.",36 18144,"","Eremopanax","Baill.",36 18142,"","Eschweileria","Zipp. ex Boerl.",36 18147,"","Euaraliopsis","Hutch.",36 18135,"","Eupteron","Miq.",36 4819,"","Evodiopanax","(Harms) Nakai",36 22668,"x","Fatshedera","Guillaumin",36 4820,"","Fatsia","Decne. & Planch.",36 4821,"","Gamblea","C.B.Clarke",36 4822,"","Gastonia","Comm. ex Lam.",36 24567,"","Gelibia","Hutch.",36 4823,"","Geopanax","Hemsl.",36 18140,"","Gilibertia","Ruiz & Pav.",36 24568,"","Grotefendia","Seem.",36 4824,"","Harmsiopanax","Warb.",36 4825,"","Hedera","L.",36 18148,"","Hederopsis","C.B.Clarke",36 18131,"","Heptapleurum","Gaertn.",36 4827,"","Heteropanax","Seem.",36 18129,"","Horsfieldia","Blume ex DC.",36 23350,"","Hunaniopanax","C.J.Qi & T.R.Cao",36 4828,"","Indokingia","Hemsl.",36 24569,"","Irvingia","F.Muell.",36 4829,"","Kalopanax","Miq.",36 24570,"","Kirkophytum","(Harms) Allan",36 18136,"","Kissodendron","Seem.",36 4830,"","Mackinlaya","F.Muell.",36 4831,"","Macropanax","Miq.",36 24571,"","Maralia","Thouars",36 4832,"","Megalopanax","Ekman",36 4833,"","Merrilliopanax","H.L.Li",36 4834,"","Meryta","J.R.Forst. & G.Forst.",36 24572,"","Mesopanax","R.Vig.",36 24573,"","Monopanax","Regel",36 2450,"","Montagueia","Baker f.",36 4835,"","Motherwellia","F.Muell.",36 4836,"","Munroidendron","Sherff",36 4837,"","Myodocarpus","Brongn. & Gris",36 25500,"","Neoacanthophora","Bennet",36 16562,"","Neocussonia","Hutch.",36 18138,"","Neopanax","Allan",36 18145,"","Nesodoxa","Calest.",36 24574,"","Nesopanax","Seem.",36 18139,"","Nothopanax","Miq.",36 16563,"","Octotheca","R.Vig.",36 24575,"","Oligoscias","Seem.",36 4838,"","Oplopanax","(Torr. & A.Gray) Miq.",36 4839,"","Oreopanax","Decne. & Planch.",36 4840,"","Osmoxylon","Miq.",36 18137,"","Palmervandenbrockia","Gibbs",36 4841,"","Panax","L.",36 24576,"","Parapanax","Miq.",36 4842,"","Parapentapanax","Hutch.",36 24577,"","Paratropia","(Blume) DC.",36 18132,"","Peekeliopanax","Harms",36 4843,"","Pentapanax","Seem.",36 4844,"","Plerandra","A.Gray",36 24578,"","Plerandropsis","R.Vig.",36 4845,"","Polyscias","J.R.Forst. & G.Forst.",36 18100,"","Porospermum","F.Muell.",36 18146,"","Pseudobrassaiopsis","R.N.Banerjee",36 4846,"","Pseudopanax","K.Koch",36 18143,"","Pseudosantalum","Kuntze",36 4847,"","Pseudosciadium","Baill.",36 18150,"","Pterotropia","W.F.Hillebr.",36 24579,"","Raukana","Seem.",36 4848,"","Reynoldsia","A.Gray",36 4849,"","Schefflera","J.R.Forst. & G.Forst.",36 16564,"","Scheffleropsis","Ridl.",36 16565,"","Schizomeryta","R.Vig.",36 4850,"","Sciadodendron","Griseb.",36 16566,"","Sciadopanax","Seem.",36 15889,"","Sciadophyllum","P.Browne",36 4851,"","Seemannaralia","R.Vig.",36 4852,"","Sinopanax","H.L.Li",36 24580,"","Sphaerodendron","Seem.",36 4853,"","Stilbocarpa","(Hook.f.) Decne. & Planch.",36 24581,"","Strobilopanax","R.Vig.",36 4854,"","Tetrapanax","(K.Koch) K.Koch",36 4855,"","Tetraplasandra","A.Gray",36 24582,"","Textoria","Miq.",36 16567,"","Tieghemopanax","R.Vig.",36 4856,"","Trevesia","Vis.",36 24583,"","Triplasandra","Seem.",36 4857,"","Tupidanthus","Hook.f. & Thomson",36 24584,"","Wangenheimia","A.Dietr.",36 4858,"","Wardenia","King",36 4859,"","Woodburnia","Prain",36 4802,"","Aralidium","Miq.",37 13390,"","Agathis","Salisb.",38 13391,"","Araucaria","Juss.",38 9775,"","Apama","Lam.",39 9776,"","Aristolochia","L.",39 9777,"","Asarum","L.",39 22270,"","Asiphonia","Griff.",39 17987,"","Bragantia","Lour.",39 17988,"","Ceramium","Blume",39 16703,"","Cyclodiscus","Klotzsch",39 9778,"","Euglypha","Chodat & Hassl.",39 20152,"","Heterotropa","C.Morren & Decne.",39 24325,"","Hexastylis","Raf.",39 9779,"","Holostylis","Duch.",39 9780,"","Isotrema","Raf.",39 24629,"","Lobbia","Planch.",39 9781,"","Pararistolochia","Hutch. & Dalziel",39 9782,"","Saruma","Oliv.",39 24628,"","Strakaea","C.Presl",39 9783,"","Thottea","Rottb.",39 24630,"","Trimeriza","Lindl.",39 7478,"","Absolmsia","Kuntze",40 19628,"","Acanthostemma","(Blume) Blume",40 17438,"","Acerates","Elliott",40 19572,"","Acustelma","Baill.",40 7479,"","Adelostemma","Hook.f.",40 17413,"","Aechmolepis","Decne.",40 25340,"","Aidomene","Stopp",40 19608,"","Alexitoxicon","St.-Lag.",40 19618,"","Amblyoglossum","Turcz.",40 19595,"","Amblyopetalum","(Griseb.) Malme",40 7480,"","Amblystigma","Benth.",40 17440,"","Ampelamus","Raf.",40 7481,"","Amphidetes","E.Fourn.",40 19602,"","Amphistelma","Griseb.",40 17444,"","Amphorella","Brandegee",40 22199,"","Anantherix","Nutt.",40 7483,"","Anatropanthus","Schltr.",40 25584,"","Angolluma","R.Munster",40 7484,"","Anisopus","N.E.Br.",40 7485,"","Anisotoma","Fenzl",40 7486,"","Anomotassa","K.Schum.",40 19607,"","Aphanostelma","Malme",40 19588,"","Aploca","Neck. ex Kuntze",40 19582,"","Apoxyanthera","Hochst.",40 7487,"","Araujia","Brot.",40 19592,"","Argelia","Decne.",40 7488,"","Asclepias","L.",40 19601,"","Asclepiodella","Small",40 17437,"","Asclepiodora","A.Gray",40 7489,"","Aspidoglossum","E.Mey.",40 7490,"","Astelma","Schltr.",40 7491,"","Astephanus","R.Br.",40 7492,"","Asterostemma","Decne.",40 17421,"","Astrostemma","Benth.",40 7493,"","Atherandra","Decne.",40 7494,"","Atherolepis","Hook.f.",40 7495,"","Atherostemon","Blume",40 7496,"","Aulostephanus","Schltr.",40 7497,"","Baeolepis","Decne. ex Moq.",40 7498,"","Barjonia","Decne.",40 7499,"","Baroniella","Costantin & Gallaud",40 7500,"","Baseonema","Schltr. & Rendle",40 7501,"","Basistelma","Bartlett",40 7502,"","Batesanthus","N.E.Br.",40 19620,"","Baxtera","Rchb.",40 25178,"","Belostemma","Wall. ex Wight",40 7503,"","Biondia","Schltr.",40 19599,"","Biventraria","Small",40 7504,"","Blepharanthera","Schltr.",40 7505,"","Blepharodon","Decne.",40 17443,"","Blyttia","Arn.",40 19636,"","Boucerosia","Wight & Arn.",40 17414,"","Brachylepis","Wight & Arn.",40 17415,"","Brachylepis","Hook. & Arn.",40 7506,"","Brachystelma","R.Br.",40 22207,"","Brachystelmaria","Schltr.",40 7507,"","Bustelma","E.Fourn.",40 7508,"","Calathostelma","E.Fourn.",40 19617,"","Callaeolepium","H.Karst.",40 7509,"","Calostigma","Decne.",40 7510,"","Calotropis","R.Br.",40 19589,"","Campelepis","Falc.",40 7511,"","Campestigma","Pierre ex Costantin",40 7512,"","Camptocarpus","Decne.",40 7513,"","Caralluma","R.Br.",40 19629,"","Cathetostemma","Blume",40 19635,"","Centrostemma","Decne.",40 19593,"","Ceramanthus","(Kunze) Malme",40 7514,"","Ceropegia","L.",40 17418,"","Chlorocodon","Hook.f.",40 7515,"","Chlorocyathus","Oliv.",40 19616,"","Chthamalia","Decne.",40 19625,"","Chymocormus","Harv.",40 22664,"","Cibirhiza","Bruyns",40 7516,"","Cionura","Griseb.",40 19624,"","Clemensia","Schltr.",40 7517,"","Clemensiella","Schltr.",40 17410,"","Cochlanthus","Balf.f.",40 7518,"","Coelostelma","E.Fourn.",40 19630,"","Conchophyllum","Blume",40 7519,"","Conomitra","Fenzl",40 7520,"","Cordylogyne","E.Mey.",40 25313,"","Corollonema","Schltr.",40 7521,"","Cosmostigma","Wight",40 7522,"","Costantina","Bullock",40 22208,"","Craterostemma","K.Schum.",40 7524,"","Cryptolepis","R.Br.",40 7525,"","Cryptostegia","R.Br.",40 7526,"","Curinila","Schult.",40 7527,"","Curroria","Planch. ex Benth.",40 7528,"","Cyathostelma","E.Fourn.",40 19575,"","Cylixylon","Llanos",40 7529,"","Cynanchum","L.",40 24234,"","Cyprinia","Browicz",40 19631,"","Cyrtoceras","Benn.",40 25160,"","Cystostemma","E.Fourn.",40 7530,"","Dactylostelma","Schltr.",40 19612,"","Daemia","Poir.",40 7531,"","Dalzielia","Turrill",40 7532,"","Decabelone","Decne.",40 7533,"","Decalepis","Wight & Arn.",40 7534,"","Decanema","Decne.",40 7535,"","Decanemopsis","Costantin & Gallaud",40 7536,"","Decastelma","Schltr.",40 17454,"","Desmidorchis","Ehrenb.",40 25314,"","Dicarpophora","Speg.",40 19576,"","Dicerolepis","Blume",40 7537,"","Dichaelia","Harv.",40 7538,"","Dictyanthus","Decne.",40 7539,"","Diplocyatha","N.E.Br.",40 7540,"","Diplolepis","R.Br.",40 7541,"","Diplostigma","K.Schum.",40 25315,"","Dischidanthus","Tsiang",40 7542,"","Dischidia","R.Br.",40 7543,"","Dischidiopsis","Schltr.",40 7544,"","Ditassa","R.Br.",40 7545,"","Dittoceras","Hook.f.",40 25316,"","Dolichostegia","Schltr.",40 7546,"","Dorystephania","Warb.",40 19638,"","Drakebrockmania","A.C.White & B.Sloane",40 7547,"","Dregea","E.Mey.",40 7548,"","Drepanostemma","Jum. & H.Perrier",40 7549,"","Duvalia","Haw.",40 17451,"","Duvaliandra","M.G.Gilbert",40 7550,"","Echidnopsis","Hook.f.",40 25317,"","Ecliptostelma","Brandegee",40 7551,"","Ectadiopsis","Benth.",40 7552,"","Ectadium","E.Mey.",40 25161,"","Edisonia","Small",40 7553,"","Edithcolea","N.E.Br.",40 7554,"","Elcomarhiza","Barb.Rodr.",40 7555,"","Emicocarpus","K.Schum. & Schltr.",40 7556,"","Emplectanthus","N.E.Br.",40 19604,"","Enslenia","Nutt.",40 7557,"","Epicion","Small",40 17417,"","Epistemma","D.V.Field & J.B.Hall",40 22201,"","Esmeraldia","E.Fourn.",40 7558,"","Eustegia","R.Br.",40 7559,"","Exolobus","E.Fourn.",40 7560,"","Fanninia","Harv.",40 7561,"","Fimbristemma","Turcz.",40 7562,"","Finlaysonia","Wall.",40 7563,"","Fischeria","DC.",40 17446,"","Fissiglossum","Rusby",40 7564,"","Flanagania","Schltr.",40 7565,"","Fockea","Endl.",40 7566,"","Folotsia","Costantin & Bois",40 7567,"","Frerea","Dalzell",40 7568,"","Funastrum","E.Fourn.",40 7569,"","Genianthus","Hook.f.",40 7570,"","Glaziostelma","E.Fourn.",40 7571,"","Glossonema","Decne.",40 7572,"","Glossostelma","Schltr.",40 17441,"","Glossostephanus","E.Mey.",40 7573,"","Gomphocarpus","R.Br.",40 7574,"","Gongronema","(Endl.) Decne.",40 7575,"","Gongylosperma","King & Gamble",40 17483,"","Gonioanthela","Malme",40 7576,"","Goniostemma","Wight",40 7577,"","Gonocrypta","Baill.",40 7578,"","Gonolobus","Michx.",40 19596,"","Gothofreda","Vent.",40 7579,"","Graphistemma","(Champ. ex Benth.) Champ. ex Benth.",40 7580,"","Grisebachiella","Lorentz",40 25578,"","Gunnessia","P.I.Forst.",40 19577,"","Guru","Buch.-Ham. ex Wight",40 7581,"","Gymnanthera","R.Br.",40 7582,"","Gymnema","R.Br.",40 7583,"","Gymnemopsis","Costantin",40 17409,"","Gymnolaema","Benth.",40 7584,"","Gyrostelma","E.Fourn.",40 22198,"","Haemax","E.Mey.",40 7586,"","Harmandiella","Costantin",40 7587,"","Harpanema","Decne.",40 19621,"","Harrisonia","Hook.",40 7588,"","Heliostemma","Woodson",40 7589,"","Hemidesmus","R.Br.",40 7590,"","Hemipogon","Decne.",40 19619,"","Henrya","Hemsl.",40 7591,"","Heterostemma","Wight & Arn.",40 25318,"","Heynella","Backer",40 25162,"","Hickenia","Lillo",40 7592,"","Himantostemma","A.Gray",40 7593,"","Holostemma","R.Br.",40 7594,"","Hoodia","Sweet ex Decne.",40 24290,"x","Hoodiapelia","G.D.Rowley",40 7595,"x","Hoodiopsis","C.A.Luckh.",40 7596,"","Hoya","R.Br.",40 25319,"","Hoyella","Ridl.",40 7597,"","Huernia","R.Br.",40 7598,"","Huerniopsis","N.E.Br.",40 22202,"","Husnotia","E.Fourn.",40 7600,"","Huthamnus","Tsiang",40 7601,"","Hypolobus","E.Fourn.",40 7602,"","Ibatia","Decne.",40 7603,"","Irmischia","Schltdl.",40 7604,"","Ischnolepis","Jum. & H.Perrier",40 7605,"","Ischnostemma","King & Gamble",40 7606,"","Jacaima","Rendle",40 7607,"","Janakia","J.Joseph & Chandras.",40 19579,"","Jenkinsia","Wall. ex Voigt",40 7608,"","Jobinia","E.Fourn.",40 7609,"","Kanahia","R.Br.",40 25320,"","Karimbolea","Desc.",40 7610,"","Kerbera","E.Fourn.",40 7611,"","Kinepetalum","Schltr.",40 17412,"","Kompitsia","Costantin & Gallaud",40 7612,"","Krebsia","Harv.",40 7613,"","Labidostelma","Schltr.",40 7614,"","Lachnostoma","Kunth",40 19597,"","Lagarinthus","E.Mey.",40 19594,"","Lagenia","E.Fourn.",40 7616,"","Lagoa","T.Durand",40 7617,"","Lasiostelma","Benth.",40 17453,"","Lavrania","Plowes",40 7618,"","Leichardtia","R.Br.",40 19573,"","Lepistoma","Blume",40 19574,"","Leposma","Blume",40 7619,"","Leptadenia","R.Br.",40 19581,"","Leptopaetia","Harv.",40 14201,"","Lhotzkyella","Rauschert",40 19640,"","Lithocaulon","Bally",40 7620,"","Lobostephanus","N.E.Br.",40 7621,"","Loniceroides","Bullock",40 7622,"","Lorostelma","E.Fourn.",40 7623,"","Luckhoffia","A.C.White & B.Sloane",40 7624,"","Lugonia","Wedd.",40 7625,"","Lygisma","Hook.f.",40 22203,"","Macroditassa","Malme",40 7627,"","Macropetalum","Burch. ex Decne.",40 7628,"","Macroscepis","Kunth",40 7629,"","Madarosperma","Benth.",40 19583,"","Mafekingia","Baill.",40 7630,"","Mahafalia","Jum. & H.Perrier",40 7631,"","Mahawoa","Schltr.",40 7632,"","Malinvaudia","E.Fourn.",40 7633,"","Mangenotia","Pichon",40 7634,"","Margaretta","Oliv.",40 7635,"","Marsdenia","R.Br.",40 7636,"","Matelea","Aubl.",40 7637,"","Meladerma","Kerr",40 7638,"","Melinia","Decne.",40 7639,"","Mellichampia","A.Gray ex S.Watson",40 7640,"","Menabea","Baill.",40 7641,"","Meresaldia","Bullock",40 7642,"","Merrillanthus","Chun & Tsiang",40 7643,"","Metalepis","Griseb.",40 7644,"","Metaplexis","R.Br.",40 7645,"","Metastelma","R.Br.",40 7646,"","Micholitzia","N.E.Br.",40 7647,"","Microdactylon","Brandegee",40 7648,"","Microloma","R.Br.",40 7649,"","Microstelma","Baill.",40 7650,"","Microstemma","R.Br.",40 19590,"","Microstephanus","N.E.Br.",40 17436,"","Miraglossum","Kupicha",40 7651,"","Mitolepis","Balf.f.",40 7652,"","Mitostigma","Decne.",40 7653,"","Mondia","Skeels",40 7654,"","Morrenia","Lindl.",40 7655,"","Myriopteron","Griff.",40 17447,"","Nanostelma","Baill.",40 7656,"","Nautonia","Decne.",40 22666,"","Nematostemma","Choux",40 19605,"","Nematuris","Turcz.",40 16608,"","Neohenrya","Hemsl.",40 7657,"","Neoschumannia","Schltr.",40 7658,"","Nephradenia","Decne.",40 17452,"","Notechidnopsis","Lavranos & Bleck",40 7659,"","Obesia","Haw.",40 19615,"","Odonostephana","Alexander",40 7660,"","Odontanthera","Wight",40 7661,"","Odontostelma","Rendle",40 7662,"","Oianthus","Benth.",40 7663,"","Oistonema","Schltr.",40 22197,"","Omphalogonus","Baill.",40 7664,"","Omphalophthalmum","H.Karst.",40 7665,"","Oncinema","Arn.",40 7666,"","Oncostemma","K.Schum.",40 17450,"","Ophionella","Bruyns",40 17456,"","Orbea","Haw.",40 17459,"","Orbeanthus","L.C.Leach",40 17457,"","Orbeopsis","L.C.Leach",40 7667,"","Oreosparte","Schltr.",40 7668,"","Orthanthera","Wight",40 7669,"","Orthosia","Decne.",40 19632,"","Otostemma","Blume",40 7670,"","Oxypetalum","R.Br.",40 19598,"","Oxypteryx","Greene",40 7671,"","Oxystelma","R.Br.",40 7673,"","Pachycarpus","E.Mey.",40 17458,"","Pachycymbium","L.C.Leach",40 17445,"","Pachystelma","Brandegee",40 7674,"","Papuastelma","Bullock",40 7675,"","Parapodium","E.Mey.",40 7676,"","Parquetina","Baill.",40 7677,"","Pattalias","S.Watson",40 7678,"","Peckoltia","E.Fourn.",40 7679,"","Pectinaria","Haw.",40 7680,"","Pentabothra","Hook.f.",40 7681,"","Pentacyphus","Schltr.",40 7682,"","Pentagonanthus","Bullock",40 7683,"","Pentanura","Blume",40 7684,"","Pentarrhinum","E.Mey.",40 25609,"","Pentasachme","Wall. ex Wight",40 7685,"","Pentasacme","Wall. ex Wight",40 25585,"","Pentastelma","Tsiang & P.T.Li",40 7686,"","Pentatropis","R.Br. ex Wight & Arn.",40 7687,"","Pentopetia","Decne.",40 7688,"","Pentopetiopsis","Costantin & Gallaud",40 7689,"","Peplonia","Decne.",40 7690,"","Pergularia","L.",40 19610,"","Perianthostelma","Baill.",40 7691,"","Periglossum","Decne.",40 7692,"","Periploca","L.",40 19587,"","Perithrix","Pierre",40 17448,"","Pervillaea","Decne.",40 19642,"","Petalonema","Schltr.",40 25163,"","Petalostelma","E.Fourn.",40 7693,"","Petopentia","Bullock",40 7694,"","Phaeostemma","E.Fourn.",40 7695,"","Pherotrichis","Decne.",40 17435,"","Philibertella","Vail",40 7696,"","Philibertia","Kunth",40 7697,"","Phyllanthera","Blume",40 7698,"","Physostelma","Wight",40 7699,"","Piaranthus","R.Br.",40 19641,"","Pilostigma","Costantin",40 7700,"","Platykeleba","N.E.Br.",40 7701,"","Pleurostelma","Baill.",40 20153,"","Pleurostelma","Schltr.",40 19633,"","Plocostemma","Blume",40 7702,"","Podandra","Baill.",40 22209,"","Podanthes","Haw.",40 7703,"","Podostelma","K.Schum.",40 7704,"","Podostemma","Greene",40 7705,"","Podostigma","Elliott",40 7706,"","Poicilla","Griseb.",40 7707,"","Poicillopsis","Schltr. ex Rendle",40 7708,"","Polystemma","Decne.",40 19623,"","Prageluria","N.E.Br.",40 7709,"","Prosopostelma","Baill.",40 7710,"","Prosthecidiscus","Donn.Sm.",40 7711,"","Pseudibatia","Malme",40 7712,"","Pseudolithos","Bally",40 7713,"","Pseudomarsdenia","Baill.",40 7714,"","Pseudopectinaria","Lavranos",40 22667,"","Pseudopentatropis","Costantin",40 7715,"","Pseudosarcolobus","Costantin",40 19622,"","Pseusmagennetus","Ruschenb.",40 19626,"","Pterophora","Harv.",40 19634,"","Pterostelma","Wight",40 7716,"","Ptycanthera","Decne.",40 7717,"","Pulvinaria","E.Fourn.",40 7718,"","Pycnobregma","Baill.",40 7719,"","Pycnoneurum","Decne.",40 7720,"","Pycnorhachis","Benth.",40 7721,"","Pycnostelma","Bunge ex Decne.",40 17460,"","Quaqua","N.E.Br.",40 7722,"","Quisumbingia","Merr.",40 19584,"","Raphiacme","K.Schum.",40 7723,"","Raphionacme","Harv.",40 7724,"","Raphistemma","Wall.",40 19591,"","Rhombonema","Schltr.",40 19611,"","Rhyncharrhena","F.Muell.",40 7725,"","Rhynchostigma","Benth.",40 7726,"","Rhyssolobium","E.Mey.",40 7727,"","Rhyssostelma","Decne.",40 7728,"","Rhytidocaulon","Bally",40 7729,"","Riocreuxia","Decne.",40 7730,"","Rojasia","Malme",40 7731,"","Rothrockia","A.Gray",40 22204,"","Roulinia","Decne.",40 7732,"","Rouliniella","Vail",40 25164,"","Ruehssia","H.Karst. ex Schltdl.",40 7733,"","Sacleuxia","Baill.",40 7734,"","Sarcolobus","R.Br.",40 19637,"","Sarcophagophilus","Dinter",40 7735,"","Sarcorrhiza","Bullock",40 7736,"","Sarcostemma","R.Br.",40 7737,"","Sattadia","E.Fourn.",40 7738,"","Schistogyne","Hook. & Arn.",40 7739,"","Schistonema","Schltr.",40 7740,"","Schizoglossum","E.Mey.",40 22200,"","Schizonotus","A.Gray",40 19609,"","Schizostephanus","Hochst. ex K.Schum.",40 7741,"","Schlechterella","K.Schum.",40 19643,"","Schlechterianthus","Quisumb.",40 7742,"","Schubertia","Mart.",40 7743,"","Scyphostelma","Baill.",40 7744,"","Secamone","R.Br.",40 7745,"","Secamonopsis","Jum.",40 19603,"","Selmation","T.Durand",40 7746,"","Seshagiria","Ansari & Hemadri",40 7747,"","Siphonostelma","Schltr.",40 7748,"","Sisyranthus","E.Mey.",40 17411,"","Socotora","Balf.f.",40 7749,"","Socotranthus","Kuntze",40 19600,"","Solanoa","Greene",40 7750,"","Solenostemma","Hayne",40 7751,"","Spathidolepis","Schltr.",40 7752,"","Spathulopetalum","Chiov.",40 7753,"","Sphaerocodon","Benth.",40 17442,"","Spiladocorys","Ridl.",40 7754,"","Spirella","Costantin",40 7755,"","Stapelia","L.",40 7756,"","Stapelianthus","Choux ex A.C.White & B.Sloane",40 24291,"","Stapeliopsis","Choux",40 7757,"","Stapeliopsis","Pillans",40 7758,"","Stathmostelma","K.Schum.",40 17419,"","Steinheilia","Decne.",40 7759,"","Steleostemma","Schltr.",40 25165,"","Stelmacrypton","Baill.",40 7760,"","Stelmagonum","Baill.",40 7761,"","Stelmation","E.Fourn.",40 7762,"","Stelmatocodon","Schltr.",40 17317,"","Stelmatocrypton","Baill.",40 7763,"","Stenomeria","Turcz.",40 7764,"","Stenostelma","Schltr.",40 7765,"","Stephanotella","E.Fourn.",40 7766,"","Stephanotis","Thouars",40 7767,"","Stigmatorhynchus","Schltr.",40 7768,"","Stomatostemma","N.E.Br.",40 7769,"","Streptocaulon","Wight & Arn.",40 7770,"","Streptomanes","K.Schum.",40 7771,"","Strobopetalum","N.E.Br.",40 7772,"","Stuckertia","Kuntze",40 7773,"","Stultitia","E.Phillips",40 7774,"","Swynnertonia","S.Moore",40 17449,"","Symphysicarpus","Hassk.",40 7775,"","Symphytonema","Schltr.",40 7776,"","Tacazzea","Decne.",40 7777,"","Tainionema","Schltr.",40 7778,"","Tanulepis","Balf.f.",40 22206,"","Tapeinostelma","Schltr.",40 7779,"","Tassadia","Decne.",40 19639,"","Tavaresia","Welw. ex N.E.Br.",40 7780,"","Telectadium","Baill.",40 7781,"","Telesilla","Klotzsch",40 7782,"","Telminostelma","E.Fourn.",40 7783,"","Telosma","Coville",40 7784,"","Tenaris","E.Mey.",40 22205,"","Tetracustelma","Baill.",40 7786,"","Tetraphysa","Schltr.",40 7787,"","Thozetia","F.Muell. ex Benth.",40 7788,"","Toxocarpus","Wight & Arn.",40 7789,"","Trachycalymma","(K.Schum.) Bullock",40 25166,"","Traunia","K.Schum.",40 7790,"","Treutlera","Hook.f.",40 7791,"","Trichocaulon","N.E.Br.",40 7792,"","Trichosacme","Zucc.",40 7793,"","Trichosandra","Decne.",40 7794,"","Trichostelma","Baill.",40 17455,"","Tridentea","Haw.",40 7795,"","Triodoglossum","Bullock",40 19578,"","Triplolepis","Turcz.",40 24329,"","Tromotriche","Haw.",40 7796,"","Turrigera","Decne.",40 7797,"","Tweedia","Hook. & Arn.",40 7798,"","Tylodontia","Griseb.",40 7799,"","Tylophora","R.Br.",40 7800,"","Tylophoropsis","N.E.Br.",40 7801,"","Urostephanus","B.L.Rob. & Greenm.",40 7802,"","Utleria","Bedd. ex Benth.",40 7803,"","Vailia","Rusby",40 25167,"","Verlotia","E.Fourn.",40 19580,"","Vicarya","Wall. ex Voigt",40 7804,"","Vincetoxicopsis","Costantin",40 7805,"","Vincetoxicum","Wolf",40 7806,"","Voharanga","Costantin & Bois",40 7807,"","Vohemaria","Buchenau",40 19627,"","Wattakaka","Hassk.",40 7808,"","White-Sloanea","Chiov.",40 7809,"","Widgrenia","Malme",40 7810,"","Woodia","Schltr.",40 7811,"","Xysmalobium","R.Br.",40 7812,"","Zacateza","Bullock",40 25607,"","Zaczatea","Baill.",40 19585,"","Zucchellia","Decne.",40 19606,"","Zygostelma","E.Fourn.",40 7813,"","Zygostelma","Benth.",40 11895,"","Asparagus","L.",41 11951,"","Elachanthera","F.Muell.",41 15967,"","Myrsiphyllum","Willd.",41 17486,"","Protasparagus","Oberm.",41 11896,"","Asphodeline","Rchb.",42 11897,"","Asphodelus","L.",42 11911,"","Bulbine","Wolf",42 11912,"","Bulbinella","Kunth",42 18871,"","Bulbinopsis","Borzi",42 11953,"","Eremurus","M.Bieb.",42 18870,"","Glyphosperma","S.Watson",42 11975,"","Hemiphylacus","S.Watson",42 16227,"","Jodrellia","Baijnath",42 11993,"","Kniphofia","Moench",42 18872,"","Liriothamnus","Schltr.",42 18869,"","Notosceptrum","Benth.",42 12037,"","Paradisea","Mazzuc.",42 12065,"","Simethis","Kunth",42 12082,"","Trachyandra","Kunth",42 21912,"","Acropteris","Link",43 21913,"","Amesium","Newman",43 21923,"","Antigramma","C.Presl",43 21914,"","Asplenidictyum","J.Sm.",43 13647,"","Asplenium","L.",43 16731,"x","Asplenoceterach","D.E.Mey.",43 16730,"x","Asplenophyllitis","Alston",43 22244,"x","Asplenosorus","Wherry",43 21926,"","Biropteris","Kummerle",43 21905,"","Boniniella","Hayata",43 21906,"","Caenopteris","Bergius",43 13648,"","Camptosorus","Link",43 21915,"","Ceterac","Adans.",43 13649,"","Ceterach","Willd.",43 24127,"","Ceterachopsis","(J.Sm.) Ching",43 25695,"x","Ceterophyllitis","Pic.Serm.",43 21916,"","Chamaefilix","Hill ex Farw.",43 21907,"","Darea","Juss.",43 13650,"","Diellia","Brack.",43 13651,"","Diplora","Baker",43 21917,"","Eremopodium","Trevis.",43 21927,"","Glossopteris","Raf.",43 13652,"","Holodictyum","Maxon",43 21908,"","Hymenasplenium","Hayata",43 21922,"","Loxoscaphe","T.Moore",43 24125,"","Micropodium","Mett.",43 21918,"","Neottopteris","J.Sm.",43 24128,"","Notolepeum","Newman",43 21919,"","Phyllitis","Moench",43 13653,"","Phyllitis","Hill",43 25710,"","Phyllitopsis","Reichst.",43 13654,"","Pleurosorus","Fee",43 21920,"","Rutamuraria","Ortega",43 21924,"","Schaffneria","Fee ex T.Moore",43 21925,"","Scolopendrium","Adans.",43 24330,"","Sinephropteris","Mickel",43 21909,"","Stormesia","J.Kickx f.",43 21910,"","Tarachia","C.Presl",43 21911,"","Thamnopteris","(C.Presl) C.Presl",43 21921,"","Trichomanes","Hill",43 24126,"","Triphlebium","Baker",43 11899,"","Astelia","Banks & Sol. ex R.Br.",44 11931,"","Collospermum","Skottsb.",44 12018,"","Milligania","Hook.f.",44 24247,"","Neoastelia","J.B.Williams",44 855,"","Asteropeia","Thouars",45 4861,"","Aucuba","Thunb.",46 18098,"","Eubasis","Salisb.",46 9860,"","Austrobaileya","C.T.White",47 9218,"","Avicennia","L.",48 13758,"","Azolla","Lam.",49 22038,"","Rhizosperma","Meyen",49 1875,"","Balanites","Delile",50 10520,"","Balanops","Baill.",51 24586,"","Archimedea","Leandro",52 10165,"","Balanophora","J.R.Forst. & G.Forst.",52 10166,"","Chlamydophytum","Mildbr.",52 10167,"","Corynaea","Hook.f.",52 10169,"","Dactylanthus","Hook.f.",52 10170,"","Ditepalanthus","Fagerl.",52 10171,"","Exorhopala","Steenis",52 10172,"","Hachettea","Baill.",52 10173,"","Helosis","Rich.",52 20095,"","Juellia","Aspl.",52 10174,"","Langsdorffia","Mart.",52 10175,"","Lathrophytum","Eichler",52 24775,"","Latraeophila","Leandro",52 10176,"","Lophophytum","Schott & Endl.",52 10177,"","Mystropetalon","Harv.",52 10178,"","Ombrophytum","Poepp. ex Endl.",52 10179,"","Rhopalocnemis","Jungh.",52 10180,"","Sarcophyte","Sparrm.",52 10181,"","Scybalium","Schott & Endl.",52 10182,"","Thonningia","Vahl",52 1673,"","Hydrocera","Blume",53 1674,"","Impatiens","L.",53 16398,"","Impatientella","H.Perrier",53 16023,"","Semeiocardium","Zoll.",53 9662,"","Barbeuia","Thouars",54 10652,"","Barbeya","Schweinf.",55 9643,"","Anredera","Juss.",56 9644,"","Basella","L.",56 9645,"","Boussingaultia","Kunth",56 9646,"","Tournonia","Moq.",56 9647,"","Ullucus","Caldas",56 9670,"","Batis","P.Browne",57 4150,"","Begonia","L.",58 4151,"","Begoniella","Oliv.",58 4152,"","Hillebrandia","Oliv.",58 4153,"","Semibegoniella","C.E.C.Fisch.",58 4154,"","Symbegonia","Warb.",58 313,"","Aceranthus","C.Morren & Decne.",59 314,"","Achlys","DC.",59 315,"","Berberis","L.",59 316,"","Bongardia","C.A.Mey.",59 317,"","Caulophyllum","Michx.",59 318,"","Diphylleia","Michx.",59 25312,"","Dysosma","Woodson",59 319,"","Epimedium","L.",59 14248,"","Gymnospermium","Spach",59 320,"","Jeffersonia","Barton",59 321,"","Leontice","L.",59 322,"","Mahonia","Nutt.",59 323,"","Nandina","Thunb.",59 22215,"","Plagiorhegma","Maxim.",59 324,"","Podophyllum","L.",59 325,"","Ranzania","T.Ito",59 25297,"","Sinopodophyllum","T.S.Ying",59 326,"","Vancouveria","C.Morren & Decne.",59 10669,"","Alnus","Mill.",60 10670,"","Betula","L.",60 8651,"","Adenocalymma","Mart. ex Meisn.",61 19664,"","Alsocydia","Mart. ex J.C.Gomes",61 19700,"","Amphicome","Royle",61 8653,"","Amphilophium","Kunth",61 8654,"","Amphitecna","Miers",61 8655,"","Anemopaegma","Mart. ex Meisn.",61 19670,"","Anisostichus","Bureau",61 19671,"","Anomoctenium","Pichon",61 8656,"","Argylia","D.Don",61 8657,"","Arrabidaea","DC.",61 19743,"","Arthrophyllum","Bojer ex DC.",61 8658,"","Astianthus","D.Don",61 8659,"","Barnettia","Santisuk",61 19677,"","Bayonia","Dugand",61 8660,"","Bignonia","L.",61 19668,"","Blepharitheca","Pichon",61 19684,"","Bothriopodium","Rizzini",61 19710,"","Bulweria","F.Muell.",61 19734,"","Calampelis","D.Don",61 8661,"","Callichlamys","Miq.",61 19691,"","Calosanthes","Blume",61 19699,"","Campana","Post & Kuntze",61 8662,"","Campsidium","Seem.",61 8663,"","Campsis","Lour.",61 8664,"","Catalpa","Scop.",61 8665,"","Catophractes","D.Don",61 8666,"","Ceratophytum","Pittier",61 19656,"","Chasmia","Schott ex Spreng.",61 8667,"","Chilopsis","D.Don",61 19678,"","Chodanthus","Hassl.",61 19694,"","Clematitaria","Bureau",61 16637,"","Clyostomanthus","Pichon",61 8668,"","Clytostoma","Miers ex Bureau",61 8669,"","Colea","Bojer ex Meisn.",61 19715,"","Cotema","Britton & P.Wilson",61 19711,"","Couralia","Splitg.",61 19688,"","Craterocoma","Mart. ex DC.",61 16638,"","Cremastus","Miers",61 8670,"","Crescentia","L.",61 19661,"","Cupulissa","Raf.",61 8671,"","Cuspidaria","DC.",61 8672,"","Cybistax","Mart. ex Meisn.",61 8673,"","Cydista","Miers",61 19679,"","Daniella","Corr.Mello",61 8674,"","Delostoma","D.Don",61 19735,"","Dendrosicus","Raf.",61 8675,"","Deplanchea","Vieill.",61 8676,"","Digomphia","Benth.",61 8677,"","Dinklageodoxa","Heine & Sandwith",61 19709,"","Diplanthera","Banks & Sol.",61 19722,"","Dipterosperma","Hassk.",61 8678,"","Distictella","Kuntze",61 8679,"","Distictis","Mart. ex Meisn.",61 19674,"","Distictis","Bureau",61 8680,"","Dolichandra","Cham.",61 8681,"","Dolichandrone","(Fenzl) Seem.",61 19744,"","Dombeya","L'Her.",61 19695,"","Doxantha","Miers",61 8682,"","Eccremocarpus","Ruiz & Pav.",61 8683,"","Ekmanianthe","Urb.",61 19736,"","Enallagma","(Miers) Baill.",61 19682,"","Endoloma","Raf.",61 19706,"","Etorloba","Raf.",61 19686,"","Exsertanthera","Pichon",61 19729,"","Ferdinanda","Benth.",61 19725,"","Ferdinandia","Welw. ex Seem.",61 19732,"","Ferdinandoa","Seem.",61 19733,"","Fernandia","Baill.",61 8685,"","Fernandoa","Welw. ex Seem.",61 8686,"","Fridericia","Mart.",61 8687,"","Gardnerodoxa","Sandwith",61 8688,"","Glaziova","Bureau",61 8689,"","Godmania","Hemsl.",61 15973,"","Hanburyophyton","Bureau",61 19714,"","Handroanthus","Mattos",61 8690,"","Haplolophium","Cham.",61 19728,"","Haplophragma","Dop",61 19697,"","Haussmannia","F.Muell.",61 19698,"","Haussmannianthes","Steenis",61 25504,"","Heterocalycium","Rauschert",61 8692,"","Heterophragma","DC.",61 8693,"","Hexaneurocarpon","Dop",61 19721,"","Hieranthes","Raf.",61 8694,"","Hieris","Steenis",61 19683,"","Hilariophyton","Pichon",61 19692,"","Hippoxylon","Raf.",61 19703,"","Iacranda","Pers.",61 8695,"","Incarvillea","Juss.",61 8696,"","Jacaranda","Juss.",61 8697,"","Kigelia","DC.",61 19727,"","Kigelianthe","Baill.",61 19740,"","Kigelkeia","Raf.",61 19718,"","Kokoschkinia","Turcz.",61 19704,"","Kordelestris","Arruda",61 8699,"","Kuhlmannia","J.C.Gomes",61 19723,"","Lageropyxis","Miq.",61 8700,"","Lamiodendron","Steenis",61 19672,"","Leiogyne","K.Schum.",61 8701,"","Leucocalantha","Barb.Rodr.",61 19712,"","Leucoxylon","Raf.",61 20953,"","Levya","Bureau ex Baill.",61 19666,"","Lochmocydia","Mart. ex DC.",61 8703,"","Lundia","DC.",61 8704,"","Macfadyena","A.DC.",61 8705,"","Macranthisiphon","Bureau ex K.Schum.",61 19708,"","Macrocatalpa","(Griseb.) Britton",61 19663,"","Macrodiscus","Bureau",61 8706,"","Manaosella","J.C.Gomes",61 8707,"","Mansoa","DC.",61 8708,"","Markhamia","Seem. ex Baill.",61 8709,"","Martinella","Baill.",61 19724,"","Mayodendron","Kurz",61 19745,"","Medica","Cothen.",61 8711,"","Melloa","Bureau",61 8712,"","Memora","Miers",61 19696,"","Microbignonia","Kraenzl.",61 19685,"","Micropaegma","Pichon",61 8713,"","Millingtonia","L.f.",61 19720,"","Muenteria","Seem.",61 8714,"","Mussatia","Bureau ex Baill.",61 19702,"","Nematopogon","Bureau & K.Schum.",61 8715,"","Neojobertia","Baill.",61 8716,"","Neomacfadya","Baill.",61 8717,"","Neosepicaea","Diels",61 8718,"","Neotuerckheimia","Donn.Sm.",61 8719,"","Nestoria","Urb.",61 19716,"","Neurotecoma","K.Schum.",61 8720,"","Neves-Armondia","K.Schum.",61 19693,"","Nevrilis","Raf.",61 8721,"","Newbouldia","Seem. ex Bureau",61 19701,"","Niedzwedzkia","B.Fedtsch.",61 19665,"","Nouletia","Endl.",61 8723,"","Nyctocalos","Teijsm. & Binn.",61 8724,"","Odontotecoma","Bureau & K.Schum.",61 19680,"","Onohualcoa","Lundell",61 8726,"","Ophiocolea","H.Perrier",61 8727,"","Oroxylum","Vent.",61 19669,"","Orthotheca","Pichon",61 19675,"","Osmhydrophora","Barb.Rodr.",61 8728,"","Pachyptera","DC.",61 8729,"","Pajanelia","DC.",61 8730,"","Pandorea","(Endl.) Spach",61 19659,"","Panterpa","Miers",61 8731,"","Parabignonia","Bureau ex K.Schum.",61 19652,"","Paracarpaea","(K.Schum.) Pichon",61 19737,"","Paracolea","Baill.",61 8732,"","Paradolichandra","Hassl.",61 8733,"","Paragonia","Bureau",61 8734,"","Paramansoa","Baill.",61 8735,"","Paratecoma","Kuhlm.",61 8736,"","Parmentiera","DC.",61 8737,"","Pauldopia","Steenis",61 19657,"","Pentelesia","Raf.",61 8738,"","Perianthomega","Bureau ex Baill.",61 8739,"","Periarrabidaea","A.Samp.",61 8740,"","Perichlaena","Baill.",61 16639,"","Petastoma","Miers",61 8741,"","Phaedranthus","Miers",61 19687,"","Phoenicocissus","Mart. ex Meisn.",61 8742,"","Phryganocydia","Mart. ex Bureau",61 19689,"","Phrygiobureaua","Kuntze",61 8743,"","Phyllarthron","DC.",61 8744,"","Phylloctenium","Baill.",61 16640,"","Piriadacus","Pichon",61 8745,"","Pithecoctenium","Mart. ex Meisn.",61 19662,"","Platolaria","Raf.",61 8746,"","Pleonotoma","Miers",61 8747,"","Podranea","Sprague",61 19719,"","Pongelia","Raf.",61 8748,"","Potamoganos","Sandwith",61 19713,"","Potamoxylon","Raf.",61 19681,"","Pseudocalymma","A.Samp. & Kuhlm.",61 15170,"","Pseudocatalpa","A.H.Gentry",61 8750,"","Pseudopaegma","Urb.",61 19739,"","Pteromischus","Pichon",61 19707,"","Pteropodium","DC. ex Meisn.",61 8751,"","Pyrostegia","C.Presl",61 8752,"","Radermachera","Zoll. & Moritzi",61 19705,"","Rafinesquia","Raf.",61 8753,"","Rhigozum","Burch.",61 8754,"","Rhodocolea","Baill.",61 8755,"","Roentgenia","Urb.",61 19690,"","Rojasiophytum","Hassl.",61 8756,"","Romeroa","Dugand",61 19667,"","Saldanhaea","Bureau",61 19653,"","Sampaiella","J.C.Gomes",61 8758,"","Sanhilaria","Baill.",61 25289,"","Santisukia","Brummitt",61 8759,"","Saritaea","Dugand",61 19676,"","Schizopsis","Bureau",61 8761,"","Scobinaria","Seibert",61 8762,"","Setilobus","Baill.",61 16641,"","Sideropogon","Pichon",61 16642,"","Siphocolea","Baill.",61 19741,"","Sotor","Fenzl",61 8763,"","Sparattosperma","Mart. ex Meisn.",61 8764,"","Spathicalyx","J.C.Gomes",61 8765,"","Spathodea","P.Beauv.",61 19730,"","Spathodeopsis","Dop",61 25590,"","Sphingiphila","A.H.Gentry",61 8767,"","Spirotecoma","Baill. ex Dalla Torre & Harms",61 19717,"","Stenolobium","D.Don",61 19654,"","Stenosiphanthus","A.Samp.",61 8768,"","Stereospermum","Cham.",61 8769,"","Stizophyllum","Miers",61 8770,"","Synapsis","Griseb.",61 8771,"","Tabebuia","Gomes ex DC.",61 8772,"","Tanaecium","Sw.",61 8773,"","Tecoma","Juss.",61 8774,"","Tecomanthe","Baill.",61 8775,"","Tecomaria","(Endl.) Spach",61 8776,"","Tecomella","Seem.",61 19655,"","Tetrastichella","Pichon",61 17770,"","Tisserantodendron","Sillans",61 8777,"","Tourrettia","Foug.",61 25410,"","Tynanthus","Miers",61 8778,"","Tynnanthus","Miers",61 8779,"","Urbanolophium","Melch.",61 19658,"","Vasconcellia","Mart.",61 8780,"","Wunschmannia","Urb.",61 8781,"","Xylophragma","Sprague",61 19742,"","Zaa","Baill.",61 19738,"","Zenkeria","Rchb.",61 16643,"","Zeyhera","Mart.",61 8782,"","Zeyheria","Mart.",61 846,"","Bixa","L.",62 11905,"","Blandfordia","Sm.",63 21945,"","Anchistea","C.Presl",64 21931,"","Blechnidium","T.Moore",64 21932,"","Blechnopsis","C.Presl",64 13655,"","Blechnum","L.",64 21944,"","Bowringia","Hook.",64 13656,"","Brainea","J.Sm.",64 21946,"","Chieniopteris","Ching",64 21933,"","Diploblechnum","Hayata",64 21934,"","Distaxia","C.Presl",64 13657,"","Doodia","R.Br.",64 21935,"","Homophyllum","Merino",64 21928,"","Lomaria","Willd.",64 21936,"","Lomaridium","C.Presl",64 21948,"","Lomariobotrys","Fee",64 21937,"","Lonchitis-Aspera","Hill ex Farw.",64 21947,"","Lorinseria","C.Presl",64 21938,"","Mesothema","C.Presl",64 21939,"","Orthogramma","C.Presl",64 21940,"","Parablechnum","C.Presl",64 13658,"","Pteridoblechnum","Hennipman",64 13659,"","Sadleria","Kaulf.",64 21929,"","Salpichlaena","J.Sm.",64 21941,"","Spicanta","C.Presl",64 21930,"","Spicantopsis","Nakai",64 25707,"","Steenisioblechnum","Hennipman",64 21942,"","Stegania","R.Br.",64 13660,"","Stenochlaena","J.Sm.",64 21943,"","Struthiopteris","Scop.",64 13661,"","Woodwardia","Sm.",64 1345,"","Adansonia","L.",65 1346,"","Aguiaria","Ducke",65 1347,"","Bernoullia","Oliv.",65 1348,"","Bombacopsis","Pittier",65 1349,"","Bombax","L.",65 1350,"","Boschia","Korth.",65 1351,"","Camptostemon","Mast.",65 17583,"","Campylanthera","Schott & Endl.",65 1352,"","Catostemma","Benth.",65 1353,"","Cavanillesia","Ruiz & Pav.",65 1354,"","Ceiba","Mill.",65 1355,"","Chorisia","Kunth",65 1356,"","Coelostegia","Benth.",65 16371,"","Cullenia","Wight",65 16372,"","Cumingia","Vidal",65 1357,"","Durio","Adans.",65 17581,"","Eriodendron","DC.",65 17582,"","Erione","Schott & Endl.",65 1358,"","Eriotheca","Schott & Endl.",65 1359,"","Gyranthera","Pittier",65 1361,"","Huberodendron","Ducke",65 1362,"","Kostermansia","Soegeng",65 1363,"","Lahia","Hassk.",65 1364,"","Matisia","Bonpl.",65 1366,"","Neesia","Blume",65 1367,"","Neobuchia","Urb.",65 1368,"","Ochroma","Sw.",65 1369,"","Pachira","Aubl.",65 1370,"","Patinoa","Cuatrec.",65 1371,"","Phragmotheca","Cuatrec.",65 24750,"","Pochota","Ram.Goyena",65 1372,"","Pseudobombax","Dugand",65 1373,"","Quararibea","Aubl.",65 1374,"","Rhodognaphalon","(Ulbr.) Roberty",65 16373,"","Rhodognaphalopsis","A.Robyns",65 17938,"","Salmalia","Schott & Endl.",65 1375,"","Scleronema","Benth.",65 1376,"","Septotheca","Ulbr.",65 16374,"","Spirotheca","Ulbr.",65 7969,"","Actinocarya","Benth.",66 7970,"","Adelocaryum","Brand",66 24664,"","Aegonychon","Gray",66 14203,"","Afrotysonia","Rauschert",66 19483,"","Aipyanthus","Steven",66 7971,"","Alkanna","Tausch",66 19466,"","Allocarya","Greene",66 16615,"","Allocaryastrum","Brand",66 24663,"","Amblynotopsis","J.F.Macbr.",66 7972,"","Amblynotus","(A.DC.) I.M.Johnst.",66 25385,"","Amphibologyne","Brand",66 7973,"","Amsinckia","Lehm.",66 7974,"","Anchusa","L.",66 7975,"","Ancistrocarya","Maxim.",66 24660,"","Anisanthera","Raf.",66 7976,"","Anoplocaryum","Ledeb.",66 7977,"","Antiotrema","Hand.-Mazz.",66 7978,"","Antiphytum","DC. ex Meisn.",66 22275,"","Antrophora","I.M.Johnst.",66 22662,"","Argusia","Boehm.",66 7979,"","Arnebia","Forssk.",66 25386,"","Arnebiola","Chiov.",66 7980,"","Asperugo","L.",66 25462,"","Austrocynoglossum","Popov ex R.R.Mill",66 7981,"","Auxemma","Miers",66 19474,"","Baphorhiza","Link",66 22280,"","Beruniella","Zakirov & Nabiev",66 19451,"","Beurreria","Jacq.",66 16620,"","Bilegnum","Brand",66 24659,"","Boraginella","Kuntze",66 7982,"","Borago","L.",66 25387,"","Borrachinea","Lavy",66 24658,"","Borraginoides","Boehm.",66 7983,"","Bothriospermum","Bunge",66 24656,"","Bourjotia","Pomel",66 7984,"","Bourreria","P.Browne",66 7985,"","Brachybotrys","Maxim. ex Oliv.",66 17506,"","Brandella","R.R.Mill",66 7986,"","Brunnera","Steven",66 24655,"","Bucanion","Steven",66 7987,"","Buglossoides","Moench",66 7988,"","Caccinia","Savi",66 19476,"","Camptocarpus","K.Koch",66 19475,"","Campylocaryum","DC. ex Meisn.",66 14851,"","Carmona","Cav.",66 19473,"","Caryolopha","Fisch. ex Trautv.",66 24653,"","Ceballosia","G.Kunkel",66 7989,"","Cerinthe","L.",66 19470,"","Cervia","Rodr. ex Lag.",66 25388,"","Chamissoniophila","Brand",66 7990,"","Chionocharis","I.M.Johnst.",66 7991,"","Choriantha","Riedl",66 7992,"","Cochranea","Miers",66 7993,"","Coldenia","L.",66 19492,"","Colsmannia","Lehm.",66 7994,"","Cordia","L.",66 24646,"","Cordiada","Vell.",66 24647,"","Cordiopsis","Desv.",66 7995,"","Cortesia","Cav.",66 7996,"","Craniospermum","Lehm.",66 25344,"","Crucicaryum","Brand",66 7997,"","Cryptantha","G.Don",66 7998,"","Cynoglossopsis","Brand",66 7999,"","Cynoglossum","L.",66 14796,"","Cynoglottis","(Gusul.) Vural & Kit Tan",66 16616,"","Cyphomattia","Boiss.",66 19458,"","Cystistemon","Post & Kuntze",66 8000,"","Cystostemon","Balf.f.",66 8001,"","Dasynotus","I.M.Johnst.",66 8002,"","Decalepidanthus","Riedl",66 25389,"","Echinoglochin","(A.Gray) Brand",66 16617,"","Echinospermum","Sw. ex Lehm.",66 8003,"","Echiochilon","Desf.",66 25390,"","Echiochilopsis","Caball.",66 19481,"","Echioides","Ortega",66 19486,"","Echiopsis","Rchb.",66 22214,"","Echiostachys","Levyns",66 8005,"","Echium","L.",66 19455,"","Eddya","Torr. & A.Gray",66 8006,"","Ehretia","P.Browne",66 8007,"","Elizaldia","Willk.",66 8008,"","Embadium","J.M.Black",66 24662,"","Endogonia","Turcz.",66 19464,"","Eremocarya","Greene",66 8009,"","Eritrichium","Schrad. ex Gaudin",66 16622,"","Euploca","Nutt.",66 24657,"","Friedrichsthalia","Fenzl",66 19453,"","Galapagoa","Hook.f.",66 8010,"","Gastrocotyle","Bunge",66 25281,"","Gerascanthus","P.Browne",66 16623,"","Glyptocaryopsis","Brand",66 17509,"","Greeneocharis","Gurke & Harms",66 19479,"","Gymnoleima","Decne.",66 14795,"","Gyrocaryum","Valdes",66 8011,"","Hackelia","Opiz",66 8012,"","Halacsya","Dorfl.",66 8013,"","Halgania","Gaudich.",66 8014,"","Harpagonella","A.Gray",66 19478,"","Havilandia","Stapf",66 8015,"","Heliocarya","Bunge",66 8016,"","Heliotropium","L.",66 25391,"","Henryettana","Brand",66 16621,"","Heterocaryum","A.DC.",66 8017,"","Hormuzakia","Gusul.",66 24349,"","Huynhia","Greuter",66 19488,"","Isorium","Raf.",66 8018,"","Ivanjohnstonia","Kazmi",66 25392,"","Johnstonella","Brand",66 19461,"","Kuschakewiczia","Regel & Smirn.",66 8019,"","Lacaitaea","Brand",66 8020,"","Lappula","Moench",66 15888,"","Lasiarrhenum","I.M.Johnst.",66 8021,"","Lasiocaryum","I.M.Johnst.",66 8022,"","Lepechiniella","Popov",66 8023,"","Lepidocordia","Ducke",66 19485,"","Leptanthe","Klotzsch",66 16624,"","Leurocline","S.Moore",66 8024,"","Lindelofia","Lehm.",66 25282,"","Lithocardium","Kuntze",66 25393,"","Lithococca","Small ex Rydb.",66 8025,"","Lithodora","Griseb.",66 8026,"","Lithospermum","L.",66 19487,"","Lobostema","Spreng.",66 8027,"","Lobostemon","Lehm.",66 8028,"","Lycopsis","L.",66 19469,"","Maccoya","F.Muell.",66 8029,"","Macromeria","D.Don",66 8030,"","Macrotomia","DC.",66 8031,"","Maharanga","A.DC.",66 8032,"","Mairetis","I.M.Johnst.",66 25394,"","Mallotonia","(Griseb.) Britton",66 16625,"","Massartina","Maire",66 19462,"","Mattia","Schult.",66 16197,"","Mattiastrum","(Boiss.) Brand",66 8033,"","Megacaryon","Boiss.",66 19467,"","Megastoma","Coss. & Durieu",66 8034,"","Mertensia","Roth",66 24652,"","Messerschmidia","Hebenstr.",66 16173,"","Messerschmidia","Roem. & Schult.",66 24651,"","Messersmidia","L.",66 25395,"","Metaeritrichium","W.T.Wang",66 8035,"","Microcaryum","I.M.Johnst.",66 24661,"","Microparacaryum","(Popov ex Riedl) Hilger",66 8036,"","Microula","Benth.",66 8037,"","Mimophytum","Greenm.",66 8038,"","Moltkia","Lehm.",66 8039,"","Moltkiopsis","I.M.Johnst.",66 19452,"","Monomesia","Raf.",66 8040,"","Moritzia","DC. ex Meisn.",66 19482,"","Munbya","Boiss.",66 8041,"","Myosotidium","Hook.",66 8042,"","Myosotis","L.",66 8043,"","Neatostema","I.M.Johnst.",66 8044,"","Nephrocarya","Candargy",66 8045,"","Nesocaryum","I.M.Johnst.",66 19321,"","Nogalia","Verdc.",66 25345,"","Nomosa","I.M.Johnst.",66 8046,"","Nonea","Medik.",66 19459,"","Octosomatium","Gagnep.",66 8047,"","Ogastemma","Brummitt",66 8048,"","Omphalodes","Mill.",66 8049,"","Omphalolappula","Brand",66 22281,"","Omphalotrigonotis","W.T.Wang",66 19477,"","Onochiles","Bubani",66 8050,"","Onosma","L.",66 8051,"","Onosmodium","Michx.",66 19490,"","Oplexion","Raf.",66 19465,"","Oreocarya","Greene",66 19468,"","Oreocharis","(Decne.) Lindl.",66 8052,"","Oreogenia","I.M.Johnst.",66 8053,"","Oxyosmyles","Speg.",66 25760,"","Paracaryopsis","R.R.Mill",66 8054,"","Paracaryum","(A.DC.) Boiss.",66 19460,"","Paracynoglossum","Popov",66 24348,"","Paramoltkia","Greuter",66 16198,"","Paraskevia","W.Sauer & G.Sauer",66 8055,"","Pardoglossum","E.Barbier & Mathez",66 8056,"","Patagonula","L.",66 8057,"","Pectocarya","DC. ex Meisn.",66 25396,"","Pedinogyne","Brand",66 8058,"","Pentaglottis","Tausch",66 19491,"","Penthysa","Raf.",66 25346,"","Perittostemma","I.M.Johnst.",66 8059,"","Phyllocara","Gusul.",66 8060,"","Plagiobothrys","Fisch. & C.A.Mey.",66 16618,"","Podonosma","Boiss.",66 16199,"","Procopiana","Gusul.",66 17507,"","Procopiania","Gusul.",66 8061,"","Pseudomertensia","Riedl",66 25347,"","Psilolaemus","I.M.Johnst.",66 8062,"","Pteleocarpa","Oliv.",66 19456,"","Ptilocalyx","Torr. & A.Gray",66 8063,"","Pulmonaria","L.",66 19471,"","Raclathris","Raf.",66 19457,"","Rhabdia","Mart.",66 24648,"","Rhabdocalyx","Lindl.",66 24665,"","Rhytispermum","Link",66 8064,"","Rindera","Pall.",66 8065,"","Rochefortia","Sw.",66 8066,"","Rochelia","Rchb.",66 8067,"","Rotula","Lour.",66 8068,"","Saccellium","Bonpl.",66 25397,"","Scapicephalus","Ovcz. & Czukav.",66 19472,"","Schistocaryum","Franch.",66 19463,"","Sclerocaryopsis","Brand",66 8069,"","Selkirkia","Hemsl.",66 8070,"","Sericostoma","Stocks",66 22282,"","Sinojohnstonia","Hu",66 8071,"","Solenanthus","Ledeb.",66 16619,"","Spilocarpus","Lem.",66 19454,"","Stegnocarpus","Torr. & A.Gray",66 25398,"","Stenosolenium","Turcz.",66 25399,"","Stephanocaryum","Popov",66 8072,"","Suchtelenia","Kar. ex Meisn.",66 8073,"","Symphytum","L.",66 25384,"","Tetraedrocarpus","O.Schwarz",66 8074,"","Thaumatocaryon","Baill.",66 8075,"","Thyrocarpus","Hance",66 8076,"","Tianschaniella","B.Fedtsch. ex Popov",66 15876,"","Tiquilia","Pers.",66 24650,"","Tiquiliopsis","A.Heller",66 8077,"","Tournefortia","L.",66 19484,"","Toxostigma","A.Rich.",66 8078,"","Trachelanthus","Kunze",66 8079,"","Trachystemon","D.Don",66 19489,"","Traxara","Raf.",66 24649,"","Traxilum","Raf.",66 8080,"","Trichodesma","R.Br.",66 8081,"","Trigonocaryum","Trautv.",66 8082,"","Trigonotis","Steven",66 8083,"","Tysonia","Bolus",66 24350,"","Ulugbekia","Zakirov",66 24654,"","Valentina","Speg.",66 16626,"","Valentiniella","Speg.",66 8084,"","Vaupelia","Brand",66 8085,"","Wellstedia","Balf.f.",66 17510,"","Wheelerella","G.B.Grant",66 19480,"","Zwackhia","Sendtn. ex Rchb.",66 13448,"","Bowenia","Hook.",67 2397,"","Bretschneidera","Hemsl.",68 11618,"","Abromeitiella","Mez",69 11619,"","Acanthostachys","Klotzsch",69 11620,"","Aechmea","Ruiz & Pav.",69 18824,"","Alcantarea","(E.Morren) Harms",69 16917,"","Anacyclia","Hoffmanns.",69 11621,"","Ananas","Mill.",69 11622,"","Andrea","Mez",69 11623,"","Androlepis","Brongn. ex Houllet",69 11624,"","Araeococcus","Brongn.",69 18834,"","Aregelia","Kuntze",69 11625,"","Ayensua","L.B.Sm.",69 18822,"","Bakerantha","L.B.Sm.",69 18823,"","Bakeria","Andre",69 11626,"","Billbergia","Thunb.",69 24245,"","Brewcaria","L.B.Sm., Steyerm. & H.Rob.",69 11627,"","Brocchinia","Schult.f.",69 11628,"","Bromelia","L.",69 11629,"","Canistrum","E.Morren",69 18826,"","Caraguata","Lindl.",69 11630,"","Catopsis","Griseb.",69 24306,"","Chevaliera","Gaudich. ex Beer",69 16918,"","Chirripoa","Suess.",69 18825,"","Cipuropsis","Ule",69 11631,"","Connellia","N.E.Br.",69 11632,"","Cottendorfia","Schult.f.",69 18838,"","Cryptanopsis","Ule",69 11633,"","Cryptanthus","Otto & A.Dietr.",69 18836,"","Deinacanthon","Mez",69 11634,"","Deuterocohnia","Mez",69 11635,"","Disteganthus","Lem.",69 11636,"","Dyckia","Schult.f.",69 11637,"","Encholirium","Mart. ex Schult.f.",69 11638,"","Fascicularia","Mez",69 11639,"","Fernseea","Baker",69 19319,"","Fosterelia","Airy Shaw",69 11640,"","Fosterella","L.B.Sm.",69 11641,"","Glomeropitcairnia","Mez",69 18841,"","Gravisia","Mez",69 11642,"","Greigia","Regel",69 11643,"","Guzmania","Ruiz & Pav.",69 11644,"","Hechtia","Klotzsch",69 18835,"","Hesperogreigia","Skottsb.",69 11645,"","Hohenbergia","Schult.f.",69 11646,"","Hohenbergiopsis","L.B.Sm. & Read",69 18837,"","Karatas","Mill.",69 24302,"","Lamprococcus","Beer",69 18819,"","Lindmania","Mez",69 24620,"","Lymania","Read",69 24305,"","Macrochordion","de Vriese",69 18827,"","Massangea","E.Morren",69 18820,"","Meziothamnus","Harms",69 11647,"","Mezobromelia","L.B.Sm.",69 11648,"","Navia","Schult.f.",69 11649,"","Neoglaziovia","Mez",69 11650,"","Neoregelia","L.B.Sm.",69 11651,"","Nidularium","Lem.",69 17487,"","Niveophyllum","Matuda",69 11652,"","Ochagavia","Phil.",69 24303,"","Ortgiesia","Regel",69 11653,"","Orthophytum","Beer",69 11654,"","Pitcairnia","L'Her.",69 18831,"","Placseptalia","Espinosa",69 24300,"","Platyaechmea","(Baker) L.B.Sm. & Kress",69 24301,"","Podaechmea","(Mez) L.B.Sm. & Kress",69 11655,"","Portea","K.Koch",69 24304,"","Pothuava","Gaudich.",69 18821,"","Prionophyllum","K.Koch",69 14239,"","Pseudaechmea","L.B.Sm. & Read",69 11656,"","Pseudananas","Hassl. ex Harms",69 11657,"","Puya","Molina",69 11658,"","Quesnelia","Gaudich.",69 18832,"","Rhodostachys","Phil.",69 11659,"","Ronnbergia","E.Morren & Andre",69 18828,"","Schlumbergera","E.Morren",69 18839,"","Sincoraea","Ule",69 18829,"","Sodiroa","Andre",69 24246,"","Steyerbromelia","L.B.Sm.",69 11660,"","Streptocalyx","Beer",69 18830,"","Thecophyllum","Andre",69 11661,"","Tillandsia","L.",69 11662,"","Vriesea","Lindl.",69 18842,"","Wittmackia","Mez",69 11663,"","Wittrockia","Lindm.",69 1871,"","Brunellia","Ruiz & Pav.",70 20332,"","Astrocoma","Neck.",71 3474,"","Audouinia","Brongn.",71 3475,"","Berzelia","Brongn.",71 3476,"","Brunia","Lam.",71 20330,"","Diberara","Baill.",71 20325,"","Erasma","R.Br.",71 20326,"","Gravenshorstia","Nees",71 20331,"","Heterodon","Meisn.",71 20333,"","Levisanus","Schreb.",71 3477,"","Linconia","L.",71 3478,"","Lonchostoma","Wikstr.",71 3479,"","Mniothamnea","(Oliv.) Nied.",71 3480,"","Nebelia","Neck. ex Sweet",71 20324,"","Pavinda","Thunb.",71 20327,"","Peliotis","E.Mey.",71 20328,"","Peliotus","E.Mey.",71 3481,"","Pseudobaeckea","Nied.",71 20334,"","Rabenhorstia","Rchb.",71 3482,"","Raspalia","Brongn.",71 20329,"","Schinzafra","Kuntze",71 3483,"","Staavia","Dahl",71 3484,"","Thamnea","Sol. ex Brongn.",71 3485,"","Tittmannia","Brongn.",71 22210,"","Adenoplea","Radlk.",72 19650,"","Adenoplusia","Radlk.",72 7814,"","Androya","H.Perrier",72 7818,"","Buddleja","L.",72 19651,"","Chilianthus","Burch.",72 7820,"","Emorya","Torr.",72 24331,"","Gomara","Ruiz & Pav.",72 14207,"","Gomaranthus","Rauschert",72 19416,"","Gomaria","Spreng.",72 7825,"","Gomphostigma","Turcz.",72 25136,"","Hasslerella","Chodat",72 22665,"","Lachnopylis","Hochst.",72 7833,"","Nicodemia","Ten.",72 7835,"","Nuxia","Comm. ex Lam.",72 7836,"","Peltanthera","Benth.",72 7838,"","Polypremum","L.",72 7844,"","Sanango","Bunting & Duke",72 15905,"","Valerioa","Standl. & Steyerm.",72 10705,"","Afrothismia","(Engl.) Schltr.",73 10706,"","Apteria","Nutt.",73 18883,"","Bagnisia","Becc.",73 10707,"","Burmannia","L.",73 10708,"","Campylosiphon","Benth.",73 10709,"","Cymbocarpa","Miers",73 10710,"","Dictyostega","Miers",73 18882,"","Dipterosiphon","Huber",73 10711,"","Geomitra","Becc.",73 10712,"","Glaziocharis","Taub. ex Warm.",73 10713,"","Gymnosiphon","Blume",73 10714,"","Haplothismia","Airy Shaw",73 10715,"","Hexapterella","Urb.",73 25149,"","Mamorea","de la Sota",73 10716,"","Marthella","Urb.",73 10717,"","Miersiella","Urb.",73 25150,"","Ophiomeris","Miers",73 25333,"","Oxygyne","Schltr.",73 25151,"","Ptychomeria","Benth.",73 25334,"","Scaphiophora","Schltr.",73 10718,"","Thismia","Griff.",73 10719,"","Triscyphus","Taub. ex Warm.",73 25152,"","Triurocodon","Schltr.",73 1909,"","Aucoumea","Pierre",74 17813,"","Balsamodendrum","Kunth",74 17567,"","Beiselia","Forman",74 1910,"","Boswellia","Roxb. ex Colebr.",74 1911,"","Bursera","Jacq. ex L.",74 1912,"","Canariellum","Engl.",74 1913,"","Canarium","L.",74 1914,"","Commiphora","Jacq.",74 1915,"","Crepidospermum","Hook.f.",74 1916,"","Dacryodes","Vahl",74 17815,"","Elaphrium","Jacq.",74 1917,"","Garuga","Roxb.",74 1918,"","Haplolobus","H.J.Lam",74 1919,"","Hedwigia","Sw.",74 1920,"","Hemicrepidospermum","Swart",74 17819,"","Hemisantiria","H.J.Lam",74 17814,"","Hemprichia","Ehrenb.",74 17816,"","Icica","Aubl.",74 17817,"","Icicaster","Ridl.",74 24400,"","Neomangenotia","J.-F.Leroy",74 17820,"","Pachylobus","G.Don",74 1921,"","Paraprotium","Cuatrec.",74 1922,"","Protium","Burm.f.",74 1923,"","Santiria","Blume",74 1924,"","Santiriopsis","Engl.",74 1925,"","Scutinanthe","Thwaites",74 1926,"","Tapirocarpus","Sagot",74 1927,"","Tetragastris","Gaertn.",74 1928,"","Trattinnickia","Willd.",74 17818,"","Trigonochlamys","Hook.f.",74 1929,"","Triomma","Hook.f.",74 12560,"","Butomus","L.",75 10508,"","Buxus","L.",76 20943,"","Crantzia","Sw.",76 20942,"","Lepidopelma","Klotzsch",76 22123,"","Macropodandra","Gilg",76 10509,"","Notobuxus","Oliv.",76 10510,"","Pachysandra","Michx.",76 10511,"","Sarcococca","Lindl.",76 10513,"","Styloceras","Kunth ex Juss.",76 20944,"","Tricera","Schreb.",76 3441,"","Byblis","Salisb.",77 343,"","Brasenia","Schreb.",78 344,"","Cabomba","Aubl.",78 14955,"","Acanthocalycium","Backeb.",79 15251,"","Acanthocephala","Backeb.",79 4158,"","Acanthocereus","(Engelm. ex A.Berger) Britton & Rose",79 14956,"","Acantholobivia","Backeb.",79 14957,"","Acanthopetalus","Y.Ito",79 14958,"","Acanthorhipsalis","(K.Schum.) Britton & Rose",79 15252,"","Acanthorhipsalis","Kimnach",79 15277,"","Airampoa","Fric",79 14959,"","Akersia","Buining",79 4159,"","Ancistrocactus","(K.Schum.) Britton & Rose",79 15287,"","Andenea","Fric",79 14961,"","Anhalonium","Lem.",79 14962,"","Anisocereus","Backeb.",79 4160,"","Aporocactus","Lem.",79 15298,"","Aporocereus","Fric & Kreuz.",79 14963,"","Arequipa","Britton & Rose",79 14964,"","Arequipiopsis","Kreuz. & Buining",79 4161,"","Ariocarpus","Scheidw.",79 4162,"","Armatocereus","Backeb.",79 4163,"","Arrojadoa","Britton & Rose",79 4164,"","Arthrocereus","A.Berger & F.M.Knuth",79 15312,"","Astrophyton","Lawr.",79 4165,"","Astrophytum","Lem.",79 15318,"","Aulacothele","Monv.",79 15319,"","Aureilobivia","Fric",79 17758,"","Austrocactus","Britton & Rose",79 14965,"","Austrocephalocereus","Backeb.",79 14966,"","Austrocylindropuntia","Backeb.",79 14967,"","Aylostera","Speg.",79 4167,"","Aztekium","Boed.",79 14968,"","Azureocereus","Akers & H.Johnson",79 15324,"","Backebergia","Bravo",79 14969,"","Bartschella","Britton & Rose",79 4168,"","Bergerocactus","Britton & Rose",79 15332,"","Bergerocereus","Fric & Kreuz.",79 15333,"","Binghamia","Britton & Rose",79 14970,"","Bisnaga","Orcutt",79 4169,"","Blossfeldia","Werderm.",79 14972,"","Bolivicereus","Cardenas",79 14973,"","Bonifazia","Standl. & Steyerm.",79 14974,"","Borzicactella","F.Ritter",79 4170,"","Borzicactus","Riccob.",79 15339,"","Borzicereus","Fric & Kreuz.",79 14975,"","Brachycalycium","Backeb.",79 4171,"","Brachycereus","Britton & Rose",79 14976,"","Brasilicactus","Backeb.",79 15346,"","Brasilicereus","Backeb.",79 14977,"","Brasiliopuntia","(K.Schum.) A.Berger",79 14978,"","Brasiliparodia","F.Ritter",79 15347,"","Brasilocactus","Fric",79 15348,"","Bridgesia","Backeb.",79 14979,"","Brittonia","C.A.Armstr.",79 15349,"","Brittonrosea","Speg.",79 4172,"","Browningia","Britton & Rose",79 15162,"","Buiningia","Buxb.",79 15358,"","Cactodendron","Bigelow",79 15359,"","Cactus","L.",79 15360,"","Cactus","Britton & Rose",79 15361,"","Cactus","Lem.",79 4173,"","Calymmanthium","F.Ritter",79 22191,"","Carnegiea","Britton & Rose",79 15379,"","Cassyta","J.Mill.",79 15380,"","Cassytha","Mill.",79 14981,"","Castellanosia","Cardenas",79 4175,"","Cephalocereus","Pfeiff.",79 14982,"","Cephalocleistocactus","F.Ritter",79 14983,"","Cephalomammillaria","Fric",79 15383,"","Ceratistes","Labour.",79 4176,"","Cereus","Mill.",79 14984,"","Chaffeyopuntia","Fric & Schelle",79 14985,"","Chamaecereus","Britton & Rose",79 15389,"","Chamaelobivia","Y.Ito",79 14986,"","Chiapasia","Britton & Rose",79 14987,"","Chichipia","Backeb.",79 15392,"","Chilenia","Backeb. [1935]",79 15393,"","Chilenia","Backeb. [1938]",79 15394,"","Chilenia","Backeb. [1939]",79 14988,"","Chileniopsis","Backeb.",79 15395,"","Chileocactus","Fric",79 15396,"","Chileorebutia","Fric",79 15397,"","Chiliorebutia","Fric",79 14989,"","Chilita","Orcutt",79 15404,"","Chrysocactus","Y.Ito",79 14990,"","Cinnabarinea","Fric ex F.Ritter",79 14991,"","Cipocereus","F.Ritter",79 15407,"","Clavarioidia","Kreuz.",79 4177,"","Cleistocactus","Lem.",79 15408,"","Cleistocereus","Fric & Kreuz.",79 14992,"","Clistanthocereus","Backeb.",79 14993,"","Cochemiea","(K.Brandegee) Walton",79 14994,"","Cochiseia","Earle",79 14951,"","Coleocephalocereus","Backeb.",79 14995,"","Coloradoa","Boissev. & Davidson",79 14996,"","Consolea","Lem.",79 4178,"","Copiapoa","Britton & Rose",79 4179,"","Corryocactus","Britton & Rose",79 15419,"","Corryocereus","Fric & Kreuz.",79 14997,"","Corynopuntia","F.M.Knuth",79 4180,"","Coryphantha","(Engelm.) Lem.",79 14998,"","Cryptocereus","Alexander",79 14999,"","Cullmannia","Distefano",79 15000,"","Cumarinia","Buxb.",79 15001,"","Cumulopuntia","F.Ritter",79 15002,"","Cylindropuntia","(Engelm.) F.M.Knuth",79 15004,"","Cylindrorebutia","Fric & Kreuz.",79 15005,"","Dactylanthocactus","Y.Ito",79 15006,"","Deamia","Britton & Rose",79 15439,"","Delaetia","Backeb.",79 15441,"","Demnosa","Fric",79 4181,"","Dendrocereus","Britton & Rose",79 4182,"","Denmoza","Britton & Rose",79 15009,"","Digitorebutia","Fric & Kreuz.",79 15454,"","Diploperianthium","F.Ritter",79 4183,"","Discocactus","Pfeiff.",79 15458,"","Disisocactus","Kunze",79 4184,"","Disocactus","Lindl.",79 15459,"","Disocereus","Fric & Kreuz.",79 15010,"","Dolichothele","(K.Schum.) Britton & Rose",79 15464,"","Dracocactus","Y.Ito",79 15467,"","Ebnerella","Buxb.",79 4185,"","Eccremocactus","Britton & Rose",79 15468,"","Eccremocereus","Fric & Kreuz.",79 4186,"","Echinocactus","Link & Otto",79 15470,"","Echinocactus","Fabr.",79 4187,"","Echinocereus","Engelm.",79 15012,"","Echinofossulocactus","Lawr.",79 15471,"","Echinofossulocactus","Britton & Rose",79 15472,"","Echinolobivia","Y.Ito",79 4188,"","Echinomastus","Britton & Rose",79 15473,"","Echinonyctanthus","Lem.",79 4189,"","Echinopsis","Zucc.",79 15474,"","Echinorebutia","Fric",79 15476,"","Efossus","Orcutt",79 25017,"","Encephalocarpus","A.Berger",79 15014,"","Eomatucana","F.Ritter",79 15015,"","Epiphyllanthus","A.Berger",79 15016,"","Epiphyllopsis","Backeb. & F.M.Knuth",79 4190,"","Epiphyllum","Haw.",79 15485,"","Epiphyllum","Pfeiff.",79 4191,"","Epithelantha","F.A.C.Weber ex Britton & Rose",79 4192,"","Erdisia","Britton & Rose",79 15018,"","Eriocactus","Backeb.",79 15487,"","Eriocephala","Backeb.",79 15019,"","Eriocereus","Riccob.",79 4193,"","Eriosyce","Phil.",79 15491,"","Erythrocereus","Houghton",79 15020,"","Erythrorhipsalis","A.Berger",79 4194,"","Escobaria","Britton & Rose",79 15021,"","Escobesseya","Hester",79 4195,"","Escontria","Rose",79 4196,"","Espostoa","Britton & Rose",79 15023,"","Espostoopsis","Buxb.",79 4197,"","Eulychnia","Phil.",79 15494,"","Eulychnocactus","Backeb.",79 15496,"","Euporteria","Kreuz. & Buining",79 15498,"","Eurebutia","Fric",79 4198,"","Facheiroa","Britton & Rose",79 4199,"","Ferocactus","Britton & Rose",79 15025,"","Ficindica","St.-Lag.",79 15507,"","Floresia","Krainz & F.Ritter ex Backeb.",79 15026,"","Floribunda","F.Ritter",79 15508,"","Fobea","Fric",79 4200,"","Frailea","Britton & Rose",79 15514,"","Friesia","Fric",79 15516,"","Furiolobivia","Y.Ito",79 15521,"","Gerocephalus","F.Ritter",79 15027,"","Glandulicactus","Backeb.",79 15524,"","Glandulifera","Fric",79 4201,"","Grusonia","F.Rchb. ex Britton & Rose",79 15029,"","Gymnantha","Y.Ito",79 15164,"","Gymnanthocereus","Backeb.",79 15030,"","Gymnocactus","Backeb.",79 22278,"","Gymnocactus","John & Riha",79 4202,"","Gymnocalycium","Pfeiff.",79 15031,"","Gymnocereus","Rauh & Backeb.",79 15535,"","Haagea","Fric",79 15536,"","Haageocactus","Backeb.",79 4203,"","Haageocereus","Backeb.",79 4204,"","Hamatocactus","Britton & Rose",79 15541,"","Hariota","DC.",79 15540,"","Hariota","Adans.",79 4205,"","Harrisia","Britton",79 15034,"","Haseltonia","Backeb.",79 15035,"","Hatiora","Britton & Rose",79 15036,"","Heliabravoa","Backeb.",79 15037,"","Helianthocereus","Backeb.",79 4206,"","Heliocereus","(A.Berger) Britton & Rose",79 15039,"","Hertrichocereus","Backeb.",79 15553,"","Heterolobivia","Y.Ito",79 15557,"","Hickenia","Britton & Rose",79 15040,"","Hildewintera","F.Ritter",79 15558,"","Hildmannia","Kreuz. & Buining",79 4207,"","Homalocephala","Britton & Rose",79 15042,"","Horridocactus","Backeb.",79 4208,"","Hylocereus","(A.Berger) Britton & Rose",79 15568,"","Hymenorebulobivia","Fric",79 15043,"","Hymenorebutia","Fric ex Buining",79 15044,"","Islaya","Backeb.",79 15045,"","Isolatocereus","(Backeb.) Backeb.",79 4209,"","Jasminocereus","Britton & Rose",79 15046,"","Krainzia","Backeb.",79 15586,"","Lactomammillaria","Fric",79 15047,"","Lasiocereus","F.Ritter",79 15048,"","Lemaireocereus","Britton & Rose",79 4210,"","Leocereus","Britton & Rose",79 15049,"","Lepidocoryphantha","Backeb.",79 15050,"","Lepismium","Pfeiff.",79 4211,"","Leptocereus","(A.Berger) Britton & Rose",79 15602,"","Leptocladia","Buxb.",79 15051,"","Leptocladodia","Buxb.",79 4212,"","Leuchtenbergia","Hook.",79 15052,"","Leucostele","Backeb.",79 15053,"","Lobeira","Alexander",79 15615,"","Lobirebutia","Fric",79 4213,"","Lobivia","Britton & Rose",79 15616,"","Lobiviopsis","Fric",79 4214,"","Lophocereus","(A.Berger) Britton & Rose",79 4215,"","Lophophora","J.M.Coult.",79 15055,"","Loxanthocereus","Backeb.",79 15056,"","Lymanbensonia","Kimnach",79 15057,"","Machaerocereus","Britton & Rose",79 15058,"","Maierocactus","E.C.Rost",79 4216,"","Maihuenia","(F.A.C.Weber) K.Schum.",79 15059,"","Maihueniopsis","Speg.",79 15622,"","Malacocarpus","Salm-Dyck",79 15626,"","Mamillaria","F.Rchb.",79 15060,"","Mamillopsis","E.Morren ex Britton & Rose",79 15627,"","Mammariella","Shafer",79 15628,"","Mammilaria","Torr. & A.Gray",79 4217,"","Mammillaria","Haw.",79 15061,"","Mammilloydia","Buxb.",79 15062,"","Marenopuntia","Backeb.",79 15063,"","Marginatocereus","(Backeb.) Backeb.",79 15064,"","Maritimocereus","Akers",79 15065,"","Marniera","Backeb.",79 15066,"","Marshallocereus","Backeb.",79 15067,"","Matucana","Britton & Rose",79 15068,"","Mediocactus","Britton & Rose",79 15633,"","Mediocereus","Fric & Kreuz.",79 15069,"","Mediolobivia","Backeb.",79 15634,"","Mediorebutia","Fric",79 15636,"","Megalobivia","Y.Ito",79 4218,"","Melocactus","Link & Otto",79 15070,"","Mesechinopsis","Y.Ito",79 15639,"","Meyenia","Backeb.",79 15071,"","Micranthocereus","Backeb.",79 15072,"","Micropuntia","Daston",79 15644,"","Microspermia","Fric",79 4219,"","Mila","Britton & Rose",79 15073,"","Miqueliopuntia","Fric ex F.Ritter",79 15074,"","Mirabella","F.Ritter",79 15075,"","Mitrocereus","(Backeb.) Backeb.",79 4220,"","Monvillea","Britton & Rose",79 15076,"","Morangaya","G.D.Rowley",79 15077,"","Morawetzia","Backeb.",79 4221,"","Myrtillocactus","Console",79 15662,"","Myrtillocereus","Fric & Kreuz.",79 15663,"","Napina","Fric",79 15078,"","Navajoa","Croizat",79 4222,"","Neoabbottia","Britton & Rose",79 15079,"","Neobesseya","Britton & Rose",79 15080,"","Neobinghamia","Backeb.",79 15081,"","Neobuxbaumia","Backeb.",79 15082,"","Neocardenasia","Backeb.",79 15083,"","Neochilenia","Backeb. ex Dolz",79 15084,"","Neodawsonia","Backeb.",79 15085,"","Neoevansia","W.T.Marshall",79 15086,"","Neogomesia","Castaneda",79 15668,"","Neogomezia","Buxb.",79 15669,"","Neogymnantha","Y.Ito",79 15670,"","Neohickenia","Fric",79 15671,"","Neolemaireocereus","Backeb.",79 4223,"","Neolloydia","Britton & Rose",79 15087,"","Neolobivia","Y.Ito",79 15672,"","Neomammillaria","Britton & Rose",79 15673,"","Neoporteria","Backeb.",79 4224,"","Neoporteria","Britton & Rose",79 4225,"","Neoraimondia","Britton & Rose",79 15088,"","Neotanahashia","Y.Ito",79 15089,"","Neowerdermannia","Fric",79 15676,"","Nichelia","Bullock",79 4226,"","Nopalea","Salm-Dyck",79 4227,"","Nopalxochia","Britton & Rose",79 15091,"","Normanbokea","Kladiwa & Buxb.",79 4228,"","Notocactus","(K.Schum.) Fric",79 4229,"","Nyctocereus","(A.Berger) Britton & Rose",79 4230,"","Obregonia","Fric",79 15092,"","Oehmea","Buxb.",79 4231,"","Opuntia","Mill.",79 15683,"","Opuntiopsis","Knebel",79 15093,"","Oreocereus","(A.Berger) Riccob.",79 4232,"","Oroya","Britton & Rose",79 15095,"","Ortegocactus","Alexander",79 4233,"","Pachycereus","(A.Berger) Britton & Rose",79 4234,"","Parodia","Speg.",79 15697,"","Parviopuntia","Soulaire & Marn.-Lap.",79 4235,"","Pediocactus","Britton & Rose",79 15701,"","Peirescia","Zucc.",79 15702,"","Peireskia","Steud.",79 15703,"","Peireskiopsis","Vaupel",79 4236,"","Pelecyphora","Ehrenb.",79 4237,"","Peniocereus","(A.Berger) Britton & Rose",79 15705,"","Perescia","Lem.",79 4238,"","Pereskia","Mill.",79 4239,"","Pereskiopsis","Britton & Rose",79 15096,"","Peruvocereus","Akers",79 15097,"","Pfeiffera","Salm-Dyck",79 15098,"","Phellosperma","Britton & Rose",79 15099,"","Philippicereus","Backeb.",79 15714,"","Phyllarthus","Neck. ex M.Gomez",79 15717,"","Phyllocactus","Link",79 15100,"","Phyllocereus","Miq.",79 15101,"","Pilocanthus","B.W.Benson & Backeb.",79 15719,"","Pilocereus","Lem.",79 15720,"","Pilocereus","K.Schum.",79 15102,"","Pilocopiapoa","F.Ritter",79 15721,"","Pilopsis","Y.Ito",79 14953,"","Pilosocereus","Byles & Rowley",79 15103,"","Piptanthocereus","(A.Berger) Riccob.",79 15104,"","Polaskia","Backeb.",79 15105,"","Porfiria","Boed.",79 15106,"","Praecereus","Buxb.",79 15107,"","Pseudoacanthocereus","F.Ritter",79 15741,"","Pseudoechinocereus","Buining",79 15108,"","Pseudoespostoa","Backeb.",79 15110,"","Pseudolobivia","(Backeb.) Backeb.",79 15111,"","Pseudomammillaria","Buxb.",79 15112,"","Pseudomitrocereus","Bravo & Buxb.",79 15113,"","Pseudonopalxochia","Backeb.",79 15109,"","Pseudopilocereus","Buxb.",79 15114,"","Pseudorhipsalis","Britton & Rose",79 25543,"","Pseudosolisia","Y.Ito",79 15744,"","Pseudotephrocactus","Fric",79 15115,"","Pseudozygocactus","Backeb.",79 4240,"","Pterocactus","K.Schum.",79 15116,"","Pterocereus","T.MacDoug. & Miranda",79 15117,"","Puna","Kiesling",79 15118,"","Pygmaeocereus","J.H.Johnson & Backeb.",79 15119,"","Pyrrhocactus","Backeb. & F.M.Knuth",79 4241,"","Quiabentia","Britton & Rose",79 15121,"","Rapicactus","Buxb. & Oehme",79 4242,"","Rathbunia","Britton & Rose",79 4243,"","Rauhocereus","Backeb.",79 15752,"","Rebulobivia","Fric",79 4244,"","Rebutia","K.Schum.",79 15123,"","Reicheocactus","Backeb.",79 15124,"","Rhipsalidopsis","Britton & Rose",79 4245,"","Rhipsalis","Gaertn.",79 15125,"","Rhodocactus","(A.Berger) F.M.Knuth",79 15126,"","Ritterocereus","Backeb.",79 15758,"","Rodentiophila","F.Ritter ex Backeb.",79 15127,"","Rooksbya","Backeb.",79 15760,"","Roseia","Fric",79 15128,"","Roseocactus","A.Berger",79 15129,"","Roseocereus","Backeb.",79 15766,"","Salmiopuntia","Fric",79 15130,"","Salpingolobivia","Y.Ito",79 14954,"","Samaipaticereus","Cardenas",79 4246,"","Schlumbergera","Lem.",79 4247,"","Sclerocactus","Britton & Rose",79 15131,"","Scoparebutia","Fric & Kreuz. ex Buining",79 4248,"","Selenicereus","(A.Berger) Britton & Rose",79 15132,"","Sericocactus","Y.Ito",79 15133,"","Seticereus","Backeb.",79 15134,"","Seticleistocactus","Backeb.",79 15135,"","Setiechinopsis","(Backeb.) de Haas",79 15787,"","Setirebutia","Fric & Kreuz.",79 24943,"","Siccobaccatus","P.J.Braun & Esteves",79 15136,"","Soehrensia","Backeb.",79 15137,"","Solisia","Britton & Rose",79 15796,"","Spegazzinia","Backeb.",79 15799,"","Spinicalycium","Fric",79 4249,"","Stenocactus","(K.Schum.) A.W.Hill",79 4250,"","Stenocereus","(A.Berger) Riccob.",79 14950,"","Stephanocereus","A.Berger",79 4251,"","Stetsonia","Britton & Rose",79 15807,"","Stromatocactus","Karw. ex Rumpler",79 4252,"","Strombocactus","Britton & Rose",79 4253,"","Strophocactus","Britton & Rose",79 15809,"","Strophocereus","Fric & Kreuz.",79 15139,"","Submatucana","Backeb.",79 15140,"","Subpilocereus","Backeb.",79 15141,"","Subulatopuntia","Fric & Schelle",79 4254,"","Sulcorebutia","Backeb.",79 4255,"","Tacinga","Britton & Rose",79 15143,"","Tephrocactus","Lem.",79 4256,"","Thelocactus","(K.Schum.) Britton & Rose",79 15144,"","Thelocephala","Y.Ito",79 15821,"","Thelomastus","Fric",79 15145,"","Thrixanthocereus","Backeb.",79 15146,"","Toumeya","Britton & Rose",79 4257,"","Trichocereus","(A.Berger) Riccob.",79 15148,"","Trochilocactus","Linding.",79 15149,"","Tunas","Lunell",79 4258,"","Turbinicarpus","(Backeb.) Buxb. & Backeb.",79 14952,"","Uebelmannia","Buining",79 15151,"","Utahia","Britton & Rose",79 15152,"","Vatricania","Backeb.",79 15153,"","Weberbauerocereus","Backeb.",79 15154,"","Weberiopuntia","Fric",79 4259,"","Weberocereus","Britton & Rose",79 4260,"","Weingartia","Werderm.",79 4261,"","Werckleocereus","Britton & Rose",79 15157,"","Wigginsia","D.M.Porter",79 4262,"","Wilcoxia","Britton & Rose",79 15159,"","Wilmattea","Britton & Rose",79 15863,"","Winteria","F.Ritter",79 15864,"","Winterocereus","Backeb.",79 15865,"","Wittia","K.Schum.",79 15165,"","Wittiocactus","Rauschert",79 15160,"","Yungasocereus","F.Ritter",79 4263,"","Zehntnerella","Britton & Rose",79 15161,"","Zygocactus","K.Schum.",79 15873,"","Zygocereus","Fric & Kreuz.",79 12107,"","Calectasia","R.Br.",80 3496,"","Callitriche","L.",81 76,"","Calycanthus","L.",82 77,"","Chimonanthus","Lindl.",82 25310,"","Sinocalycanthus","(W.C.Cheng & S.Y.Chang) W.C.Cheng & S.Y.Chang",82 5563,"","Acarpha","Griseb.",83 5564,"","Acicarpha","Juss.",83 5565,"","Boopis","Juss.",83 5566,"","Calycera","Cav.",83 5567,"","Gamocarpha","DC.",83 24110,"","Leucocera","Turcz.",83 5568,"","Moschopsis","Phil.",83 24109,"","Nastanthus","Miers",83 6798,"","Adenophora","Fisch.",84 25559,"","Annaea","Kolak.",84 6799,"","Apetahia","Baill.",84 16865,"","Astrocodon","Fed.",84 6800,"","Asyneuma","Griseb. & Schenck",84 16147,"","Azorina","Feer",84 6801,"","Berenice","Tul.",84 18042,"","Bolelia","Raf.",84 16866,"","Brachycodon","Fed.",84 6802,"","Brighamia","A.Gray",84 6803,"","Burmeistera","H.Karst. & Triana",84 18036,"","Byrsanthes","C.Presl",84 6804,"","Campanula","L.",84 16867,"","Campanulastrum","Small",84 18055,"","Campanumoea","Blume",84 6805,"","Canarina","L.",84 6806,"","Centropogon","C.Presl",84 6807,"","Cephalostigma","A.DC.",84 24597,"","Cervicina","Delile",84 6808,"","Clermontia","Gaudich.",84 18117,"","Clintonia","Douglas ex Lindl.",84 6809,"","Codonopsis","Wall.",84 16869,"","Colensoa","Hook.f.",84 16267,"","Craterocapsa","Hilliard & B.L.Burtt",84 18037,"","Cremochilus","Turcz.",84 6810,"","Cryptocodon","Fed.",84 6811,"","Cyananthus","Wall. ex Benth.",84 6812,"","Cyanea","Gaudich.",84 18056,"","Cyclocodon","Griff.",84 6813,"","Cylindrocarpa","Regel",84 6814,"","Cyphia","Bergius",84 6815,"","Cyphocarpus","Miers",84 6816,"","Delissea","Gaudich.",84 6817,"","Dialypetalum","Benth.",84 6818,"","Diastatea","Scheidw.",84 6819,"","Dielsantha","E.Wimm.",84 17425,"","Diosphaera","Buser",84 6820,"","Dominella","E.Wimm.",84 6821,"","Downingia","Torr.",84 17426,"","Echinocodon","D.Y.Hong",84 6825,"","Edraianthus","(A.DC.) DC.",84 18040,"","Enchysia","C.Presl",84 25560,"","Fedorovia","Kolak.",84 17428,"","Feeria","Buser",84 25680,"","Gadellia","Schulkina",84 18119,"","Gaertnera","Retz.",84 6822,"","Githopsis","Nutt.",84 18057,"","Glosocomia","D.Don",84 18058,"","Glossocomia","Rchb.",84 6823,"","Grammatotheca","C.Presl",84 17429,"","Gunillaea","Thulin",84 16868,"","Halacsyella","Janch.",84 6824,"","Hanabusaya","Nakai",84 18045,"","Haynaldia","Kanitz",84 17427,"","Hedraeanthus","Griseb.",84 6826,"","Heterochaenia","A.DC.",84 6827,"","Heterocodon","Nutt.",84 6828,"","Heterotoma","Zucc.",84 25370,"","Hippobroma","G.Don",84 25371,"","Homocodon","D.Y.Hong",84 6829,"","Howellia","A.Gray",84 6830,"","Hypsela","C.Presl",84 23197,"","Hyssaria","Kolak.",84 6831,"","Isolobus","A.DC.",84 17430,"","Isotoma","(R.Br.) Lindl.",84 6832,"","Jasione","L.",84 18051,"","Jasionella","Stoj. & Stef.",84 18035,"","Kittelia","Rchb.",84 6833,"","Laurentia","Adans.",84 6834,"","Legenere","McVaugh",84 6835,"","Legousia","Durande",84 18059,"","Leptocodon","Sond.",84 6836,"","Leptocodon","(Hook.f.) Lem.",84 6837,"","Lightfootia","L'Her.",84 6838,"","Lobelia","L.",84 6839,"","Lysipomia","Kunth",84 6840,"","Merciera","A.DC.",84 18046,"","Mezleria","C.Presl",84 6841,"","Michauxia","L'Her.",84 6842,"","Microcodon","A.DC.",84 6843,"","Monopsis","Salisb.",84 18054,"","Muehlbergella","Feer",84 6844,"","Musschia","Dumort.",84 18050,"","Myopsia","C.Presl",84 23198,"","Mzymtella","Kolak.",84 17431,"","Namacodon","Thulin",84 6845,"","Nemacladus","Nutt.",84 25562,"","Neocodon","Kolak. & Serdyuk.",84 6846,"","Neowimmeria","O.Deg. & I.Deg.",84 24596,"","Nesocodon","Thulin",84 25372,"","Numaeacampa","Gagnep.",84 6847,"","Ostrowskia","Regel",84 18052,"","Ovilla","Adans.",84 6848,"","Palmerella","A.Gray",84 18047,"","Parastranthus","G.Don",84 6849,"","Parishella","A.Gray",84 6850,"","Peracarpa","Hook.f. & Thomson",84 6851,"","Petromarula","Vent. ex R.Hedw.",84 6852,"","Phyllocharis","Diels",84 16200,"","Physoplexis","(Endl.) Schur",84 6853,"","Phyteuma","L.",84 18044,"","Piddingtonia","A.DC.",84 6854,"","Platycodon","A.DC.",84 18062,"","Podanthum","Boiss.",84 6855,"","Pongati","Adans.",84 18060,"","Pongatium","Juss.",84 6856,"","Popoviocodonia","Fed.",84 6857,"","Pratia","Gaudich.",84 6858,"","Prismatocarpus","L'Her.",84 25561,"","Pseudocampanula","Kolak.",84 6859,"","Pseudonemacladus","McVaugh",84 18120,"","Rapinia","Lour.",84 18061,"","Rapunculus","Mill.",84 18063,"","Rapuntia","Chevall.",84 18048,"","Rapuntium","Mill.",84 18064,"","Rapuntium","Post & Kuntze",84 6860,"","Rhigiophyllum","Hochst.",84 6861,"","Rhizocephalum","Wedd.",84 6862,"","Roella","L.",84 6863,"","Rollandia","Gaudich.",84 18065,"","Rotantha","Small",84 6864,"","Ruthiella","Steenis",84 23199,"","Sachokiella","Kolak.",84 18118,"","Schultesia","Roth",84 6865,"","Sclerotheca","A.DC.",84 6866,"","Sergia","Fed.",84 6867,"","Siphocampylus","Pohl",84 6868,"","Siphocodon","Turcz.",84 18041,"","Solenopsis","C.Presl",84 18066,"","Specularia","A.DC.",84 16870,"","Speirema","Hook.f. & Thomson",84 6881,"","Sphenoclea","Gaertn.",84 16871,"","Symphiandra","Steud.",84 6869,"","Symphyandra","A.DC.",84 14262,"","Synotoma","(G.Don) Rich.Schulz",84 6870,"","Theilera","E.Phillips",84 6871,"","Tracheliopsis","Buser",84 6872,"","Trachelium","L.",84 6873,"","Treichelia","Vatke",84 6874,"","Trematocarpus","Zahlbr.",84 18039,"","Trematolobelia","Zahlbr.",84 17432,"","Trimeris","C.Presl",84 6875,"","Triodanis","Raf.",84 6876,"","Trochocodon","Candargy",84 18049,"","Tupa","G.Don",84 6877,"","Unigenes","E.Wimm.",84 6878,"","Wahlenbergia","Schrad. ex Roth",84 18043,"","Wittea","Kunth",84 6879,"","Zeugandra","P.H.Davis",84 840,"","Canella","P.Browne",85 841,"","Capsicodendron","Hoehne",85 842,"","Cinnamodendron","Endl.",85 843,"","Cinnamosma","Baill.",85 844,"","Pleodendron","Tiegh.",85 845,"","Warburgia","Engl.",85 10586,"","Cannabis","L.",86 24288,"","Humulopsis","Grudz.",86 10587,"","Humulus","L.",86 11617,"","Canna","L.",87 2090,"","Acanthothamnus","Brandegee",88 16223,"","Canotia","Torr.",88 758,"","Apophyllum","F.Muell.",89 759,"","Atamisquea","Miers ex Hook. & Arn.",89 760,"","Bachmannia","Pax",89 761,"","Beautempsia","Gaudich.",89 762,"","Belencita","H.Karst.",89 763,"","Borthwickia","W.W.Sm.",89 764,"","Boscia","Lam.",89 765,"","Buchholzia","Engl.",89 766,"","Buhsia","Bunge",89 767,"","Cadaba","Forssk.",89 16311,"","Capparidastrum","Hutch.",89 768,"","Capparis","L.",89 769,"","Chilocalyx","Klotzsch",89 770,"","Cladostemon","A.Braun & Vatke",89 771,"","Cleome","L.",89 772,"","Cleomella","DC.",89 15965,"","Colicodendron","Mart.",89 773,"","Courbonia","Brongn.",89 774,"","Crateva","L.",89 775,"","Cristatella","Nutt.",89 776,"","Dactylaena","Schrad. ex Schult.f.",89 17730,"","Dhofaria","A.G.Mill.",89 17500,"","Dianthera","Klotzsch",89 491,"","Dipterygium","Decne.",89 777,"","Euadenia","Oliv.",89 778,"","Forchhammeria","Liebm.",89 779,"","Gynandropsis","DC.",89 780,"","Haptocarpum","Ule",89 781,"","Hypselandra","Pax & K.Hoffm.",89 782,"","Isomeris","Nutt.",89 783,"","Justago","Kuntze",89 1874,"","Koeberlinia","Zucc.",89 15966,"","Linnaeobreynia","Hutch.",89 784,"","Maerua","Forssk.",89 17504,"","Meeboldia","Pax & K.Hoffm.",89 785,"","Morisonia","L.",89 16312,"","Neocalyptrocalyx","Hutch.",89 786,"","Neothorelia","Gagnep.",89 787,"","Niebuhria","DC.",89 788,"","Oceanopapaver","Guillaumin",89 789,"","Oxystylis","Torr. & Frem.",89 16313,"","Pedicellaria","Schrank",89 2169,"","Pentadiplandra","Baill.",89 17502,"","Physostemon","Mart.",89 791,"","Podandrogyne","Ducke",89 792,"","Poilanedora","Gagnep.",89 793,"","Polanisia","Raf.",89 25832,"","Pteroloma","Hochst. & Steud.",89 794,"","Pteropetalum","Pax",89 664,"","Puccionia","Chiov.",89 15964,"","Quadrella","J.Presl",89 795,"","Ritchiea","R.Br. ex G.Don",89 24699,"","Rorida","J.F.Gmel.",89 24698,"","Roridula","Forssk.",89 17503,"","Roydsia","Roxb.",89 796,"","Setchellanthus","Brandegee",89 797,"","Steriphoma","Spreng.",89 798,"","Stixis","Lour.",89 17505,"","Stuebelia","Pax",89 19493,"","Tetrateleia","Arw.",89 799,"","Tetratelia","Sond.",89 800,"","Thilachium","Lour.",89 801,"","Tirania","Pierre",89 802,"","Wislizenia","Engelm.",89 4875,"","Abelia","R.Br.",90 4876,"","Diervilla","Mill.",90 4877,"","Dipelta","Maxim.",90 4878,"","Heptacodium","Rehder",90 4879,"","Kolkwitzia","Graebn.",90 4880,"","Leycesteria","Wall.",90 4881,"","Linnaea","L.",90 4882,"","Lonicera","L.",90 24280,"","Metalonicera","M.Wang & A.G.Gu",90 4887,"","Sambucus","L.",90 4883,"","Symphoricarpos","Duhamel",90 4884,"","Triosteum","L.",90 4885,"","Viburnum","L.",90 4886,"","Weigela","Thunb.",90 18099,"","Zabelia","(Rehder) Makino",90 22663,"","Cardiopteris","Wall. ex Royle",91 2077,"","Peripterygium","Hassk.",91 4025,"","Carica","L.",92 4026,"","Cylicomorpha","Urb.",92 4027,"","Jacaratia","A.DC.",92 22147,"","Jarilla","I.M.Johnst.",92 4028,"","Jarilla","Rusby",92 20915,"","Pileus","Ramirez",92 4893,"","Carlemannia","Benth.",93 4894,"","Quiducia","Gagnep.",93 4895,"","Silvianthus","Hook.f.",93 1175,"","Anthodiscus","G.Mey.",94 1176,"","Caryocar","L.",94 982,"","Acanthophyllum","C.A.Mey.",95 983,"","Agrostemma","L.",95 984,"","Allochrusa","Bunge ex Boiss.",95 25717,"","Alsinanthe","(Fenzl) Rchb.",95 19538,"","Alsine","L.",95 19541,"","Alsine","Gaertn.",95 985,"","Alsinidendron","H.Mann",95 986,"","Ankyropetalum","Fenzl",95 987,"","Arenaria","L.",95 988,"","Bolanthus","(Ser.) Rchb.",95 989,"","Brachystemma","D.Don",95 990,"","Brewerina","A.Gray",95 991,"","Bufonia","L.",95 16318,"","Calycotropis","Turcz.",95 992,"","Cerastium","L.",95 993,"","Cerdia","Moc. & Sesse",95 19533,"","Charesia","E.A.Busch",95 994,"","Colobanthus","Bartl.",95 19537,"","Coronaria","Guett.",95 995,"","Cucubalus","L.",95 23202,"","Cyathophylla","Bocquet & Strid",95 19531,"","Dianthella","Clauson ex Pomel",95 997,"","Dianthus","L.",95 998,"","Diaphanoptera","Rech.f.",95 999,"","Drymaria","Willd. ex Schult.",95 1000,"","Drypis","L.",95 25716,"","Eremogone","Fenzl",95 25478,"","Fimbripetalum","(Turcz.) Ikonn.",95 24717,"","Gastrocalyx","Schischk.",95 1001,"","Gooringia","F.N.Williams",95 19539,"","Gouffeia","Robill. & Castagne ex Lam. & DC.",95 1002,"","Gypsophila","L.",95 1050,"","Habrosia","Fenzl",95 19534,"","Heliosperma","Rchb.",95 1003,"","Holosteum","L.",95 17571,"","Honckenya","Ehrh.",95 25419,"","Honkenya","Ehrh.",95 19540,"","Hymenella","Moc. & Sesse",95 1004,"","Kohlrauschia","Kunth",95 1005,"","Krascheninnikovia","Turcz. ex Fenzl",95 1006,"","Krauseola","Pax & K.Hoffm.",95 16319,"","Kuhitangia","Ovcz.",95 1007,"","Lepyrodiclis","Fenzl",95 25476,"","Lidia","A.Love & D.Love",95 1008,"","Loeflingia","L.",95 1009,"","Lychnis","L.",95 19535,"","Melandrium","Rohl.",95 19536,"","Melandryum","Rchb.",95 16320,"","Mesostemma","Vved.",95 1010,"","Microphyes","Phil.",95 1011,"","Minuartia","L.",95 25477,"","Minuopsis","W.A.Weber",95 1012,"","Moehringia","L.",95 1013,"","Moenchia","Ehrh.",95 1014,"","Myosoton","Moench",95 25294,"","Ochotonophila","Gilli",95 1015,"","Ortegia","L.",95 1016,"","Pentastemonodiscus","Rech.f.",95 1017,"","Petrocoptis","A.Braun ex Endl.",95 1018,"","Petrorhagia","(Ser.) Link",95 1019,"","Phryna","(Boiss.) Pax & K.Hoffm.",95 16322,"","Phrynella","Pax & K.Hoffm.",95 16323,"","Pinosia","Urb.",95 25521,"","Pirinia","Kral",95 17575,"","Pleioneura","Rech.f.",95 1020,"","Polycarpaea","Lam.",95 1021,"","Polycarpon","L.",95 1022,"","Polytepalum","Suess. & Beyerle",95 25475,"","Porsildia","A.Love & D.Love",95 16324,"","Provancheria","B.Boivin",95 25746,"","Psammophila","Ikonn.",95 25745,"","Psammophiliella","Ikonn.",95 25502,"","Pseudosaponaria","(F.N.Williams) Ikonn.",95 1023,"","Pseudostellaria","Pax",95 23089,"","Pycnophyllopsis","Skottsb.",95 1024,"","Pycnophyllum","J.Remy",95 25718,"","Queria","L.",95 9528,"","Reesia","Ewart",95 25287,"","Rhodalsine","J.Gay",95 1025,"","Robbairea","Boiss.",95 1026,"","Sagina","L.",95 1027,"","Sanctambrosia","Skottsb. ex Kuschel",95 1028,"","Saponaria","L.",95 1029,"","Schiedea","Cham. & Schltdl.",95 1030,"","Schischkiniella","Steenis",95 16325,"","Scleranthopsis","Rech.f.",95 16326,"","Selleola","Urb.",95 1031,"","Silene","L.",95 1032,"","Spergula","L.",95 1033,"","Spergularia","(Pers.) J.Presl & C.Presl",95 1034,"","Stellaria","L.",95 1035,"","Stipulicida","Michx.",95 1036,"","Thurya","Boiss. & Balansa",95 1037,"","Thylacospermum","Fenzl",95 25719,"","Tryphane","Rchb.",95 19532,"","Tunica","Mert. & W.D.J.Koch",95 19530,"","Tunica","Ludw.",95 16327,"","Tytthostemma","Nevski",95 1038,"","Uebelinia","Hochst.",95 1039,"","Vaccaria","Wolf",95 1040,"","Velezia","L.",95 1041,"","Viscaria","Rohl.",95 16343,"","Wangerinia","E.Franz",95 25720,"","Wierzbickia","Rchb.",95 25295,"","Wilhelmsia","Rchb.",95 14197,"","Allocasuarina","L.A.S.Johnson",96 10667,"","Casuarina","L.",96 14196,"","Ceuthostoma","L.A.S.Johnson",96 10668,"","Gymnostoma","L.A.S.Johnson",96 25557,"","Quadrangula","Baum.-Bod.",96 25232,"","Ambaiba","Adans.",97 10646,"","Cecropia","Loefl.",97 19004,"","Conocephalus","Blume",97 10647,"","Coussapoa","Aubl.",97 25233,"","Dicranostachys","Trecul",97 10648,"","Musanga","C.Sm. ex R.Br.",97 10649,"","Myrianthus","P.Beauv.",97 10650,"","Poikilospermum","Zipp. ex Miq.",97 10651,"","Pourouma","Aubl.",97 2091,"","Allocassine","N.Robson",98 24548,"","Annulodiscus","Tardieu",98 17855,"","Anthodon","Ruiz & Pav.",98 2092,"","Apatophyllum","McGill.",98 16426,"","Apodostigma","R.Wilczek",98 14833,"","Arnicratea","N.Halle",98 16713,"","Bequaertia","R.Wilczek",98 2093,"","Bhesa","Buch.-Ham. ex Arn.",98 24416,"","Boaria","A.DC.",98 2094,"","Brassiantha","A.C.Sm.",98 2095,"","Brexiella","H.Perrier",98 2096,"","Campylostemon","Welw.",98 24540,"","Capusia","Lecomte",98 2097,"","Caryospermum","Blume",98 2098,"","Cassine","L.",98 2099,"","Catha","Forssk. ex Schreb.",98 17850,"","Cathastrum","Turcz.",98 2100,"","Celastrus","L.",98 2101,"","Cheiloclinium","Miers",98 2102,"","Crocoxylon","Eckl. & Zeyh.",98 15183,"","Crossopetalum","P.Browne",98 17856,"","Cuervea","Triana ex Miers",98 2103,"","Denhamia","Meisn.",98 16428,"","Dicarpellum","(Loes.) A.C.Sm.",98 2104,"","Dillonia","Sacleux",98 16429,"","Elachyptera","A.C.Sm.",98 2105,"","Elaeodendron","J.Jacq.",98 2106,"","Euonymus","L.",98 2107,"","Evonymopsis","H.Perrier",98 2108,"","Fraunhofera","Mart.",98 2109,"","Glyptopetalum","Thwaites",98 2110,"","Goniodiscus","Kuhlm.",98 2112,"","Gyminda","Sarg.",98 17851,"","Gymnosporia","(Wight & Arn.) Hook.f.",98 2113,"","Hartogia","Thunb. ex L.f.",98 25288,"","Hartogiella","Codd",98 2114,"","Hartogiopsis","H.Perrier",98 2115,"","Hedraianthera","F.Muell.",98 17858,"","Helictonema","Pierre",98 17857,"","Hemiangium","A.C.Sm.",98 2116,"","Herya","Cordem.",98 2117,"","Hexaspora","C.T.White",98 2118,"","Hippocratea","L.",98 17859,"","Hylenaea","Miers",98 2119,"","Hypsophila","F.Muell.",98 24546,"","Johnia","Roxb.",98 2120,"","Katafa","Costantin & J.Poiss.",98 2121,"","Kokoona","Thwaites",98 17852,"","Kurrimia","Wall. ex Thwaites",98 17853,"","Lauridia","Eckl. & Zeyh.",98 16430,"","Lecardia","Poiss. ex Guillaumin",98 16431,"","Loeseneriella","A.C.Sm.",98 2122,"","Lophopetalum","Wight ex Arn.",98 2123,"","Lydenburgia","N.Robson",98 2124,"","Maurocenia","Mill.",98 2125,"","Maytenus","Molina",98 2126,"","Menepetalum","Loes.",98 2127,"","Microtropis","Wall. ex Meisn.",98 2128,"","Monimopetalum","Rehder",98 24541,"","Monocelastrus","F.T.Wang & T.Tang",98 2129,"","Mortonia","A.Gray",98 2130,"","Moya","Griseb.",98 2131,"","Myginda","Jacq.",98 2132,"","Mystroxylon","Eckl. & Zeyh.",98 23214,"","Nicobariodendron","Vasudeva Rao & Chakrab.",98 24537,"","Nothocnestis","Miq.",98 2133,"","Orthosphenia","Standl.",98 17848,"","Otherodendron","Makino",98 16433,"","Pachystima","Raf.",98 24545,"","Paracelastrus","Miq.",98 2134,"","Paxistima","Raf.",98 2135,"","Peripterygia","(Baill.) Loes.",98 2136,"","Peritassa","Miers",98 2137,"","Perrottetia","Kunth",98 2138,"","Platypterocarpus","Dunkley & Brenan",98 2139,"","Plenckia","Reissek",98 2140,"","Pleurostylia","Wight & Arn.",98 2141,"","Polycardia","Juss.",98 3362,"","Pottingeria","Prain",98 24542,"","Pragmotessara","Pierre",98 24543,"","Pragmotropa","Pierre",98 17860,"","Prionostemma","Miers",98 15914,"","Pristimera","Miers",98 2142,"","Psammomoya","Diels & Loes.",98 17849,"","Pseudocassine","Bredell",98 2143,"","Pseudosalacia","Codd",98 2144,"","Ptelidium","Thouars",98 2145,"","Pterocelastrus","Meisn.",98 2146,"","Putterlickia","Endl.",98 24538,"","Pyrospermum","Miq.",98 2147,"","Quadripterygium","Tardieu",98 2148,"","Quetzalia","Lundell",98 17861,"","Reissantia","N.Halle",98 2149,"","Rhacoma","P.Browne ex L.",98 22225,"","Rzedowskia","Medrano",98 2150,"","Salacia","L.",98 2151,"","Salacicratea","Loes.",98 2152,"","Salacighia","Loes.",98 2153,"","Salaciopsis","Baker f.",98 2154,"","Salvadoropsis","H.Perrier",98 2155,"","Sarawakodendron","Ding Hou",98 2156,"","Scandivepres","Loes.",98 2157,"","Schaefferia","Jacq.",98 14285,"","Semialarium","N.Halle",98 14284,"","Simicratea","N.Halle",98 16434,"","Simirestis","N.Halle",98 2159,"","Siphonodon","Griff.",98 2160,"","Solenospermum","Zoll.",98 24544,"","Sphaerodiscus","Nakai",98 16435,"","Telemachia","Urb.",98 2161,"","Tetrasiphon","Urb.",98 2162,"","Thyrsosalacia","Loes.",98 2163,"","Tontelea","Aubl.",98 2164,"","Torralbasia","Krug & Urb.",98 25132,"","Tricerma","Liebm.",98 2165,"","Tripterygium","Hook.f.",98 17854,"","Tristemonanthus","Loes.",98 24539,"","Trochisandra","Bedd.",98 16436,"","Viposia","Lundell",98 2166,"","Wimmeria","Schltdl. & Cham.",98 2167,"","Xylonymus","Kalkman ex Ding Hou",98 2168,"","Zinowiewia","Turcz.",98 24635,"","Alepyrum","R.Br.",99 12598,"","Aphelia","R.Br.",99 12599,"","Brizula","Hieron.",99 12600,"","Centrolepis","Labill.",99 24636,"","Devauxia","R.Br.",99 12601,"","Gaimardia","Gaudich.",99 24637,"","Pseudalepyrum","Dandy",99 3398,"","Cephalotus","Labill.",100 13439,"","Cephalotaxus","Siebold & Zucc.",101 10688,"","Ceratophyllum","L.",102 105,"","Cercidiphyllum","Siebold & Zucc.",103 13551,"","Cheiropleuria","C.Presl",104 9539,"","Acroglochin","Schrad. ex Schult.",105 9540,"","Aellenia","Ulbr.",105 9541,"","Agathophora","(Fenzl) Bunge",105 9542,"","Agriophyllum","M.Bieb.",105 9543,"","Alexandra","Bunge",105 9544,"","Allenrolfea","Kuntze",105 9545,"","Anabasis","L.",105 9546,"","Anthochlamys","Fenzl",105 9547,"","Aphanisma","Nutt. ex Moq.",105 24320,"","Archiatriplex","G.L.Chu",105 20922,"","Armola","(Kirschl.) Montandon",105 9548,"","Arthrocnemum","Moq.",105 9549,"","Arthrophytum","Schrenk",105 9550,"","Atriplex","L.",105 9551,"","Axyris","L.",105 9552,"","Babbagia","F.Muell.",105 25171,"","Baolia","H.W.Kung & G.L.Chu",105 9553,"","Bassia","All.",105 9554,"","Beta","L.",105 9555,"","Bienertia","Bunge ex Boiss.",105 9556,"","Blackiella","Aellen",105 9557,"","Borsczowia","Bunge",105 9558,"","Brachylepis","C.A.Mey.",105 16677,"","Brezia","Moq.",105 20929,"","Bushia","Nieuwl.",105 16678,"","Calvelia","Moq.",105 9559,"","Camphorosma","L.",105 20937,"","Caroxylon","Thunb.",105 25469,"","Caspia","Galushko",105 9560,"","Ceratocarpus","L.",105 25226,"","Ceratoides","Gagnebin",105 9561,"","Chenolea","Thunb.",105 25484,"","Chenoleoides","Botsch.",105 9562,"","Chenopodium","L.",105 9563,"","Choriptera","Botsch.",105 9564,"","Climacoptera","Botsch.",105 20926,"","Coilocarpus","F.Muell. ex Domin",105 9565,"","Corispermum","L.",105 9566,"","Cornulaca","Delile",105 23207,"","Cremnophyton","Brullo & Pavone",105 9567,"","Cyathobasis","Aellen",105 9568,"","Cycloloma","Moq.",105 16679,"","Cyrilwhitea","Ising",105 20938,"","Darniella","Maire & Weiller",105 9569,"","Didymanthus","Endl.",105 20928,"","Dissocarpus","F.Muell.",105 20933,"","Dondia","Adans.",105 9570,"","Duriala","(R.H.Anderson) Ulbr.",105 1048,"","Dysphania","R.Br.",105 20927,"","Echinopsilon","Moq.",105 25327,"","Einadia","Raf.",105 9571,"","Enchylaena","R.Br.",105 16680,"","Eremochion","Gilli",105 19323,"","Eremophea","Paul G.Wilson",105 16692,"","Eremosemium","Greene",105 25348,"","Eriochiton","(R.H.Anderson) A.J.Scott",105 9572,"","Esfandiaria","Charif & Aellen",105 9573,"","Eurotia","Adans.",105 9574,"","Exomis","Fenzl ex Moq.",105 9575,"","Fadenia","Aellen & C.C.Towns.",105 9576,"","Fredolia","(Coss. & Durieu ex Bunge) Ulbr.",105 20939,"","Fremontia","Torr.",105 16681,"","Gamanthus","Bunge",105 9577,"","Girgensohnia","Bunge",105 25350,"","Goerziella","Urb.",105 9578,"","Grayia","Hook. & Arn.",105 9579,"","Gyroptera","Botsch.",105 9580,"","Hablitzia","M.Bieb.",105 9581,"","Halanthium","K.Koch",105 9582,"","Halarchon","Bunge",105 9583,"","Halimione","Aellen",105 9584,"","Halimocnemis","C.A.Mey.",105 20923,"","Halimus","Wallr.",105 9585,"","Halocharis","Moq.",105 9586,"","Halocnemum","M.Bieb.",105 9587,"","Halogeton","C.A.Mey.",105 9588,"","Halopeplis","Bunge ex Ung.-Sternb.",105 9590,"","Halosarcia","Paul G.Wilson",105 9591,"","Halostachys","C.A.Mey. ex Schrenk",105 20935,"","Halothamnus","Jaub. & Spach",105 25170,"","Halotis","Bunge",105 16682,"","Haloxanthium","Ulbr.",105 9592,"","Haloxylon","Bunge",105 9593,"","Hammada","Iljin",105 9594,"","Helicilla","Moq.",105 9595,"","Hemichroa","R.Br.",105 9596,"","Heterostachys","Ung.-Sternb.",105 9597,"","Holmbergia","Hicken",105 9598,"","Horaninovia","Fisch. & C.A.Mey.",105 25408,"","Hypocylix","Wol.",105 16683,"","Iljinia","Korovin",105 9599,"","Kalidiopsis","Aellen",105 9600,"","Kalidium","Moq.",105 9601,"","Kirilowia","Bunge",105 9602,"","Kochia","Roth",105 20924,"","Krascheninnikovia","Gueldenst.",105 9603,"","Lagenantha","Chiov.",105 20917,"","Lecanocarpus","Nees",105 20934,"","Lerchia","Zinn",105 16684,"","Londesia","Fisch. & C.A.Mey.",105 9604,"","Maireana","Moq.",105 9605,"","Malacocera","R.H.Anderson",105 9606,"","Manochlamys","Aellen",105 20918,"","Meiomeria","Standl.",105 9607,"","Microcnemum","Ung.-Sternb.",105 9608,"","Microgynoecium","Hook.f.",105 16685,"","Micromonolepis","Ulbr.",105 25409,"","Micropeplis","Bunge",105 9609,"","Monolepis","Schrad.",105 16686,"","Morrisiella","Aellen",105 20936,"","Muratina","Maire",105 9610,"","Nanophyton","Less.",105 25524,"","Neobassia","A.J.Scott",105 20919,"","Neobotrydium","Moldenke",105 16687,"","Neopreissia","Ulbr.",105 9611,"","Nitrophila","S.Watson",105 9612,"","Noaea","Moq.",105 9613,"","Nucularia","Batt.",105 20920,"","Obione","Gaertn.",105 9614,"","Ofaiston","Raf.",105 9615,"","Oreobliton","Durieu",105 20930,"","Osteocarpum","F.Muell.",105 9616,"","Pachycornia","Hook.f.",105 20921,"","Pachypharynx","Aellen",105 9617,"","Panderia","Fisch. & C.A.Mey.",105 25495,"","Patellaria","J.T.Williams, A.J.Scott & Ford-Lloyd",105 16148,"","Patellifolia","A.J.Scott, Ford-Lloyd & J.T.Williams",105 9618,"","Petrosimonia","Bunge",105 16688,"","Physandra","Botsch.",105 9619,"","Piptoptera","Bunge",105 9620,"","Polycnemum","L.",105 25479,"","Proatriplex","Stutz & G.L.Chu",105 9621,"","Rhagodia","R.Br.",105 16689,"","Rhaphidophyton","Iljin",105 9622,"","Roubieva","Moq.",105 9623,"","Roycea","C.A.Gardner",105 9624,"","Salicornia","L.",105 9625,"","Salsola","L.",105 9626,"","Sarcobatus","Nees",105 17461,"","Sarcocornia","A.J.Scott",105 20925,"","Sclerobassia","Ulbr.",105 16691,"","Scleroblitum","Ulbr.",105 9627,"","Sclerolaena","R.Br.",105 25328,"","Sclerostegia","Paul G.Wilson",105 9628,"","Seidlitzia","Bunge ex Boiss.",105 9629,"","Senniella","Aellen",105 9630,"","Sevada","Moq.",105 9631,"","Spinacia","L.",105 20932,"","Spirostachys","Ung.-Sternb.",105 20931,"","Spirostachys","S.Watson",105 25329,"","Stelligera","A.J.Scott",105 9632,"","Suaeda","Forssk. ex Scop.",105 9633,"","Suckleya","A.Gray",105 9634,"","Sympegma","Bunge",105 9635,"","Tecticornia","Hook.f.",105 9636,"","Tegicornia","Paul G.Wilson",105 9637,"","Teloxys","Moq.",105 9638,"","Theleophyton","(Hook.f.) Moq.",105 9639,"","Threlkeldia","R.Br.",105 9640,"","Traganopsis","Maire & Wilczek",105 9641,"","Traganum","Delile",105 9642,"","Zuckia","Standl.",105 9798,"","Ascarina","J.R.Forst. & G.Forst.",106 9799,"","Ascarinopsis","Humbert & Capuron",106 9800,"","Chloranthus","Sw.",106 9801,"","Hedyosmum","Sw.",106 9802,"","Sarcandra","Gardner",106 3275,"","Acioa","Aubl.",107 3276,"","Afrolicania","Mildbr.",107 16459,"","Angelesia","Korth.",107 3277,"","Atuna","Raf.",107 3278,"","Bafodeya","Prance ex F.White",107 20178,"","Balantium","Desv. ex Ham.",107 20183,"","Brya","Vell.",107 20184,"","Causea","Scop.",107 3279,"","Chrysobalanus","L.",107 20171,"","Coccomelia","Ridl.",107 3280,"","Couepia","Aubl.",107 20971,"","Cyclandrophora","Hassk.",107 20190,"","Dactyladenia","Welw.",107 20173,"","Dahuronia","Scop.",107 20172,"","Diemenia","Korth.",107 20179,"","Dugortia","Scop.",107 3281,"","Exellodendron","Prance",107 20970,"","Exitelia","Blume",107 20175,"","Geobalanus","Small",107 3282,"","Grangeria","Comm. ex Juss.",107 20191,"","Griffonia","Hook.f.",107 20174,"","Hedycrea","Schreb.",107 3283,"","Hirtella","L.",107 3284,"","Hunga","Pancher ex Prance",107 3285,"","Kostermanthus","Prance",107 20180,"","Lepidocarpa","Korth.",107 3286,"","Licania","Aubl.",107 3287,"","Magnistipula","Engl.",107 3288,"","Maranthes","Blume",107 20176,"","Moquilea","Aubl.",107 3289,"","Neocarya","(DC.) Prance ex F.White",107 3290,"","Parastemon","A.DC.",107 3291,"","Parinari","Aubl.",107 20181,"","Parinarium","Juss.",107 20182,"","Petrocarya","Schreb.",107 20185,"","Salmasia","Schreb.",107 20186,"","Sphenista","Raf.",107 20187,"","Tachibota","Aubl.",107 20188,"","Thelyra","Thouars",107 20177,"","Trichocarya","Miq.",107 20189,"","Zamzela","Raf.",107 56,"","Circaeaster","Maxim.",108 25527,"","Atlanthemum","Raynaud",109 811,"","Cistus","L.",109 19494,"","Crocanthemum","Spach",109 812,"","Fumana","(Dunal) Spach",109 17532,"x","Halimiocistus","Janch.",109 813,"","Halimium","(Dunal) Spach",109 814,"","Helianthemum","Mill.",109 815,"","Hudsonia","L.",109 816,"","Lechea","L.",109 25526,"","Therocistus","Holub",109 817,"","Tuberaria","(Dunal) Spach",109 7007,"","Clethra","L.",110 1869,"","Cneorum","L.",111 16149,"","Neochamaelea","(Engl.) Erdtman",111 8783,"","Cobaea","Cav.",112 849,"","Amoreuxia","Moc. & Sesse ex DC.",113 850,"","Cochlospermum","Kunth",113 11887,"","Androcymbium","Willd.",114 18933,"","Anguillaria","R.Br.",114 11900,"","Baeometra","Salisb. ex Endl.",114 11913,"","Bulbocodium","L.",114 11914,"","Burchardia","R.Br.",114 11920,"","Camptorrhiza","Hutch.",114 11930,"","Colchicum","L.",114 11943,"","Dipidax","Salisb. ex Benth.",114 11968,"","Gloriosa","L.",114 11982,"","Hexacyrtis","Dinter",114 11989,"","Iphigenia","Kunth",114 12006,"","Littonia","Hook.",114 12014,"","Merendera","Ramond",114 12027,"","Neodregea","C.H.Wright",114 16022,"","Onixotis","Raf.",114 12036,"","Ornithoglossum","Salisb.",114 18932,"","Reya","Kuntze",114 12056,"","Sandersonia","Hook.",114 18931,"","Synsiphon","Regel",114 12100,"","Wurmbea","Thunb.",114 8491,"","Columellia","Ruiz & Pav.",115 20544,"","Aetia","Adans.",116 3515,"","Anogeissus","(DC.) Wall.",116 20568,"","Aristotelia","Comm. ex Lam.",116 20571,"","Badamia","Gaertn.",116 20588,"","Bruguiera","Thouars",116 20583,"","Bucera","P.Browne",116 3516,"","Buchenavia","Eichler",116 3517,"","Bucida","L.",116 20557,"","Bureava","Baill.",116 20545,"","Cacoucia","Aubl.",116 3518,"","Calopyxis","Tul.",116 20560,"","Calycopteris","Lam.",116 20559,"","Campylochiton","Welw. ex Hiern",116 20561,"","Campylogyne","Welw. ex Hemsl.",116 20573,"","Catappa","Gaertn.",116 20579,"","Chicharronia","A.Rich.",116 20554,"","Chrysostachys","Pohl",116 20570,"","Chuncoa","Pav. ex Juss.",116 3519,"","Combretum","Loefl.",116 3520,"","Conocarpus","L.",116 20547,"","Cristaria","Sonn.",116 3521,"","Dansiea","Byrnes",116 20556,"","Embryogonia","Blume",116 20575,"","Fatrea","Juss.",116 3522,"","Finetia","Gagnep.",116 20553,"","Forsgardia","Vell.",116 20589,"","Funckia","Dennst.",116 3523,"","Getonia","Roxb.",116 20574,"","Gimbernatea","Ruiz & Pav.",116 20551,"","Gonocarpus","Ham.",116 20543,"","Grislea","L.",116 3524,"","Guiera","Adans. ex Juss.",116 20546,"","Hambergera","Scop.",116 20577,"","Hudsonia","A.Rob. ex Lunan",116 20563,"","Kleinia","Crantz",116 20567,"","Kniphofia","Scop.",116 3525,"","Laguncularia","C.F.Gaertn.",116 3526,"","Lumnitzera","Willd.",116 3527,"","Macropteranthes","F.Muell.",116 3528,"","Meiostemon","Exell & Stace",116 20565,"","Myrobalanifera","Houtt.",116 20572,"","Myrobalanus","Gaertn.",116 20584,"","Pamea","Aubl.",116 20576,"","Pentaptera","Roxb.",116 20552,"","Physopodium","Desv.",116 20550,"","Poivrea","Comm. ex DC.",116 20593,"","Pokornya","Montrouz.",116 20591,"","Problastes","Reinw.",116 3529,"","Pteleopsis","Engl.",116 20590,"","Pyrrhanthus","Jack",116 3530,"","Quisqualis","L.",116 3531,"","Ramatuela","Kunth",116 20582,"","Ramatuella","Kunth",116 20569,"","Resinaria","Comm. ex Lam.",116 20586,"","Rudbeckia","Adans.",116 20549,"","Schousboea","Willd.",116 20558,"","Seguiera","Rchb. ex Oliv.",116 20555,"","Sheadendron","G.Bertol.",116 20564,"","Sphalanthus","Jack",116 3532,"","Strephonema","Hook.f.",116 20566,"","Tanibouca","Aubl.",116 3533,"","Terminalia","L.",116 3534,"","Terminaliopsis","Danguy",116 3535,"","Thiloa","Eichler",116 20562,"","Udani","Adans.",116 20578,"","Vicentia","Allemao",116 18884,"","Aclisia","E.Mey.",117 12132,"","Aetheolirion","Forman",117 18889,"","Amischophacelus","R.S.Rao & Kammathy",117 12133,"","Amischotolype","Hassk.",117 12134,"","Aneilema","R.Br.",117 12135,"","Anthericopsis","Engl.",117 12136,"","Aploleia","Raf.",117 18885,"","Athyrocarpus","Schltdl. ex Benth.",117 16942,"","Ballya","Brenan",117 18886,"","Baoulia","A.Chev.",117 12137,"","Belosynapsis","Hassk.",117 12138,"","Buforrestia","C.B.Clarke",117 12139,"","Callisia","Loefl.",117 12140,"","Campelia","Rich.",117 12176,"","Cartonema","R.Br.",117 24880,"","Chamaeanthus","Ule",117 12141,"","Cochliostema","Lem.",117 12142,"","Coleotrype","C.B.Clarke",117 12143,"","Commelina","L.",117 18891,"","Commelinantia","Tharp",117 12144,"","Commelinopsis","Pichon",117 23230,"","Cuthbertia","Small",117 12145,"","Cyanotis","D.Don",117 18899,"","Cymbispatha","Pichon",117 18892,"","Descantaria","Schltdl.",117 12146,"","Dichorisandra","J.C.Mikan",117 12147,"","Dictyospermum","Wight",117 18893,"","Donnellia","C.B.Clarke ex Donn.Sm.",117 12148,"","Elasis","D.R.Hunt",117 12149,"","Floscopa","Lour.",117 18888,"","Forrestia","A.Rich.",117 12150,"","Geogenanthus","Ule",117 12151,"","Gibasis","Raf.",117 12152,"","Gibasoides","D.R.Hunt",117 18887,"","Gillettia","Rendle",117 16943,"","Hadrodemas","H.E.Moore",117 24881,"","Leiandra","Raf.",117 16944,"","Leptocallisia","(Benth.) Pichon",117 12153,"","Leptorhoeo","C.B.Clarke",117 18900,"","Mandonia","Hassk.",117 12154,"","Matudanthus","D.R.Hunt",117 12155,"","Murdannia","Royle",117 18894,"","Neodonnellia","Rose",117 16945,"","Neomandonia","Hutch.",117 16946,"","Neotreleasea","Rose",117 12156,"","Palisota","Rchb. ex Endl.",117 12157,"","Phaeosphaerion","Hassk.",117 12158,"","Phyodina","Raf.",117 12159,"","Pollia","Thunb.",117 12160,"","Polyspatha","Benth.",117 24098,"","Porandra","D.Y.Hong",117 12161,"","Pseudoparis","H.Perrier",117 18890,"","Pyrrheima","Hassk.",117 18895,"","Rectanthera","O.Deg.",117 12162,"","Rhoeo","Hance",117 12163,"","Rhopalephora","Hassk.",117 12164,"","Sauvallea","W.Wright",117 16947,"","Separotheca","Waterf.",117 16948,"","Setcreasea","K.Schum. & Syd.",117 12165,"","Siderasis","Raf.",117 12166,"","Spatholirion","Ridl.",117 18896,"","Spironema","Lindl.",117 12167,"","Stanfieldiella","Brenan",117 12168,"","Streptolirion","Edgew.",117 12169,"","Thyrsanthemum","Pichon",117 12170,"","Tinantia","Scheidw.",117 25691,"","Tonningia","Juss.",117 18897,"","Tradescantella","Small",117 12171,"","Tradescantia","L.",117 18898,"","Treleasea","Rose",117 24099,"","Tricarpelema","J.K.Morton",117 12172,"","Triceratella","Brenan",117 12173,"","Tripogandra","Raf.",117 12174,"","Weldenia","Schult.f.",117 12175,"","Zebrina","Schnizl.",117 5569,"","Aaronsohnia","Warb. & Eig",118 5570,"","Abrotanella","Cass.",118 5571,"","Acamptopappus","(A.Gray) A.Gray",118 5572,"","Acanthocephalus","Kar. & Kir.",118 16793,"","Acanthocladium","F.Muell.",118 5573,"","Acanthodesmos","C.D.Adams & duQuesnay",118 5574,"","Acantholepis","Less.",118 5575,"","Acanthospermum","Schrank",118 16794,"","Acanthostyles","R.M.King & H.Rob.",118 5576,"","Achaenipodium","Brandegee",118 5577,"","Achaetogeron","A.Gray",118 5578,"","Achillea","L.",118 5579,"","Achnophora","F.Muell.",118 5580,"","Achnopogon","Maguire, Steyerm. & Wurdack",118 5581,"","Achyrachaena","Schauer",118 25124,"","Achyrobaccharis","Sch.Bip. ex Walp.",118 5582,"","Achyrocline","(Less.) DC.",118 16795,"","Achyropappus","Kunth",118 5583,"","Achyrothalamus","O.Hoffm.",118 25206,"","Acilepidopsis","H.Rob.",118 16796,"","Acmella","Rich. ex Pers.",118 5584,"","Acomis","F.Muell.",118 15915,"","Acourtia","D.Don",118 16797,"","Acrisione","B.Nord.",118 16798,"","Acritopappus","R.M.King & H.Rob.",118 24821,"","Acroclinium","A.Gray",118 5585,"","Acroptilon","Cass.",118 5586,"","Actinobole","Endl.",118 24867,"","Actinomeris","Nutt.",118 5587,"","Actinoseris","(Endl.) Cabrera",118 16806,"","Actinospermum","Elliott",118 24875,"","Actites","Lander",118 5588,"","Adelostigma","Steetz",118 16805,"","Adenanthellum","B.Nord.",118 25455,"","Adenanthemum","B.Nord.",118 5589,"","Adenocaulon","Hook.",118 16807,"","Adenocritonia","R.M.King & H.Rob.",118 16808,"","Adenoglossa","B.Nord.",118 5590,"","Adenoon","Dalzell",118 5591,"","Adenopappus","Benth.",118 16809,"","Adenophyllum","Pers.",118 5592,"","Adenostemma","J.R.Forst. & G.Forst.",118 5593,"","Adenostyles","Cass.",118 5594,"","Adenothamnus","D.D.Keck",118 5595,"","Aedesia","O.Hoffm.",118 16810,"","Aegopordon","Boiss.",118 16811,"","Aequatorium","B.Nord.",118 18638,"","Aetheolaena","Cass.",118 5596,"","Aetheorhiza","Cass.",118 5597,"","Ageratella","A.Gray ex S.Watson",118 5598,"","Ageratina","Spach",118 5599,"","Ageratinastrum","Mattf.",118 5600,"","Ageratum","L.",118 5601,"","Agiabampoa","Rose ex O.Hoffm.",118 5602,"","Agoseris","Raf.",118 5603,"","Agrianthus","Mart. ex DC.",118 5604,"","Ainsliaea","DC.",118 25147,"","Aiolotheca","DC.",118 16812,"","Ajania","Poljakov",118 16813,"","Ajaniopsis","C.Shih",118 5605,"","Alatoseta","Compton",118 5606,"","Albertinia","Spreng.",118 5607,"","Alcantara","Glaz. ex G.M.Barroso",118 5608,"","Alciope","DC. ex Lindl.",118 5609,"","Aldama","La Llave",118 5610,"","Alepidocline","S.F.Blake",118 16814,"","Alfredia","Cass.",118 16815,"","Aliella","Qaiser & Lack",118 5611,"","Allagopappus","Cass.",118 5612,"","Allardia","Decne.",118 16816,"","Alloispermum","Willd.",118 16817,"","Allopterigeron","Dunlop",118 25443,"","Almutaster","A.Love & D.Love",118 5613,"","Alomia","Kunth",118 16818,"","Alomiella","R.M.King & H.Rob.",118 5614,"","Alvordia","Brandegee",118 5615,"","Amauria","Benth.",118 5616,"","Amberboa","(Pers.) Less.",118 5617,"","Amblyocarpum","Fisch. & C.A.Mey.",118 5618,"","Amblyolepis","DC.",118 5619,"","Amblyopappus","Hook. & Arn.",118 5620,"","Amboroa","Cabrera",118 5621,"","Ambrosia","L.",118 5622,"","Ameghinoa","Speg.",118 5623,"","Amellus","L.",118 5624,"","Ammobium","R.Br. ex Sims",118 16819,"","Amolinia","R.M.King & H.Rob.",118 5625,"","Amphiachyris","(DC.) Nutt.",118 5626,"","Amphidoxa","DC.",118 5627,"","Amphiglossa","DC.",118 16820,"","Amphipappus","Torr. & A.Gray",118 5628,"","Amphoricarpos","Vis.",118 24808,"","Anacantha","(Iljin) Sojak",118 5629,"","Anacyclus","L.",118 16821,"","Anaphalioides","(Benth.) Kirp.",118 5630,"","Anaphalis","DC.",118 16822,"","Anastraphia","D.Don",118 5631,"","Anaxeton","Gaertn.",118 5632,"","Ancathia","DC.",118 25771,"","Ancistrocarphus","A.Gray",118 16823,"","Ancistrophora","A.Gray",118 5633,"","Andryala","L.",118 16824,"","Angelphytum","G.M.Barroso",118 5634,"","Angianthus","J.C.Wendl.",118 5635,"","Anisochaeta","DC.",118 5636,"","Anisocoma","Torr. & A.Gray",118 5637,"","Anisopappus","Hook. & Arn.",118 5638,"","Anisothrix","O.Hoffm. ex Kuntze",118 16825,"","Anomostephium","DC.",118 5639,"","Antennaria","Gaertn.",118 5640,"","Anthemis","L.",118 5641,"","Antheropeas","Rydb.",118 16826,"","Antillia","R.M.King & H.Rob.",118 5642,"","Antiphiona","Merxm.",118 5643,"","Antithrixia","DC.",118 16827,"","Anura","(Juz.) Tscherneva",118 5644,"","Anvillea","DC.",118 5645,"","Anvilleina","Maire",118 16828,"","Apalochlamys","(Cass.) Cass.",118 5646,"","Apargidium","Torr. & A.Gray",118 5647,"","Aphanactis","Wedd.",118 5648,"","Aphanostephus","DC.",118 24860,"","Aphantochaeta","A.Gray",118 16829,"","Aphyllocladus","Wedd.",118 5649,"","Apodocephala","Baker",118 16830,"","Aposeris","Neck. ex Cass.",118 25207,"","Apostates","Lander",118 16831,"","Arbelaezaster","Cuatrec.",118 5650,"","Archibaccharis","Heering",118 16833,"","Arctanthemum","(Tzvelev) Tzvelev",118 5651,"","Arctium","L.",118 16832,"","Arctogeron","DC.",118 5652,"","Arctotheca","J.C.Wendl.",118 5653,"","Arctotis","L.",118 16150,"","Argyranthemum","Webb",118 16834,"","Argyroglottis","Turcz.",118 24799,"","Argyrophanes","Schltdl.",118 18637,"","Argyrovernonia","MacLeish",118 5654,"","Argyroxiphium","DC.",118 16835,"","Aristeguietia","R.M.King & H.Rob.",118 5655,"","Arnaldoa","Cabrera",118 5656,"","Arnica","L.",118 5657,"","Arnicastrum","Greenm.",118 5658,"","Arnoglossum","Raf.",118 5659,"","Arnoseris","Gaertn.",118 5660,"","Arrhenechthites","Mattf.",118 5661,"","Arrojadocharis","Mattf.",118 5662,"","Arrowsmithia","DC.",118 5663,"","Artemisia","L.",118 5664,"","Artemisiopsis","S.Moore",118 5665,"","Asaemia","(Harv.) Benth.",118 16836,"","Asanthus","R.M.King & H.Rob.",118 5666,"","Aschenbornia","S.Schauer",118 5667,"","Ascidiogyne","Cuatrec.",118 23180,"","Askellia","W.A.Weber",118 5668,"","Aspilia","Thouars",118 5669,"","Aspiliopsis","Greenm.",118 16837,"","Asplundianthus","R.M.King & H.Rob.",118 5670,"","Astemma","Less.",118 5671,"","Aster","L.",118 16838,"","Asteridea","Lindl.",118 5672,"","Asteriscus","Mill.",118 5673,"","Asteromoea","Blume",118 5674,"","Astranthium","Nutt.",118 5675,"","Athanasia","L.",118 5676,"","Athrixia","Ker Gawl.",118 5677,"","Athroisma","DC.",118 5678,"","Atractylis","L.",118 5679,"","Atractylodes","DC.",118 16839,"","Atrichantha","Hilliard & B.L.Burtt",118 5680,"","Atrichoseris","A.Gray",118 16840,"","Austrobrickellia","R.M.King & H.Rob.",118 16841,"","Austrocritonia","R.M.King & H.Rob.",118 5681,"","Austroeupatorium","R.M.King & H.Rob.",118 16842,"","Austroliabum","H.Rob. & Brettell",118 23181,"","Austrosynotis","C.Jeffrey",118 5682,"","Autrania","C.Winkl. & Barbey",118 16843,"","Avellara","Blanca & C.Diaz",118 5683,"","Axiniphyllum","Benth.",118 5684,"","Ayapana","Spach",118 16845,"","Ayapanopsis","R.M.King & H.Rob.",118 5685,"","Aylacophora","Cabrera",118 24853,"","Aynia","H.Rob.",118 16151,"","Babcockia","Boulos",118 18641,"","Baccharidastrum","Cabrera",118 25447,"","Baccharidiopsis","G.M.Barroso",118 5687,"","Baccharis","L.",118 24844,"","Baccharoides","Moench",118 17037,"","Badilloa","R.M.King & H.Rob.",118 5688,"","Baeriopsis","J.T.Howell",118 5689,"","Bafutia","C.D.Adams",118 5690,"","Bahia","Lag.",118 17043,"","Bahianthus","R.M.King & H.Rob.",118 5691,"","Baileya","Harv. & A.Gray",118 5692,"","Balduina","Nutt.",118 17044,"","Balsamita","Mill.",118 5693,"","Balsamorhiza","Hook. ex Nutt.",118 5694,"","Baltimora","L.",118 17045,"","Barkleyanthus","H.Rob. & Brettell",118 5695,"","Barnadesia","Mutis ex L.f.",118 5696,"","Barroetea","A.Gray",118 17046,"","Barrosoa","R.M.King & H.Rob.",118 5697,"","Bartlettia","A.Gray",118 15916,"","Bartlettina","R.M.King & H.Rob.",118 5698,"","Basedowia","E.Pritz.",118 5699,"","Bebbia","Greene",118 5700,"","Bedfordia","DC.",118 17047,"","Bejaranoa","R.M.King & H.Rob.",118 5701,"","Bellida","Ewart",118 5702,"","Bellis","L.",118 5703,"","Bellium","L.",118 5704,"","Belloa","J.Remy",118 17048,"","Benitoa","D.D.Keck",118 5705,"","Berardia","Vill.",118 5706,"","Berkheya","Ehrh.",118 5707,"","Berlandiera","DC.",118 5708,"","Berroa","Beauverd",118 5709,"","Bidens","L.",118 5710,"","Bigelowia","DC.",118 25125,"","Billya","Cass.",118 25126,"","Bipontia","S.F.Blake",118 17049,"","Bishopalea","H.Rob.",118 24800,"","Bishopanthus","H.Rob.",118 17050,"","Bishopiella","R.M.King & H.Rob.",118 17051,"","Bishovia","R.M.King & H.Rob.",118 5711,"","Blainvillea","Cass.",118 17052,"","Blakeanthus","R.M.King & H.Rob.",118 5712,"","Blakiella","Cuatrec.",118 5713,"","Blanchetia","DC.",118 5714,"","Blennosperma","Less.",118 17053,"","Blennospora","A.Gray",118 5715,"","Blepharipappus","Hook.",118 5716,"","Blepharispermum","DC.",118 5717,"","Blepharizonia","(A.Gray) Greene",118 5718,"","Blumea","DC.",118 5719,"","Blumeopsis","Gagnep.",118 5720,"","Boebera","Willd.",118 5721,"","Boeberastrum","(A.Gray) Rydb.",118 23503,"","Boeberoides","(DC.) Strother",118 5722,"","Bojeria","DC.",118 5723,"","Bolanosa","A.Gray",118 5724,"","Bolocephalus","Hand.-Mazz.",118 17054,"","Bolophyta","Nutt.",118 5725,"","Boltonia","L'Her.",118 5726,"","Bombycilaena","(DC.) Smoljan.",118 25127,"","Borkonstia","Ignatov",118 5727,"","Borrichia","Adans.",118 5728,"","Bothriocline","Oliv. ex Benth.",118 5729,"","Bourdonia","Greene",118 17055,"","Brachanthemum","DC.",118 5730,"","Brachionostylum","Mattf.",118 25614,"","Brachyandra","Phil.",118 5731,"","Brachychaeta","Torr. & A.Gray",118 5732,"","Brachyclados","Gillies ex D.Don",118 25544,"","Brachycome","Cass.",118 5734,"","Brachyglottis","J.R.Forst. & G.Forst.",118 5735,"","Brachylaena","R.Br.",118 5736,"","Brachymeris","DC.",118 5737,"","Brachyonostylum","Mattf.",118 5733,"","Brachyscome","Cass.",118 17056,"","Brachythrix","Wild & G.V.Pope",118 25772,"","Bracteantha","Anderb.",118 5738,"","Bradburia","Torr. & A.Gray",118 5739,"","Brasilia","G.M.Barroso",118 5740,"","Brickellia","Elliott",118 17057,"","Brickelliastrum","R.M.King & H.Rob.",118 5741,"","Brintonia","Greene",118 5742,"","Bryomorphe","Harv.",118 18647,"","Bubonium","Hill",118 5743,"","Buphthalmum","L.",118 17058,"","Burkartia","Crisci",118 17059,"","Cabreriella","Cuatrec.",118 24857,"","Cacalia","L.",118 5744,"","Cacaliopsis","A.Gray",118 5745,"","Cacosmia","Kunth",118 5746,"","Cadiscus","E.Mey. ex DC.",118 5747,"","Caesulia","Roxb.",118 5748,"","Calea","L.",118 5749,"","Calendula","L.",118 5750,"","Caleopsis","Fedde",118 17060,"","Callicephalus","C.A.Mey.",118 5751,"","Callilepis","DC.",118 5752,"","Callistephus","Cass.",118 5753,"","Calocephalus","R.Br.",118 5754,"","Calomeria","Vent.",118 24872,"","Calopappus","Meyen",118 5755,"","Calostephane","Benth.",118 25208,"","Calotesta","P.O.Karis",118 5756,"","Calotis","R.Br.",118 17061,"","Calycadenia","DC.",118 5757,"","Calycocorsus","F.W.Schmidt",118 5758,"","Calycoseris","A.Gray",118 5759,"","Calyptocarpus","Less.",118 5760,"","Camchaya","Gagnep.",118 17063,"","Campovassouria","R.M.King & H.Rob.",118 14224,"","Camptacra","N.T.Burb.",118 17062,"","Campuloclinium","DC.",118 17065,"","Campylotheca","Cass.",118 5761,"","Cancrinia","Kar. & Kir.",118 5762,"","Cancriniella","Tzvelev",118 17066,"","Cardonaea","Aristeg., Maguire & Steyerm.",118 5763,"","Cardopatium","Juss.",118 5764,"","Carduncellus","Adans.",118 5765,"","Carduus","L.",118 5766,"","Carlina","L.",118 5767,"","Carminatia","Moc. ex DC.",118 5768,"","Carpesium","L.",118 5769,"","Carphephorus","Cass.",118 5770,"","Carphochaete","A.Gray",118 17067,"","Carramboa","Cuatrec.",118 5771,"","Carterothamnus","R.M.King",118 5772,"","Carthamus","L.",118 5773,"","Cassinia","R.Br.",118 5774,"","Castalis","Cass.",118 25446,"","Castenedia","R.M.King & H.Rob.",118 5775,"","Catamixis","Thomson",118 5776,"","Catananche","L.",118 5777,"","Catatia","Humbert",118 17069,"","Cavalcantia","R.M.King & H.Rob.",118 5778,"","Cavea","W.W.Sm. & Small",118 5779,"","Celmisia","Cass.",118 5780,"","Centaurea","L.",118 5781,"","Centaurodendron","Johow",118 5782,"","Centauropsis","Bojer ex DC.",118 14243,"","Centaurothamnus","Wagenitz & Dittrich",118 5783,"","Centipeda","Lour.",118 24854,"","Centrapalus","Cass.",118 15917,"","Centratherum","Cass.",118 5784,"","Cephalipterum","A.Gray",118 5785,"","Cephalobembix","Rydb.",118 5786,"","Cephalopappus","Nees & Mart.",118 5787,"","Cephalophora","Cav.",118 16152,"","Cephalorhyncus","Boiss.",118 16172,"","Cephalorrhynchus","Boiss.",118 17070,"","Cephalosorus","A.Gray",118 5788,"","Ceratogyne","Turcz.",118 5789,"","Ceruana","Forssk.",118 17071,"","Chacoa","R.M.King & H.Rob.",118 5790,"","Chaenactis","DC.",118 5791,"","Chaenocephalus","Griseb.",118 5792,"","Chaetadelpha","A.Gray ex S.Watson",118 5793,"","Chaetanthera","Ruiz & Pav.",118 5794,"","Chaetopappa","DC.",118 17072,"","Chaetospira","S.F.Blake",118 17073,"","Chaetymenia","Hook. & Arn.",118 5795,"","Chamaechaenactis","Rydb.",118 5796,"","Chamaegeron","Schrenk",118 25711,"","Chamaeleon","Cass.",118 17075,"","Chamaemelum","Mill.",118 17074,"","Chamaepus","Wagenitz",118 5797,"","Chamartemisia","Rydb.",118 5798,"","Chaptalia","Vent.",118 5799,"","Chardinia","Desf.",118 25839,"","Charieis","Cass.",118 16153,"","Chartolepis","Cass.",118 16154,"","Cheirolophus","Cass.",118 5800,"","Chersodoma","Phil.",118 5801,"","Chevreulia","Cass.",118 17076,"","Chiliadenus","Cass.",118 24863,"","Chiliocephalum","Benth.",118 5802,"","Chiliophyllum","Phil.",118 5803,"","Chiliotrichiopsis","Cabrera",118 5804,"","Chiliotrichum","Cass.",118 5805,"","Chimantaea","Maguire, Steyerm. & Wurdack",118 5806,"","Chionolaena","DC.",118 5807,"","Chionopappus","Benth.",118 5808,"","Chlamydites","J.R.Drumm.",118 5809,"","Chlamydophora","Ehrenb. ex Less.",118 25751,"","Chloracantha","G.L.Nesom, Y.B.Suh, D.R.Morgan, S.D.Sundb. & B.B",118 5810,"","Chondrilla","L.",118 24801,"","Chondropyxis","D.A.Cooke",118 17077,"","Chorisis","DC.",118 5811,"","Chorisiva","(A.Gray) Rydb.",118 17078,"","Chresta","Vell. ex DC.",118 5812,"","Chromolaena","DC.",118 5813,"","Chromolepis","Benth.",118 5814,"","Chronopappus","DC.",118 5815,"","Chrysactinia","A.Gray",118 17079,"","Chrysactinium","(Kunth) Wedd.",118 5816,"","Chrysanthellum","Rich.",118 5817,"","Chrysanthemoides","Fabr.",118 5818,"","Chrysanthemum","L.",118 25773,"","Chrysocephalum","Walp.",118 5819,"","Chrysocoma","L.",118 17080,"","Chrysocoryne","Endl.",118 5820,"","Chrysogonum","L.",118 24852,"","Chrysolaena","H.Rob.",118 25209,"","Chrysopappus","Takht.",118 5821,"","Chrysophthalmum","Sch.Bip. ex Walp.",118 5822,"","Chrysopsis","(Nutt.) Elliott",118 5823,"","Chrysothamnus","Nutt.",118 5824,"","Chthonocephalus","Steetz",118 5825,"","Chucoa","Cabrera",118 5826,"","Chuquiraga","Juss.",118 5827,"","Cicerbita","Wallr.",118 5828,"","Ciceronia","Urb.",118 5829,"","Cichorium","L.",118 5830,"","Cineraria","L.",118 5831,"","Cirsium","Mill.",118 17081,"","Cissampelopsis","(DC.) Miq.",118 5832,"","Cladanthus","Cass.",118 17082,"","Cladochaeta","DC.",118 5833,"","Clappia","A.Gray",118 5834,"","Clibadium","L.",118 5835,"","Clybatis","Phil.",118 5836,"","Cnicothamnus","Griseb.",118 5837,"","Cnicus","L.",118 5838,"","Codonocephalum","Fenzl",118 17083,"","Coespeletia","Cuatrec.",118 5839,"","Coleocoma","F.Muell.",118 17084,"","Coleostephus","Cass.",118 5840,"","Colobanthera","Humbert",118 5841,"","Colobogyne","Gagnep.",118 23498,"","Comaclinium","Scheidw. & Planch.",118 5842,"","Commidendrum","DC.",118 25800,"","Complaya","Strother",118 5843,"","Comptonanthus","B.Nord.",118 17085,"","Condylidium","R.M.King & H.Rob.",118 17086,"","Condylopodium","R.M.King & H.Rob.",118 17087,"","Conocliniopsis","R.M.King & H.Rob.",118 17088,"","Conoclinium","DC.",118 5844,"","Conyza","Less.",118 5845,"","Conyzanthus","Tamamsch.",118 5846,"","Coreocarpus","Benth.",118 5847,"","Coreopsis","L.",118 17089,"","Corethamnium","R.M.King & H.Rob.",118 5848,"","Corethrogyne","DC.",118 15918,"","Correllia","A.M.Powell",118 5849,"","Corymbium","L.",118 5850,"","Cosmos","Cav.",118 5851,"","Cotula","L.",118 5852,"","Coulterella","Vasey & Rose",118 5853,"","Cousinia","Cass.",118 5854,"","Cousiniopsis","Nevski",118 5855,"","Craspedia","G.Forst.",118 5856,"","Crassocephalum","Moench",118 5857,"","Cratystylis","S.Moore",118 5858,"","Cremanthodium","Benth.",118 5859,"","Crepidiastrum","Nakai",118 5860,"","Crepidopsis","Arv.-Touv.",118 5861,"","Crepis","L.",118 17090,"","Critonia","P.Browne",118 17091,"","Critoniadelphus","R.M.King & H.Rob.",118 17092,"","Critoniella","R.M.King & H.Rob.",118 17093,"","Critoniopsis","Sch.Bip.",118 5862,"","Crocidium","Hook.",118 5863,"","Cronquistia","R.M.King",118 17094,"","Cronquistianthus","R.M.King & H.Rob.",118 24822,"","Croptilon","Raf.",118 5864,"","Crossostephium","Less.",118 17095,"","Crossothamnus","R.M.King & H.Rob.",118 5865,"","Crupina","(Pers.) DC.",118 25128,"","Cryptostemma","R.Br. ex W.T.Aiton",118 24855,"","Crystallopollen","Steetz",118 25210,"","Cuatrecasanthus","H.Rob.",118 24823,"","Cuatrecasasiella","H.Rob.",118 5866,"","Cuchumatanea","Seid. & Beaman",118 5867,"","Culcitium","Bonpl.",118 5868,"","Cullumia","R.Br.",118 5869,"","Cuspidia","Gaertn.",118 16201,"","Cyanopsis","Cass.",118 24845,"","Cyanthillium","Blume",118 5870,"","Cyathocline","Cass.",118 5871,"","Cyathomone","S.F.Blake",118 17096,"","Cyclachaena","Fresen. ex Schltdl.",118 5872,"","Cyclolepis","Gillies ex D.Don",118 5873,"","Cylindrocline","Cass.",118 5874,"","Cymbolaena","Smoljan.",118 5875,"","Cymbonotus","Cass.",118 17097,"","Cymbopappus","B.Nord.",118 5876,"","Cymophora","B.L.Rob.",118 5877,"","Cynara","L.",118 5878,"","Cynaropsis","Kuntze",118 24260,"","Cyrtocymura","H.Rob.",118 17098,"","Dacryotrichia","Wild",118 5879,"","Dahlia","Cav.",118 22223,"","Damnamenia","Given",118 23508,"","Damnxanthodium","Strother",118 5880,"","Darwiniothamnus","Harling",118 17099,"","Dasycondylus","R.M.King & H.Rob.",118 5881,"","Dasyphyllum","Kunth",118 5882,"","Daumalia","Arenes",118 5883,"","Daveaua","Willk. ex Mariz",118 5884,"","Decachaeta","DC.",118 5885,"","Decastylocarpus","Humbert",118 5886,"","Decazesia","F.Muell.",118 5887,"","Deinandra","Greene",118 17100,"","Delairea","Lem.",118 5888,"","Delamerea","S.Moore",118 17316,"","Delilia","Spreng.",118 5889,"","Demidium","DC.",118 16155,"","Dendranthema","(DC.) Des Moul.",118 5890,"","Dendrocacalia","(Nakai) Tuyama",118 25211,"","Dendrosenecio","(Hauman ex Humbert) B.Nord.",118 5891,"","Dendroseris","D.Don",118 5892,"","Denekia","Thunb.",118 5893,"","Desmanthodium","Benth.",118 5894,"","Dewildemania","O.Hoffm.",118 17102,"","Diacranthera","R.M.King & H.Rob.",118 5895,"","Dianthoseris","Sch.Bip.",118 17103,"","Diaperia","Nutt.",118 5896,"","Diaphractanthus","Humbert",118 25102,"","Diaspananthus","Miq.",118 17104,"","Dicercoclados","C.Jeffrey & Y.L.Chen",118 5897,"","Dichaetophora","A.Gray",118 5898,"","Dichrocephala","L'Her. ex DC.",118 17105,"","Dichromochlamys","Dunlop",118 5899,"","Dicoma","Cass.",118 5900,"","Dicoria","Torr. & A.Gray",118 5901,"","Dicranocarpus","A.Gray",118 5902,"","Didelta","L'Her.",118 25454,"","Dielitzia","P.S.Short",118 5903,"","Digitacalia","Pippen",118 5904,"","Dimeresia","A.Gray",118 5905,"","Dimerostemma","Cass.",118 5906,"","Dimorphocoma","F.Muell. & Tate",118 5907,"","Dimorphotheca","Moench",118 5908,"","Dinoseris","Griseb.",118 25563,"","Diodontium","F.Muell.",118 5909,"","Diplazoptilon","Y.Ling",118 5910,"","Diplostephium","Kunth",118 5911,"","Dipterocome","Fisch. & C.A.Mey.",118 5912,"","Dipterocypsela","S.F.Blake",118 5913,"","Disparago","Gaertn.",118 5914,"","Dissothrix","A.Gray",118 24824,"","Distephanus","(Cass.) Cass.",118 5915,"","Distoecha","Phil.",118 17106,"","Disynaphia","Hook. & Arn. ex DC.",118 17107,"","Dithyrostegia","A.Gray",118 16202,"","Dittrichia","Greuter",118 17108,"","Dolichlasium","Lag.",118 17109,"","Dolichoglottis","B.Nord.",118 17111,"","Dolichorrhiza","(Pojark.) Galushko",118 17110,"","Dolichothrix","Hilliard & B.L.Burtt",118 5916,"","Dolomiaea","DC.",118 5917,"","Dolosanthus","Klatt",118 5918,"","Doniophyton","Wedd.",118 5919,"","Doratolepis","Schltdl.",118 25103,"","Dorobaea","Cass.",118 5920,"","Doronicum","L.",118 25104,"","Dracopsis","Cass.",118 17112,"","Dresslerothamnus","H.Rob.",118 5921,"","Dubautia","Gaudich.",118 5922,"","Dubyaea","DC.",118 24825,"","Dugaldia","(Cass.) Cass.",118 5923,"","Dugesia","A.Gray",118 25713,"","Duhaldea","DC.",118 5924,"","Duidaea","S.F.Blake",118 5925,"","Duseniella","K.Schum.",118 5926,"","Dymondia","Compton",118 17113,"","Dyscritogyne","R.M.King & H.Rob.",118 5927,"","Dyscritothamnus","B.L.Rob.",118 5928,"","Dysodiopsis","(A.Gray) Rydb.",118 5929,"","Dyssodia","Cav.",118 5930,"","Eastwoodia","Brandegee",118 5931,"","Eatonella","A.Gray",118 5932,"","Echinacea","Moench",118 23182,"","Echinocoryne","H.Rob.",118 5933,"","Echinops","L.",118 5934,"","Eclipta","L.",118 17114,"","Edmondia","Cass.",118 5935,"","Egletes","Cass.",118 24261,"","Eirmocephala","H.Rob.",118 17115,"","Eitenia","R.M.King & H.Rob.",118 5936,"","Ekmania","Gleason",118 17116,"","Elachanthemum","Y.Ling & Y.R.Ling",118 5937,"","Elachanthus","F.Muell.",118 25801,"","Elaphandra","Strother",118 5938,"","Elephantopus","L.",118 5939,"","Eleutheranthera","Poit. ex Bosc",118 5940,"","Ellenbergia","Cuatrec.",118 5941,"","Elvira","Cass.",118 5942,"","Elytropappus","Cass.",118 24876,"","Embergeria","Boulos",118 5943,"","Emilia","(Cass.) Cass.",118 5944,"","Emiliella","S.Moore",118 5945,"","Encelia","Adans.",118 5946,"","Enceliopsis","(A.Gray) A.Nelson",118 17117,"","Endocellion","Turcz. ex Herder",118 24869,"","Endopappus","Sch.Bip.",118 5948,"","Engelmannia","A.Gray ex Nutt.",118 5949,"","Engleria","O.Hoffm.",118 5950,"","Enydra","Lour.",118 5951,"","Epaltes","Cass.",118 5952,"","Epilasia","(Bunge) Benth.",118 17118,"","Episcothamnus","H.Rob.",118 17119,"","Epitriche","Turcz.",118 17749,"","Erato","DC.",118 5953,"","Erechtites","Raf.",118 5954,"","Eremanthus","Less.",118 17120,"","Eremiastrum","A.Gray",118 5955,"","Eremosis","(DC.) Gleason",118 5956,"","Eremothamnus","O.Hoffm.",118 5957,"","Eriachaenium","Sch.Bip.",118 15919,"","Ericameria","Nutt.",118 5958,"","Ericentrodea","S.F.Blake & Sherff",118 5959,"","Erigeron","L.",118 5960,"","Eriocephalus","L.",118 5961,"","Eriochlamys","Sond. & F.Muell.",118 5962,"","Eriophyllum","Lag.",118 5963,"","Eriosphaera","Less.",118 5964,"","Eriotrix","Cass.",118 5965,"","Erlangea","Sch.Bip.",118 5966,"","Erodiophyllum","F.Muell.",118 24802,"","Erymophyllum","Paul G.Wilson",118 5967,"","Eryngiophyllum","Greenm.",118 5968,"","Erythradenia","(B.L.Rob.) R.M.King & H.Rob.",118 5969,"","Erythrocephalum","Benth.",118 5970,"","Espejoa","DC.",118 5971,"","Espeletia","Mutis ex Humb. & Bonpl.",118 17121,"","Espeletiopsis","Cuatrec.",118 5972,"","Ethulia","L.f.",118 24826,"","Euchiton","Cass.",118 5973,"","Eumorphia","DC.",118 23516,"","Eupatoriadelphus","R.M.King & H.Rob.",118 5974,"","Eupatoriastrum","Greenm.",118 5975,"","Eupatorina","R.M.King & H.Rob.",118 5976,"","Eupatoriopsis","Hieron.",118 5977,"","Eupatorium","L.",118 5978,"","Euphrosyne","DC.",118 17123,"","Eurybiopsis","DC.",118 5979,"","Eurydochus","Maguire & Wurdack",118 5980,"","Euryops","(Cass.) Cass.",118 5981,"","Eutetras","A.Gray",118 25105,"","Euthamia","(Nutt.) Elliott",118 5982,"","Evacidium","Pomel",118 5983,"","Evax","Gaertn.",118 5984,"","Ewartia","Beauverd",118 25774,"","Ewartiothamnus","Anderb.",118 5985,"","Exomiocarpon","Lawalree",118 5986,"","Faberia","Hemsl.",118 5987,"","Facelis","Cass.",118 17750,"","Farfugium","Lindl.",118 5988,"","Faujasia","Cass.",118 5989,"","Faxonia","Brandegee",118 5990,"","Feddea","Urb.",118 25453,"","Feldstonia","P.S.Short",118 5991,"","Felicia","Cass.",118 23183,"","Femeniasia","Susanna",118 5992,"","Fenixia","Merr.",118 17124,"","Ferreyranthus","H.Rob. & Brettell",118 5993,"","Ferreyrella","S.F.Blake",118 24864,"","Filaginella","Opiz",118 5994,"","Filago","L.",118 5995,"","Filifolium","Kitam.",118 5996,"","Fitchia","Hook.f.",118 25452,"","Fitzwillia","P.S.Short",118 5997,"","Flaveria","Juss.",118 5998,"","Fleischmannia","Sch.Bip.",118 15920,"","Fleischmanniana","Sch.Bip.",118 5999,"","Fleischmanniopsis","R.M.King & H.Rob.",118 6000,"","Florestina","Cass.",118 6001,"","Floscaldasia","Cuatrec.",118 17125,"","Flosmutisia","Cuatrec.",118 6002,"","Flourensia","DC.",118 15921,"","Flyriella","R.M.King & H.Rob.",118 6003,"","Fontquera","Maire",118 6004,"","Formania","W.W.Sm. & Small",118 23184,"","Foveolina","Kallersjo",118 18645,"","Francoeuria","Cass.",118 25610,"","Franseria","Cav.",118 23185,"","Freya","V.M.Badillo",118 6005,"","Fulcaldea","Poir.",118 6006,"","Gaillardia","Foug.",118 6007,"","Galactites","Moench",118 24861,"","Galatella","(Cass.) Cass.",118 6008,"","Galeana","La Llave",118 14225,"","Galeomma","Rauschert",118 6009,"","Galinsoga","Ruiz & Pav.",118 24827,"","Gamochaeta","Wedd.",118 25530,"","Gamochaetopsis","Anderb. & Freire",118 6010,"","Garberia","A.Gray",118 17126,"","Garcibarrigoa","Cuatrec.",118 6011,"","Garcilassa","Poepp.",118 17127,"","Gardnerina","R.M.King & H.Rob.",118 6012,"","Garhadiolus","Jaub. & Spach",118 6013,"","Garuleum","Cass.",118 6014,"","Gazania","Gaertn.",118 23186,"","Gazaniopsis","C.Huber",118 6015,"","Geigeria","Griess.",118 6016,"","Geissolepis","B.L.Rob.",118 6017,"","Geissopappus","Benth.",118 24828,"","Geraea","Torr. & A.Gray",118 6018,"","Gerbera","L.",118 17128,"","Geropogon","L.",118 6019,"","Gibbaria","Cass.",118 6020,"","Gifola","Cass.",118 25712,"","Gilberta","Turcz.",118 6021,"","Gilruthia","Ewart",118 6022,"","Gladiopappus","Humbert",118 6023,"","Glaziovianthus","G.M.Barroso",118 6024,"","Glossarion","Maguire & Wurdack",118 6025,"","Glossocardia","Cass.",118 6026,"","Glossogyne","Cass.",118 17129,"","Glossopappus","Kunze",118 24862,"","Glycideras","DC.",118 6027,"","Glyptopleura","Eaton",118 6028,"","Gnaphaliothamnus","Kirp.",118 6029,"","Gnaphalium","L.",118 6030,"","Gnaphalodes","Mill.",118 6031,"","Gnephosis","Cass.",118 6032,"","Gochnatia","Kunth",118 6033,"","Goldmanella","Greenm.",118 17130,"","Gongrostylus","R.M.King & H.Rob.",118 6034,"","Gongrothamnus","Steetz",118 6035,"","Gongylolepis","R.H.Schomb.",118 6036,"","Goniocaulon","Cass.",118 16156,"","Gonospermum","Less.",118 6038,"","Gorceixia","Baker",118 6039,"","Gorteria","L.",118 6040,"","Gossweilera","S.Moore",118 17131,"","Goyazianthus","R.M.King & H.Rob.",118 17132,"","Graciela","Rzed.",118 6041,"","Grangea","Adans.",118 6042,"","Grangeopsis","Humbert",118 6043,"","Grantia","Boiss.",118 17133,"","Graphistylis","B.Nord.",118 6044,"","Gratwickia","F.Muell.",118 17134,"","Grauanthus","Fayed",118 17135,"","Grazielia","R.M.King & H.Rob.",118 6045,"","Greenella","A.Gray",118 6046,"","Greenmaniella","W.M.Sharp",118 6047,"","Grindelia","Willd.",118 17136,"","Grisebachianthus","R.M.King & H.Rob.",118 17137,"","Grosvenoria","R.M.King & H.Rob.",118 6048,"","Guaicaia","Maguire",118 6049,"","Guardiola","Cerv. ex Humb. & Bonpl.",118 6056,"","Guayania","R.M.King & H.Rob.",118 6050,"","Guerreroia","Merr.",118 17139,"","Guevaria","R.M.King & H.Rob.",118 6051,"","Guizotia","Cass.",118 6052,"","Gundelia","L.",118 6053,"","Gundlachia","A.Gray",118 6054,"","Gutenbergia","Sch.Bip.",118 6055,"","Gutierrezia","Lag.",118 24846,"","Gymnanthemum","Cass.",118 6057,"","Gymnarrhena","Desf.",118 17140,"","Gymnocondylus","R.M.King & H.Rob.",118 6058,"","Gymnocoronis","DC.",118 6059,"","Gymnodiscus","Less.",118 6060,"","Gymnolaena","(DC.) Rydb.",118 6061,"","Gymnolomia","Kunth",118 6062,"","Gymnopentzia","Benth.",118 6063,"","Gymnosperma","Less.",118 6064,"","Gymnostephium","Less.",118 17141,"","Gymnostyles","Juss.",118 6065,"","Gynoxys","Cass.",118 6066,"","Gynura","Cass.",118 6067,"","Gypothamnium","Phil.",118 17143,"","Gyptidium","R.M.King & H.Rob.",118 17142,"","Gyptis","(Cass.) Cass.",118 17144,"","Gyrodoma","Wild",118 6068,"","Haarera","Hutch. & E.A.Bruce",118 6069,"","Haastia","Hook.f.",118 24829,"","Haeckeria","F.Muell.",118 25451,"","Haegiela","P.S.Short",118 6070,"","Handelia","Heimerl",118 6071,"","Haplocalymma","S.F.Blake",118 6072,"","Haplocarpha","Less.",118 6073,"","Haploesthes","A.Gray",118 6074,"","Haplopappus","Cass.",118 6075,"","Haplostephium","Mart. ex DC.",118 6076,"","Haradjania","Rech.f.",118 6077,"","Harleya","S.F.Blake",118 6078,"","Harnackia","Urb.",118 17145,"","Harthamnus","H.Rob.",118 6079,"","Hartwrightia","A.Gray ex S.Watson",118 24840,"","Hasteola","Raf.",118 17146,"","Hatschbachiella","R.M.King & H.Rob.",118 24830,"","Hazardia","Greene",118 15922,"","Hebeclinium","DC.",118 6080,"","Hecastocleis","A.Gray",118 6081,"","Hedypnois","Mill.",118 6082,"","Helenium","L.",118 6083,"","Helianthella","Torr. & A.Gray",118 17147,"","Helianthopsis","H.Rob.",118 6084,"","Helianthus","L.",118 6085,"","Helichrysopsis","Kirp.",118 6086,"","Helichrysum","Mill.",118 17148,"","Heliocauta","Humphries",118 24866,"","Heliomeris","Nutt.",118 6087,"","Heliopsis","Pers.",118 6088,"","Helipterum","DC. ex Lindl.",118 24873,"","Helminthia","Juss.",118 6089,"","Helogyne","Nutt.",118 17149,"","Hemisteptia","Fisch. & C.A.Mey.",118 6090,"","Hemizonia","DC.",118 6091,"","Henricia","Cass.",118 17150,"","Henricksonia","B.L.Turner",118 6092,"","Heptanthus","Griseb.",118 6093,"","Herderia","Cass.",118 6094,"","Herodotia","Urb. & Ekman",118 6095,"","Herrickia","Wooton & Standl.",118 6096,"","Hertia","Less.",118 6097,"","Hesperomannia","A.Gray",118 6098,"","Hesperoseris","Skottsb.",118 6099,"","Heteracia","Fisch. & C.A.Mey.",118 17151,"","Heteranthemis","Schott",118 6100,"","Heterocoma","DC.",118 17152,"","Heterocondylus","R.M.King & H.Rob.",118 17153,"","Heterocypsela","H.Rob.",118 6101,"","Heteroderis","(Bunge) Boiss.",118 6102,"","Heterolepis","Cass.",118 6103,"","Heteromera","Pomel",118 6104,"","Heteromma","Benth.",118 6105,"","Heteropappus","Less.",118 6106,"","Heteroplexis","C.C.Chang",118 6107,"","Heterorhachis","Sch.Bip. ex Walp.",118 6108,"","Heterosperma","Cav.",118 6109,"","Heterothalamus","Less.",118 6110,"","Heterotheca","Cass.",118 6111,"","Heywoodiella","Svent. & Bramwell",118 6112,"","Hidalgoa","La Llave",118 6113,"","Hieracium","L.",118 23506,"","Hilliardia","B.Nord.",118 6114,"","Hinterhubera","Sch.Bip. ex Wedd.",118 6115,"","Hippia","L.",118 17154,"","Hippolytia","Poljakov",118 6116,"","Hirpicium","Cass.",118 6117,"","Hirschia","Baker",118 6118,"","Hispidella","Barnadez ex Lam.",118 6119,"","Hochstetteria","DC.",118 6120,"","Hoehnelia","Schweinf.",118 6121,"","Hoehnephytum","Cabrera",118 6122,"","Hoffmanniella","Schltr. ex Lawalree",118 6123,"","Hofmeisteria","Walp.",118 6124,"","Holocarpha","Greene",118 17155,"","Holocheilus","Cass.",118 6125,"","Hololeion","Kitam.",118 24847,"","Hololepis","DC.",118 6126,"","Holozonia","Greene",118 6127,"","Homognaphalium","Kirp.",118 6128,"","Homogyne","Cass.",118 6129,"","Hoplophyllum","DC.",118 6130,"","Huarpea","Cabrera",118 25212,"","Hubertia","Bory",118 17156,"","Hughesia","R.M.King & H.Rob.",118 6131,"","Hulsea","Torr. & A.Gray",118 23187,"","Hulteniella","Tzvelev",118 25775,"","Humeocline","Anderb.",118 6132,"","Hyalis","D.Don ex Hook. & Arn.",118 17157,"","Hyalochaete","Dittrich & Rech.f.",118 17159,"","Hyalochlamys","A.Gray",118 6133,"","Hyaloseris","Griseb.",118 24803,"","Hyalosperma","Steetz",118 17158,"","Hybridella","Cass.",118 24877,"","Hydrodyssodia","B.L.Turner",118 25213,"","Hydroidea","P.O.Karis",118 6134,"","Hydropectis","Rydb.",118 25106,"","Hymenatherum","Cass.",118 17160,"","Hymenocephalus","Jaub. & Spach",118 6135,"","Hymenoclea","Torr. & A.Gray",118 17161,"","Hymenolepis","Cass.",118 6136,"","Hymenonema","Cass.",118 6137,"","Hymenopappus","L'Her.",118 16203,"","Hymenostemma","Kunze ex Willk.",118 6138,"","Hymenostephium","Benth.",118 6139,"","Hymenothrix","A.Gray",118 6140,"","Hymenoxys","Cass.",118 6141,"","Hyoseris","L.",118 18652,"","Hypacanthium","Juz.",118 6142,"","Hypelichrysum","Kirp.",118 6143,"","Hypericophyllum","Steetz",118 6144,"","Hypochaeris","L.",118 18639,"","Hypochoeris","L.",118 6145,"","Hysterionica","Willd.",118 6146,"","Hystrichophora","Mattf.",118 6147,"","Ichthyothere","Mart.",118 17163,"","Idiothamnus","R.M.King & H.Rob.",118 6148,"","Ifloga","Cass.",118 14829,"","Ighermia","Wiklund",118 6149,"","Iltisia","S.F.Blake",118 17164,"","Imeria","R.M.King & H.Rob.",118 6150,"","Inezia","E.Phillips",118 6151,"","Inula","L.",118 17165,"","Inulanthera","Kallersjo",118 6152,"","Inyonia","M.E.Jones",118 25214,"","Iocenes","B.Nord.",118 6153,"","Iodocephalus","Thorel ex Gagnep.",118 25802,"","Iogeton","Strother",118 6154,"","Iostephane","Benth.",118 6155,"","Iphiona","Cass.",118 17166,"","Iphionopsis","Anderb.",118 24832,"","Iranecio","B.Nord.",118 17167,"","Irwinia","Barroso",118 6156,"","Ischnea","F.Muell.",118 6157,"","Isocarpha","R.Br.",118 6158,"","Isocoma","Nutt.",118 6159,"","Isoetopsis","Turcz.",118 24833,"","Isopappus","Torr. & A.Gray",118 6160,"","Isostigma","Less.",118 6161,"","Iva","L.",118 6162,"","Ixeridium","(A.Gray) Tzvelev",118 6163,"","Ixeris","(Cass.) Cass.",118 17168,"","Ixiochlamys","F.Muell. & Sond.",118 6164,"","Ixiolaena","Benth.",118 6165,"","Ixodia","R.Br.",118 17169,"","Jacmaia","B.Nord.",118 6166,"","Jaegeria","Kunth",118 17170,"","Jalcophila","Dillon & Sagast.",118 23518,"","Jaliscoa","S.Watson",118 6168,"","Jamesianthus","S.F.Blake & Sherff",118 17171,"","Jaramilloa","R.M.King & H.Rob.",118 6169,"","Jasonia","(Cass.) Cass.",118 6170,"","Jaumea","Pers.",118 25803,"","Jefea","Strother",118 17172,"","Jeffreya","Wild",118 25448,"","Joseanthus","H.Rob.",118 6171,"","Jungia","L.f.",118 6172,"","Jurinea","Cass.",118 24871,"","Jurinella","Jaub. & Spach",118 24834,"","Kalimeris","(Cass.) Cass.",118 23517,"","Kanimia","Gardner",118 16157,"","Karelinia","Less.",118 6173,"","Karvandarina","Rech.f.",118 6174,"","Kaschgaria","Poljakov",118 17173,"","Kaunia","R.M.King & H.Rob.",118 6175,"","Keysseria","Lauterb.",118 24269,"","Kinghamia","C.Jeffrey",118 17174,"","Kingianthus","H.Rob.",118 17175,"","Kippistia","F.Muell.",118 6176,"","Kirkianella","Allan",118 25442,"","Kitamuraea","Rauschert",118 25441,"","Kitamuraster","Sojak",118 6177,"","Kleinia","Mill.",118 16028,"","Koanophyllon","Arruda",118 15923,"","Koanophyllum","Arruda",118 6178,"","Koechlea","Endl.",118 6179,"","Koehneola","Urb.",118 6180,"","Koelpinia","Pall.",118 6181,"","Kremeria","Durieu",118 6182,"","Krigia","Schreb.",118 6183,"","Kuhnia","L.",118 15924,"","Kyrsteniopsis","R.M.King & H.Rob.",118 17176,"","Lachanodes","DC.",118 6184,"","Lachnophyllum","Bunge",118 6185,"","Lachnorhiza","A.Rich.",118 6186,"","Lachnospermum","Willd.",118 6187,"","Laciala","Kuntze",118 6188,"","Lactuca","L.",118 6189,"","Lactucosonchus","(Sch.Bip.) Svent.",118 17177,"","Laennecia","Cass.",118 6190,"","Laestadia","Kunth ex Less.",118 6191,"","Lagascea","Cav.",118 24874,"","Lagedium","Sojak",118 15925,"","Lagenifera","Cass.",118 6192,"","Lagenophora","Cass.",118 6193,"","Laggera","Sch.Bip. ex Benth.",118 6194,"","Lagophylla","Nutt.",118 25107,"","Lagoseris","M.Bieb.",118 6195,"","Lamprachaenium","Benth.",118 17178,"","Lamprocephalus","B.Nord.",118 6196,"","Lamyropappus","Knorring & Tamamsch.",118 6197,"","Lamyropsis","(Kharadze) Dittrich",118 6198,"","Landtia","Less.",118 25776,"","Langebergia","Anderb.",118 6199,"","Lantanopsis","C.Wright",118 6200,"","Laphamia","A.Gray",118 6201,"","Lapsana","L.",118 6202,"","Lasallea","Greene",118 15926,"","Lasianthaea","DC.",118 17179,"","Lasiocephalus","Schltdl.",118 6203,"","Lasiocoma","Bolus",118 17180,"","Lasiolaena","R.M.King & H.Rob.",118 6204,"","Lasiopogon","Cass.",118 6205,"","Lasiospermum","Lag.",118 6206,"","Lasthenia","Cass.",118 6207,"","Launaea","Cass.",118 25777,"","Lawrencella","Lindl.",118 6208,"","Layia","Hook. & Arn. ex DC.",118 6209,"","Lebetina","Cass.",118 6210,"","Lecocarpus","Decne.",118 6211,"","Leibnitzia","Cass.",118 6212,"","Leiboldia","Schltdl. ex Gleason",118 6213,"","Lembertia","Greene",118 25450,"","Lemooria","P.S.Short",118 6214,"","Leontodon","L.",118 6215,"","Leontonyx","Cass.",118 6216,"","Leontopodium","(Pers.) R.Br. ex Cass.",118 24848,"","Lepidaploa","(Cass.) Cass.",118 6217,"","Lepidesmia","Klatt",118 6218,"","Lepidolopha","C.Winkl.",118 6219,"","Lepidolopsis","Poljakov",118 6220,"","Lepidonia","S.F.Blake",118 6221,"","Lepidophorum","Neck. ex DC.",118 6222,"","Lepidophyllum","Cass.",118 6223,"","Lepidospartum","(A.Gray) A.Gray",118 6224,"","Lepidostephium","Oliv.",118 24835,"","Leptinella","Cass.",118 6225,"","Leptocarpha","DC.",118 6226,"","Leptoclinium","(Nutt.) Benth.",118 6227,"","Leptopharynx","Rydb.",118 6228,"","Leptorhynchos","Less.",118 25778,"","Leptotriche","Turcz.",118 6229,"","Lescaillea","Griseb.",118 6230,"","Lessingia","Cham.",118 24851,"","Lessingianthus","H.Rob.",118 6231,"","Leto","Phil.",118 6232,"","Leucactinia","Rydb.",118 6233,"","Leucampyx","A.Gray ex Benth.",118 17181,"","Leucanthemella","Tzvelev",118 16204,"","Leucanthemopsis","(Giroux) Heywood",118 16205,"","Leucanthemum","Mill.",118 6234,"","Leucelene","Greene",118 6235,"","Leucheria","Lag.",118 6236,"","Leuciva","Rydb.",118 25353,"","Leucoblepharis","Arn.",118 17182,"","Leucocyclus","Boiss.",118 6237,"","Leucogenes","Beauverd",118 25108,"","Leucomeris","D.Don",118 6238,"","Leucopholis","Gardner",118 6239,"","Leucopsis","(DC.) Baker",118 17183,"","Leucoptera","B.Nord.",118 6240,"","Leucosyris","Greene",118 6241,"","Leunisia","Phil.",118 6242,"","Leuzea","DC.",118 6243,"","Leveillea","Vaniot",118 6244,"","Leysera","L.",118 15927,"","Liabellum","Rydb.",118 6245,"","Liabum","Adans.",118 6246,"","Liatris","Gaertn. ex Schreb.",118 17184,"","Libanothamnus","Ernst",118 6247,"","Lidbeckia","Bergius",118 6248,"","Lifago","Schweinf. & Muschl.",118 6249,"","Ligularia","Cass.",118 24865,"","Limbarda","Adans.",118 6250,"","Lindheimera","A.Gray & Engelm.",118 6251,"","Lipochaeta","DC.",118 6252,"","Lipskyella","Juz.",118 17185,"","Litothamnus","R.M.King & H.Rob.",118 6253,"","Litrisa","Small",118 6254,"","Llerasia","Triana",118 16206,"","Logfia","Cass.",118 23511,"","Lomatozona","Baker",118 6256,"","Lonas","Adans.",118 6257,"","Lopholaena","DC.",118 6258,"","Lophopappus","Rusby",118 14276,"","Lordhowea","B.Nord.",118 17186,"","Lorentzianthus","R.M.King & H.Rob.",118 6259,"","Loricaria","Wedd.",118 17187,"","Lourteigia","R.M.King & H.Rob.",118 6260,"","Loxothysanus","B.L.Rob.",118 6261,"","Lucilia","Cass.",118 25531,"","Luciliocline","Anderb. & Freire",118 6262,"","Luciliopsis","Wedd.",118 16158,"","Lugoa","DC.",118 6263,"","Luina","Benth.",118 17188,"","Lulia","Zardini",118 16029,"","Lundellianthus","H.Rob.",118 17189,"","Lycapsus","Phil.",118 6264,"","Lychnophora","Mart.",118 6265,"","Lychnophoriopsis","Sch.Bip.",118 6266,"","Lycoseris","Cass.",118 6267,"","Lygodesmia","D.Don",118 17190,"","Macdougalia","A.Heller",118 6268,"","Machaeranthera","Nees",118 6269,"","Macowania","Oliv.",118 6270,"","Macrachaenium","Hook.f.",118 17191,"","Macraea","Hook.f.",118 6271,"","Macroclinidium","Maxim.",118 24836,"","Macronema","Nutt.",118 17192,"","Macropodina","R.M.King & H.Rob.",118 6272,"","Macvaughiella","R.M.King & H.Rob.",118 6273,"","Madia","Molina",118 6274,"","Mairia","Nees",118 6275,"","Malacothrix","DC.",118 6276,"","Mallotopus","Franch. & Sav.",118 17193,"","Malmeanthus","R.M.King & H.Rob.",118 6277,"","Malperia","S.Watson",118 6278,"","Mantisalca","Cass.",118 6279,"","Marasmodes","DC.",118 6280,"","Marshallia","Schreb.",118 17194,"","Marshalljohnstonia","Henr.",118 17195,"","Marticorenia","Crisci",118 6281,"","Matricaria","L.",118 17196,"","Mattfeldanthus","H.Rob. & R.M.King",118 6282,"","Mattfeldia","Urb.",118 17197,"","Matudina","R.M.King & H.Rob.",118 17198,"","Mausolea","Poljakov",118 6283,"","Mecomischus","Coss. ex Benth.",118 6284,"","Megalodonta","Greene",118 6285,"","Melampodium","L.",118 6286,"","Melanodendron","DC.",118 6287,"","Melanthera","Rohr",118 6288,"","Merrittia","Merr.",118 6289,"","Metalasia","R.Br.",118 15928,"","Metastevia","Grashoff",118 25216,"","Mexerion","G.L.Nesom",118 6290,"","Mexianthus","B.L.Rob.",118 17199,"","Micractis","DC.",118 6291,"","Microbahia","Cockerell",118 6292,"","Microcephala","Pobed.",118 16159,"","Microderis","A.DC.",118 6293,"","Microglossa","DC.",118 17200,"","Microgynella","Grau",118 6294,"","Microlecane","Sch.Bip. ex Benth.",118 6295,"","Microliabum","Cabrera",118 6296,"","Microlonchoides","Candargy",118 6297,"","Micropsis","DC.",118 6298,"","Micropus","L.",118 6299,"","Microseris","D.Don",118 6300,"","Microspermum","Lag.",118 6301,"","Microstephium","Less.",118 6302,"","Microtrichia","DC.",118 6303,"","Mikania","Willd.",118 6304,"","Mikaniopsis","Milne-Redh.",118 6305,"","Milleria","L.",118 6306,"","Millotia","Cass.",118 6307,"","Mimela","Phil.",118 6308,"","Minuria","DC.",118 6309,"","Miricacalia","Kitam.",118 25440,"","Miyamayomena","Kitam.",118 6310,"","Mniodes","(A.Gray) Benth.",118 17201,"","Modestia","Kharadze & Tamamsch.",118 6311,"","Mollera","O.Hoffm.",118 6312,"","Monactis","Kunth",118 6313,"","Monarrhenus","Cass.",118 24837,"","Monenteles","Labill.",118 6314,"","Monogereion","G.M.Barroso & R.M.King",118 6315,"","Monolopia","DC.",118 6316,"","Monopholis","S.F.Blake",118 6317,"","Monoptilon","Torr. & A.Gray",118 6318,"","Montanoa","Cerv.",118 6319,"","Moonia","Arn.",118 6320,"","Moquinia","DC.",118 23515,"","Morithamnus","R.M.King, H.Rob. & G.M.Barroso",118 6321,"","Moscharia","Ruiz & Pav.",118 6322,"","Msuata","O.Hoffm.",118 17202,"","Mulgedium","Cass.",118 6323,"","Munnozia","Ruiz & Pav.",118 6324,"","Munzothamnus","Raven",118 6325,"","Muschleria","S.Moore",118 6326,"","Musilia","Velen.",118 6327,"","Mutisia","L.f.",118 6328,"","Mycelis","Cass.",118 6329,"","Myopordon","Boiss.",118 6330,"","Myriactis","Less.",118 6331,"","Myriocephalus","Benth.",118 6332,"","Myripnois","Bunge",118 23188,"","Myxopappus","Kallersjo",118 23504,"","Nabalus","Cass.",118 6333,"","Nablonium","Cass.",118 6334,"","Nananthea","DC.",118 6335,"","Nannoglottis","Maxim.",118 6336,"","Nanothamnus","Thomson",118 6337,"","Nardophyllum","(Hook. & Arn.) Hook. & Arn.",118 6338,"","Narvalina","Cass.",118 6339,"","Nassauvia","Comm. ex Juss.",118 17203,"","Nauplius","(Cass.) Cass.",118 6340,"","Neblinaea","Maguire & Wurdack",118 15929,"","Nelsonianthus","H.Rob. & Brettell",118 17204,"","Nemosenecio","(Kitam.) B.Nord.",118 6341,"","Nemoseris","Greene",118 17205,"","Neocabreria","R.M.King & H.Rob.",118 17206,"","Neocuatrecasia","R.M.King & H.Rob.",118 17207,"","Neohintonia","R.M.King & H.Rob.",118 17208,"","Neojeffreya","Cabrera",118 15930,"","Neomirandea","R.M.King & H.Rob.",118 6342,"","Neopallasia","Poljakov",118 6343,"","Neothymopsis","Britton & Millsp.",118 6344,"","Neotysonia","Dalla Torre & Harms",118 6345,"","Nesothamnus","Rydb.",118 17209,"","Neuractis","Cass.",118 6346,"","Neurolaena","R.Br.",118 6347,"","Neurolakis","Mattf.",118 6348,"","Nicolasia","S.Moore",118 6349,"","Nicolletia","A.Gray",118 6350,"","Nidorella","Cass.",118 6351,"","Nikitinia","Iljin",118 17210,"","Nipponanthemum","(Kitam.) Kitam.",118 6352,"","Nolletia","Cass.",118 17211,"","Nothobaccharis","R.M.King & H.Rob.",118 25755,"","Nothocalais","Greene",118 6353,"","Noticastrum","DC.",118 6354,"","Notobasis","(Cass.) Cass.",118 6355,"","Notonia","DC.",118 25109,"","Notoniopsis","B.Nord.",118 6356,"","Notoptera","Urb.",118 23505,"","Notoseris","C.Shih",118 6357,"","Nouelia","Franch.",118 24263,"","Novenia","Freire",118 25420,"","Oaxacania","B.L.Rob. & Greenm.",118 25217,"","Oblivia","Strother",118 14281,"","Ochrocephala","Dittrich",118 6359,"","Oclemena","Greene",118 6360,"","Ocyroe","Phil.",118 24838,"","Odixia","Orchard",118 17212,"","Odontocline","B.Nord.",118 24812,"","Odontotrichum","Zucc.",118 6361,"","Oedera","L.",118 6362,"","Oiospermum","Less.",118 6363,"","Oldenburgia","Less.",118 6364,"","Olearia","Moench",118 6365,"","Olgaea","Iljin",118 17213,"","Oligactis","(Kunth) Cass.",118 6366,"","Oligandra","Less.",118 6367,"","Oliganthes","Cass.",118 6368,"","Oligocarpus","Less.",118 17214,"","Oligochaeta","(DC.) K.Koch",118 6369,"","Oligothrix","DC.",118 6370,"","Olivaea","Sch.Bip. ex Benth.",118 25218,"","Omalotheca","Cass.",118 6371,"","Omphalopappus","O.Hoffm.",118 23189,"","Oncosiphon","Kallersjo",118 6372,"","Ondetia","Benth.",118 6373,"","Onopordum","L.",118 6374,"","Onoseris","Willd.",118 24805,"","Oonopsis","(Nutt.) Greene",118 6375,"","Oparanthus","Sherff",118 6376,"","Ophryosporus","Meyen",118 17215,"","Opisthopappus","C.Shih",118 24806,"","Oreochrysum","Rydb.",118 17216,"","Oreoleysera","Bremer",118 6377,"","Oreostemma","Greene",118 6378,"","Oritrophium","(Kunth) Cuatrec.",118 6379,"","Ormenis","Cass.",118 6380,"","Orochaenactis","Coville",118 24807,"","Osbertia","Greene",118 17217,"","Osmiopsis","R.M.King & H.Rob.",118 6381,"","Osmitopsis","Cass.",118 6382,"","Osteospermum","L.",118 6383,"","Otanthus","Hoffmanns. & Link",118 15931,"","Oteiza","La Llave",118 6384,"","Othonna","L.",118 6385,"","Otopappus","Benth.",118 17218,"","Otospermum","Willk.",118 24839,"","Outreya","Jaub. & Spach",118 6386,"","Oxycarpha","S.F.Blake",118 25779,"","Oxylaena","Benth. ex Anderb.",118 6387,"","Oxylobus","(Moq. ex DC.) A.Gray",118 6388,"","Oxypappus","Benth.",118 6389,"","Oxyphyllum","Phil.",118 6390,"","Oxytenia","Nutt.",118 6391,"","Oyedaea","DC.",118 18644,"","Ozothamnus","R.Br.",118 6392,"","Pachylaena","D.Don ex Hook. & Arn.",118 23501,"","Pachyrhynchus","DC.",118 6393,"","Pachystegia","Cheeseman",118 17219,"","Pachythamnus","(R.M.King & H.Rob.) R.M.King & H.Rob.",118 17307,"","Packera","A.Love & D.Love",118 17220,"","Pacourina","Aubl.",118 16207,"","Palaeocyanus","Dostal",118 6394,"","Palafoxia","Lag.",118 6395,"","Paleaepappus","Cabrera",118 6396,"","Pallenis","(Cass.) Cass.",118 6397,"","Pamphalea","Lag.",118 25608,"","Panphalea","Lag.",118 6398,"","Pappobolus","S.F.Blake",118 25796,"","Papuacalia","Veldkamp",118 6399,"","Paracalia","Cuatrec.",118 6400,"","Paragynoxys","(Cuatrec.) Cuatrec.",118 6401,"","Paraixeris","Nakai",118 23190,"","Paralychnophora","MacLeish",118 17221,"","Paranephelius","Poepp.",118 6402,"","Parantennaria","Beauverd",118 17222,"","Parapiqueria","R.M.King & H.Rob.",118 24264,"","Paraprenanthes","C.C.Chang ex C.Shih",118 17223,"","Parasenecio","W.W.Sm. & Small",118 6403,"","Parastrephia","Nutt.",118 6404,"","Parthenice","A.Gray",118 6405,"","Parthenium","L.",118 6406,"","Pasaccardoa","Kuntze",118 6407,"","Pascalia","Ortega",118 16030,"","Pascalium","Cass.",118 6408,"","Paua","Caball.",118 6409,"","Paurolepis","S.Moore",118 18642,"","Pechuel-Loeschea","O.Hoffm.",118 6411,"","Pectis","L.",118 6412,"","Pegolettia","Cass.",118 6413,"","Pelucha","S.Watson",118 17224,"","Pentacalia","Cass.",118 17751,"","Pentachaeta","Nutt.",118 6735,"","Pentanema","Cass.",118 6414,"","Pentatrichia","Klatt",118 6415,"","Pentheriella","O.Hoffm. & Muschl.",118 6416,"","Pentzia","Thunb.",118 17225,"","Perdicium","L.",118 6417,"","Perezia","Lag.",118 15933,"","Pericalia","Cass.",118 17226,"","Pericallis","D.Don",118 6418,"","Pericome","A.Gray",118 6419,"","Perityle","Benth.",118 6420,"","Perplexia","Iljin",118 6421,"","Perralderia","Coss.",118 14226,"","Perralderiopsis","Rauschert",118 6422,"","Pertya","Sch.Bip.",118 17227,"","Perymeniopsis","H.Rob.",118 6423,"","Perymenium","Schrad.",118 6424,"","Petalacte","D.Don",118 6425,"","Petasites","Mill.",118 17228,"","Peteravenia","R.M.King & H.Rob.",118 6426,"","Petradoria","Greene",118 6427,"","Petrobium","R.Br.",118 6428,"","Peucephyllum","A.Gray",118 6429,"","Peyrousea","DC.",118 6430,"","Phacellothrix","F.Muell.",118 6431,"","Phaenocoma","D.Don",118 6432,"","Phaeocephalus","S.Moore",118 17229,"","Phaeostigma","Muldashev",118 6433,"","Phagnalon","Cass.",118 6434,"","Phalacrachena","Iljin",118 17230,"","Phalacraea","DC.",118 6435,"","Phalacrocarpum","(DC.) Willk.",118 6436,"","Phalacroderis","DC.",118 6437,"","Phalacroseris","A.Gray",118 17231,"","Phaneroglossa","B.Nord.",118 6438,"","Phanerostylis","(A.Gray) R.M.King & H.Rob.",118 23512,"","Phania","DC.",118 6440,"","Philactis","Schrad.",118 6441,"","Philoglossa","DC.",118 6442,"","Philyrophyllum","O.Hoffm.",118 6443,"","Phoebanthus","S.F.Blake",118 6444,"","Phoenicoseris","(Skottsb.) Skottsb.",118 17232,"","Phyllocephalum","Blume",118 6445,"","Phymaspermum","Less.",118 6446,"","Picnomon","Adans.",118 6447,"","Picradeniopsis","Rydb.",118 6448,"","Picris","L.",118 6449,"","Picrosia","D.Don",118 24809,"","Picrothamnus","Nutt.",118 24810,"","Pilosella","Hill",118 6450,"","Piloselloides","(Less.) C.Jeffrey",118 6451,"","Pilostemon","Iljin",118 6452,"","Pinaropappus","Less.",118 6453,"","Pinillosia","Ossa",118 6454,"","Pionocarpus","S.F.Blake",118 6455,"","Piora","J.Kost.",118 6456,"","Pippenalia","McVaugh",118 6457,"","Piptocarpha","R.Br.",118 6458,"","Piptocoma","Cass.",118 6459,"","Piptolepis","Sch.Bip.",118 6460,"","Piptothrix","A.Gray",118 23513,"","Piqueria","Cav.",118 17233,"","Piqueriella","R.M.King & H.Rob.",118 6462,"","Piqueriopsis","R.M.King",118 6463,"","Pithecoseris","Mart. ex DC.",118 6464,"","Pithocarpa","Lindl.",118 17234,"","Pittocaulon","H.Rob. & Brettell",118 24858,"","Pityopsis","Nutt.",118 17235,"","Pladaroxylon","(Endl.) Hook.f.",118 6465,"","Plagiobasis","Schrenk",118 6466,"","Plagiocheilus","Arn. ex DC.",118 6467,"","Plagiolophus","Greenm.",118 6468,"","Plagius","L'Her. ex DC.",118 6469,"","Planaltoa","Taub.",118 25219,"","Planea","P.O.Karis",118 6470,"","Plateilema","(A.Gray) Cockerell",118 6471,"","Platycarpha","Less.",118 18646,"","Platychaete","Boiss.",118 17236,"","Platypodanthera","R.M.King & H.Rob.",118 6472,"","Platyschkuhria","(A.Gray) Rydb.",118 6473,"","Plazia","Ruiz & Pav.",118 17237,"","Plecostachys","Hilliard & B.L.Burtt",118 17238,"","Plectocephalus","D.Don",118 6474,"","Pleiotaxis","Steetz",118 25110,"","Pleocarphus","D.Don",118 6475,"","Pleurocarpaea","Benth.",118 17239,"","Pleurocoronis","R.M.King & H.Rob.",118 17240,"","Pleuropappus","F.Muell.",118 6476,"","Pleurophyllum","Hook.f.",118 6477,"","Pluchea","Cass.",118 17241,"","Plummera","A.Gray",118 6478,"","Podachaenium","Benth. ex Oerst.",118 6479,"","Podanthus","Lag.",118 6480,"","Podocoma","Cass.",118 6481,"","Podolepis","Labill.",118 25111,"","Podophania","Baill.",118 25612,"","Podospermum","DC.",118 6482,"","Podotheca","Cass.",118 17242,"","Poecilolepis","Grau",118 17243,"","Pogonolepis","Steetz",118 17244,"","Pojarkovia","Askerova",118 6483,"","Pollalesta","Kunth",118 6484,"","Polyachyrus","Lag.",118 17245,"","Polyanthina","R.M.King & H.Rob.",118 6485,"","Polyarrhena","Cass.",118 25780,"","Polycalymma","F.Muell. & Sond.",118 17246,"","Polychrysum","(Tzvelev) Kovalevsk.",118 6486,"","Polymnia","L.",118 17247,"","Polytaxis","Bunge",118 6487,"","Porophyllum","Adans.",118 6488,"","Porphyrostemma","Benth. ex Oliv.",118 6489,"","Postia","Boiss. & Blanche",118 6490,"","Praxeliopsis","G.M.Barroso",118 17248,"","Praxelis","Cass.",118 17249,"","Prenanthella","Rydb.",118 6491,"","Prenanthes","L.",118 6492,"","Printzia","Cass.",118 24811,"","Prionopsis","Nutt.",118 17251,"","Prolobus","R.M.King & H.Rob.",118 16208,"","Prolongoa","Boiss.",118 6493,"","Proteopsis","Mart. & Zucc. ex Sch.Bip.",118 6494,"","Proustia","Lag.",118 17252,"","Psacaliopsis","H.Rob. & Brettell",118 6495,"","Psacalium","Cass.",118 6496,"","Psathyrotes","A.Gray",118 6497,"","Psathyrotopsis","Rydb.",118 6498,"","Psednotrichia","Hiern",118 6499,"","Pseudactis","S.Moore",118 24856,"","Pseudelephantopus","Rohr",118 17253,"","Pseudobaccharis","Cabrera",118 6500,"","Pseudobahia","(A.Gray) Rydb.",118 6501,"","Pseudobartlettia","Rydb.",118 14242,"","Pseudoblepharispermum","J.-P.Lebrun & Stork",118 17254,"","Pseudobrickellia","R.M.King & H.Rob.",118 23191,"","Pseudocadiscus","Lisowski",118 6502,"","Pseudoclappia","Rydb.",118 6503,"","Pseudoconyza","Cuatrec.",118 6504,"","Pseudognaphalium","Kirp.",118 6505,"","Pseudogynoxys","(Greenm.) Cabrera",118 6506,"","Pseudohandelia","Tzvelev",118 24265,"","Pseudojacobaea","(Hook.f.) R.Mathur",118 15934,"","Pseudokyrsteniopsis","R.M.King & H.Rob.",118 25220,"","Pseudoligandra","Dillon & Sagast.",118 17255,"","Pseudonoseris","H.Rob. & Brettell",118 17256,"","Pseudostifftia","H.Rob.",118 6507,"","Psiadia","Jacq.",118 6508,"","Psiadiella","Humbert",118 6509,"","Psila","Phil.",118 6510,"","Psilactis","A.Gray",118 6511,"","Psilocarphus","Nutt.",118 6512,"","Psilostrophe","DC.",118 17257,"","Psychrogeton","Boiss.",118 25781,"","Psychrophyton","Beauverd",118 17258,"","Pterachenia","(Benth.) Lipsch.",118 6513,"","Pterigeron","(DC.) Benth.",118 6514,"","Pterocaulon","Elliott",118 24266,"","Pterocypsela","C.Shih",118 6515,"","Pteronia","L.",118 6516,"","Pterothrix","DC.",118 6517,"","Pterygopappus","Hook.f.",118 6518,"","Ptilepida","Raf.",118 6519,"","Ptilocalais","A.Gray ex Greene",118 6520,"","Ptilostemon","Cass.",118 6521,"","Pulicaria","Gaertn.",118 17752,"","Pycnocephalum","(Less.) DC.",118 18650,"","Pyrethrum","Zinn",118 6522,"","Pyrrhopappus","DC.",118 24813,"","Pyrrocoma","Hook.",118 6523,"","Quelchia","N.E.Br.",118 6524,"","Quinetia","Cass.",118 23192,"","Quinqueremulus","Paul G.Wilson",118 6525,"","Radlkoferotoma","Kuntze",118 6526,"","Rafinesquia","Nutt.",118 6527,"","Raillardella","(A.Gray) Benth.",118 6528,"","Raillardia","Gaudich.",118 25221,"","Raillardiopsis","Rydb.",118 25222,"","Rainiera","Greene",118 6529,"","Raoulia","Hook.f. ex Raoul",118 6530,"","Raouliopsis","S.F.Blake",118 17259,"","Rastrophyllum","Wild & G.V.Pope",118 6531,"","Ratibida","Raf.",118 17260,"","Raulinoreitzia","R.M.King & H.Rob.",118 17261,"","Rea","Bertero ex Decne.",118 6532,"","Reichardia","Roth",118 6533,"","Relhania","L'Her.",118 6534,"","Remya","W.F.Hillebr. ex Benth.",118 6535,"","Rennera","Merxm.",118 6536,"","Rensonia","S.F.Blake",118 15935,"","Revealia","R.M.King & H.Rob.",118 6537,"","Rhagadiolus","Scop.",118 6538,"","Rhamphogyne","S.Moore",118 14227,"","Rhanteriopsis","Rauschert",118 6539,"","Rhanterium","Desf.",118 16161,"","Rhaponticum","Ludw.",118 6540,"","Rhetinodendron","Meisn.",118 24814,"","Rhodanthe","Lindl.",118 6541,"","Rhodogeron","Griseb.",118 6542,"","Rhynchospermum","Reinw.",118 23510,"","Rhynea","DC.",118 6543,"","Rhysolepis","S.F.Blake",118 24815,"","Richteria","Kar. & Kir.",118 6544,"","Riencourtia","Cass.",118 6545,"","Rigiopappus","A.Gray",118 6546,"","Robinsonia","DC.",118 6547,"","Rochonia","DC.",118 6548,"","Rojasianthe","Standl. & Steyerm.",118 6549,"","Rolandra","Rottb.",118 15932,"","Roldana","La Llave",118 6550,"","Rosenia","Thunb.",118 6551,"","Rosilla","Less.",118 6552,"","Rothmaleria","Font Quer",118 6553,"","Rudbeckia","L.",118 17262,"","Rugelia","Shuttlew. ex Chapm.",118 17263,"","Ruilopezia","Cuatrec.",118 6554,"","Rumfordia","DC.",118 6555,"","Russowia","C.Winkl.",118 6556,"","Rutidosis","DC.",118 6557,"","Sabazia","Cass.",118 6558,"","Sachsia","Griseb.",118 6559,"","Salmea","DC.",118 6560,"","Salmeopsis","Benth.",118 6561,"","Santolina","L.",118 17264,"","Santosia","R.M.King & H.Rob.",118 6562,"","Sanvitalia","Lam.",118 17265,"","Sartorina","R.M.King & H.Rob.",118 6563,"","Sartwellia","A.Gray",118 6564,"","Saussurea","DC.",118 6565,"","Scalesia","Arn.",118 17266,"","Scariola","F.W.Schmidt",118 23514,"","Schaetzellia","Sch.Bip.",118 17267,"","Scherya","R.M.King & H.Rob.",118 6566,"","Schischkinia","Iljin",118 6567,"","Schistocarpha","Less.",118 6568,"","Schistostephium","Less.",118 16167,"","Schizogyne","Cass.",118 6569,"","Schizoptera","Turcz.",118 6570,"","Schizotrichia","Benth.",118 6571,"","Schkuhria","Roth",118 6572,"","Schlechtendalia","Less.",118 6573,"","Schmalhausenia","C.Winkl.",118 6574,"","Schoenia","Steetz",118 18653,"","Schumeria","Iljin",118 6575,"","Sciadocephala","Mattf.",118 6576,"","Sclerocarpus","Jacq.",118 6577,"","Sclerolepis","Cass.",118 6578,"","Sclerorhachis","(Rech.f.) Rech.f.",118 6579,"","Sclerostephane","Chiov.",118 6580,"","Scolymus","L.",118 25756,"","Scorzonella","Nutt.",118 6581,"","Scorzonera","L.",118 17268,"","Scrobicaria","Cass.",118 6582,"","Scyphocoronis","A.Gray",118 25445,"","Scyphopappus","B.Nord.",118 6583,"","Selleophytum","Urb.",118 6584,"","Selloa","Kunth",118 6585,"","Senecio","L.",118 24849,"","Senecioides","Post & Kuntze",118 23500,"","Sericocarpus","Nees",118 6586,"","Seriola","L.",118 24816,"","Seriphidium","(Besser) Poljak.",118 6587,"","Serratula","L.",118 6588,"","Shafera","Greenm.",118 6589,"","Sheareria","S.Moore",118 6590,"","Shinnersia","R.M.King & H.Rob.",118 17269,"","Shinnersoseris","Tomb",118 6591,"","Siebera","J.Gay",118 6592,"","Sigesbeckia","L.",118 17270,"","Siloxerus","Labill.",118 6593,"","Silphium","L.",118 6594,"","Silybum","Adans.",118 6595,"","Simsia","Pers.",118 17271,"","Sinacalia","H.Rob. & Brettell",118 15936,"","Sinclairia","Hook. & Arn.",118 17272,"","Sinoleontopodium","Y.L.Chen",118 17273,"","Sinosenecio","B.Nord.",118 23499,"","Sipolisia","Glaz. ex Oliv.",118 6596,"","Sitilias","Raf.",118 17274,"","Smallanthus","Mack.",118 6597,"","Soaresia","Sch.Bip.",118 17275,"","Solanecio","(Sch.Bip.) Walp.",118 6598,"","Solenogyne","Cass.",118 6599,"","Solidago","L.",118 6600,"","Soliva","Ruiz & Pav.",118 6601,"","Sommerfeltia","Less.",118 6602,"","Sonchus","L.",118 25449,"","Sondottia","P.S.Short",118 6603,"","Soroseris","Stebbins",118 6604,"","Spaniopappus","B.L.Rob.",118 6605,"","Sparganophorus","Boehm.",118 6606,"","Spathipappus","Tzvelev",118 6607,"","Sphacophyllum","Benth.",118 6608,"","Sphaeranthus","L.",118 6609,"","Sphaereupatorium","(O.Hoffm.) Kuntze ex B.L.Rob.",118 17276,"","Sphaeroclinium","(DC.) Sch.Bip.",118 24817,"","Sphaeromeria","Nutt.",118 6610,"","Sphaeromorphaea","DC.",118 6611,"","Sphagneticola","O.Hoffm.",118 6612,"","Sphenogyne","R.Br.",118 6613,"","Spilanthes","Jacq.",118 6614,"","Spiracantha","Kunth",118 17277,"","Spiroseris","Rech.f.",118 14223,"","Squamopappus","Jansen, Harriman & Urbatsch",118 6615,"","Stachycephalum","Sch.Bip. ex Benth.",118 6616,"","Staehelina","L.",118 17278,"","Standleyanthus","R.M.King & H.Rob.",118 6617,"","Stanfieldia","Small",118 6618,"","Staurochlamys","Baker",118 25752,"","Stebbinsoseris","K.L.Chambers",118 6619,"","Steiractinia","S.F.Blake",118 6620,"","Steirodiscus","Less.",118 25112,"","Steleocodon","Gilli",118 16160,"","Stemmacantha","Cass.",118 17753,"","Stemmatella","Wedd. ex Benth.",118 6621,"","Stenachaenium","Benth.",118 6622,"","Stenocarpha","S.F.Blake",118 24850,"","Stenocephalum","Sch.Bip.",118 6623,"","Stenocline","DC.",118 6624,"","Stenopadus","S.F.Blake",118 25782,"","Stenophalium","Anderb.",118 17279,"","Stenops","B.Nord.",118 24818,"","Stenotopsis","Rydb.",118 24819,"","Stenotus","Nutt.",118 17280,"","Stephanochilus","Coss. & Durieu ex Maire",118 6625,"","Stephanodoria","Greene",118 6626,"","Stephanolepis","S.Moore",118 6627,"","Stephanomeria","Nutt.",118 18648,"","Stephanopholis","S.F.Blake",118 6629,"","Steptorhamphus","Bunge",118 6630,"","Stevia","Cav.",118 15937,"","Steviopsis","R.M.King & H.Rob.",118 17281,"","Steyermarkina","R.M.King & H.Rob.",118 6631,"","Stifftia","J.C.Mikan",118 6632,"","Stilpnogyne","DC.",118 6633,"","Stilpnolepis","Krasch.",118 6634,"","Stilpnopappus","Mart. ex DC.",118 24868,"","Stilpnophyton","Less.",118 6635,"","Stilpnophytum","Less.",118 6636,"","Stobaea","Thunb.",118 6637,"","Stoebe","L.",118 6638,"","Stokesia","L'Her.",118 17282,"","Stomatanthes","R.M.King & H.Rob.",118 6639,"","Stomatochaeta","(S.F.Blake) Maguire & Wurdack",118 23507,"","Stramentopappus","H.Rob. & V.A.Funk",118 17283,"","Streptoglossa","Steetz ex F.Muell.",118 6640,"","Strotheria","B.L.Turner",118 6641,"","Struchium","P.Browne",118 6642,"","Stuartina","Sond.",118 6643,"","Stuckertiella","Beauverd",118 15938,"","Stuessya","B.L.Turner & F.G.Davies",118 6644,"","Stylocline","Nutt.",118 6645,"","Stylotrichium","Mattf.",118 6646,"","Sventenia","Font Quer",118 6647,"","Symphyllocarpus","Maxim.",118 6648,"","Symphyochaeta","(DC.) Skottsb.",118 6649,"","Symphyopappus","Turcz.",118 6650,"","Syncalathium","Lipsch.",118 24820,"","Syncarpha","DC.",118 6651,"","Syncephalum","DC.",118 6652,"","Syncretocarpus","S.F.Blake",118 6653,"","Synedrella","Gaertn.",118 6654,"","Synedrellopsis","Hieron. & Kuntze",118 17284,"","Syneilesis","Maxim.",118 17286,"","Synosma","Raf. ex Britton & A.Br.",118 17285,"","Synotis","(C.B.Clarke) C.Jeffrey & Y.L.Chen",118 6655,"","Syntrichopappus","A.Gray",118 6656,"","Synurus","Iljin",118 6657,"","Syreitschikovia","Pavlov",118 6658,"","Taeckholmia","Boulos",118 6659,"","Tagetes","L.",118 24804,"","Takeikadzuchia","Kitag. & Kitam.",118 24267,"","Takhtajanianthus","A.B.De",118 17287,"","Tamananthus","V.M.Badillo",118 17288,"","Tamania","Cuatrec.",118 17289,"","Tamaulipa","R.M.King & H.Rob.",118 6660,"","Tanacetum","L.",118 24841,"","Taplinia","Lander",118 6661,"","Taraxacum","Weber ex F.H.Wigg.",118 6662,"","Tarchonanthus","L.",118 17290,"","Teixeiranthus","R.M.King & H.Rob.",118 15939,"","Telanthophora","H.Rob. & Brettell",118 6663,"","Telekia","Baumg.",118 6664,"","Telmatophila","Mart. ex Baker",118 23509,"","Tenrhynea","Hilliard & B.L.Burtt",118 17291,"","Tephroseris","(Rchb.) Rchb.",118 6665,"","Terana","La Llave",118 6666,"","Tessaria","Ruiz & Pav.",118 17292,"","Tetrachyron","Schltdl.",118 6667,"","Tetradymia","DC.",118 6668,"","Tetragonotheca","L.",118 6669,"","Tetramolopium","Nees",118 17293,"","Tetraneuris","Greene",118 6670,"","Tetranthus","Sw.",118 6671,"","Tetraperone","Urb.",118 6672,"","Thaminophyllum","Harv.",118 6673,"","Thamnoseris","F.Phil.",118 6674,"","Thelechitonia","Cuatrec.",118 6675,"","Thelesperma","Less.",118 6676,"","Thespidium","F.Muell. ex Benth.",118 6677,"","Thespis","DC.",118 6678,"","Thevenotia","DC.",118 6679,"","Thiseltonia","Hemsl.",118 25613,"","Thorelia","Gagnep.",118 6680,"","Thurovia","Rose",118 6681,"","Thymophylla","Lag.",118 6682,"","Thymopsis","Benth.",118 17294,"","Tiarocarpus","Rech.f.",118 25113,"","Tibestina","Maire",118 25223,"","Tietkensia","P.S.Short",118 6683,"","Tisserantia","Humbert",118 6684,"","Tithonia","Desf. ex Juss.",118 25114,"","Tolbonia","Kuntze",118 6686,"","Tolpis","Adans.",118 6687,"","Tonalanthus","Brandegee",118 24842,"","Tonestus","A.Nelson",118 6688,"","Tourneuxia","Coss.",118 6689,"","Townsendia","Hook.",118 6690,"","Toxanthes","Turcz.",118 6691,"","Tracyina","S.F.Blake",118 6692,"","Tragopogon","L.",118 6693,"","Traversia","Hook.f.",118 17295,"","Trichanthemis","Regel & Schmalh.",118 25224,"","Trichanthodium","Sond. & F.Muell.",118 25115,"","Trichapium","Gilli",118 6694,"","Trichocline","Cass.",118 6695,"","Trichocoronis","A.Gray",118 6696,"","Trichocoryne","S.F.Blake",118 6697,"","Trichogonia","(DC.) Gardner",118 17296,"","Trichogoniopsis","R.M.King & H.Rob.",118 25783,"","Trichogyne","Less.",118 6698,"","Tricholepis","DC.",118 6699,"","Trichoptilium","A.Gray",118 6700,"","Trichospira","Kunth",118 17297,"","Tridactylina","(DC.) Sch.Bip.",118 6701,"","Tridax","L.",118 6702,"","Trigonospermum","Less.",118 6703,"","Trilisa","(Cass.) Cass.",118 25564,"","Trioncinia","(F.Muell.) Veldkamp",118 17298,"","Tripleurospermum","Sch.Bip.",118 6704,"","Triplocephalum","O.Hoffm.",118 6705,"","Triplotaxis","Hutch.",118 25611,"","Tripteris","Less.",118 6706,"","Triptilion","Ruiz & Pav.",118 24843,"","Triptilodiscus","Turcz.",118 6707,"","Trixis","P.Browne",118 17299,"","Troglophyton","Hilliard & B.L.Burtt",118 6708,"","Trychinolepis","B.L.Rob.",118 6709,"","Tuberostyles","Benth.",118 6710,"","Tuberostylis","Steetz",118 17754,"","Tuckermannia","Nutt.",118 6711,"","Tugarinovia","Iljin",118 6712,"","Turaniphytum","Poljakov",118 6713,"","Tussilago","L.",118 25225,"","Tuxtla","Villasenor & Strother",118 6714,"","Tyleropappus","Greenm.",118 6715,"","Tyrimnus","(Cass.) Cass.",118 6716,"","Uechtritzia","Freyn",118 6717,"","Ugamia","Pavlov",118 6718,"","Uleophytum","Hieron.",118 6719,"","Unxia","L.f.",118 17300,"","Urbananthus","R.M.King & H.Rob.",118 6720,"","Urbinella","Greenm.",118 6721,"","Urmenetea","Phil.",118 17301,"","Urolepis","(DC.) R.M.King & H.Rob.",118 25753,"","Uropappus","Nutt.",118 6722,"","Urospermum","Scop.",118 18651,"","Urostemon","B.Nord.",118 6723,"","Ursinia","Gaertn.",118 6724,"","Ursiniopsis","E.Phillips",118 6725,"","Vanclevea","Greene",118 6726,"","Vanillosmopsis","Sch.Bip.",118 6727,"","Varilla","A.Gray",118 6728,"","Varthemia","DC.",118 17302,"","Vellereophyton","Hilliard & B.L.Burtt",118 6729,"","Vendredia","Baill.",118 6730,"","Venegasia","DC.",118 6731,"","Venidium","Less.",118 6732,"","Verbesina","L.",118 6733,"","Vernonia","Schreb.",118 6734,"","Vernoniopsis","Humbert",118 23502,"","Vicoa","Cass.",118 6736,"","Vieraea","Sch.Bip.",118 17303,"","Viereckia","R.M.King & H.Rob.",118 6737,"","Vigethia","W.A.Weber",118 6738,"","Viguiera","Kunth",118 25750,"","Villanova","Ortega",118 6739,"","Villanova","Lag.",118 6740,"","Vilobia","Strother",118 25444,"","Virginia","(DC.) Nicoli",118 23193,"","Virgulaster","Semple",118 6741,"","Vittadinia","A.Rich.",118 17304,"","Vittetia","R.M.King & H.Rob.",118 6742,"","Vladimiria","Iljin",118 6743,"","Volkensia","O.Hoffm.",118 16168,"","Volutaria","Cass.",118 16209,"","Wagenitzia","Dostal",118 6744,"","Waitzia","J.C.Wendl.",118 6745,"","Waldheimia","Kar. & Kir.",118 25804,"","Wamalchitamia","Strother",118 6746,"","Warionia","Benth. & Coss.",118 25439,"","Weberaster","A.Love & D.Love",118 6747,"","Wedelia","Jacq.",118 6748,"","Welwitschiella","O.Hoffm.",118 6749,"","Wendelboa","Soest",118 6750,"","Werneria","Kunth",118 15940,"","Westoniella","Cuatrec.",118 6751,"","Wettsteinia","Petr.",118 6752,"","Whitneya","A.Gray",118 6753,"","Wiestia","Sch.Bip.",118 6754,"","Wilkesia","A.Gray",118 17305,"","Wollastonia","DC. ex Decne.",118 6755,"","Wootonella","Standl.",118 6756,"","Wootonia","Greene",118 6757,"","Wulffia","Neck. ex Cass.",118 6758,"","Wunderlichia","Riedel ex Benth.",118 6759,"","Wyethia","Nutt.",118 6760,"","Xanthisma","DC.",118 6761,"","Xanthium","L.",118 6762,"","Xanthocephalum","Willd.",118 6763,"","Xanthopappus","C.Winkl.",118 6764,"","Xeranthemum","L.",118 25714,"","Xerolekia","Anderb.",118 17306,"","Xylanthemum","Tzvelev",118 25354,"","Xylothamia","G.L.Nesom, Y.B.Suh, D.R.Morgan & B.B.Simpson",118 24870,"","Xyridopsis","Welw. ex B.Nord.",118 25754,"","Yermo","Dorn",118 6765,"","Youngia","Cass.",118 6766,"","Yunquea","Skottsb.",118 6767,"","Zacintha","Mill.",118 6768,"","Zaluzania","Pers.",118 24268,"","Zandera","D.L.Schulz",118 6769,"","Zexmenia","La Llave",118 6770,"","Zinnia","L.",118 6771,"","Zoegea","L.",118 6772,"","Zonanthemis","Greene",118 25805,"","Zyzyxia","Strother",118 2488,"","Agelaea","Sol. ex Planch.",119 25021,"","Anisostemon","Turcz.",119 25030,"","Anthagathis","Harms",119 2489,"","Bernardinia","Planch.",119 2490,"","Burttia","Baker f. & Exell",119 2491,"","Byrsocarpus","Schumach. & Thonn.",119 2492,"","Castanola","Llanos",119 2493,"","Cnestidium","Planch.",119 2494,"","Cnestis","Juss.",119 2495,"","Connarus","L.",119 25022,"","Dinklagea","Gilg",119 2427,"","Ebandoua","Pellegr.",119 24438,"","Eichleria","Progel",119 2496,"","Ellipanthus","Hook.f.",119 25023,"","Erythrostigma","Hassk.",119 2497,"","Hemandradenia","Stapf",119 25028,"","Hemiandrina","Hook.f.",119 2498,"","Jaundea","Gilg",119 2499,"","Jollydora","Pierre ex Gilg",119 2500,"","Manotes","Sol. ex Planch.",119 25422,"","Omphalobium","Gaertn.",119 2501,"","Paxia","Gilg",119 16450,"","Pseudellipanthus","Schellenb.",119 2502,"","Pseudoconnarus","Radlk.",119 2503,"","Rourea","Aubl.",119 2504,"","Roureopsis","Planch.",119 25031,"","Santalodes","Kuntze",119 2505,"","Santaloidella","Schellenb.",119 2506,"","Santaloides","Schellenb.",119 2507,"","Schellenbergia","C.E.Parkinson",119 2508,"","Spiropetalum","Gilg",119 25024,"","Taeniochlaena","Hook.f.",119 25029,"","Tapomana","Adans.",119 25025,"","Thysanus","Lour.",119 25026,"","Tricholobus","Blume",119 1440,"","Trichostephania","Tardieu",119 25027,"","Troostwykia","Miq.",119 2509,"","Vismianthus","Mildbr.",119 18851,"","Antherolophus","Gagnep.",120 11898,"","Aspidistra","Ker Gawl.",120 18852,"","Brachycyrtis","Koidz.",120 11921,"","Campylandra","Baker",120 11929,"","Clintonia","Raf.",120 18850,"","Colania","Gagnep.",120 11932,"","Convallaria","L.",120 11944,"","Disporopsis","Hance",120 11945,"","Disporum","Salisb. ex D.Don",120 11949,"","Drymophila","R.Br.",120 11969,"","Gonioscypha","Baker",120 11995,"","Kreysigia","Rchb.",120 24248,"","Kuntheria","Conran & Clifford",120 12004,"","Liriope","Lour.",120 12010,"","Maianthemum","Weber",120 12012,"","Medeola","L.",120 18849,"","Oligobotrya","Baker",120 12034,"","Ophiopogon","Ker Gawl.",120 12040,"","Peliosanthes","Andrews",120 12045,"","Polygonatum","Mill.",120 12050,"","Reineckea","Kunth",120 12054,"","Rohdea","Roth",120 12058,"","Schelhammera","R.Br.",120 12066,"","Smilacina","Desf.",120 12071,"","Speirantha","Baker",120 12075,"","Streptopus","Michx.",120 12078,"","Theropogon","Maxim.",120 12083,"","Tricalistra","Ridl.",120 12087,"","Tricyrtis","Wall.",120 24621,"","Tripladenia","D.Don",120 12094,"","Tupistra","Ker Gawl.",120 12096,"","Uvularia","L.",120 22325,"","Acmostemon","Pilg.",121 8088,"","Aniseia","Choisy",121 8089,"","Argyreia","Lour.",121 8090,"","Astripomoea","A.Meeuse",121 17972,"","Astrochlaena","Hallier f.",121 17973,"","Astromerremia","Pilg.",121 18613,"","Baillandea","Roberty",121 22326,"","Batatas","Choisy",121 8091,"","Blinkworthia","Choisy",121 8092,"","Bonamia","Thouars",121 17968,"","Bonanox","Raf.",121 18616,"","Breueria","R.Br.",121 18617,"","Breueriopsis","Roberty",121 18618,"","Breuieropsis","Roberty",121 17965,"","Calonyction","Choisy",121 17967,"","Calycantherum","Klotzsch",121 8093,"","Calycobolus","Willd. ex Schult.",121 8094,"","Calystegia","R.Br.",121 8095,"","Cardiochlamys","Oliv.",121 18622,"","Carpentia","Ewart",121 8096,"","Cladostigma","Radlk.",121 8097,"","Convolvulus","L.",121 8098,"","Cordisepalum","Verdc.",121 8099,"","Cressa","L.",121 17961,"","Cryptanthela","Gagnep.",121 8100,"","Cuscuta","L.",121 17574,"","Dactylostigma","D.F.Austin",121 8101,"","Decalobanthus","Ooststr.",121 17971,"","Diatremis","Raf.",121 8102,"","Dichondra","J.R.Forst. & G.Forst.",121 16627,"","Dichondropsis","Brandegee",121 8103,"","Dicranostyles","Benth.",121 17970,"","Dimerodisus","Gagnep.",121 17980,"","Dinetopsis","Roberty",121 8104,"","Dipteropeltis","Hallier f.",121 17977,"","Eremosperma","Chiov.",121 8105,"","Erycibe","Roxb.",121 8106,"","Evolvulus","L.",121 8107,"","Exogonium","Choisy",121 8108,"","Falkia","L.f.",121 17959,"","Fissipetalum","Merr.",121 18623,"","Grammica","Lour.",121 8109,"","Hewittia","Wight & Arn.",121 8110,"","Hildebrandtia","Vatke",121 8111,"","Humbertia","Comm. ex Lam.",121 8112,"","Hyalocystis","Hallier f.",121 18612,"","Hygrocharis","Hochst.",121 8113,"","Ipomoea","L.",121 8114,"","Iseia","O'Donell",121 8115,"","Itzaea","Standl. & Steyerm.",121 8116,"","Jacquemontia","Choisy",121 16628,"","Kuhlmanniella","Barroso",121 17960,"","Legendrea","Webb & Berthel.",121 22661,"","Lepidostemon","Hassk.",121 8117,"","Lepistemon","Blume",121 8118,"","Lepistemonopsis","Dammer",121 17962,"","Lettsomia","Roxb.",121 8119,"","Lysiostyles","Benth.",121 8120,"","Maripa","Aubl.",121 8121,"","Merremia","Dennst. ex Endl.",121 8122,"","Metaporana","N.E.Br.",121 8123,"","Mina","Cerv.",121 20348,"","Montejacquia","Roberty",121 17963,"","Moorcroftia","Choisy",121 17964,"","Mouroucoa","Aubl.",121 17976,"","Nemodon","Griff.",121 8124,"","Nephrophyllum","A.Rich.",121 8125,"","Neuropeltis","Wall.",121 8126,"","Neuropeltopsis","Ooststr.",121 14202,"","Odonellia","K.R.Robertson",121 8127,"","Operculina","Silva Manso",121 17573,"","Paralepistemon","Lejoly & Lisowski",121 17966,"","Parasitipomoea","Hayata",121 8128,"","Pentacrostigma","K.Afzel.",121 18619,"","Perispermum","O.Deg.",121 8129,"","Petrogenia","I.M.Johnst.",121 17969,"","Pharbitis","Choisy",121 8130,"","Polymeria","R.Br.",121 8131,"","Porana","Burm.f.",121 17981,"","Poranopsis","Roberty",121 18614,"","Prevostea","Choisy",121 18621,"","Pterochlamys","Roberty",121 22660,"","Quamoclit","Moench",121 15874,"","Quamoclit","Mill.",121 8132,"","Rapona","Baill.",121 8133,"","Remirema","Kerr",121 8134,"","Rivea","Choisy",121 8135,"","Sabaudiella","Chiov.",121 16629,"","Saccia","Naudin",121 8136,"","Seddera","Hochst.",121 18615,"","Sedderopsis","Roberty",121 18115,"","Shuteria","Choisy",121 2158,"","Sinomerrillia","Hu",121 18114,"","Skinneria","Choisy",121 17974,"","Spiranthera","Bojer",121 8137,"","Stictocardia","Hallier f.",121 17978,"","Strophocaulos","Small",121 8138,"","Stylisma","Raf.",121 8139,"","Tetralocularia","O'Donell",121 20349,"","Thyella","Raf.",121 18620,"","Trichantha","H.Karst. & Triana",121 17982,"","Tridynamia","Gagnep.",121 8140,"","Turbina","Raf.",121 17979,"","Volvulopsis","Roberty",121 20347,"","Volvulus","Medik.",121 8141,"","Wilsonia","R.Br.",121 14250,"","Xenostegia","D.F.Austin & Staples",121 2486,"","Coriaria","L.",122 4860,"","Afrocrania","(Harms) Hutch.",123 18091,"","Arctocrania","Nakai",123 18092,"","Benthamia","Lindl.",123 18093,"","Benthamidia","Spach",123 4871,"","Camptotheca","Decne.",123 16568,"","Chamaepericlymenum","Hill",123 4862,"","Cornus","L.",123 4864,"","Curtisia","Aiton",123 18094,"","Cynoxylon","Raf.",123 4873,"","Davidia","Baill.",123 18095,"","Dendrobenthamia","Hutch.",123 4815,"","Diplopanax","Hand.-Mazz.",123 18096,"","Macrocarpium","(Spach) Nakai",123 4867,"","Mastixia","Blume",123 4872,"","Nyssa","Gronov. ex L.",123 16569,"","Swida","Opiz",123 18097,"","Thelycrania","(Dumort.) Fourr.",123 25566,"","Yinquania","Z.Y.Zhu",123 10720,"","Arachnitis","Phil.",124 10721,"","Corsia","Becc.",124 10671,"","Carpinus","L.",125 10672,"","Corylus","L.",125 10673,"","Ostrya","Scop.",125 10674,"","Ostryopsis","Decne.",125 2482,"","Corynocarpus","J.R.Forst. & G.Forst.",126 18810,"","Cadalvena","Fenzl",127 11576,"","Costus","L.",127 11577,"","Dimerocostus","Kuntze",127 11578,"","Monocostus","K.Schum.",127 11579,"","Tapeinochilos","Miq.",127 3399,"","Adromischus","Lem.",128 3400,"","Aeonium","Webb & Berthel.",128 16463,"","Afrovivella","A.Berger",128 3401,"","Aichryson","Webb & Berthel.",128 20286,"","Aithales","Webb & Berthel.",128 20277,"","Aizopsis","Grulich",128 3402,"","Altamiranoa","Rose",128 20285,"","Amerosedum","A.Love & D.Love",128 20287,"","Anacampseros","Mill.",128 20276,"","Asterosedum","Grulich",128 20284,"","Breitungia","A.Love & D.Love",128 3403,"","Bryophyllum","Salisb.",128 20261,"","Bulliarda","DC.",128 20273,"","Byrnesia","Rose",128 20288,"","Cepaea","Fabr.",128 20304,"","Chamaerhodiola","Nakai",128 20283,"","Chetyson","Raf.",128 3404,"","Chiastophyllum","(Ledeb.) A.Berger",128 20282,"","Clausenellia","A.Love & D.Love",128 20305,"","Clementsia","Rose",128 20281,"","Cockerellia","A.Love & D.Love",128 20262,"","Combesia","A.Rich.",128 20289,"","Congdonia","Jeps.",128 20290,"","Corynephyllum","Rose",128 3405,"","Cotyledon","L.",128 20268,"","Cotyliphyllum","Link",128 20269,"","Courantia","Lem.",128 3406,"","Crassula","L.",128 22234,"","Cremnophila","Rose",128 20263,"","Danielia","Lem.",128 3407,"","Diamorpha","Nutt.",128 20264,"","Dinacria","Haw.",128 20309,"","Diopogon","Jord. & Fourr.",128 3408,"","Dudleya","Britton & Rose",128 3409,"","Echeveria","DC.",128 20280,"","Etiosedum","A.Love & D.Love",128 24352,"","Gomara","Adans.",128 20291,"","Gormania","Britton",128 20265,"","Grammanthes","DC.",128 3410,"","Graptopetalum","Rose",128 24095,"x","Graptoveria","G.D.Rowley",128 3411,"","Greenovia","Webb & Berthel.",128 20272,"","Hasseanthus","Rose",128 23063,"","Helladia","M.Kral",128 20279,"","Hjaltalinia","A.Love & D.Love",128 3412,"","Hylotelephium","H.Ohba",128 16464,"","Hypagophytum","A.Berger",128 16210,"","Jovibarba","(DC.) Opiz",128 3413,"","Kalanchoe","Adans.",128 20292,"","Keratolepis","Rose ex Frod.",128 25536,"","Kirpicznikovia","A.Love & D.Love",128 16465,"","Kitchingia","Baker",128 3414,"","Lenophyllum","Rose",128 20293,"","Leucosedum","Fourr.",128 20311,"","Macrobia","(Webb & Berthel.) G.Kunkel",128 20294,"","Macrosepalum","Regel & Schmalh.",128 20310,"","Megalonium","(Berger) Kunkel",128 3415,"","Meterostachys","Nakai",128 20275,"","Monanthella","A.Berger",128 3416,"","Monanthes","Haw.",128 3417,"","Mucizonia","(DC.) A.Berger",128 20270,"","Oliveranthus","Rose",128 20301,"","Oreosedum","Grulich",128 3418,"","Orostachys","Fisch. ex A.Berger",128 3419,"","Pachyphytum","Link, Klotzsch & Otto",128 16466,"","Pagella","Schonl.",128 17315,"","Parvisedum","R.T.Clausen",128 3420,"","Perrierosedum","(A.Berger) H.Ohba",128 20312,"","Petrophyes","Webb & Berthel.",128 20302,"","Petrosedum","Grulich",128 20295,"","Phedimus","Raf.",128 3421,"","Pistorinia","DC.",128 15977,"","Poenosedum","Holub",128 20296,"","Procrassula","Griseb.",128 3422,"","Prometheum","(A.Berger) H.Ohba",128 20274,"","Pseudorosularia","Gurgen.",128 3423,"","Pseudosedum","(Boiss.) A.Berger",128 3424,"","Rhodiola","L.",128 16467,"","Rhopalota","N.E.Br.",128 16468,"","Rochea","DC.",128 3425,"","Rosularia","(DC.) Stapf",128 20297,"","Sedastrum","Rose",128 20298,"","Sedella","Fourr.",128 20303,"","Sedella","Britton & Rose",128 24096,"x","Sedeveria","E.Walther",128 3426,"","Sedum","L.",128 16469,"","Sempervivella","Stapf",128 3427,"","Sempervivum","L.",128 3428,"","Sinocrassula","A.Berger",128 20278,"","Spathulata","(Boriss.) A.Love & D.Love",128 3429,"","Stylophyllum","Britton & Rose",128 15171,"","Tacitus","Moran",128 3430,"","Telmissa","Fenzl",128 20306,"","Tetradium","Dulac",128 20299,"","Tetrorum","Rose",128 3431,"","Thompsonella","Britton & Rose",128 20266,"","Tillaea","L.",128 20267,"","Tillaeastrum","Britton",128 20307,"","Tolmachevia","A.Love & D.Love",128 20300,"","Triactina","Hook.f. & Thomson",128 3432,"","Tylecodon","Toelken",128 3433,"","Umbilicus","DC.",128 20271,"","Urbinia","Rose",128 16470,"","Vauanthes","Haw.",128 3434,"","Villadia","Rose",128 24588,"","Apacheria","C.T.Mason",129 74,"","Crossosoma","Nutt.",129 75,"","Forsellesia","Greene",129 24587,"","Glossopetalon","A.Gray",129 18749,"","Abdra","Greene",130 16270,"","Acachmena","H.P.Fuchs",130 16284,"","Acanthocardamum","Thell.",130 24746,"","Achoriphragma","Sojak",130 18788,"","Acroschizocarpus","Gombocz",130 389,"","Aethionema","R.Br.",130 390,"","Agallis","Phil.",130 391,"","Agianthus","Greene",130 392,"","Alliaria","Heist. ex Fabr.",130 393,"","Alpaminia","O.E.Schulz",130 394,"","Alyssoides","Mill.",130 395,"","Alyssopsis","Boiss.",130 396,"","Alyssum","L.",130 397,"","Ammosperma","Hook.f.",130 398,"","Anastatica","L.",130 399,"","Anchonium","DC.",130 400,"","Andrzeiowskya","Rchb.",130 401,"","Anelsonia","J.F.Macbr. & Payson",130 21510,"","Anguillicarpus","Burkill",130 402,"","Aphragmus","Andrz. ex DC.",130 403,"","Aplanodes","Marais",130 16285,"","Apterigia","Galushko",130 404,"","Arabidella","(F.Muell.) O.E.Schulz",130 24740,"","Arabidium","Spach",130 405,"","Arabidopsis","Heynh.",130 406,"","Arabis","L.",130 24739,"","Arabisa","Rchb.",130 407,"","Arcyosperma","O.E.Schulz",130 408,"","Armoracia","P.Gaertn., B.Mey. & Scherb.",130 409,"","Aschersoniodoxa","Gilg & Muschl.",130 14181,"","Asperuginoides","Rauschert",130 410,"","Asta","Klotzsch ex O.E.Schulz",130 25836,"","Asterotricha","V.V.Botschantz.",130 25119,"","Ateixa","Ravenna",130 411,"","Atelanthera","Hook.f. & Thomson",130 17533,"","Athysanus","Greene",130 24728,"","Atropatenia","F.K.Mey.",130 412,"","Aubrieta","Adans.",130 413,"","Aurinia","Desv.",130 14275,"","Ballantinia","Hook.f. ex E.A.Shaw",130 414,"","Barbarea","R.Br.",130 415,"","Berteroa","DC.",130 416,"","Berteroella","O.E.Schulz",130 417,"","Biscutella","L.",130 418,"","Bivonaea","DC.",130 419,"","Blennodia","R.Br.",130 25490,"","Boechera","A.Love & D.Love",130 16211,"","Boleum","Desv.",130 420,"","Boreava","Jaub. & Spach",130 421,"","Bornmuellera","Hausskn.",130 422,"","Borodinia","N.Busch",130 16286,"","Botschantzevia","Nabiev",130 423,"","Brachycarpaea","DC.",130 424,"","Brassica","L.",130 18715,"","Brassicaria","Pomel",130 425,"","Brassicella","Fourr. ex O.E.Schulz",130 426,"","Braya","Sternb. & Hoppe",130 24764,"","Brayopsis","Gilg & Muschl.",130 427,"","Brossardia","Boiss.",130 428,"","Buchingera","Boiss. & Hohen.",130 429,"","Bunias","L.",130 430,"","Cakile","Mill.",130 431,"","Calepina","Adans.",130 24726,"","Callothlaspi","F.K.Mey.",130 432,"","Calymmatium","O.E.Schulz",130 433,"","Camelina","Crantz",130 17554,"","Camelinopsis","A.G.Mill.",130 18731,"","Campyloptera","Boiss.",130 434,"","Capsella","Medik.",130 435,"","Cardamine","L.",130 436,"","Cardaminopsis","(C.A.Mey.) Hayek",130 437,"","Cardaria","Desv.",130 438,"","Carinavalva","Ising",130 24767,"","Carinivalva","Airy Shaw",130 24948,"","Carponema","Eckl. & Zeyh.",130 439,"","Carrichtera","DC.",130 440,"","Cartiera","Greene",130 441,"","Catadysia","O.E.Schulz",130 442,"","Catenularia","Botsch.",130 24768,"","Catenulina","Sojak",130 443,"","Caulanthus","S.Watson",130 24946,"","Caulostramina","Rollins",130 444,"","Ceratocnemum","Coss. & Balansa",130 24743,"","Ceriosperma","(O.E.Schulz) Greuter & Burdet",130 445,"","Chalcanthus","Boiss.",130 446,"","Chamira","Thunb.",130 447,"","Chartoloma","Bunge",130 448,"","Chaunanthus","O.E.Schulz",130 449,"","Cheesemania","O.E.Schulz",130 450,"","Cheiranthus","L.",130 451,"","Chilocardamum","O.E.Schulz",130 452,"","Chlorocrambe","Rydb.",130 24769,"","Chodsha-Kasiana","Rauschert",130 18771,"","Chorispermum","R.Br.",130 453,"","Chorispora","R.Br. ex DC.",130 454,"","Christolea","Cambess. ex Jacquem.",130 24939,"","Chrysobraya","Hara",130 455,"","Chrysochamela","(Fenzl) Boiss.",130 456,"","Cibotarium","O.E.Schulz",130 457,"","Cithareloma","Bunge",130 25285,"","Clandestinaria","Spach",130 458,"","Clastopus","Bunge ex Boiss.",130 459,"","Clausia","Korn.-Trotzky ex Hayek",130 460,"","Clypeola","L.",130 461,"","Cochlearia","L.",130 25488,"","Cochleariella","Y.H.Zhang & Vogt",130 24735,"","Cochleariopsis","Y.H.Zhang",130 25489,"","Cochleariopsis","A.Love & D.Love",130 462,"","Coelonema","Maxim.",130 463,"","Coelophragmus","O.E.Schulz",130 464,"","Coincya","Rouy",130 465,"","Coluteocarpus","Boiss.",130 466,"","Conringia","Heist. ex Fabr.",130 467,"","Cordylocarpus","Desf.",130 468,"","Coronopus","Zinn",130 469,"","Cossonia","Durieu",130 470,"","Crambe","L.",130 471,"","Crambella","Maire",130 472,"","Cremolobus","DC.",130 18732,"","Crenularia","Boiss.",130 473,"","Cryptospora","Kar. & Kir.",130 474,"","Cuphonotus","O.E.Schulz",130 23200,"","Cusickiella","Rollins",130 475,"","Cycloptychis","E.Mey. ex Sond.",130 476,"","Cymatocarpus","O.E.Schulz",130 477,"","Cyphocardamum","Hedge",130 24949,"","Dactylocardamum","Al-Shehbaz",130 478,"","Decaptera","Turcz.",130 479,"","Degenia","Hayek",130 480,"","Delpinophytum","Speg.",130 18757,"","Dentaria","L.",130 481,"","Descurainia","Webb & Berthel.",130 18789,"","Desideria","Pamp.",130 482,"","Diceratella","Boiss.",130 14184,"","Dichasianthus","Ovcz. & Yunusov",130 483,"","Dictyophragmus","O.E.Schulz",130 484,"","Didesmus","Desv.",130 485,"","Didymophysa","Boiss.",130 486,"","Dielsiocharis","O.E.Schulz",130 487,"","Dilophia","Thomson",130 25120,"","Dimitria","Ravenna",130 24947,"","Dimorphocarpa","Rollins",130 18779,"","Dimorphostemon","Kitag.",130 16287,"","Diplopilosa","Dvorak",130 488,"","Diplotaxis","DC.",130 489,"","Dipoma","Franch.",130 492,"","Diptychocarpus","Trautv.",130 493,"","Disaccanthus","Greene",130 16288,"","Discovium","Raf.",130 16289,"","Distomocarpus","O.E.Schulz",130 494,"","Dithyrea","Harv.",130 22217,"","Dolichorhynchus","Hedge & Kit Tan",130 18752,"","Dolichostylis","Turcz.",130 496,"","Dontostemon","Andrz. ex C.A.Mey.",130 495,"","Douepea","Cambess.",130 497,"","Draba","L.",130 498,"","Drabastrum","(F.Muell.) O.E.Schulz",130 22216,"","Drabella","Nabelek",130 499,"","Drabopsis","K.Koch",130 18758,"","Dracamine","Nieuwl.",130 500,"","Dryopetalon","A.Gray",130 24770,"","Eigia","Sojak",130 501,"","Elburzia","Hedge",130 502,"","Enarthrocarpus","Labill.",130 18784,"","Endemal","Pritz.",130 503,"","Englerocharis","Muschl.",130 504,"","Eremobium","Boiss.",130 24745,"","Eremoblastus","Botsch.",130 505,"","Eremodraba","O.E.Schulz",130 506,"","Eremophyton","Beg.",130 16291,"","Ermanea","Cham.",130 24951,"","Ermaniopsis","Hara",130 508,"","Erophila","DC.",130 509,"","Eruca","Mill.",130 18740,"","Erucago","Mill.",130 510,"","Erucaria","Gaertn.",130 511,"","Erucastrum","(DC.) C.Presl",130 512,"","Erysimum","L.",130 18761,"","Esquiroliella","H.Lev.",130 513,"","Euclidium","R.Br.",130 514,"","Eudema","Humb. & Bonpl.",130 515,"","Euklisia","Rydb. ex Small",130 516,"","Eunomia","DC.",130 16290,"","Eurycarpus","Botsch.",130 517,"","Eutrema","R.Br.",130 18763,"","Euxena","Calest.",130 518,"","Euzomodendron","Coss.",130 16292,"","Fabrisinapis","C.C.Towns.",130 519,"","Farsetia","Turra",130 18773,"","Fedtschenkoa","Regel & Schmalh.",130 520,"","Fezia","Pit.",130 521,"","Fibigia","Medik.",130 522,"","Foleyola","Maire",130 523,"","Fortuynia","Shuttlew. ex Boiss.",130 24742,"","Fourraea","Greuter & Burdet",130 24732,"","Gagria","Kral",130 24738,"","Galitzkya","V.V.Botschantz.",130 524,"","Gamosepalum","Hausskn.",130 525,"","Geococcus","J.L.Drumm. ex Harv.",130 25356,"","Glaribraya","Hara",130 16294,"","Glastaria","Boiss.",130 16295,"","Glaucocarpum","Rollins",130 16296,"","Glaucocochlearia","(O.E.Schulz) Pobed.",130 526,"","Goldbachia","DC.",130 527,"","Gorodkovia","Botsch. & Karav.",130 528,"","Graellsia","Boiss.",130 529,"","Grammosperma","O.E.Schulz",130 530,"","Greggia","A.Gray",130 531,"","Guillenia","Greene",130 532,"","Guiraoa","Coss.",130 533,"","Gynophorea","Gilli",130 534,"","Halimolobos","Tausch",130 15172,"","Halimolobus","Tausch",130 535,"","Harmsiodoxa","O.E.Schulz",130 536,"","Hartwegiella","O.E.Schulz",130 537,"","Hedinia","Ostenf.",130 24955,"","Hediniopsis","Botsch. & V.V.Petrovsky",130 538,"","Heldreichia","Boiss.",130 539,"","Heliophila","Burm.f. ex L.",130 540,"","Hemicrambe","Webb",130 541,"","Hemilophia","Franch.",130 542,"","Henophyton","Coss. & Durieu",130 543,"","Hesperidanthus","(B.L.Rob.) Rydb.",130 544,"","Hesperis","L.",130 18759,"","Heterocarpus","Phil.",130 545,"","Heterodraba","Greene",130 18787,"","Heterothrix","(B.L.Rob.) Rydb.",130 546,"","Hexaptera","Hook.",130 24734,"","Hilliella","(O.E.Schulz) Y.H.Zhang & H.W.Li",130 547,"","Hirschfeldia","Moench",130 548,"","Hollermayera","O.E.Schulz",130 549,"","Hormathophylla","Cullen & T.R.Dudley",130 550,"","Hornungia","Rchb.",130 551,"","Horwoodia","Turrill",130 552,"","Hugueninia","Rchb.",130 18718,"","Hussonia","Boiss.",130 553,"","Hutchinsia","R.Br.",130 554,"","Hutchinsiella","O.E.Schulz",130 16212,"","Hutera","Porta",130 24765,"","Hylandra","A.Love",130 555,"","Hymenolobus","Nutt.",130 556,"","Hymenophysa","C.A.Mey.",130 18736,"","Iberidella","Boiss.",130 557,"","Iberis","L.",130 558,"","Icianthus","Greene",130 559,"","Idahoa","A.Nelson & J.F.Macbr.",130 560,"","Iodanthus","(Torr. & A.Gray) Steud.",130 18733,"","Iondra","Raf.",130 18729,"","Iondraba","Rchb.",130 561,"","Ionopsidium","Rchb.",130 14194,"","Irenepharsus","Hewson",130 562,"","Isatis","L.",130 563,"","Ischnocarpus","O.E.Schulz",130 564,"","Iskandera","N.Busch",130 24284,"","Iti","Garn.-Jones & P.N.Johnson",130 565,"","Ivania","O.E.Schulz",130 18730,"","Jondraba","Medik.",130 566,"","Kardanoglyphos","Schltdl.",130 567,"","Kernera","Medik.",130 18772,"","Koeiea","Rech.f.",130 18790,"","Koelzia","Rech.f.",130 18744,"","Koenigia","Post & Kuntze",130 18745,"","Konig","Adans.",130 24725,"","Kotschyella","F.K.Mey.",130 568,"","Kremeriella","Maire",130 569,"","Lachnocapsa","Balf.f.",130 570,"","Lachnoloma","Bunge",130 571,"","Lamprophragma","O.E.Schulz",130 572,"","Leavenworthia","Torr.",130 16297,"","Leiospora","(C.A.Mey.) A.N.Vassiljeva",130 573,"","Lemphoria","O.E.Schulz",130 18726,"","Lepicochlea","Rojas Acosta",130 574,"","Lepidium","L.",130 575,"","Lepidostemon","Hook.f. & Thomson",130 576,"","Lepidotrichum","Velen. & Bornm.",130 577,"","Leptaleum","DC.",130 18753,"","Leptonema","Hook.",130 578,"","Leptoplax","O.E.Schulz",130 579,"","Lesquerella","S.Watson",130 16298,"","Lignariella","Baehni",130 18734,"","Lipophragma","Schott & Kotschy ex Boiss.",130 16299,"","Lithodraba","Boelcke",130 16169,"","Litwinowia","Woronow",130 580,"","Lobularia","Desv.",130 581,"","Lonchophora","Durieu",130 582,"","Loxoptera","O.E.Schulz",130 583,"","Loxostemon","Hook.f. & Thomson",130 584,"","Lunaria","L.",130 18741,"","Lutzia","Gand.",130 585,"","Lycocarpus","O.E.Schulz",130 586,"","Lyrocarpa","Hook. & Harv.",130 18775,"","Machaerophorus","Schltdl.",130 587,"","Macropodium","R.Br.",130 14185,"","Macrostigmatella","Rauschert",130 588,"","Malcolmia","R.Br.",130 589,"","Mancoa","Wedd.",130 590,"","Maresia","Pomel",130 18762,"","Martinella","H.Lev.",130 24730,"","Masmenia","F.K.Mey.",130 591,"","Mathewsia","Hook. & Arn.",130 16293,"","Mathiola","R.Br.",130 18769,"","Mathiolaria","Chevall.",130 592,"","Matthiola","R.Br.",130 593,"","Megacarpaea","DC.",130 594,"","Megadenia","Maxim.",130 18791,"","Melanidion","Greene",130 18742,"","Meniocus","Desv.",130 595,"","Menkea","Lehm.",130 596,"","Menonvillea","R.Br. ex DC.",130 18714,"","Mesoreanthus","Greene",130 16300,"","Micrantha","Dvorak",130 597,"","Microcardamum","O.E.Schulz",130 24731,"","Microlepidium","F.Muell.",130 598,"","Micromystria","O.E.Schulz",130 599,"","Microsemia","Greene",130 600,"","Microsisymbrium","O.E.Schulz",130 25121,"","Microstigma","Trautv.",130 24722,"","Microthlaspi","F.K.Mey.",130 601,"","Mitophyllum","Greene",130 602,"","Morettia","DC.",130 603,"","Moricandia","DC.",130 604,"","Moriera","Boiss.",130 605,"","Morisia","J.Gay",130 606,"","Mostacillastrum","O.E.Schulz",130 607,"","Murbeckiella","Rothm.",130 608,"","Muricaria","Desv.",130 18778,"","Myagropsis","Hort. ex O.E.Schulz",130 609,"","Myagrum","L.",130 18723,"","Nasturtiastrum","(Gren. & Godr.) Gillet & Magne",130 18783,"","Nasturtiicarpa","Gilli",130 610,"","Nasturtiopsis","Boiss.",130 611,"","Nasturtium","R.Br.",130 18765,"","Neobeckia","Greene",130 25487,"","Neolepia","W.A.Weber",130 612,"","Neomartinella","Pilg.",130 14186,"","Neotchihatchewia","Rauschert",130 17546,"","Neotorularia","Hedge & J.Leonard",130 16301,"","Nerisyrenia","Greene",130 613,"","Neslia","Desv.",130 18754,"","Nesodraba","Greene",130 614,"","Neuontobotrys","O.E.Schulz",130 18735,"","Noccaea","Moench",130 24724,"","Noccidium","F.K.Mey.",130 615,"","Notoceras","R.Br.",130 616,"","Notothlaspi","Hook.f.",130 617,"","Ochthodium","DC.",130 618,"","Octoceras","Bunge",130 18755,"","Odontocyclus","Turcz.",130 619,"","Onuris","Phil.",130 18782,"","Oreas","Cham. & Schltdl.",130 16302,"","Oreoblastus","Suslova",130 24747,"","Oreoloma","Botsch.",130 620,"","Oreophyton","O.E.Schulz",130 621,"","Ornithocarpa","Rose",130 622,"","Orychophragmus","Bunge",130 623,"","Otocarpus","Durieu",130 18720,"","Oudneya","R.Br.",130 624,"","Pachycladon","Hook.f.",130 625,"","Pachymitus","O.E.Schulz",130 626,"","Pachyneurum","Bunge",130 627,"","Pachyphragma","(DC.) Rchb.",130 18776,"","Pachypodium","Nutt.",130 18780,"","Pachypodium","Webb & Berthel.",130 18728,"","Pachypteris","Kar. & Kir.",130 628,"","Pachypterygium","Bunge",130 18722,"","Palmstruckia","Sond.",130 18716,"","Pantorrhynchus","Murb.",130 629,"","Papuzilla","Ridl.",130 630,"","Parlatoria","Boiss.",130 631,"","Parodiodoxa","O.E.Schulz",130 632,"","Parolinia","Webb",130 18737,"","Parrasia","Greene",130 633,"","Parrya","R.Br.",130 634,"","Parryodes","Jafri",130 16303,"","Parryopsis","Botsch.",130 635,"","Pegaeophyton","Hayek & Hand.-Mazz.",130 636,"","Pelagatia","O.E.Schulz",130 637,"","Peltaria","Jacq.",130 638,"","Peltariopsis","(Boiss.) N.Busch",130 639,"","Pennellia","Nieuwl.",130 17534,"","Petiniotia","J.Leonard",130 640,"","Petrocallis","R.Br.",130 641,"","Phaeonychium","O.E.Schulz",130 642,"","Phlebiophragmus","O.E.Schulz",130 643,"","Phlebolobium","O.E.Schulz",130 16304,"","Phlegmatospermum","O.E.Schulz",130 644,"","Phoenicaulis","Nutt.",130 645,"","Phryne","Bubani",130 646,"","Physalidium","Fenzl",130 647,"","Physaria","(Nutt.) A.Gray",130 24721,"","Physocardamum","Hedge",130 648,"","Physoptychis","Boiss.",130 649,"","Physorhynchus","Hook.",130 18770,"","Pirazzia","Chiov.",130 18766,"","Pirea","T.Durand",130 16305,"","Planodes","Greene",130 650,"","Platycraspedum","O.E.Schulz",130 18748,"","Platyspermum","Hook.",130 651,"","Pleiocardia","Greene",130 652,"","Pleurophragma","Rydb.",130 653,"","Poliophyton","O.E.Schulz",130 18792,"","Polyctenium","Greene",130 654,"","Polypsecadium","O.E.Schulz",130 18760,"","Porphyrocodon","Hook.f.",130 655,"","Pringlea","T.Anderson ex Hook.f.",130 656,"","Prionotrichon","Botsch. & Vved.",130 24733,"","Pritzelago","Kuntze",130 657,"","Pseudarabidella","O.E.Schulz",130 658,"","Pseuderucaria","(Boiss.) O.E.Schulz",130 18747,"","Pseudoanastatica","(Boiss.) Grossh.",130 18750,"","Pseudobraya","Korsh.",130 659,"","Pseudocamelina","(Boiss.) N.Busch",130 16306,"","Pseudoclausia","Popov",130 18719,"","Pseudocytisus","Kuntze",130 660,"","Pseudofortuynia","Hedge",130 18738,"","Pseudosempervivum","(Boiss.) Grossh.",130 661,"","Pseudovesicaria","(Boiss.) Rupr.",130 18743,"","Psilonema","C.A.Mey.",130 662,"","Psychine","Desf.",130 663,"","Pterygiosperma","O.E.Schulz",130 24736,"","Pterygostemon","V.V.Botschantz.",130 21511,"","Ptilotrichum","C.A.Mey.",130 665,"","Pugionium","Gaertn.",130 18785,"","Pycnobolus","Willd. ex O.E.Schulz",130 24748,"","Pycnoplinthopsis","Jafri",130 666,"","Pycnoplinthus","O.E.Schulz",130 667,"","Pyramidium","Boiss.",130 24720,"","Quezelia","H.Scholz",130 24719,"","Quezeliantha","H.Scholz ex Rauschert",130 24718,"","Quidproquo","Greuter & Burdet",130 669,"","Raffenaldia","Godr.",130 24727,"","Raparia","F.K.Mey.",130 15875,"","Raphanorhyncha","Rollins",130 670,"","Raphanus","L.",130 671,"","Rapistrum","Crantz",130 672,"","Reboudia","Coss. & Durieu",130 673,"","Redowskia","Cham. & Schltdl.",130 674,"","Rhammatophyllum","O.E.Schulz",130 675,"","Rhizobotrya","Tausch",130 676,"","Rhynchosinapis","Hayek",130 677,"","Ricotia","L.",130 678,"","Robeschia","Hochst. ex O.E.Schulz",130 14183,"","Rollinsia","Al-Shehbaz",130 679,"","Romanschulzia","O.E.Schulz",130 24744,"","Roripella","(Maire) Greuter & Burdet",130 680,"","Rorippa","Scop.",130 681,"","Rytidocarpus","Coss.",130 682,"","Sameraria","Desv.",130 683,"","Sandbergia","Greene",130 684,"","Sarcodraba","Gilg & Muschl.",130 685,"","Savignya","DC.",130 686,"","Scambopus","O.E.Schulz",130 687,"","Schimpera","Steud. & Hochst. ex Endl.",130 688,"","Schivereckia","Andrz. ex DC.",130 689,"","Schizopetalon","Sims",130 690,"","Schlechteria","Bolus",130 18781,"","Schoenocrambe","Greene",130 691,"","Schouwia","DC.",130 692,"","Scoliaxon","Payson",130 693,"","Selenia","Nutt.",130 18724,"","Semetum","Raf.",130 18764,"","Shortia","Raf.",130 694,"","Sibara","Greene",130 695,"","Silicularia","Compton",130 696,"","Sinapidendron","Lowe",130 697,"","Sinapis","L.",130 698,"","Sisymbrella","Spach",130 18767,"","Sisymbrianthus","Chevall.",130 699,"","Sisymbriopsis","Botsch. & Tzvelev",130 700,"","Sisymbrium","L.",130 24749,"","Skottsbergianthus","Boelcke",130 24763,"","Skottsbergiella","Boelcke",130 701,"","Smelowskia","C.A.Mey.",130 702,"","Sobolewskia","M.Bieb.",130 703,"","Solms-Laubachia","Muschl.",130 25293,"","Sophiopsis","O.E.Schulz",130 704,"","Sphaerocardamum","Nees & Schauer",130 705,"","Spirorhynchus","Kar. & Kir.",130 18725,"","Sprengeria","Greene",130 18721,"","Spryginia","Popov",130 24950,"","Staintoniella","Hara",130 706,"","Stanfordia","S.Watson",130 707,"","Stanleya","Nutt.",130 708,"","Stanleyella","Rydb.",130 709,"","Stenodraba","O.E.Schulz",130 18751,"","Stenonema","Hook.",130 710,"","Stenopetalum","R.Br. ex DC.",130 18786,"","Stenophragma","Celak.",130 711,"","Sterigmostemum","M.Bieb.",130 712,"","Stevenia","Adams ex Fisch.",130 713,"","Stigmatella","Eig",130 714,"","Straussiella","Hausskn.",130 715,"","Streptanthella","Rydb.",130 716,"","Streptanthus","Nutt.",130 717,"","Streptoloma","Bunge",130 16307,"","Strigosella","Boiss.",130 718,"","Stroganowia","Kar. & Kir.",130 719,"","Stubendorffia","Schrenk ex Fisch., C.A.Mey. & Ave-Lall.",130 720,"","Subularia","L.",130 721,"","Succowia","Medik.",130 722,"","Synstemon","Botsch.",130 24766,"","Synstemonanthus","Botsch.",130 723,"","Synthlipsis","A.Gray",130 724,"","Syrenia","Andrz. ex Besser",130 725,"","Syrenopsis","Jaub. & Spach",130 726,"","Taphrospermum","C.A.Mey.",130 727,"","Tauscheria","Fisch. ex DC.",130 728,"","Tchihatchewia","Boiss.",130 729,"","Teesdalia","R.Br.",130 730,"","Teesdaliopsis","(Willk.) Rothm.",130 731,"","Tetracme","Bunge",130 21512,"","Tetracmidion","Korsh.",130 18768,"","Tetrapoma","Turcz. ex Fisch. & C.A.Mey.",130 732,"","Texiera","Jaub. & Spach",130 733,"","Thellungiella","O.E.Schulz",130 734,"","Thelypodiopsis","Rydb.",130 735,"","Thelypodium","Endl.",130 736,"","Thlaspeocarpa","C.A.Sm.",130 737,"","Thlaspi","L.",130 24723,"","Thlaspiceras","F.K.Mey.",130 738,"","Thylacodraba","(Nabelek) O.E.Schulz",130 739,"","Thysanocarpus","Hook.",130 740,"","Torularia","O.E.Schulz",130 741,"","Trachystoma","O.E.Schulz",130 18774,"","Trichochiton","Kom.",130 742,"","Trichotolinum","O.E.Schulz",130 743,"","Triplopetalum","Nyar.",130 744,"","Trochiscus","O.E.Schulz",130 745,"","Tropidocarpum","Hook.",130 24741,"","Turrita","Wallr.",130 746,"","Turritis","L.",130 747,"","Uranodactylus","Gilli",130 748,"","Urbanodoxa","Muschl.",130 24729,"","Vania","F.K.Mey.",130 749,"","Vella","DC.",130 16308,"","Veselskya","Opiz",130 750,"","Vesicaria","Adans.",130 18739,"","Vogelia","Medik.",130 16309,"","Vvedenskyella","Botsch.",130 751,"","Wakilia","Gilli",130 752,"","Warea","Nutt.",130 18777,"","Wasabia","Matsum.",130 753,"","Weberbauera","Gilg & Muschl.",130 754,"","Werdermannia","O.E.Schulz",130 18727,"","Winklera","Regel",130 755,"","Xerodraba","Skottsb.",130 16310,"","Zederbauera","H.P.Fuchs",130 756,"","Zerdana","Boiss.",130 757,"","Zilla","Forssk.",130 3707,"","Axinandra","Thwaites",131 3952,"","Crypteronia","Blume",131 3953,"","Dactylocladus","Oliv.",131 22639,"","Naxiandra","(Baill.) Krasser",131 1547,"","Ctenolophon","Oliv.",132 4029,"","Abobra","Naudin",133 4030,"","Acanthosicyos","Welw. ex Hook.f.",133 20376,"","Acanthosicyus","Post & Kuntze",133 4031,"","Actinostemma","Griff.",133 20370,"","Adenopus","Benth.",133 20424,"","Aechmandra","Arn.",133 20469,"","Ahzolia","Standl. & Steyerm.",133 20420,"","Allagosperma","M.Roem.",133 4032,"","Alsomitra","(Blume) M.Roem.",133 20422,"","Alternasemina","Silva Manso",133 4033,"","Ampelosicyos","Thouars",133 22656,"","Anacaona","Alain",133 20359,"","Anguina","Mill.",133 15941,"","Anguria","Jacq.",133 20392,"","Anguria","Mill.",133 20434,"","Anguriopsis","J.R.Johnst.",133 4034,"","Anisosperma","Silva Manso",133 20460,"","Anomalosicyos","Gentry",133 20443,"","Antagonia","Griseb.",133 4035,"","Apatzingania","Dieterle",133 4036,"","Apodanthera","Arn.",133 20444,"","Arkezostis","Raf.",133 20483,"","Atheranthera","Mast.",133 4037,"","Bambekea","Cogn.",133 4038,"","Benincasa","Savi",133 20399,"","Bisedmondia","Hutch.",133 4039,"","Biswarea","Cogn.",133 20436,"","Blastania","Kotschy & Peyr.",133 4040,"","Bolbostemma","Franquet",133 4041,"","Brandegea","Cogn.",133 4042,"","Bryonia","L.",133 20425,"","Bryonopsis","Arn.",133 20380,"","Calpidosicyos","Harms",133 4043,"","Calycophysum","H.Karst. & Triana",133 20435,"","Calyptrosicyos","Keraudren",133 20377,"","Camolenga","Post & Kuntze",133 4044,"","Cayaponia","Silva Manso",133 20426,"","Cedrostis","Post & Kuntze",133 20396,"","Cephalandra","Schrad. ex Eckl. & Zeyh.",133 4045,"","Cephalopentandra","Chiov.",133 20427,"","Cerasiocarpum","Hook.f.",133 4046,"","Ceratosanthes","Burm. ex Adans.",133 4047,"","Chalema","Dieterle",133 20470,"","Chayota","Jacq.",133 20471,"","Chocho","Adans.",133 20445,"","Cionandra","Griseb.",133 4048,"","Cionosicyos","Griseb.",133 20395,"","Cionosicys","Griseb.",133 4049,"","Citrullus","Schrad. ex Eckl. & Zeyh.",133 20465,"","Cladocarpa","(H.St.John) H.St.John",133 20415,"","Cladosicyos","Hook.f.",133 4050,"","Coccinia","Wight & Arn.",133 4051,"","Cogniauxia","Baill.",133 20378,"","Cogniauxiella","Baill.",133 20393,"","Colocynthis","Mill.",133 20428,"","Coniandra","Schrad. ex Eckl. & Zeyh.",133 4052,"","Corallocarpus","Welw. ex Hook.f.",133 20416,"","Corynosicyos","F.Muell.",133 20466,"","Costarica","L.D.Gomez",133 4053,"","Cremastopus","Paul G.Wilson",133 4054,"","Ctenolepis","Hook.f.",133 20437,"","Ctenopsis","Naudin",133 4055,"","Cucumella","Chiov.",133 20357,"","Cucumeroides","Gaertn.",133 4056,"","Cucumeropsis","Naudin",133 4057,"","Cucumis","L.",133 4058,"","Cucurbita","L.",133 4059,"","Cucurbitella","Walp.",133 20413,"","Cucurbitula","(M.Roem.) Post & Kuntze",133 4060,"","Cyclanthera","Schrad.",133 4061,"","Cyclantheropsis","Harms",133 20429,"","Cyrtonema","Schrad. ex Eckl. & Zeyh.",133 4062,"","Dactyliandra","(Hook.f.) Hook.f.",133 20362,"","Delognaea","Cogn.",133 4063,"","Dendrosicyos","Balf.f.",133 20446,"","Dermophylla","Silva Manso",133 20442,"","Dicaelosperma","E.G.O.Mull. & Pax",133 20441,"","Dicaelospermum","C.B.Clarke",133 20423,"","Diclidostigma","Kunze",133 4064,"","Dicoelospermum","C.B.Clarke",133 22658,"","Dieterlea","Lott",133 16715,"","Dieudonnaea","Cogn.",133 20381,"","Dimorphoclamys","Hook.f.",133 4065,"","Diplocyclos","(Endl.) Post & Kuntze",133 20411,"","Diplocyclus","Post & Kuntze",133 20456,"","Discanthera","Torr. & A.Gray",133 4066,"","Doyerea","Grosourdy",133 20447,"","Druparia","Silva Manso",133 20448,"","Dryparia","Post & Kuntze",133 4067,"","Ecballium","A.Rich.",133 4068,"","Echinocystis","Torr. & A.Gray",133 4069,"","Echinopepon","Naudin",133 4070,"","Edgaria","C.B.Clarke",133 20400,"","Edmondia","Cogn.",133 4071,"","Elateriopsis","Ernst",133 20394,"","Elaterium","Mill.",133 15942,"","Elaterium","Jacq.",133 20476,"","Enkylia","Griff.",133 20358,"","Eopepon","Naudin",133 20382,"","Eulenburgia","Pax",133 4072,"","Eureiandra","Hook.f.",133 20379,"","Euryandra","Hook.f.",133 20484,"","Feuillaea","Gled.",133 20485,"","Feuillea","Kuntze",133 4073,"","Fevillea","L.",133 15943,"","Frantzia","Pittier",133 4074,"","Gerrardanthus","Harv. ex Hook.f.",133 20430,"","Gijefa","(M.Roem.) Post & Kuntze",133 4075,"","Gomphogyne","Griff.",133 4076,"","Gurania","(Schltdl.) Cogn.",133 4077,"","Guraniopsis","Cogn.",133 4078,"","Gymnopetalum","Arn.",133 4079,"","Gynostemma","Blume",133 4080,"","Halosicyos","Mart.Crov.",133 4081,"","Hanburia","Seem.",133 20417,"","Harlandia","Hance",133 4082,"","Helmontia","Cogn.",133 4083,"","Hemsleya","Cogn. ex F.B.Forbes & Hemsl.",133 4084,"","Herpetospermum","Wall. ex Hook.f.",133 20366,"","Heterosicyos","Welw. ex Hook.f.",133 20458,"","Heterosicyos","(S.Watson) Cockerell",133 20367,"","Heterosicyus","Post & Kuntze",133 20451,"","Hexameria","Torr. & A.Gray",133 4085,"","Hodgsonia","Hook.f. & Thomson",133 20391,"","Hymenosicyos","Chiov.",133 20487,"","Hypanthera","Silva Manso",133 4086,"","Ibervillea","Greene",133 20412,"","Ilocania","Merr.",133 4087,"","Indofevillea","Chatterjee",133 20360,"","Involucraria","Ser.",133 20356,"","Joliffia","Bojer ex Delile",133 20418,"","Juchia","M.Roem.",133 20479,"","Juppia","Merr.",133 20419,"","Karivia","Arn.",133 4088,"","Kedrostis","Medik.",133 4089,"","Lagenaria","Ser.",133 20421,"","Landersia","Macfad.",133 4090,"","Lemurosicyos","Keraudren",133 4091,"","Luffa","Mill.",133 20482,"","Macrozanonia","(Cogn.) Cogn.",133 4092,"","Marah","Kellogg",133 22149,"","Maximowiczia","Cogn.",133 20452,"","Megarrhiza","Torr. & A.Gray",133 4093,"","Melancium","Naudin",133 20405,"","Mellouia","Gasp.",133 20390,"","Melo","Mill.",133 20404,"","Melopepo","Mill.",133 4094,"","Melothria","L.",133 4095,"","Melothrianthus","Mart.Crov.",133 20453,"","Micrampelis","Raf.",133 4096,"","Microsechium","Naudin",133 20474,"","Mitrosicyos","Maxim.",133 4097,"","Momordica","L.",133 4098,"","Muellerargia","Cogn.",133 4099,"","Mukia","Arn.",133 20383,"","Muricia","Lour.",133 4100,"","Myrmecosicyos","C.Jeffrey",133 20488,"","Nandiroba","Adans.",133 4101,"","Neoalsomitra","Hutch.",133 4102,"","Neoluffa","Chakrav.",133 20384,"","Neurosperma","Raf.",133 20385,"","Neurospermum","Bartl.",133 20386,"","Nevrosperma","Raf.",133 20489,"","Nhandiroba","Adans.",133 20455,"","Nietoa","Seem. ex W.Schaffn.",133 14195,"","Nothoalsomitra","Telford",133 22659,"","Odosicyos","Keraudren",133 4103,"","Oreosyce","Hook.f.",133 20406,"","Ozodycus","Raf.",133 4104,"","Parasicyos","Dieterle",133 20480,"","Penar-Valli","Adans.",133 20481,"","Penarvallia","Post & Kuntze",133 4105,"","Penelopeia","Urb.",133 20401,"","Pentaclathra","Endl.",133 20407,"","Pepo","Mill.",133 20368,"","Peponia","Naudin",133 20369,"","Peponiella","Kuntze",133 4106,"","Peponium","Engl.",133 4107,"","Peponopsis","Naudin",133 20449,"","Perianthopodus","Silva Manso",133 20478,"","Pestalozzia","Zoll. & Moritzi",133 20397,"","Physedra","Hook.f.",133 20408,"","Pileocalyx","Gasp.",133 20414,"","Pilogyne","Eckl. ex Schrad.",133 20431,"","Pisosperma","Sond.",133 20402,"","Pittiera","Cogn.",133 20361,"","Platygonia","Naudin",133 20472,"","Polakowskia","Pittier",133 4108,"","Polyclathra","Bertol.",133 20475,"","Pomasterion","Miq.",133 20372,"","Poppya","Neck. ex M.Roem.",133 4109,"","Posadaea","Cogn.",133 4110,"","Praecitrullus","Pangalo",133 20438,"","Prasopepon","Naudin",133 4111,"","Pseudocyclanthera","Mart.Crov.",133 20457,"","Pseudoechinopepon","(Cogn.) Cockerell",133 4112,"","Pseudosicydium","Harms",133 4113,"","Psiguria","Neck. ex Arn.",133 4114,"","Pteropepon","(Cogn.) Cogn.",133 4115,"","Pterosicyos","Brandegee",133 20440,"","Rampinia","C.B.Clarke",133 22148,"","Ranugia","(Schltdl.) Post & Kuntze",133 20387,"","Raphanistrocarpus","(Baill.) Pax",133 20388,"","Raphanocarpus","Hook.f.",133 4116,"","Raphidiocystis","Hook.f.",133 20432,"","Rhynchocarpa","Schrad. ex Endl.",133 20454,"","Rhytidostylis","Rchb.",133 20403,"","Roseanthus","Cogn.",133 4117,"","Ruthalicia","C.Jeffrey",133 4119,"","Rytidostylis","Hook. & Arn.",133 20467,"","Sarx","H.St.John",133 4121,"","Schizocarpum","Schrad.",133 4122,"","Schizopepon","Maxim.",133 20439,"","Schizostigma","Arn.",133 20363,"","Scotanthus","Naudin",133 4123,"","Sechiopsis","Naudin",133 4124,"","Sechium","P.Browne",133 4125,"","Selysia","Cogn.",133 4126,"","Seyrigia","Keraudren",133 4127,"","Sicana","Naudin",133 4128,"","Sicydium","Schltdl.",133 19320,"","Sicyocarya","(A.Gray) H.St.John",133 20461,"","Sicyocaulis","Wiggins",133 20462,"","Sicyoides","Mill.",133 4129,"","Sicyos","L.",133 4130,"","Sicyosperma","A.Gray",133 20463,"","Sicyus","Clem.",133 4131,"","Siolmatra","Baill.",133 4132,"","Siraitia","Merr.",133 20459,"","Skottsbergiliana","H.St.John",133 4133,"","Solena","Lour.",133 20371,"","Sphaerosicyos","Hook.f.",133 22657,"","Sphenantha","Schrad.",133 20398,"","Staphylosyce","Hook.f.",133 20464,"","Sycios","Medik.",133 4134,"","Tecunumania","Standl. & Steyerm.",133 4135,"","Telfairia","Hook.",133 4136,"","Thladiantha","Bunge",133 20433,"","Toxanthera","Hook.f.",133 20373,"","Trevauxia","Steud.",133 20374,"","Trevouxia","Scop.",133 20450,"","Trianosperma","(Torr. & A.Gray) Mart.",133 22150,"","Triceratia","A.Rich.",133 20473,"","Triceros","Griff.",133 4137,"","Trichosanthes","L.",133 4138,"","Tricyclandra","Keraudren",133 20364,"","Tripodanthera","M.Roem.",133 4139,"","Trirostellum","Z.P.Wang & Q.Z.Xie",133 20409,"","Tristemon","Scheele",133 4140,"","Trochomeria","Hook.f.",133 4141,"","Trochomeriopsis","Cogn.",133 4142,"","Tumamoca","Rose",133 20375,"","Turia","Forssk. ex J.F.Gmel.",133 4143,"","Vaseyanthus","Cogn.",133 20365,"","Warea","C.B.Clarke",133 4144,"","Wilbrandia","Silva Manso",133 4145,"","Xerosicyos","Humbert",133 4146,"","Zanonia","L.",133 4147,"","Zehneria","Endl.",133 4148,"","Zombitsia","Keraudren",133 20389,"","Zucca","Comm. ex Juss.",133 4149,"","Zygosicyos","Humbert",133 20238,"","Ackama","A.Cunn.",134 20236,"","Acrophyllum","Benth.",134 3370,"","Acsmithia","Hoogland",134 3371,"","Aistopetalum","Schltr.",134 3372,"","Anodopetalum","A.Cunn. ex Endl.",134 3373,"","Aphanopetalum","Endl.",134 20245,"","Arnoldia","Blume",134 3397,"","Bauera","Banks ex Andr.",134 20232,"","Belangera","Cambess.",134 20239,"","Betchea","Schltr.",134 3374,"","Caldcluvia","D.Don",134 3375,"","Callicoma","Andrews",134 24462,"","Calycomis","R.Br. ex Nees & Sinning",134 3376,"","Calycomis","D.Don",134 3377,"","Ceratopetalum","Sm.",134 3378,"","Codia","J.R.Forst. & G.Forst.",134 20235,"","Cremnobates","Ridl.",134 3379,"","Cunonia","L.",134 20240,"","Dichynchosia","Mull.Berol.",134 20241,"","Dirhynchosia","Blume",134 3381,"","Geissois","Labill.",134 3382,"","Gillbeea","F.Muell.",134 3383,"","Gumillea","Ruiz & Pav.",134 3384,"","Lamanonia","Vell.",134 20246,"","Leiospermum","D.Don",134 16462,"","Oosterdickia","Boehm.",134 20242,"","Opocunonia","Schltr.",134 20247,"","Ornithrophus","Bojer ex Engl.",134 3385,"","Pancheria","Brongn. & Gris",134 20229,"","Pfeifferago","Kuntze",134 3386,"","Platylophus","D.Don",134 20234,"","Platyptelea","J.Drumm. ex Harv.",134 20233,"","Polystemon","D.Don",134 3387,"","Pseudoweinmannia","Engl.",134 20248,"","Pterophylla","D.Don",134 3388,"","Pullea","Schltr.",134 3389,"","Schizomeria","D.Don",134 3390,"","Spiraeanthemum","A.Gray",134 20243,"","Spiraeopsis","Miq.",134 20244,"","Stollaea","Schltr.",134 20231,"","Stutzeria","F.Muell.",134 20237,"","Trimerisma","C.Presl",134 3391,"","Vesselowskya","Pamp.",134 3392,"","Weinmannia","L.",134 20249,"","Windmannia","P.Browne",134 13412,"","Actinostrobus","Miq.",135 13413,"","Arceuthos","Antoine & Kotschy",135 13414,"","Austrocedrus","Florin & Boutelje",135 24899,"","Biota","(D.Don) Endl.",135 13415,"","Callitris","Vent.",135 13416,"","Calocedrus","Kurz",135 13417,"","Chamaecyparis","Spach",135 16736,"x","Cupressocyparis","Dallim.",135 13418,"","Cupressus","L.",135 13419,"","Diselma","Hook.f.",135 13420,"","Fitzroya","Hook.f. ex Lindl.",135 13421,"","Fokienia","A.Henry & H.H.Thomas",135 24897,"","Heyderia","K.Koch",135 13422,"","Juniperus","L.",135 13423,"","Libocedrus","Endl.",135 13424,"","Microbiota","Kom.",135 13425,"","Neocallitropsis","Florin",135 13426,"","Papuacedrus","H.L.Li",135 13427,"","Pilgerodendron","Florin",135 24898,"","Platycladus","Spach",135 24896,"","Sabina","Mill.",135 13428,"","Tetraclinis","Mast.",135 13429,"","Thuja","L.",135 13430,"","Thujopsis","Siebold & Zucc. ex Endl.",135 13431,"","Widdringtonia","Endl.",135 11679,"","Cyanastrum","Oliv.",136 18868,"","Schoenlandia","Cornu",136 21746,"","Actinophlebia","C.Presl",137 15944,"","Alsophila","R.Br.",137 21747,"","Amphicosmia","Gardner",137 21748,"","Chnoophora","Kaulf.",137 15945,"","Cnemidaria","C.Presl",137 21749,"","Cormiophyllum","Newman",137 13547,"","Cyathea","Sm.",137 21750,"","Dichorexia","C.Presl",137 21751,"","Dicranophlebia","(Mart.) Lindl.",137 21752,"","Disphenia","C.Presl",137 21753,"","Eatoniopteris","J.Bommer",137 21754,"","Fourniera","J.Bommer ex E.Fourn.",137 21755,"","Gymnopremnon","Lindig",137 21743,"","Gymnosphaera","Blume",137 21756,"","Halophlebia","(Mart.) Lindl.",137 21757,"","Hemistegia","C.Presl",137 21744,"","Hemitelia","R.Br.",137 21758,"","Microstegnus","C.Presl",137 15946,"","Nephelea","R.M.Tryon",137 21745,"","Schizocaena","J.Sm. ex Hook.",137 15947,"","Sphaeropteris","Bernh.",137 21759,"","Thysanobotrya","Alderw.",137 21760,"","Trachypremnon","Lindig",137 15948,"","Trichipteris","C.Presl",137 13446,"","Cycas","L.",138 12416,"","Asplundia","Harling",139 12417,"","Carludovica","Ruiz & Pav.",139 25558,"","Chorigyne","R.Erikss.",139 12418,"","Cyclanthus","Poit.",139 24318,"","Dianthoveus","Hammel & Wilder",139 12419,"","Dicranopygium","Harling",139 12420,"","Evodianthus","Oerst.",139 12421,"","Ludovia","Brongn.",139 12422,"","Pseudoludovia","Harling",139 12423,"","Schultesiophytum","Harling",139 12424,"","Sphaeradenia","Harling",139 12425,"","Stelestylis","Drude",139 12426,"","Thoracocarpus","Harling",139 9220,"","Asepalum","Marais",140 9221,"","Cyclocheilon","Oliv.",140 12575,"","Amphibolis","C.Agardh",141 12576,"","Cymodocea","K.Koenig",141 12577,"","Halodule","Endl.",141 19209,"","Pectinella","J.M.Black",141 19210,"","Phycoschoenus","(Asch.) Nakai",141 12579,"","Syringodium","Kutz.",141 12580,"","Thalassodendron","Hartog",141 10168,"","Cynomorium","L.",142 15951,"","Abildgaardia","Vahl",143 25035,"","Acorellus","Palla",143 12634,"","Acriulus","Ridl.",143 12635,"","Actinoschoenus","Benth.",143 24633,"","Actinoscirpus","(Ohwi) R.W.Haines & Lye",143 12636,"","Afrotrilepis","(Gilly) J.Raynal",143 12637,"","Alinula","J.Raynal",143 19229,"","Amphiscirpus","Oteng-Yeb.",143 12638,"","Androtrichum","(Brongn.) Brongn.",143 25036,"","Anosporum","Nees",143 12639,"","Arthrostylis","R.Br.",143 12640,"","Ascolepis","Nees ex Steud.",143 12641,"","Ascopholis","C.E.C.Fisch.",143 19231,"","Asterochaete","Nees",143 19228,"","Baeothryon","A.Dietr.",143 12642,"","Baumea","Gaudich.",143 12643,"","Becquerelia","Brongn.",143 12644,"","Bisboeckelera","Kuntze",143 19225,"","Blepharolepis","Nees",143 25037,"","Blysmocarex","N.A.Ivanova",143 23236,"","Blysmopsis","Oteng-Yeb.",143 12645,"","Blysmus","Panz. ex Schult.",143 17021,"","Boeckeleria","T.Durand",143 14814,"","Bolboschoenus","(Asch.) Palla",143 12646,"","Bulbostylis","Kunth",143 12647,"","Calyptrocarya","Nees",143 17034,"","Capitularia","J.V.Suringar",143 12648,"","Capitularina","Kern",143 12649,"","Carex","L.",143 12650,"","Carpha","Banks & Sol. ex R.Br.",143 19244,"","Catagyna","Hutch. & Dalziel",143 12651,"","Caustis","R.Br.",143 12652,"","Cephalocarpus","Nees",143 25038,"","Chaetocyperus","Nees",143 25039,"","Chaetospora","R.Br.",143 17022,"","Chamaegyne","Suess.",143 12653,"","Chillania","Roiv.",143 19214,"","Chlorocyperus","Rikli",143 23238,"","Chondrachne","R.Br.",143 12654,"","Chorizandra","R.Br.",143 12655,"","Chrysitrix","L.",143 12656,"","Cladium","P.Browne",143 12657,"","Coleochloa","Gilly",143 12658,"","Costularia","C.B.Clarke",143 17026,"","Courtoisia","Nees",143 24112,"","Courtoisina","Sojak",143 12659,"","Crosslandia","W.Fitzg.",143 12660,"","Cryptangium","Schrad. ex Nees",143 15953,"","Cryptopodium","Schrad. ex Nees",143 12661,"","Cyathochaeta","Nees",143 19236,"","Cyathocoma","Nees",143 12662,"","Cymophyllus","Mack. ex Britton & A.Br.",143 12663,"","Cyperus","L.",143 14816,"","Desmoschoenus","Hook.f.",143 19223,"","Dichostylis","P.Beauv.",143 12664,"","Dichromena","Michx.",143 22252,"","Didymiandrum","Gilly",143 12666,"","Diplacrum","R.Br.",143 12667,"","Diplasia","Pers.",143 17023,"","Diplocarex","Hayata",143 12668,"","Dulichium","Pers.",143 19232,"","Ecklonea","Steud.",143 12669,"","Egleria","G.Eiten",143 12670,"","Eleocharis","R.Br.",143 19220,"","Eleogiton","Link",143 19245,"","Elyna","Schrad.",143 19237,"","Elynanthus","Nees",143 12671,"","Epischoenus","C.B.Clarke",143 25040,"","Eriophorella","Holub",143 25041,"","Eriophoropsis","Palla",143 12672,"","Eriophorum","L.",143 22251,"","Erioscirpus","Palla",143 25042,"","Eriospora","Hochst. ex A.Rich.",143 12673,"","Evandra","R.Br.",143 12674,"","Everardia","Ridl.",143 12675,"","Exocarya","Benth.",143 12676,"","Exochogyne","C.B.Clarke",143 12677,"","Ficinia","Schrad.",143 12678,"","Fimbristylis","Vahl",143 19243,"","Fintelmannia","Kunth",143 12679,"","Fuirena","Rottb.",143 12680,"","Gahnia","J.R.Forst. & G.Forst.",143 19215,"","Galilea","Parl.",143 12681,"","Gymnoschoenus","Nees",143 19222,"","Heleocharis","T.Lestib.",143 24917,"","Hellmuthia","Steud.",143 17024,"","Helonema","Suess.",143 19246,"","Hemicarex","Benth.",143 14817,"","Hemicarpha","Nees",143 17025,"","Hemichlaena","Schrad.",143 19221,"","Holoschoenus","Link",143 19240,"","Hoppia","Nees",143 22250,"","Hymenochaeta","P.Beauv.",143 12682,"","Hypolytrum","Rich. ex Pers.",143 19238,"","Ideleria","Kunth",143 24113,"","Indocourtoisia","Bennet & Raizada",143 14818,"","Isolepis","R.Br.",143 23235,"","Juncellus","C.B.Clarke",143 12683,"","Kobresia","Willd.",143 24319,"","Koyamaea","W.W.Thomas & Davidse",143 12684,"","Kyllinga","Rottb.",143 14820,"","Kyllingiella","R.W.Haines & Lye",143 12685,"","Lagenocarpus","Nees",143 19239,"","Lampocarya","R.Br.",143 12686,"","Lepidosperma","Labill.",143 12687,"","Lepironia","Rich.",143 12688,"","Lipocarpha","R.Br.",143 17036,"","Lophocarpus","Boeck.",143 12689,"","Lophoschoenus","Stapf",143 12690,"","Machaerina","Vahl",143 12691,"","Macrochaetium","Steud.",143 12692,"","Mapania","Aubl.",143 12693,"","Mapaniopsis","C.B.Clarke",143 19213,"","Mariscopsis","Cherm.",143 25499,"","Marisculus","Goetgh.",143 17027,"","Mariscus","Vahl",143 25497,"","Maximoviczia","A.P.Khokhr.",143 25498,"","Maximovicziella","A.P.Khokhr.",143 19219,"","Megarrhena","Schrad. ex Nees",143 12694,"","Mesomelaena","Nees",143 12695,"","Microdracoides","Hua",143 12696,"","Micropapyrus","Suess.",143 12698,"","Morelotia","Gaudich.",143 12699,"","Neesenbeckia","Levyns",143 12700,"","Nelmesia","Van der Veken",143 12701,"","Nemum","Desv.",143 19241,"","Neo-Senea","K.Schum. ex H.Pfeiff.",143 17028,"","Neolophocarpus","E.G.Camus",143 24250,"","Oreobolopsis","Koyama & Guagl.",143 12702,"","Oreobolus","R.Br.",143 17029,"","Oreograstis","K.Schum.",143 14821,"","Oxycaryum","Nees",143 12703,"","Paramapania","Uittien",143 25043,"","Pentasticha","Turcz.",143 23237,"","Phacellanthus","Siebold & Zucc.",143 14832,"","Phylloscirpus","C.B.Clarke",143 19218,"","Platylepis","Kunth",143 12704,"","Pleurostachys","Brongn.",143 12705,"","Principina","Uittien",143 12665,"","Pseudoeverardia","Gilly",143 14238,"","Pseudomariscus","Rauschert",143 19233,"","Pseudoschoenus","(C.B.Clarke) Oteng-Yeb.",143 19230,"","Psilocarya","Torr.",143 17031,"","Pteroscleria","Nees",143 12706,"","Ptilanthelium","Steud.",143 17032,"","Pycreus","P.Beauv.",143 12707,"","Queenslandiella","Domin",143 25044,"","Raynalia","Sojak",143 12708,"","Reedia","F.Muell.",143 12709,"","Remirea","Aubl.",143 19234,"","Rhynchocladium","T.Koyama",143 12710,"","Rhynchospora","Vahl",143 14822,"","Rikliella","J.Raynal",143 19242,"","Schoenodendron","Engl.",143 23060,"","Schoenoides","Seberg",143 14823,"","Schoenoplectus","(Rchb.) Palla",143 12711,"","Schoenoxiphium","Nees",143 12712,"","Schoenus","L.",143 25456,"","Scirpidiella","Rauschert",143 12713,"","Scirpodendron","Zipp. ex Kurz",143 14826,"","Scirpoides","Seg.",143 12714,"","Scirpus","L.",143 12715,"","Scleria","Bergius",143 12716,"","Sickmannia","Nees",143 19216,"","Sorostachys","Steud.",143 14824,"","Sphaerocyperus","Lye",143 17033,"","Sphaeromariscus","E.G.Camus",143 19224,"","Stenophyllus","Raf.",143 19226,"","Sumatroscirpus","Oteng-Yeb.",143 12717,"","Syntrinema","H.Pfeiff.",143 12718,"","Tetraria","P.Beauv.",143 12719,"","Tetrariopsis","C.B.Clarke",143 12720,"","Thoracostachyum","Kurz",143 19217,"","Torulinium","Desv.",143 12721,"","Trachystylis","S.T.Blake",143 12722,"","Trianoptiles","Fenzl ex Endl.",143 14825,"","Trichophorum","Pers.",143 12723,"","Trichoschoenus","J.Raynal",143 12724,"","Tricostularia","Nees ex Lehm.",143 12725,"","Trilepis","Nees",143 12726,"","Tylocarya","Nelmes",143 12727,"","Uncinia","Pers.",143 12728,"","Vesicarex","Steyerm.",143 19235,"","Vincentia","Gaudich.",143 12203,"","Voladeria","Benoist",143 12729,"","Volkiella","Merxm. & Czech",143 12730,"","Websteria","S.H.Wright",143 2086,"","Cliftonia","Banks ex C.F.Gaertn.",144 16425,"","Costaea","A.Rich.",144 2087,"","Cyrilla","Garden ex L.",144 2088,"","Purdiaea","Planch.",144 2089,"","Schizocardia","A.C.Sm. & Standl.",144 10515,"","Daphniphyllum","Blume",145 20945,"","Goughia","Wight",145 20946,"","Gyrandra","Wall.",145 12109,"","Dasypogon","R.Br.",146 12110,"","Kingia","R.Br.",146 4155,"","Datisca","L.",147 4156,"","Octomeles","Miq.",147 4157,"","Tetrameles","R.Br.",147 13637,"","Araiostegia","Copel.",148 13638,"","Davallia","Sm.",148 13639,"","Davallodes","(Copel.) Copel.",148 13640,"","Gymnogrammitis","Griff.",148 13641,"","Humata","Cav.",148 13642,"","Leucostegia","C.Presl",148 21899,"","Pachypleuria","(C.Presl) C.Presl",148 21904,"","Paradavallodes","Ching",148 13643,"","Parasorus","Alderw.",148 21901,"","Parestia","C.Presl",148 21900,"","Pteroneura","Fee",148 13644,"","Rumohra","Raddi",148 13645,"","Scyphularia","Fee",148 21902,"","Stenolobus","C.Presl",148 13646,"","Trogostolon","Copel.",148 21903,"","Wibelia","Bernh.",148 3380,"","Davidsonia","F.Muell.",149 100,"","Degeneria","I.W.Bailey & A.C.Sm.",150 21766,"","Adectum","Link",151 21780,"","Anisosorus","Trevis. ex Maxon",151 13553,"","Blotiella","R.M.Tryon",151 21774,"","Cincinalis","Gled.",151 21763,"","Coptidipteris","Nakai & Momose",151 21764,"","Costaricia","H.Christ",151 13554,"","Dennstaedtia","Bernh.",151 25727,"","Emodiopteris","Ching & S.K.Wu",151 21775,"","Eupteris","Newman",151 21776,"","Filix","Ludw.",151 21777,"","Filix-Foemina","Hill ex Farw.",151 21770,"","Fuziifilix","Nakai & Momose",151 21791,"","Guerinia","J.Sm.",151 13555,"","Histiopteris","(J.Agardh) J.Sm.",151 21786,"","Humblotiella","Tardieu",151 13556,"","Hypolepis","Bernh.",151 21785,"","Isoloma","J.Sm.",151 25696,"","Ithycaulon","Copel.",151 21779,"","Lepidocaulon","Copel.",151 13557,"","Leptolepia","Prantl",151 13558,"","Lindsaea","Dryand. ex Sm.",151 21792,"","Lindsaenium","Fee",151 21794,"","Lindsaeopsis","Kuhn",151 21767,"","Litolobium","Newman",151 13559,"","Lonchitis","L.",151 13560,"","Microlepia","C.Presl",151 21781,"","Neuropteris","Desv.",151 21787,"","Odontoloma","J.Sm.",151 13561,"","Odontosoria","Fee",151 13562,"","Oenotrichia","Copel.",151 16719,"","Ormoloma","Maxon",151 21778,"","Ornithopteris","(J.Agardh) J.Sm.",151 13563,"","Orthiopteris","Copel.",151 13564,"","Paesia","A.St.-Hil.",151 21765,"","Paradennstaedtia","Tagawa",151 21768,"","Patania","C.Presl",151 21782,"","Protolindsaya","Copel.",151 13565,"","Pteridium","Gled. ex Scop.",151 13566,"","Saccoloma","Kaulf.",151 21788,"","Sambirania","Tardieu",151 21789,"","Schizolegnia","Alston",151 21790,"","Schizoloma","Gaudich.",151 21772,"","Scyphofilix","Thouars",151 21771,"","Scypholepia","J.Sm.",151 21773,"","Scyphopteris","Raf.",151 21769,"","Sitolobium","Desv.",151 13567,"","Sphenomeris","Maxon",151 21784,"","Stenoloma","Fee",151 21793,"","Synaphlebium","J.Sm.",151 13568,"","Tapeinidium","(C.Presl) C.Chr.",151 21783,"","Wibelia","Fee",151 13569,"","Xyropteris","K.U.Kramer",151 5535,"","Dialypetalanthus","Kuhlm.",152 7048,"","Berneuxia","Decne.",153 7050,"","Diapensia","L.",153 7051,"","Diplarche","Hook.f. & Thomson",153 7052,"","Galax","Sims",153 7053,"","Pyxidanthera","Michx.",153 7054,"","Schizocodon","Siebold & Zucc.",153 7055,"","Shortia","Torr. & A.Gray",153 1983,"","Dichapetalum","Thouars",154 16417,"","Gonypetalum","Ule",154 16418,"","Icacinopsis","Roberty",154 1984,"","Stephanopodium","Poepp.",154 1985,"","Tapura","Aubl.",154 21738,"","Balantium","Kaulf.",155 25726,"","Calochlaena","(Maxon) R.A.White & M.D.Turner",155 13540,"","Cibotium","Kaulf.",155 13541,"","Culcita","C.Presl",155 21739,"","Cystodiopteris","Rauschert",155 13542,"","Cystodium","J.Sm.",155 13543,"","Dicksonia","L'Her.",155 13544,"","Lophosoria","C.Presl",155 21742,"","Panicularia","Colla",155 21741,"","Pinonia","Gaudich.",155 13545,"","Thyrsopteris","Kunze",155 21740,"","Trichosorus","Liebm.",155 4264,"","Alluaudia","(Drake) Drake",156 4265,"","Alluaudiopsis","Humbert & Choux",156 4266,"","Decarya","Choux",156 4267,"","Didierea","Baill.",156 10514,"","Didymeles","Thouars",157 1908,"","Diegodendron","Capuron",158 59,"","Acrotrema","Jack",159 60,"","Adrastaea","DC.",159 22071,"","Candollea","Labill.",159 61,"","Curatella","Loefl.",159 62,"","Davilla","Vand.",159 63,"","Delima","L.",159 64,"","Didesmandra","Stapf",159 65,"","Dillenia","L.",159 66,"","Doliocarpus","Rol.",159 67,"","Hibbertia","Andrews",159 22072,"","Neowormia","Hutch. & Summerh.",159 68,"","Pachynema","R.Br. ex DC.",159 69,"","Pinzona","Mart. & Zucc.",159 22073,"","Reifferscheidia","C.Presl",159 70,"","Schumacheria","Vahl",159 71,"","Tetracera","L.",159 72,"","Trimorphandra","Brongn. & Gris",159 73,"","Trisema","Hook.f.",159 3442,"","Dioncophyllum","Baill.",160 3443,"","Habropetalum","Airy Shaw",160 3444,"","Triphyophyllum","Airy Shaw",160 11864,"","Avetra","H.Perrier",161 16214,"","Borderea","Miegev.",161 11865,"","Dioscorea","L.",161 11866,"","Epipetrum","Phil.",161 25335,"","Nanarepenta","Matuda",161 11867,"","Rajania","L.",161 11868,"","Stenomeris","Planch.",161 11869,"","Tamus","L.",161 2080,"","Dipentodon","Dunn",162 5552,"","Cephalaria","Schrad. ex Roem. & Schult.",163 5553,"","Dipsacus","L.",163 5554,"","Knautia","L.",163 22120,"","Lomelosia","Raf.",163 22118,"","Pseudoscabiosa","Devesa",163 24595,"","Pterocephalidium","G.Lopez",163 5556,"","Pterocephalus","Adans.",163 5557,"","Pycnocomon","Hoffmanns. & Link",163 5558,"","Scabiosa","L.",163 24929,"","Scabiosiopsis","Rech.f.",163 25280,"","Simenia","Szabo",163 22119,"","Sixalix","Raf.",163 5559,"","Succisa","Haller",163 5560,"","Succisella","Beck",163 16864,"","Tremastelma","Raf.",163 13552,"","Dipteris","Reinw.",164 21762,"","Phymatodes","C.Presl",164 1197,"","Anisoptera","Korth.",165 17563,"","Balanocarpus","Bedd.",165 16350,"","Caryolobis","Gaertn.",165 1198,"","Cotylelobium","Pierre",165 1199,"","Dioticarpus","Dunn",165 1200,"","Dipterocarpus","C.F.Gaertn.",165 1201,"","Doona","Thwaites",165 1202,"","Dryobalanops","C.F.Gaertn.",165 17922,"","Duvaliella","F.Heim",165 1203,"","Hopea","Roxb.",165 1204,"","Isoptera","Scheff. ex Burck",165 1205,"","Marquesia","Gilg",165 1206,"","Monoporandra","Thwaites",165 1207,"","Monotes","A.DC.",165 1208,"","Neobalanocarpus","P.S.Ashton",165 17925,"","Pachychlamys","Dyer ex Ridl.",165 17923,"","Pachynocarpus","Hook.f.",165 1209,"","Pakaraimaea","Maguire & P.S.Ashton",165 1210,"","Parashorea","Kurz",165 17926,"","Pentacme","A.DC.",165 16352,"","Pierrea","F.Heim",165 25431,"","Retinodendron","Korth.",165 1211,"","Shorea","Roxb. ex C.F.Gaertn.",165 1212,"","Stemonoporus","Thwaites",165 25429,"","Sunaptea","Griff.",165 25430,"","Synaptea","Kurz",165 1213,"","Upuna","Symington",165 1214,"","Vateria","L.",165 16351,"","Vateriopsis","F.Heim",165 1215,"","Vatica","L.",165 11848,"","Doryanthes","Correa",166 11901,"","Beaucarnea","Lem.",167 11916,"","Calibanus","Rose",167 11937,"","Dasylirion","Zucc.",167 11946,"","Dracaena","Vand. ex L.",167 12030,"","Nolina","Michx.",167 19322,"","Pleomele","Salisb.",167 12057,"","Sansevieria","Thunb.",167 3436,"","Aldrovanda","L.",168 3437,"","Dionaea","Ellis",168 3438,"","Drosera","L.",168 3439,"","Drosophyllum","Link",168 13570,"","Acropelta","Nakai",169 13571,"","Acrophorus","C.Presl",169 21869,"","Acrorumohra","(H.Ito) H.Ito",169 16728,"","Aenigmopteris","Holttum",169 21871,"","Aetopteron","Ehrh. ex House",169 21877,"","Amblia","C.Presl",169 13574,"","Amphiblestra","C.Presl",169 13576,"","Arachniodes","Blume",169 21855,"","Arcypteris","Underw.",169 21860,"","Arthrobotrys","(C.Presl) Lindl.",169 21842,"","Aspidium","Sw.",169 13577,"","Atalopteris","Maxon & C.Chr.",169 16721,"","Ataxipteris","Holttum",169 21845,"","Bathmium","C.Presl ex Link",169 21870,"","Byrsopteris","C.V.Morton",169 13579,"","Camptodium","Fee",169 21846,"","Cardiochlaena","Fee",169 22242,"","Chlamydogramme","Holttum",169 21843,"","Cionidium","T.Moore",169 16727,"","Coveniella","Tindale",169 13580,"","Ctenitis","(C.Chr.) C.Chr.",169 21858,"","Ctenitopsis","Ching ex Tardieu & C.Chr.",169 16729,"","Cyclodium","C.Presl",169 13581,"","Cyclopeltis","J.Sm.",169 21875,"","Cyrtogonellum","Ching",169 21876,"","Cyrtomidictyum","Ching",169 16720,"","Cyrtomium","C.Presl",169 13583,"","Diacalpe","Blume",169 21861,"","Dichasium","(A.Braun) Fee",169 21862,"","Diclisodon","T.Moore",169 21856,"","Dictyopteris","C.Presl",169 13584,"","Dictyoxiphium","Hook.",169 13585,"","Didymochlaena","Desv.",169 24124,"","Dorcapteris","C.Presl",169 21847,"","Dryomenis","Fee ex J.Sm.",169 13588,"","Dryopolystichum","Copel.",169 16724,"","Dryopsis","Holttum & P.J.Edwards",169 13589,"","Dryopteris","Adans.",169 13590,"","Fadyenia","Hook.",169 21863,"","Filix","Seg.",169 21864,"","Filix-Mas","Hill ex Farw.",169 21848,"","Grammatosorus","Regel",169 21872,"","Hemesteum","H.Lev.",169 21841,"","Hemicardion","Fee",169 13592,"","Hemigramma","H.Christ",169 13593,"","Heterogonium","C.Presl",169 13595,"","Hypoderris","R.Br. ex Hook.",169 21873,"","Hypopeltis","Michx.",169 13597,"","Lastreopsis","Ching",169 21849,"","Lenda","Koidz.",169 13598,"","Leptorumohra","(H.Ito) H.Ito",169 13599,"","Lithostegia","Ching",169 21865,"","Lophodium","Newman",169 13600,"","Luerssenia","Kuhn ex Luerss.",169 13603,"","Maxonia","C.Chr.",169 22241,"","Megalastrum","Holttum",169 21850,"","Microbrochis","C.Presl",169 21879,"","Monochlaena","Gaudich.",169 21859,"","Nephrodium","Michx.",169 13604,"","Nothoperanema","(Tagawa) Ching",169 16723,"","Olfersia","Raddi",169 13607,"","Papuapteris","C.Chr.",169 21840,"","Parapolystichum","(Keyserl.) Ching",169 13608,"","Peranema","D.Don",169 13609,"","Phanerophlebia","C.Presl",169 22243,"","Phanerophlebiopsis","Ching",169 21851,"","Phlebiogonium","Fee",169 13610,"","Plecosorus","Fee",169 13611,"","Pleocnemia","C.Presl",169 16726,"","Pleuroderris","Maxon",169 21852,"","Podopeltis","Fee",169 13612,"","Polybotrya","Humb. & Bonpl. ex Willd.",169 21853,"","Polydictyum","C.Presl",169 13613,"","Polystichopsis","(J.Sm.) Holttum",169 13614,"","Polystichum","Roth",169 16725,"","Pseudotectaria","Tardieu",169 13615,"","Psomiocarpa","C.Presl",169 13616,"","Pteridrys","C.Chr. & Ching",169 21867,"","Pteris","Gled. ex Scop.",169 21868,"","Pycnopteris","T.Moore",169 13617,"","Quercifilix","Copel.",169 21844,"","Sagenia","C.Presl",169 21857,"","Sagenopteris","Trevis.",169 21874,"","Sorolepidium","H.Christ",169 21878,"","Soromanes","Fee",169 21839,"","Sphaeropteris","R.Br. ex Wall.",169 13618,"","Stenolepia","Alderw.",169 13619,"","Stenosemia","C.Presl",169 13620,"","Stigmatopteris","C.Chr.",169 13621,"","Tectaria","Cav.",169 13622,"","Tectaridium","Copel.",169 21880,"","Tegularia","Reinw.",169 21854,"","Trichiocarpa","(Hook.) J.Sm.",169 16722,"","Triplophyllum","Holttum",169 8086,"","Duckeodendron","Kuhlm.",170 7253,"","Diospyros","L.",171 7254,"","Euclea","L.",171 22195,"","Idesia","Scop.",171 18028,"","Maba","J.R.Forst. & G.Forst.",171 18029,"","Mabola","Raf.",171 18030,"","Noltia","Schumach. & Thonn.",171 7255,"","Rhaphidanthe","Hiern ex Gurke",171 18027,"","Ropourea","Aubl.",171 18031,"","Royena","L.",171 7256,"","Tetraclis","Hiern",171 12632,"","Ecdeiocolea","F.Muell.",172 10037,"","Elaeagnus","L.",173 10038,"","Hippophae","L.",173 10039,"","Shepherdia","Nutt.",173 1506,"","Aceratium","DC.",174 17039,"","Acronodia","Blume",174 17040,"","Anoniodes","Schltr.",174 17041,"","Antholoma","Labill.",174 1507,"","Aristotelia","L'Her.",174 1508,"","Crinodendron","Molina",174 17042,"","Dicera","J.R.Forst. & G.Forst.",174 1509,"","Dubouzetia","Pancher ex Brongn. & Gris",174 16381,"","Echinocarpus","Blume",174 1510,"","Elaeocarpus","L.",174 17308,"","Ganitrus","Gaertn.",174 17309,"","Monocera","Jack",174 1511,"","Peripentadenia","L.S.Sm.",174 1512,"","Sericolea","Schltr.",174 1513,"","Sloanea","L.",174 17310,"","Tricuspidaria","Ruiz & Pav.",174 1514,"","Vallea","Mutis ex L.f.",174 1097,"","Bergia","L.",175 1098,"","Elatine","L.",175 6797,"","Emblingia","F.Muell.",176 10685,"","Ceratiola","Michx.",177 10686,"","Corema","D.Don",177 10687,"","Empetrum","L.",177 7019,"","Acrotriche","R.Br.",178 7020,"","Andersonia","R.Br.",178 7021,"","Archeria","Hook.f.",178 7022,"","Astroloma","R.Br.",178 7049,"","Brachyloma","Sond.",178 7023,"","Choristemon","H.B.Will.",178 7024,"","Coleanthera","Stschegl.",178 7025,"","Conostephium","Benth.",178 7026,"","Cosmelia","R.Br.",178 7027,"","Cyathodes","Labill.",178 7028,"","Cyathopsis","Brongn. & Gris",178 7029,"","Decatoca","F.Muell.",178 7030,"","Dracophyllum","Labill.",178 7031,"","Epacris","Cav.",178 7032,"","Lebetanthus","Endl.",178 7033,"","Leucopogon","R.Br.",178 7034,"","Lissanthe","R.Br.",178 7035,"","Lysinema","R.Br.",178 7036,"","Melichrus","R.Br.",178 7037,"","Monotoca","R.Br.",178 16878,"","Needhamia","R.Br.",178 7038,"","Needhamiella","L.Watson",178 7039,"","Oligarrhena","R.Br.",178 7040,"","Pentachondra","R.Br.",178 7041,"","Prionotes","R.Br.",178 7042,"","Richea","R.Br.",178 7043,"","Rupicola","Maiden & Betche",178 16877,"","Sphenotoma","R.Br. ex Sweet",178 7044,"","Sprengelia","Sm.",178 7045,"","Styphelia","Sm.",178 7046,"","Trochocarpa","R.Br.",178 24598,"","Woollsia","F.Muell.",178 13389,"","Ephedra","L.",179 21546,"","Allostelites","Borner",180 13461,"","Equisetum","L.",180 21547,"","Hippochaete","J.Milde",180 10045,"","Antidaphne","Poepp. & Endl.",181 24212,"","Basicarpus","Tiegh.",181 10066,"","Eremolepis","Griseb.",181 10068,"","Eubrachion","Hook.f.",181 10073,"","Ixidium","Eichler",181 10081,"","Lepidoceras","Hook.f.",181 22136,"","Myrtobium","Miq.",181 24213,"","Stachyphyllum","Tiegh.",181 3328,"","Eremosyne","Endl.",182 6882,"","Acrostemon","Klotzsch",183 6883,"","Agapetes","D.Don ex G.Don",183 6884,"","Agarista","D.Don ex G.Don",183 6885,"","Agauria","(DC.) Hook.f.",183 7008,"","Allotropa","Torr. & A.Gray",183 6886,"","Ampelothamnus","Small",183 16875,"","Andresia","Sleumer",183 6887,"","Andromeda","L.",183 6888,"","Aniserica","N.E.Br.",183 6889,"","Anomalanthus","Klotzsch",183 6890,"","Anthopteropsis","A.C.Sm.",183 6891,"","Anthopterus","Hook.",183 6892,"","Arachnocalyx","Compton",183 6893,"","Arbutus","L.",183 6894,"","Arcterica","Coville",183 6895,"","Arctostaphylos","Adans.",183 6896,"","Arctous","Nied.",183 24599,"","Azalea","L.",183 18067,"","Befaria","Mutis ex L.",183 6897,"","Bejaria","Mutis ex L.",183 6898,"","Blaeria","L.",183 6899,"","Botryostege","Stapf",183 18071,"","Brossaea","L.",183 18072,"","Brossea","Kuntze",183 6900,"","Bruckenthalia","Rchb.",183 6901,"","Bryanthus","J.G.Gmel.",183 6902,"","Calluna","Salisb.",183 6903,"","Calopteryx","A.C.Sm.",183 20885,"","Cassandra","D.Don",183 6904,"","Cassiope","D.Don",183 6905,"","Cavendishia","Lindl.",183 6906,"","Ceratostema","Juss.",183 20884,"","Chamaedaphne","Moench",183 7009,"","Cheilotheca","Hook.f.",183 7002,"","Chimaphila","Pursh",183 18073,"","Chiogenes","Salisb. ex Torr.",183 6907,"","Cladothamnus","Bong.",183 6908,"","Coccosperma","Klotzsch",183 6909,"","Codonostigma","Klotzsch ex Benth.",183 6910,"","Coilostigma","Klotzsch",183 6911,"","Comarostaphylis","Zucc.",183 16872,"","Corallobotrys","Hook.f.",183 6912,"","Costera","J.J.Sm.",183 6913,"","Craibiodendron","W.W.Sm.",183 6914,"","Daboecia","D.Don",183 25369,"","Decamerium","Nutt.",183 24602,"","Demosthenesia","A.C.Sm.",183 18076,"","Desmogyne","King & Prain",183 18068,"","Desmothamnus","Small",183 15895,"","Didonica","Luteyn & Wilbur",183 6915,"","Dimorphanthera","(Drude) J.J.Sm.",183 6916,"","Diogenesia","Sleumer",183 6917,"","Diplycosia","Blume",183 6918,"","Disterigma","(Klotzsch) Nied.",183 18624,"","Eleutherostemon","Herzog",183 6919,"","Elliottia","Muhl. ex Elliott",183 6920,"","Empedoclesia","Sleumer",183 18633,"","Englerodoxa","Hoerold",183 6921,"","Enkianthus","Lour.",183 6922,"","Epigaea","L.",183 6923,"","Eremia","D.Don",183 6924,"","Eremiella","Compton",183 6925,"","Eremiopsis","N.E.Br.",183 7003,"","Eremotropa","Andres",183 6926,"","Erica","L.",183 6927,"","Ericinella","Klotzsch",183 18626,"","Eurygania","Klotzsch",183 6928,"","Findlaya","Hook.f.",183 25730,"x","Gaulnettya","Marchant",183 6929,"","Gaultheria","Kalm ex L.",183 16740,"x","Gaulthettya","Camp",183 6930,"","Gaylussacia","Kunth",183 6931,"","Gonocalyx","Planch. & Linden",183 6932,"","Grisebachia","Klotzsch",183 6933,"","Harrimanella","Coville",183 7010,"","Hemitomes","A.Gray",183 6934,"","Hexastemon","Klotzsch",183 6935,"","Hornemannia","Vahl",183 16247,"","Hypopitys","Hill",183 6936,"","Kalmia","L.",183 6937,"","Kalmiella","Small",183 6938,"","Kalmiopsis","Rehder",183 23057,"x","Kalmiothamnus","Starling",183 18075,"","Killipiella","A.C.Sm.",183 18123,"","Lagenocarpus","Klotzsch",183 6939,"","Lateropora","A.C.Sm.",183 6940,"","Ledothamnus","Meisn.",183 6941,"","Ledum","L.",183 6942,"","Leiophyllum","(Pers.) R.Hedw.",183 6943,"","Lepterica","N.E.Br.",183 6944,"","Leucothoe","D.Don",183 6945,"","Loiseleuria","Desv.",183 6946,"","Lyonia","Nutt.",183 6947,"","Lysiclesia","A.C.Sm.",183 6948,"","Macleania","Hook.",183 6949,"","Malea","Lundell",183 6950,"","Menziesia","Sm.",183 6951,"","Mischopleura","Wernham ex Ridl.",183 6952,"","Mitrastylus","Alm & T.C.E.Fr.",183 7004,"","Moneses","Salisb. ex Gray",183 7012,"","Monotropa","L.",183 16876,"","Monotropanthum","Andres",183 7013,"","Monotropastrum","Andres",183 7014,"","Monotropsis","Schwein. ex Elliott",183 6953,"","Mycerinus","A.C.Sm.",183 6954,"","Nagelocarpus","Bullock",183 18074,"","Neojunghuhnia","Koord.",183 18069,"","Neopieris","Britton",183 18081,"","Newberrya","Torr.",183 6955,"","Notopora","Hook.f.",183 6956,"","Nuihonia","Dop",183 6957,"","Oreanthes","Benth.",183 18122,"","Oreocallis","Small",183 6958,"","Ornithostaphylos","Small",183 6959,"","Orphanidesia","Boiss. & Balansa",183 6960,"","Orthaea","Klotzsch",183 7005,"","Orthilia","Raf.",183 6961,"","Oxycoccus","Hill",183 6962,"","Oxydendrum","DC.",183 6963,"","Paphia","Seem.",183 6964,"","Pellegrinia","Sleumer",183 16873,"","Pentapera","Klotzsch",183 6965,"","Pentapterygium","Klotzsch",183 6966,"","Periclesia","A.C.Sm.",183 6967,"","Pernettya","Gaudich.",183 6968,"","Pernettyopsis","King & Gamble",183 6969,"","Philippia","Klotzsch",183 6970,"","Phyllodoce","Salisb.",183 16741,"x","Phyllothamnus","C.K.Schneid.",183 6971,"","Pieris","D.Don",183 7015,"","Pityopus","Small",183 6972,"","Platycalyx","N.E.Br.",183 7016,"","Pleuricospora","A.Gray",183 18078,"","Plutarchia","A.C.Sm.",183 24600,"","Polyboea","Klotzsch",183 6973,"","Polyclita","A.C.Sm.",183 24601,"","Proclesia","Klotzsch",183 6974,"","Psammisia","Klotzsch",183 23056,"","Pseudogonocalyx","Bisse & Berazain",183 7017,"","Pterospora","Nutt.",183 7006,"","Pyrola","L.",183 16245,"","Ramischia","Opiz ex Garcke",183 6975,"","Rhododendron","L.",183 6976,"","Rhodothamnus","Rchb.",183 6977,"","Rigiolepis","Hook.f.",183 6978,"","Rusbya","Britton",183 6979,"","Salaxis","Salisb.",183 7018,"","Sarcodes","Torr.",183 6980,"","Satyria","Klotzsch",183 6981,"","Schizococcus","Eastw.",183 18080,"","Schweinitzia","Elliott ex Nutt.",183 6982,"","Scyphogyne","Decne.",183 6983,"","Semiramisia","Klotzsch",183 6984,"","Simocheilus","Klotzsch",183 6985,"","Siphonandra","Klotzsch",183 18079,"","Siphonostema","Griseb.",183 18625,"","Socratesia","Klotzsch",183 16874,"","Sophoclesia","Klotzsch",183 6986,"","Sphyrospermum","Poepp. & Endl.",183 16739,"","Stokoeanthus","E.G.H.Oliv.",183 6987,"","Symphysia","C.Presl",183 6988,"","Sympieza","Licht. ex Roem. & Schult.",183 6989,"","Syndesmanthus","Klotzsch",183 6990,"","Tepuia","Camp",183 6991,"","Thamnus","Klotzsch",183 6992,"","Themistoclesia","Klotzsch",183 6993,"","Therorhodion","(Maxim.) Small",183 6994,"","Thibaudia","Ruiz & Pav.",183 6995,"","Thoracosperma","Klotzsch",183 6996,"","Tripetaleia","Siebold & Zucc.",183 6997,"","Tsusiophyllum","Maxim.",183 15894,"","Utleya","Wilbur & Luteyn",183 6998,"","Vacciniopsis","Rusby",183 6999,"","Vaccinium","L.",183 18070,"","Xolisma","Raf.",183 7000,"","Xylococcus","Nutt.",183 7001,"","Zenobia","D.Don",183 12586,"","Blastocaulon","Ruhland",184 12587,"","Carptotepala","Moldenke",184 12588,"","Comanthera","L.B.Sm.",184 12589,"","Eriocaulon","L.",184 12590,"","Lachnocaulon","Kunth",184 12591,"","Leiothrix","Ruhland",184 12592,"","Mesanthemum","Korn.",184 24634,"","Moldenkeanthus","Morat",184 12593,"","Paepalanthus","Kunth",184 12594,"","Philodice","Mart.",184 17017,"","Rondonanthus","Herzog",184 12595,"","Syngonanthus","Ruhland",184 12596,"","Tonina","Aubl.",184 12597,"","Wurdackia","Moldenke",184 11955,"","Eriospermum","Jacq. ex Willd.",185 1534,"","Aneulophus","Benth.",186 1535,"","Erythroxylum","P.Browne",186 1536,"","Nectaropetalum","Engl.",186 17774,"","Peglera","Bolus",186 1537,"","Pinacopodium","Exell & Mendonca",186 3351,"","Abrophyllum","Hook.f. ex Benth.",187 3352,"","Anopterus","Labill.",187 3353,"","Argophyllum","J.R.Forst. & G.Forst.",187 20220,"","Argyrocalymma","K.Schum. & Lauterb.",187 20221,"","Brachynema","F.Muell.",187 3367,"","Brexia","Noronha ex Thouars",187 3354,"","Carpodetus","J.R.Forst. & G.Forst.",187 20217,"","Chalepoa","Hook.f.",187 3355,"","Choristylis","Harv.",187 4863,"","Corokia","A.Cunn.",187 20218,"","Curraniodendron","Merr.",187 3356,"","Cuttsia","F.Muell.",187 20219,"","Dedea","Baill.",187 20226,"","Defforgia","Lam.",187 20227,"","Desforgia","Steud.",187 20222,"","Diconangia","Adans.",187 20225,"","Dulongia","Kunth",187 3357,"","Escallonia","Mutis ex L.f.",187 3358,"","Forgesia","Comm. ex Juss.",187 3359,"","Itea","L.",187 3368,"","Ixerba","A.Cunn.",187 20223,"","Kurrimia","Wall. ex Meisn.",187 23352,"","Lautea","F.Br.",187 3360,"","Phyllonoma","Willd. ex Schult.",187 1798,"","Platyspermation","Guillaumin",187 3361,"","Polyosma","Blume",187 3363,"","Quintinia","A.DC.",187 20224,"","Reinia","Franch.",187 3369,"","Roussea","Sm.",187 20215,"","Stereoxylon","Ruiz & Pav.",187 3364,"","Tetracarpaea","Hook.",187 20228,"","Tetracarpus","Post & Kuntze",187 20972,"","Thomassetia","Hemsl.",187 3365,"","Tribeles","Phil.",187 3366,"","Valdivia","Gay ex J.Remy",187 20973,"","Venana","Lam.",187 20216,"","Vigieria","Vell.",187 10585,"","Eucommia","Oliv.",188 3394,"","Eucryphia","Cav.",189 20123,"","Aalius","Lam. ex Kuntze",190 10183,"","Acalypha","L.",190 21439,"","Acalyphes","Hassk.",190 10184,"","Acalyphopsis","Pax & K.Hoffm.",190 21201,"","Acanthocaulon","Klotzsch ex Endl.",190 21127,"","Acantholoma","Gaudich. ex Baill.",190 21105,"","Acanthopyxis","Miq. ex Lanj.",190 21198,"","Accia","A.St.-Hil.",190 10185,"","Acidocroton","Griseb.",190 23241,"","Acidocroton","P.Browne",190 10186,"","Acidoton","Sw.",190 21285,"","Acidoton","P.Browne",190 21450,"","Aconceveibum","Miq.",190 10187,"","Actephila","Blume",190 21399,"","Actephilopsis","Ridl.",190 10188,"","Actinostemon","Mart. ex Klotzsch",190 10189,"","Adelia","L.",190 20060,"","Ademo","Post & Kuntze",190 21470,"","Adenoceras","Rchb.f. & Zoll. ex Baill.",190 22263,"","Adenochlaena","Boivin ex Baill.",190 21137,"","Adenoclina","Post & Kuntze",190 10190,"","Adenocline","Turcz.",190 21323,"","Adenocrepis","Blume",190 21508,"","Adenogyne","Klotzsch",190 21173,"","Adenogynum","Rchb.f. & Zoll.",190 10192,"","Adenopeltis","Bertero ex A.Juss.",190 20043,"","Adenopetalum","Klotzsch & Garcke",190 10193,"","Adenophaedra","(Mull.Arg.) Mull.Arg.",190 21338,"","Adenorhopium","Pohl",190 20017,"","Adenorima","Raf.",190 21329,"","Adenoropium","Pohl",190 21113,"","Adisa","Steud.",190 21112,"","Adisca","Blume",190 10194,"","Adriana","Gaudich.",190 21218,"","Aegopicron","Giseke",190 21217,"","Aegopricon","L.f.",190 21216,"","Aegopricum","L.",190 22258,"","Aerisilvaea","Radcl.-Sm.",190 10196,"","Afrotrewia","Pax & K.Hoffm.",190 20018,"","Agaloma","Raf.",190 23225,"","Agelandra","Engl. & Pax",190 21478,"","Agirta","Baill.",190 10197,"","Agrostistachys","Dalzell",190 20117,"","Agyneia","L.",190 20139,"","Agyneja","L.",190 20995,"","Agyneja","Vent.",190 20019,"","Aklema","Raf.",190 10198,"","Alchornea","Sw.",190 10199,"","Alchorneopsis","Mull.Arg.",190 21170,"","Alcineanthus","Merr.",190 21228,"","Alcoceria","Fernald",190 21363,"","Aldinia","Raf.",190 20041,"","Alectoroctonum","Schltdl.",190 10200,"","Aleurites","J.R.Forst. & G.Forst.",190 21415,"","Alevia","Baill.",190 10201,"","Algernonia","Baill.",190 20065,"","Allenia","Ewart",190 20020,"","Allobia","Raf.",190 21472,"","Allosandra","Raf.",190 10202,"","Alphandia","Baill.",190 21085,"","Altora","Adans.",190 10203,"","Amanoa","Aubl.",190 21064,"","Ambinux","Comm. ex Juss.",190 10204,"","Amperea","A.Juss.",190 10205,"","Amyrea","Leandri",190 21195,"","Anabaena","A.Juss.",190 21196,"","Anabaenella","Pax & K.Hoffm.",190 21302,"","Anaua","Miq.",190 21053,"","Anda","A.Juss.",190 21054,"","Andicus","Vell.",190 10206,"","Andrachne","L.",190 21109,"","Androphoranthus","H.Karst.",190 10207,"","Androstachys","Prain",190 21381,"","Angelandra","Endl.",190 23227,"","Angostyles","Benth.",190 16895,"","Angostylidium","(Mull.Arg.) Pax & K.Hoffm.",190 10208,"","Angostylis","Benth.",190 21350,"","Anisepta","Raf.",190 21248,"","Anisonema","A.Juss.",190 20009,"","Anisophyllum","Haw.",190 21392,"","Anisophyllum","Boivin ex Baill.",190 10209,"","Annesijoa","Pax & K.Hoffm.",190 10210,"","Anomalocalyx","Ducke",190 20106,"","Anomospermum","Dalzell",190 21222,"","Anomostachys","(Baill.) Hurus.",190 20042,"","Anthacantha","Lem.",190 10211,"","Anthostema","Juss.",190 10212,"","Antidesma","L.",190 21099,"","Aonikena","Speg.",190 10214,"","Aparisthmium","Endl.",190 21103,"","Aphora","Nutt.",190 20034,"","Aplarina","Raf.",190 10215,"","Apodandra","Pax & K.Hoffm.",190 10216,"","Apodiscus","Hutch.",190 21018,"","Aporosa","Blume",190 10217,"","Aporosella","Chodat",190 10218,"","Aporusa","Blume",190 20114,"","Arachne","(Endl.) Pojark.",190 21249,"","Arachnodes","Gagnep.",190 21269,"","Ardinghalia","Comm. ex Juss.",190 21090,"","Argithamnia","Sw.",190 10219,"","Argomuellera","Pax",190 21092,"","Argothamnia","Spreng.",190 21393,"","Argyra","Noronha ex Baill.",190 21341,"","Argyrodendron","(Endl.) Klotzsch",190 21093,"","Argyrothamnia","Mull.Arg.",190 21091,"","Argytamnia","Duchesne",190 10220,"","Argythamnia","P.Browne",190 10221,"","Aristogeitonia","Prain",190 20044,"","Arthrothamnus","Klotzsch & Garcke",190 10222,"","Ashtonia","Airy Shaw",190 21263,"","Asterandra","Klotzsch",190 21362,"","Astraea","Klotzsch",190 10223,"","Astrocasia","B.L.Rob. & Millsp.",190 10224,"","Astrococcus","Benth.",190 21361,"","Astrogyne","Benth.",190 21309,"","Astylis","Wight",190 16896,"","Ateramnus","P.Browne",190 21419,"","Athroandra","(Hook.f.) Pax & K.Hoffm.",190 21408,"","Athroisma","Griff.",190 21394,"","Aubertia","Chapel. ex Baill.",190 10225,"","Austrobuxus","Miq.",190 21422,"","Autrandra","Pierre ex Prain",190 10226,"","Avellanita","Phil.",190 21461,"","Axenfeldia","Baill.",190 10227,"","Baccaurea","Lour.",190 21039,"","Baccaureopsis","Pax",190 10228,"","Baliospermum","Blume",190 10229,"","Baloghia","Endl.",190 21364,"","Banalia","Raf.",190 21174,"","Baprea","Pierre ex Pax & K.Hoffm.",190 21382,"","Barhamia","Klotzsch",190 21074,"","Barrettia","Sim",190 21038,"","Bellevalia","Roem. & Schult.",190 10230,"","Beltrania","Miranda",190 10231,"","Benoistia","H.Perrier & Leandri",190 21417,"","Bernarda","Adans.",190 10232,"","Bernardia","Mill.",190 21418,"","Bernhardia","Post & Kuntze",190 10233,"","Bertya","Planch.",190 21286,"","Bessera","Spreng.",190 21026,"","Bestram","Adans.",190 10234,"","Beyeria","Miq.",190 20070,"","Beyeriopsis","Mull.Arg.",190 21474,"","Bia","Klotzsch",190 10235,"","Bischofia","Blume",190 21058,"","Bivonea","Raf.",190 21410,"","Bivonia","Spreng.",190 10236,"","Blachia","Baill.",190 21446,"","Bleekeria","Miq.",190 10237,"","Blotia","Leandri",190 10238,"","Blumeodendron","(Mull.Arg.) Kurz",190 10239,"","Bocquillonia","Baill.",190 20037,"","Bojeria","Raf.",190 10240,"","Bonania","A.Rich.",190 10241,"","Borneodendron","Airy Shaw",190 21441,"","Bossera","Leandri",190 21199,"","Botryanthe","Klotzsch",190 10242,"","Botryophora","Hook.f.",190 21154,"","Botryospora","B.D.Jacks.",190 21155,"","Botryphora","Post & Kuntze",190 21159,"","Boutonia","Bojer ex Baill.",190 21376,"","Brachystachys","Klotzsch",190 20131,"","Bradleia","Cav.",190 20133,"","Bradleja","Banks ex Gaertn.",190 21304,"","Brexiopsis","H.Perrier",190 10243,"","Breynia","J.R.Forst. & G.Forst.",190 20120,"","Breyniopsis","Beille",190 10244,"","Bridelia","Willd.",190 17330,"","Bruea","Gaudich.",190 21007,"","Buraeavia","Baill.",190 21009,"","Bureaua","Kuntze",190 21144,"","Caelodepas","Benth.",190 20066,"","Caletia","Baill.",190 20999,"","Calococcus","Kurz ex Teijsm.",190 21141,"","Calpigyne","Blume",190 10245,"","Calycopeplus","Planch.",190 21386,"","Calypteriopetalon","Hassk.",190 21307,"","Calyptosepalum","S.Moore",190 21326,"","Calyptroon","Miq.",190 21434,"","Calyptrospatha","Klotzsch ex Baill.",190 20069,"","Calyptrostigma","Klotzsch",190 21061,"","Camirium","Gaertn.",190 21010,"","Canaca","Guillaumin",190 21017,"","Canariastrum","Engl.",190 20082,"","Candelabria","Hochst.",190 21153,"","Canschi","Adans.",190 21050,"","Caoutchoua","J.F.Gmel.",190 21171,"","Capellenia","Teijsm. & Binn.",190 10246,"","Caperonia","A.St.-Hil.",190 21067,"","Carcia","Raeusch.",190 21208,"","Carumbium","Reinw.",190 21497,"","Carumbium","Kurz",190 10247,"","Caryodendron","H.Karst.",190 25123,"","Casabitoa","Alain",190 21342,"","Cascarilla","Adans.",190 21335,"","Castiglionia","Ruiz & Pav.",190 21271,"","Cathetus","Lour.",190 21429,"","Caturus","L.",190 10248,"","Cavacoa","J.Leonard",190 21106,"","Cavanilla","Vell.",190 21012,"","Cecchia","Chiov.",190 10249,"","Celaenodendron","Standl.",190 10250,"","Celianella","Jabl.",190 21202,"","Cenesmon","Gagnep.",190 21070,"","Centrandra","H.Karst.",190 21145,"","Centrodiscus","Mull.Arg.",190 22264,"","Centrostylis","Baill.",190 10251,"","Cephalocroton","Hochst.",190 22262,"","Cephalocrotonopsis","Pax",190 10252,"","Cephalomappa","Baill.",190 21239,"","Ceramanthus","Hassk.",190 20061,"","Ceraselma","Wittst.",190 21192,"","Ceratococcus","Meisn.",190 20121,"","Ceratogynum","Wight",190 21183,"","Ceratophorus","Sond.",190 21003,"","Chaenotheca","Urb.",190 10253,"","Chaetocarpus","Thwaites",190 20063,"","Chamaesyce","Gray",190 20008,"","Characias","Gray",190 20110,"","Charidia","Baill.",190 10254,"","Chascotheca","Urb.",190 10255,"","Cheilosa","Blume",190 10256,"","Chiropetalum","A.Juss.",190 10257,"","Chlamydojatropha","Pax & K.Hoffm.",190 21175,"","Chloradenia","Baill.",190 21421,"","Chloropatane","Engl.",190 10258,"","Chondrostylis","Boerl.",190 10259,"","Chonocentrum","Pierre ex Pax & K.Hoffm.",190 10260,"","Choriceras","Baill.",190 21008,"","Choriophyllum","Benth.",190 20143,"","Chorisandra","Wight",190 10261,"","Chorisandrachne","Airy Shaw",190 20067,"","Chorizotheca","Mull.Arg.",190 10262,"","Chrozophora","Neck. ex Juss.",190 20068,"","Chrysostemon","Klotzsch",190 20056,"","Chylogala","Fourr.",190 20144,"","Cicca","L.",190 21068,"","Cieca","Adans.",190 21443,"","Cladodes","Lour.",190 10263,"","Cladogelonium","Leandri",190 10264,"","Cladogynos","Zipp. ex Span.",190 21279,"","Clambus","Miers",190 10265,"","Claoxylon","A.Juss.",190 10266,"","Claoxylopsis","Leandri",190 21188,"","Clarorivinia","Pax & K.Hoffm.",190 20071,"","Clavipodium","Desv. ex Gruning",190 21190,"","Clavistylus","J.J.Sm.",190 10267,"","Cleidiocarpon","Airy Shaw",190 10268,"","Cleidion","Blume",190 10269,"","Cleistanthus","Hook.f. ex Planch.",190 23224,"","Cleodora","Klotzsch",190 20089,"","Clistanthus","Post & Kuntze",190 21233,"","Clistranthus","Poit. ex Baill.",190 21507,"","Clonostachys","Klotzsch",190 21167,"","Clonostylis","S.Moore",190 21047,"","Clusiophyllum","Mull.Arg.",190 10270,"","Clutia","L.",190 21083,"","Cluytia","Aiton",190 20125,"","Cluytiandra","Mull.Arg.",190 21084,"","Clytia","Stokes",190 21502,"","Cnemidostachys","Mart.",190 10271,"","Cnesmone","Blume",190 21203,"","Cnesmosa","Blume",190 15901,"","Cnidoscolus","Pohl",190 21451,"","Coccoceras","Miq.",190 20128,"","Coccoglochidion","K.Schum.",190 21325,"","Coccomelia","Reinw.",190 10272,"","Cocconerion","Baill.",190 10273,"","Codiaeum","A.Juss.",190 21388,"","Codonocalyx","Klotzsch ex Baill.",190 21445,"","Coelebogyne","J.Sm.",190 21442,"","Coelobogyne","J.Sm.",190 21142,"","Coelodepas","Hassk.",190 21452,"","Coelodiscus","Baill.",190 21328,"","Collenucia","Chiov.",190 10274,"","Colliguaja","Molina",190 21283,"","Colmeiroa","Reut.",190 21391,"","Comatocroton","H.Karst.",190 10275,"","Cometia","Thouars ex Baill.",190 21223,"","Commia","Lour.",190 21187,"","Comopyena","Kuntze",190 21252,"","Conami","Aubl.",190 10276,"","Conceveiba","Aubl.",190 10277,"","Conceveibastrum","(Mull.Arg.) Pax & K.Hoffm.",190 21498,"","Conosapium","Mull.Arg.",190 10278,"","Cordemoya","Baill.",190 21426,"","Corythea","S.Watson",190 21029,"","Coulejia","Dennst.",190 21206,"","Cremophyllum","Scheidw.",190 19994,"","Crepidaria","Haw.",190 10279,"","Croizatia","Steyerm.",190 21119,"","Crossophora","Link",190 10280,"","Croton","L.",190 21385,"","Crotonanthus","Klotzsch ex Schltdl.",190 10281,"","Crotonogyne","Mull.Arg.",190 10282,"","Crotonogynopsis","Pax",190 10283,"","Crotonopsis","Michx.",190 21118,"","Crozophora","A.Juss.",190 21078,"","Crozophyla","Raf.",190 20064,"","Ctenadena","Prokh.",190 10284,"","Ctenomeria","Harv.",190 10285,"","Cubacroton","Alain",190 10286,"","Cubanthus","(Boiss.) Millsp.",190 10287,"","Cunuria","Baill.",190 21428,"","Cupameni","Adans.",190 21330,"","Curcas","Adans.",190 10288,"","Cyathogyne","Mull.Arg.",190 20021,"","Cyathophora","Raf.",190 21294,"","Cyclostemon","Blume",190 21383,"","Cyclostigma","Klotzsch ex Seem.",190 21131,"","Cynocrambe","Hill",190 10289,"","Cyrtogonone","Prain",190 20985,"","Cystidospermum","Prokh.",190 10290,"","Cyttaranthus","J.Leonard",190 20010,"","Dactylanthes","Haw.",190 21224,"","Dactylostemon","Klotzsch",190 10291,"","Dalechampia","L.",190 21204,"","Dalechampsia","Post & Kuntze",190 10292,"","Dalembertia","Baill.",190 10293,"","Danguyodrypetes","Leandri",190 21351,"","Decarinium","Raf.",190 21423,"","Deflersia","Schweinf. ex Penz.",190 20040,"","Dematra","Raf.",190 21229,"","Dendrobryon","Klotzsch ex Pax & K.Hoffm.",190 10294,"","Dendrocousinsia","Millsp.",190 20145,"","Dendrophyllanthus","S.Moore",190 21082,"","Deonia","Pierre ex Pax",190 21096,"","Desfontaena","Vell.",190 21097,"","Desfontaina","Steud.",190 21098,"","Desfontainea","Rchb.",190 20015,"","Desmonema","Raf.",190 21076,"","Desmostemon","Thwaites",190 10295,"","Deuteromallotus","Pax & K.Hoffm.",190 10296,"","Deutzianthus","Gagnep.",190 19997,"","Diadenaria","Klotzsch & Garcke",190 20141,"","Diasperus","Kuntze",190 21210,"","Dibrachion","Regel",190 21211,"","Dibrachium","Walp.",190 21257,"","Dicholactina","Hance",190 10297,"","Dichostemma","Pierre",190 20045,"","Dichrophyllum","Klotzsch & Garcke",190 20986,"","Dichylium","Britton",190 10298,"","Dicoelia","Benth.",190 21147,"","Diderotia","Baill.",190 10299,"","Didymocistus","Kuhlm.",190 10300,"","Dimorphocalyx","Thwaites",190 20146,"","Dimorphocladium","Britton",190 21462,"","Diplochlamys","Mull.Arg.",190 19999,"","Diplocyathium","Heinr.Schmidt",190 20122,"","Diplomorpha","Griff.",190 21135,"","Diplostylis","Sond.",190 10301,"","Discocarpus","Klotzsch",190 10302,"","Discoclaoxylon","(Mull.Arg.) Pax & K.Hoffm.",190 10303,"","Discocleidion","(Mull.Arg.) Pax & K.Hoffm.",190 10304,"","Discoglypremna","Prain",190 21300,"","Discophis","Raf.",190 21132,"","Discoplis","Raf.",190 10305,"","Dissiliaria","F.Muell.",190 10306,"","Ditaxis","Vahl ex A.Juss.",190 20036,"","Ditritra","Raf.",190 21505,"","Ditrysinia","Raf.",190 10307,"","Ditta","Griseb.",190 21299,"","Dodecastemon","Hassk.",190 10308,"","Dodecastigma","Ducke",190 10309,"","Domohinea","Leandri",190 10310,"","Doryxylon","Zoll.",190 21352,"","Drepadenium","Raf.",190 10311,"","Droceloncia","J.Leonard",190 21063,"","Dryandra","Thunb.",190 10312,"","Drypetes","Vahl",190 21209,"","Duania","Noronha",190 21482,"","Duchola","Adans.",190 21200,"","Durandeeldia","Kuntze",190 10313,"","Duvigneaudia","J.Leonard",190 10314,"","Dysopsis","Baill.",190 21460,"","Echinocroton","F.Muell.",190 20073,"","Echinosphaera","Sieber ex Steud.",190 21454,"","Echinus","Lour.",190 21504,"","Elachocroton","F.Muell.",190 21065,"","Elaeococca","Comm. ex Juss.",190 10315,"","Elaeophora","Ducke",190 10316,"","Elaeophorbia","Stapf",190 21046,"","Elaterioides","Kuntze",190 10317,"","Elateriospermum","Blume",190 21045,"","Elaterispermum","Rchb.",190 10318,"","Eleutherostigma","Pax & K.Hoffm.",190 21349,"","Eluteria","Steud.",190 20147,"","Emblica","Gaertn.",190 21405,"","Enchidium","Jack",190 10319,"","Endadenium","L.C.Leach",190 20038,"","Endoisila","Raf.",190 10320,"","Endospermum","Benth.",190 21368,"","Engelmannia","Klotzsch",190 16033,"","Enriquebeltrania","Rzed.",190 10321,"","Epiprinus","Griff.",190 20137,"","Episteira","Raf.",190 21264,"","Epistylium","Sw.",190 20057,"","Epurga","Fourr.",190 20113,"","Eraeliss","Forssk.",190 10322,"","Eremocarpus","Benth.",190 21258,"","Eriococcus","Hassk.",190 10323,"","Erismanthus","Wall. ex Mull.Arg.",190 21181,"","Erythrocarpus","Blume",190 21128,"","Erythrochylus","Reinw. ex Blume",190 10324,"","Erythrococca","Benth.",190 20011,"","Esula","(Pers.) Haw.",190 20987,"","Euforbia","Ten.",190 20046,"","Eumecanthus","Klotzsch & Garcke",190 10325,"","Euphorbia","L.",190 20047,"","Euphorbiastrum","Klotzsch & Garcke",190 20001,"","Euphorbiodendron","Millsp.",190 20000,"","Euphorbiopsis","H.Lev.",190 20058,"","Euphorbium","Hill",190 21369,"","Eutrophia","Klotzsch",190 21320,"","Everettiodendron","Merr.",190 10326,"","Excoecaria","L.",190 21219,"","Excoecariopsis","Pax",190 10327,"","Fahrenheitia","Rchb.f. & Zoll.",190 21495,"","Falconeria","Royle",190 17318,"","Flueggea","Willd.",190 21235,"","Fluggeopsis","K.Schum.",190 21291,"","Foersteria","Scop.",190 10328,"","Fontainea","Heckel",190 21290,"","Forsteria","Steud.",190 10329,"","Fragariopsis","A.St.-Hil.",190 21305,"","Freireodendron","Mull.Arg.",190 21072,"","Friesia","Spreng.",190 21389,"","Furcaria","Boivin ex Baill.",190 21177,"","Gaedawakka","Kuntze",190 20012,"","Galarhoeus","Haw.",190 21430,"","Galurus","Spreng.",190 10330,"","Garcia","Rohr",190 21321,"","Gatnaia","Gagnep.",190 10331,"","Gavarretia","Baill.",190 21287,"","Geblera","Fisch. & C.A.Mey.",190 21370,"","Geiseleria","Klotzsch",190 21180,"","Gelonium","Roxb. ex Willd.",190 20994,"","Geminaria","Raf.",190 21265,"","Genesiphylla","L'Her.",190 20079,"","Gentilia","Chev. & Beille",190 10332,"","Gitara","Pax & K.Hoffm.",190 10333,"","Givotia","Griff.",190 10334,"","Glochidion","J.R.Forst. & G.Forst.",190 20135,"","Glochidionopsis","Blume",190 20132,"","Glochisandra","Wight",190 10335,"","Glycydendron","Ducke",190 10336,"","Glyphostylus","Gagnep.",190 20085,"","Godefroya","Gagnep.",190 20108,"","Gonatogyne","Klotzsch ex Mull.Arg.",190 10337,"","Grimmeodendron","Urb.",190 10338,"","Grossera","Pax",190 21037,"","Guarania","Wedd. ex Baill.",190 21500,"","Gussonia","Spreng.",190 21308,"","Guya","Frapp.",190 21436,"","Gymnalypha","Griseb.",190 10339,"","Gymnanthes","Sw.",190 21496,"","Gymnobothrys","Wall. ex Baill.",190 21220,"","Gymnostillingia","Mull.Arg.",190 21384,"","Gynamblosis","Torr.",190 20134,"","Gynoon","Juss.",190 21166,"","Haematospermum","Wall.",190 10340,"","Haematostemon","(Mull.Arg.) Pax & K.Hoffm.",190 21356,"","Halecus","Raf.",190 20142,"","Halliophytum","I.M.Johnst.",190 10341,"","Hamilcoa","Prain",190 21459,"","Hancea","Seem.",190 21043,"","Hasskarlia","Baill.",190 21486,"","Hebecocca","Beurl.",190 21484,"","Hecatea","Thouars",190 21194,"","Hedraiostylus","Hassk.",190 21324,"","Hedycarpus","Jack",190 21281,"","Hemicicca","Baill.",190 21295,"","Hemicyclia","Wight & Arn.",190 21236,"","Hemiglochidion","(Mull.Arg.) K.Schum.",190 21354,"","Hendecandras","Eschsch.",190 21041,"","Henribaillonia","Kuntze",190 21353,"","Heptallon","Raf.",190 21444,"","Hermesia","Humb. & Bonpl.",190 20119,"","Heterocalymnantha","Domin",190 21088,"","Heterocalyx","Gagnep.",190 21069,"","Heterochlamys","Turcz.",190 10342,"","Heterocroton","S.Moore",190 10343,"","Hevea","Aubl.",190 21266,"","Hexadena","Raf.",190 19998,"","Hexadenia","Klotzsch & Garcke",190 20116,"","Hexakestra","Hook.f.",190 20115,"","Hexakistra","Hook.f.",190 10344,"","Hexaspermum","Domin",190 10345,"","Heywoodia","Sim",190 10346,"","Hieronima","Allemao",190 21031,"","Hieronyma","Baill.",190 20076,"","Hippocrepandra","Mull.Arg.",190 10347,"","Hippomane","L.",190 10348,"","Holstia","Pax",190 10349,"","Homalanthus","A.Juss.",190 10350,"","Homonoia","Lour.",190 21121,"","Hotnima","Chev.",190 21296,"","Humblotia","Baill.",190 10351,"","Hura","L.",190 10352,"","Hyaenanche","Lamb.",190 21032,"","Hyeronima","Allemao",190 10353,"","Hylandia","Airy Shaw",190 10354,"","Hymenocardia","Wall. ex Lindl.",190 21221,"","Hypocoton","Urb.",190 20124,"","Ibina","Noronha",190 17319,"","Jablonskia","G.L.Webster",190 21122,"","Janipha","Kunth",190 21331,"","Jatropa","Scop.",190 10356,"","Jatropha","L.",190 10357,"","Joannesia","Vell.",190 10358,"","Julocroton","Mart.",190 21080,"","Junghuhnia","Miq.",190 21057,"","Jussieuia","Houst.",190 10359,"","Kairothamnus","Airy Shaw",190 20990,"","Kaluhaburunghos","Kuntze",190 20022,"","Kanopikon","Raf.",190 10360,"","Keayodendron","Leandri",190 21237,"","Kirganelia","Juss.",190 10361,"","Klaineanthus","Pierre ex Prain",190 10362,"","Kleinodendron","L.B.Sm. & Downs",190 21390,"","Klotzschiphytum","Baill.",190 20002,"","Kobiosis","Raf.",190 10363,"","Koilodepas","Hassk.",190 21087,"","Kunstlerodendron","Ridl.",190 21357,"","Kurkas","Raf.",190 21400,"","Kurziodendron","N.P.Balakr.",190 20023,"","Lacanthis","Raf.",190 10364,"","Lachnostylis","Turcz.",190 20074,"","Lambertya","F.Muell.",190 21310,"","Laneasagum","Bedd.",190 10365,"","Lasiococca","Hook.f.",190 10366,"","Lasiocroton","Griseb.",190 21377,"","Lasiogyne","Klotzsch",190 21162,"","Lasiostyles","C.Presl",190 21456,"","Lasipana","Raf.",190 21479,"","Lassia","Baill.",190 20059,"","Lathyris","Trew",190 10367,"","Lautembergia","Baill.",190 20093,"","Lebidiera","Baill.",190 20086,"","Lebidieropsis","Mull.Arg.",190 10368,"","Leeuwenbergia","Letouzey & N.Halle",190 21270,"","Leichhardtia","F.Muell.",190 10369,"","Leidesia","Mull.Arg.",190 21019,"","Leiocarpus","Blume",190 20094,"","Leiopyxis","Miq.",190 21355,"","Leontia","Rchb.",190 20024,"","Lepadena","Raf.",190 21108,"","Lepidococea","Turcz.",190 21020,"","Lepidostachys","Wall.",190 21447,"","Lepidoturus","Baill.",190 21071,"","Leptemon","Raf.",190 21477,"","Leptobotrys","Baill.",190 20078,"","Leptomeria","Sieber",190 10370,"","Leptonema","A.Juss.",190 10371,"","Leptopus","Decne.",190 20048,"","Leptopus","Klotzsch & Garcke",190 21476,"","Leptorhachis","Klotzsch",190 21396,"","Leucadenia","Klotzsch ex Baill.",190 21475,"","Leucandra","Klotzsch",190 10372,"","Leucocroton","Griseb.",190 10373,"","Lingelsheimia","Pax",190 21433,"","Linostachys","Klotzsch ex Schltdl.",190 21297,"","Liodendron","H.Keng",190 21312,"","Liparena","Poit. ex Leman",190 21313,"","Liparene","Baill.",190 20105,"","Lithoxylon","Endl.",190 22266,"","Lobanilia","Radcl.-Sm.",190 20136,"","Lobocarpus","Wight & Arn.",190 10374,"","Loerzingia","Airy Shaw",190 21267,"","Lomanthes","Raf.",190 21006,"","Longetia","Baill.",190 20025,"","Lophobios","Raf.",190 20989,"","Lortia","Rendle",190 21332,"","Loureira","Cav.",190 21165,"","Lumanaja","Blanco",190 21398,"","Luntia","Neck. ex Raf.",190 20055,"","Lyciopsis","(Boiss.) Schweinf.",190 10375,"","Mabea","Aubl.",190 21273,"","Maborea","Aubl.",190 10376,"","Macaranga","Thouars",190 21277,"","Macraea","Wight",190 21380,"","Macrocroton","Klotzsch",190 10377,"","Maesobotrya","Benth.",190 10378,"","Mallotus","Lour.",190 21214,"","Mancanilla","Mill.",190 21215,"","Mancinella","Tussac",190 21123,"","Mandioca","Link",190 10379,"","Manihot","Mill.",190 10380,"","Manihotoides","D.J.Rogers & Appan",190 10381,"","Manniophyton","Mull.Arg.",190 21465,"","Mappa","A.Juss.",190 10382,"","Maprounea","Aubl.",190 10383,"","Mareya","Baill.",190 10384,"","Mareyopsis","Pax & K.Hoffm.",190 10385,"","Margaritaria","L.f.",190 10386,"","Martretia","Beille",190 20109,"","Maschalanthus","Nutt.",190 21469,"","Mecostylis","Kurz ex Teijsm. & Binn.",190 21371,"","Medea","Klotzsch",190 20013,"","Medusea","Haw.",190 21036,"","Megabaria","Pierre ex Hutch.",190 10387,"","Megalostylis","S.Moore",190 10388,"","Megistostigma","Hook.f.",190 21125,"","Meialisa","Raf.",190 10389,"","Meineckia","Baill.",190 10390,"","Melanolepis","Rchb.f. & Zoll.",190 21293,"","Melanthes","Blume",190 21288,"","Melanthesa","Blume",190 21289,"","Melanthesopsis","Mull.Arg.",190 21238,"","Menarda","Comm. ex Juss.",190 21111,"","Mercadoa","Naves",190 10391,"","Mercurialis","L.",190 21438,"","Mercuriastrum","Fabr.",190 21365,"","Merleta","Raf.",190 21336,"","Mesandrinia","Raf.",190 21107,"","Meterana","Raf.",190 10392,"","Mettenia","Griseb.",190 21051,"","Micrandra","Benn. & R.Br.",190 10393,"","Micrandra","Benth.",190 25325,"","Micrandropsis","W.A.Rodrigues",190 10394,"","Micrantheum","Desf.",190 10395,"","Micrococca","Benth.",190 21014,"","Microelus","Wight & Arn.",190 20993,"","Micropetalum","Poit. ex Baill.",190 21327,"","Microsepala","Miq.",190 21501,"","Microstachys","A.Juss.",190 10396,"","Mildbraedia","Pax",190 21030,"","Minutalia","Fenzl",190 21134,"","Mirabellia","Baill.",190 21280,"","Mirobalanus","Rumph.",190 10397,"","Mischodon","Thwaites",190 16897,"","Moacroton","Croizat",190 21276,"","Moeroris","Raf.",190 21133,"","Molina","Gay",190 10398,"","Monadenium","Pax",190 21395,"","Monguia","Chapel. ex Baill.",190 10399,"","Monotaxis","Brongn.",190 10400,"","Moultonianthus","Merr.",190 21333,"","Mozinna","Ortega",190 21172,"","Muricococcum","Chun & F.C.How",190 20026,"","Murtekias","Raf.",190 10401,"","Myladenia","Airy Shaw",190 10402,"","Myricanthe","Airy Shaw",190 21387,"","Myriogomphus","Didr.",190 20092,"","Nanopetalum","Hassk.",190 10403,"","Nealchornea","Huber",190 10404,"","Necepsia","Prain",190 21272,"","Nellica","Raf.",190 10405,"","Neoboutonia","Mull.Arg.",190 21176,"","Neochevaliera","A.Chev. & Beille",190 20080,"","Neogoetzia","Pax",190 10406,"","Neoguillauminia","Croizat",190 14212,"","Neoholstia","Rauschert",190 16898,"","Neojatropha","Pax",190 21114,"","Neomanniophyton","Pax & K.Hoffm.",190 21480,"","Neomphalea","Pax & K.Hoffm.",190 10407,"","Neopalissya","Pax",190 20127,"","Neopeltandra","Gamble",190 21157,"","Neopycnocoma","Pax",190 10408,"","Neoroepera","Mull.Arg. & F.Muell.",190 10409,"","Neoscortechinia","Pax",190 10410,"","Neotrewia","Pax & K.Hoffm.",190 21401,"","Neotrigonostemon","Pax & K.Hoffm.",190 21282,"","Neowawraea","Rock",190 21402,"","Nepenthandra","S.Moore",190 21143,"","Nephrostylus","Gagnep.",190 22265,"","Niedenzua","Pax",190 21250,"","Niruri","Adans.",190 20027,"","Nisomenes","Raf.",190 21240,"","Nymania","K.Schum.",190 21278,"","Nymphanthus","Lour.",190 21372,"","Ocalia","Klotzsch",190 10412,"","Octospermum","Airy Shaw",190 21432,"","Odonteilema","Turcz.",190 21094,"","Odotalon","Raf.",190 10413,"","Oldfieldia","Benth. & Hook.",190 10414,"","Oligoceras","Gagnep.",190 21207,"","Omalanthus","A.Juss.",190 21481,"","Omphalandria","P.Browne",190 10415,"","Omphalea","L.",190 10416,"","Ophellantha","Standl.",190 10417,"","Ophthalmoblapton","Allemao",190 21262,"","Orbicularia","Baill.",190 17320,"","Oreoporanthera","Hutch.",190 21148,"","Orfilea","Baill.",190 20062,"","Ossifraga","Rumph.",190 10418,"","Ostodes","Blume",190 21184,"","Owataria","Matsum.",190 21268,"","Oxalistylis","Baill.",190 21339,"","Oxydectes","Kuntze",190 21464,"","Pachystemon","Blume",190 10419,"","Pachystroma","Mull.Arg.",190 10420,"","Pachystylidium","Pax & K.Hoffm.",190 21013,"","Paivaeusa","Welw.",190 21378,"","Palanostigma","Mart. ex Klotzsch",190 21311,"","Palenga","Thwaites",190 21156,"","Palissya","Baill.",190 21467,"","Panopia","Noronha ex Thouars",190 10421,"","Pantadenia","Gagnep.",190 21315,"","Paracasearia","Boerl.",190 21427,"","Paracelsea","Zoll.",190 20087,"","Paracleisthus","Gagnep.",190 21075,"","Paracroton","Miq.",190 21136,"","Paradenocline","Mull.Arg.",190 10422,"","Paradrypetes","Kuhlm.",190 10423,"","Paragelonium","Leandri",190 10424,"","Paranecepsia","Radcl.-Sm.",190 24603,"","Parapantadenia","Capuron",190 10425,"","Parodiodendron","Hunz.",190 21416,"","Passaea","Baill.",190 10426,"","Pausandra","Radlk.",190 21102,"","Paxiuscula","Herter",190 20039,"","Peccana","Raf.",190 10427,"","Pedilanthus","Neck. ex Poit.",190 20126,"","Peltandra","Wight",190 21179,"","Peniculifera","Ridl.",190 10428,"","Pentabrachion","Mull.Arg.",190 20081,"","Pentameria","Klotzsch ex Baill.",190 21358,"","Penteca","Raf.",190 10429,"","Pera","Mutis",190 21232,"","Peridium","Schott",190 21316,"","Periplexis","Wall.",190 23228,"","Perula","Schreb.",190 20052,"","Petalandra","F.Muell. ex Boiss.",190 20107,"","Petalodiscus","Baill.",190 10430,"","Petalostigma","F.Muell.",190 21412,"","Phaedra","Klotzsch ex Endl.",190 10431,"","Philyra","Klotzsch",190 21468,"","Phocea","Seem.",190 10432,"","Phyllanoa","Croizat",190 21241,"","Phyllanthodendron","Hemsl.",190 10433,"","Phyllanthus","L.",190 21077,"","Phyllaurea","Lour.",190 21100,"","Phyllera","Endl.",190 1872,"","Picrodendron","Griseb.",190 21322,"","Pierardia","Roxb.",190 21373,"","Pilinophyton","Klotzsch",190 10434,"","Pimelodendron","Hassk.",190 10435,"","Piranhea","Baill.",190 16899,"","Piscaria","Piper",190 21458,"","Plagianthera","Rchb.f. & Zoll.",190 10436,"","Plagiostyles","Pierre",190 10437,"","Platygyna","Mercier",190 21284,"","Pleiostemon","Sond.",190 21366,"","Pleopadium","Raf.",190 21055,"","Plesiatropha","Pierre ex Hutch.",190 20016,"","Pleuradena","Raf.",190 10438,"","Plukenetia","L.",190 22267,"","Podadenia","Thwaites",190 10439,"","Podocalyx","Klotzsch",190 21374,"","Podostachys","Klotzsch",190 21420,"","Poggeophyton","Pax",190 10440,"","Pogonophora","Miers ex Benth.",190 21048,"","Pogonophyllum","Didr.",190 10441,"","Poilaniella","Gagnep.",190 15196,"","Poinsettia","Graham",190 10442,"","Polyandra","Leal",190 21413,"","Polyboea","Klotzsch ex Endl.",190 21168,"","Polydragma","Hook.f.",190 10443,"","Poranthera","Rudge",190 21042,"","Poraresia","Gleason",190 21403,"","Prosartema","Gagnep.",190 20996,"","Prosorus","Dalzell",190 10444,"","Protomegabaria","Hutch.",190 10445,"","Pseudagrostistachys","Pax & K.Hoffm.",190 10446,"","Pseudanthus","Sieber ex A.Spreng.",190 10447,"","Pseudocroton","Mull.Arg.",190 20129,"","Pseudoglochidion","Gamble",190 10448,"","Pseudolachnostylis","Pax",190 24289,"","Pseudosagotia","Secco",190 21191,"","Pseudotragia","Pax",190 21146,"","Pseudotrewia","Miq.",190 21161,"","Psilostachys","Turcz.",190 10449,"","Pterococcus","Hassk.",190 10450,"","Ptychopyxis","Miq.",190 17321,"","Putranjiva","Wall.",190 10451,"","Pycnocoma","Benth.",190 21317,"","Pycnosandra","Blume",190 20028,"","Pythius","B.D.Jacks.",190 10452,"","Ramelia","Baill.",190 21242,"","Ramsdenia","Britton",190 21160,"","Redia","Casar.",190 21178,"","Regnaldia","Baill.",190 21243,"","Reidia","Wight",190 20075,"","Reissipa","Steud. ex Klotzsch",190 10453,"","Reutealis","Airy Shaw",190 10454,"","Reverchonia","A.Gray",190 21205,"","Rhopalostylis","Klotzsch ex Baill.",190 21275,"","Rhopium","Schreb.",190 21027,"","Rhytis","Lour.",190 10455,"","Richeria","Vahl",190 10456,"","Richeriella","Pax & K.Hoffm.",190 21138,"","Ricinella","Mull.Arg.",190 10457,"","Ricinocarpos","Desf.",190 21437,"","Ricinocarpus","Kuntze",190 10458,"","Ricinodendron","Mull.Arg.",190 21117,"","Ricinoides","Moench",190 10459,"","Ricinus","L.",190 21298,"","Riseleya","Hemsl.",190 21073,"","Ritchieophyton","Pax",190 21424,"","Rivinoides","Afzel. ex Prain",190 10460,"","Rockinghamia","Airy Shaw",190 20072,"","Roeperia","Spreng.",190 21244,"","Roigia","Britton",190 10461,"","Romanoa","Trevis.",190 21483,"","Ronnowia","Buc'hoz",190 21150,"","Rottlera","Willd. (1797)",190 21453,"","Rottlera","Willd. (1804)",190 21028,"","Rubina","Noronha",190 10462,"","Sagotia","Baill.",190 21340,"","Saipania","Hosok.",190 21193,"","Sajorium","Endl.",190 22257,"","Samaropyxis","Miq.",190 10463,"","Sampantaea","Airy Shaw",190 10464,"","Sandwithia","Lanj.",190 21494,"","Sapiopsis","Mull.Arg.",190 10465,"","Sapium","P.Browne",190 21089,"","Sarcoclinium","Wight",190 21506,"","Sarothrostachys","Klotzsch",190 10466,"","Sauropus","Blume",190 10467,"","Savia","Willd.",190 17322,"","Scagea","McPherson",190 21021,"","Scepa","Lindl.",190 21259,"","Scepasma","Blume",190 22261,"","Schinziophyton","Hutch. ex Radcl.-Sm.",190 21231,"","Schismatopera","Klotzsch",190 20088,"","Schistostigma","Lauterb.",190 21435,"","Schizogyne","Ehrenb. ex Pax",190 21471,"","Schorigeram","Adans.",190 21449,"","Schousboea","Schumach. & Thonn.",190 21348,"","Schradera","Willd.",190 21490,"","Sclerocroton","Hochst.",190 20003,"","Sclerocyathium","Prokh.",190 21169,"","Scortechinia","Hook.f.",190 10468,"","Sebastiania","Spreng.",190 21491,"","Seborium","Raf.",190 10469,"","Securinega","Comm. ex Juss.",190 10470,"","Seidelia","Baill.",190 21359,"","Semilta","Raf.",190 10471,"","Senefeldera","Mart.",190 16900,"","Senefelderopsis","Steyerm.",190 21095,"","Serophyton","Benth.",190 21489,"","Shirakia","Hurus.",190 10472,"","Sibangea","Oliv.",190 21407,"","Silvaea","Hook. & Arn.",190 21186,"","Sinopimelodendron","Tsiang",190 21052,"","Siphonanthus","Schreb. ex Baill.",190 21049,"","Siphonia","Rich.",190 10473,"","Spathiostemon","Blume",190 10474,"","Speranskia","Baill.",190 10475,"","Sphaerostylis","Baill.",190 21301,"","Sphragidia","Thwaites",190 10476,"","Sphyranthera","Hook.f.",190 10477,"","Spirostachys","Sond.",190 21230,"","Spixia","Leandro",190 10478,"","Spondianthus","Engl.",190 22260,"","Stachyandra","J.-F.Leroy ex Radcl.-Sm.",190 10479,"","Stachystemon","Planch.",190 21035,"","Staphysora","Pierre",190 21256,"","Staurothylax","Griff.",190 21081,"","Steigeria","Mull.Arg.",190 21306,"","Stelechanteria","Thouars ex Baill.",190 16901,"","Stenadenium","Pax",190 20090,"","Stenonia","Baill.",190 21104,"","Stenonia","Didr.",190 20991,"","Stenoniella","Kuntze",190 20049,"","Sterigmanthe","Klotzsch & Garcke",190 21033,"","Stilaginella","Tul.",190 21025,"","Stilago","L.",190 21493,"","Stillingfleetia","Bojer",190 10480,"","Stillingia","Garden ex L.",190 21448,"","Stipellaria","Benth.",190 21213,"","Stomatocalyx","Mull.Arg.",190 10481,"","Strophioblachia","Boerl.",190 21463,"","Stylanthus","Rchb.f. & Zoll.",190 21015,"","Stylodiscus","Benn.",190 21110,"","Sumbavia","Baill.",190 10482,"","Sumbaviopsis","J.J.Sm.",190 10483,"","Suregada","Roxb. ex Rottler",190 21185,"","Symphyllia","Baill.",190 10484,"","Synadenium","Boiss.",190 21079,"","Synaspisma","Endl.",190 20118,"","Synastemon","F.Muell.",190 10485,"","Syndyophyllum","K.Schum. & Lauterb.",190 21130,"","Synema","Dulac",190 21254,"","Synexemia","Raf.",190 25421,"","Synostemon","F.Muell.",190 25434,"","Tacarcuna","Huft",190 21499,"","Taeniosapium","Mull.Arg.",190 21466,"","Tanarius","Kuntze",190 10486,"","Tannodia","Baill.",190 10487,"","Tapoides","Airy Shaw",190 21406,"","Telogyne","Baill.",190 10488,"","Tetracarpidium","Pax",190 10489,"","Tetracoccus","Engelm. ex Parry",190 21023,"","Tetractinostigma","Hassk.",190 20130,"","Tetraglochidion","K.Schum.",190 21163,"","Tetraglossa","Bedd.",190 10490,"","Tetraplandra","Baill.",190 21044,"","Tetrorchidiopsis","Rauschert",190 10491,"","Tetrorchidium","Poepp.",190 10492,"","Thecacoris","A.Juss.",190 20112,"","Thelypotzium","Gagnep.",190 10493,"","Thyrsanthera","Pierre ex Gagnep.",190 21379,"","Tiglium","Klotzsch",190 21375,"","Timandra","Klotzsch",190 20029,"","Tirucalia","Raf.",190 19992,"","Tithymaloides","Ortega",190 20050,"","Tithymalopsis","Klotzsch & Garcke",190 19995,"","Tithymalus","Gaertn.",190 20004,"","Tithymalus","Hill",190 20030,"","Torfasadis","Raf.",190 21115,"","Tournesol","Adans.",190 21116,"","Tournesolia","Scop.",190 21011,"","Toxicodendrum","Thunb.",190 21126,"","Trachycaryon","Klotzsch",190 21411,"","Traganthus","Klotzsch",190 10494,"","Tragia","L.",190 10495,"","Tragiella","Pax & K.Hoffm.",190 21503,"","Tragiopsis","H.Karst.",190 20014,"","Treisia","Haw.",190 21149,"","Trevia","L.",190 10496,"","Trewia","L.",190 21492,"","Triadica","Lour.",190 21255,"","Tricarium","Lour.",190 20054,"","Tricherostigma","Boiss.",190 20051,"","Trichosterigma","Klotzsch & Garcke",190 21347,"","Tridesmis","Lour.",190 10497,"","Trigonopleura","Hook.f.",190 10498,"","Trigonostemon","Blume",190 21360,"","Triplandra","Raf.",190 21404,"","Tritaxis","Baill.",190 20031,"","Tumalis","Raf.",190 21409,"","Tylosepalum","Kurz ex Teijsm. & Binn.",190 21414,"","Tyria","Klotzsch ex Endl.",190 20083,"","Tzellemtinia","Chiov.",190 10500,"","Uapaca","Baill.",190 21246,"","Uranthera","Pax & K.Hoffm.",190 21251,"","Urinaria","Medik.",190 21431,"","Usteria","Dennst.",190 20032,"","Vallaris","Raf.",190 21367,"","Vandera","Raf.",190 10501,"","Vaupesia","R.E.Schult.",190 17323,"","Veconcibea","(Mull.Arg.) Pax & K.Hoffm.",190 19993,"","Ventenatia","Tratt.",190 10502,"","Vernicia","Lour.",190 21056,"","Victorinia","Leon",190 21197,"","Vigia","Vell.",190 21001,"","Villanova","Pourr. ex Cutanda",190 10503,"","Voatamalo","Capuron ex Bosser",190 21212,"","Wartmannia","Mull.Arg.",190 10504,"","Wetria","Baill.",190 21158,"","Wetriaria","Pax",190 10505,"","Whyanbeelia","Airy Shaw & B.Hyland",190 10506,"","Wielandia","Baill.",190 21261,"","Williamia","Baill.",190 20998,"","Wurtzia","Baill.",190 20033,"","Xamesike","Raf.",190 21005,"","Xylococcus","R.Br. ex Britten & S.Moore",190 21260,"","Xylophylla","L.",190 20035,"","Zalitea","Raf.",190 20138,"","Zarcoa","Llanos",190 20091,"","Zenkerodendron","Gilg ex Jabl.",190 21337,"","Zimapania","Engl. & Pax",190 10507,"","Zimmermannia","Pax",190 22259,"","Zimmermanniopsis","Radcl.-Sm.",190 21473,"","Zuckertia","Baill.",190 20005,"","Zygophyllidium","(Boiss.) Small",190 20997,"","Zygospermum","Thwaites ex Baill.",190 971,"","Euphronia","Mart. & Zucc.",191 19528,"","Lightia","R.H.Schomb.",191 25486,"","Lightiodendron","Rauschert",191 237,"","Eupomatia","R.Br.",192 107,"","Euptelea","Siebold & Zucc.",193 10675,"","Castanea","Mill.",194 10676,"","Castanopsis","(D.Don) Spach",194 10677,"","Chrysolepis","Hjelmq.",194 24959,"","Colombobalanus","Nixon & Crepet",194 19006,"","Cyclobalanopsis","Oerst.",194 10678,"","Fagus","L.",194 24958,"","Formanodendron","Nixon & Crepet",194 10679,"","Lithocarpus","Blume",194 10680,"","Nothofagus","Blume",194 19007,"","Pasania","Oerst.",194 19008,"","Pasaniopsis","Kudo",194 10681,"","Quercus","L.",194 10682,"","Trigonobalanus","Forman",194 25330,"","Trisynsyne","Baill.",194 851,"","Abatia","Ruiz & Pav.",195 19504,"","Aberia","Hochst.",195 19498,"","Aembilla","Adans.",195 852,"","Ahernia","Merr.",195 16314,"","Antinisa","(Tul.) Hutch.",195 853,"","Aphaerema","Miers",195 854,"","Aphloia","(DC.) Benn.",195 16315,"","Arechavaletaia","Speg.",195 19509,"","Asteriastigma","Bedd.",195 856,"","Azara","Ruiz & Pav.",195 857,"","Baileyoxylon","C.T.White",195 858,"","Banara","Aubl.",195 859,"","Bartholomaea","Standl. & Steyerm.",195 860,"","Bembicia","Oliv.",195 861,"","Bennettiodendron","Merr.",195 862,"","Berberidopsis","Hook.f.",195 19505,"","Bergsmia","Blume",195 863,"","Bivinia","Jaub. ex Tul.",195 864,"","Buchnerodendron","Gurke",195 865,"","Byrsanthus","Guill.",195 866,"","Calantica","Jaub. ex Tul.",195 867,"","Caloncoba","Gilg",195 868,"","Camptostylus","Gilg",195 869,"","Carpotroche","Endl.",195 870,"","Carrierea","Franch.",195 871,"","Casearia","Jacq.",195 19501,"","Cathayeia","Ohwi",195 19499,"","Cerolepis","Pierre",195 24285,"","Chiangiodendron","Wendt",195 872,"","Chlorocarpa","Alston",195 873,"","Dasylepis","Oliv.",195 19508,"","Dasypetalum","Pierre ex A.Chev.",195 874,"","Dendrostigma","Gleason",195 875,"","Dendrostylis","H.Karst. & Triana",195 876,"","Dissomeria","Hook.f. ex Benth.",195 877,"","Dovyalis","E.Mey. ex Arn.",195 19503,"","Eichlerodendron","Briq.",195 878,"","Eleutherandra","Slooten",195 879,"","Erythrospermum","Lam.",195 880,"","Euceraea","Mart.",195 881,"","Flacourtia","Comm. ex L'Her.",195 882,"","Gerrardina","Oliv.",195 19506,"","Gertrudia","K.Schum.",195 19500,"","Gestroa","Becc.",195 19512,"","Gossypiospermum","(Griseb.) Urb.",195 847,"","Grandidiera","Jaub.",195 19514,"","Guayabilla","Sesse & Moc.",195 19496,"","Guidonia","P.Browne",195 19515,"","Guidonia","(DC.) Griseb.",195 22218,"","Guidonia","Mill.",195 883,"","Gynocardia","R.Br.",195 884,"","Hecatostemon","S.F.Blake",195 885,"","Hemiscolopia","Slooten",195 886,"","Homalium","Jacq.",195 887,"","Hydnocarpus","Gaertn.",195 888,"","Idesia","Maxim.",195 889,"","Itoa","Hemsl.",195 890,"","Kiggelaria","L.",195 19516,"","Kuhlia","Kunth",195 891,"","Laetia","L.",195 17572,"","Lasiochlamys","Pax & K.Hoffm.",195 892,"","Lindackeria","C.Presl",195 19511,"","Llavea","Liebm.",195 893,"","Ludia","Comm. ex Juss.",195 894,"","Lunania","Hook.",195 895,"","Mayna","Aubl.",195 19502,"","Mesaulosperma","Slooten",195 896,"","Mocquerysia","Hua",195 897,"","Neopringlea","S.Watson",195 898,"","Neoptychocarpus","Buchheim",195 19497,"","Neumannia","A.Rich.",195 19518,"","Nisa","Noronha ex Thouars",195 899,"","Olmediella","Baill.",195 900,"","Oncoba","Forssk.",195 901,"","Ophiobotrys","Gilg",195 902,"","Osmelia","Thwaites",195 903,"","Pangium","Reinw.",195 16316,"","Paraphyadanthe","Mildbr.",195 19495,"","Patrisia","Rich.",195 904,"","Peterodendron","Sleumer",195 905,"","Phyllobotryon","Mull.Arg.",195 906,"","Phylloclinium","Baill.",195 19519,"","Pierrea","Hance",195 907,"","Pineda","Ruiz & Pav.",195 848,"","Poggea","Gurke",195 908,"","Poliothyrsis","Oliv.",195 909,"","Priamosia","Urb.",195 910,"","Prockiopsis","Baill.",195 911,"","Pseudoscolopia","Gilg",195 912,"","Pseudosmelia","Sleumer",195 22075,"","Ptychocarpus","Kuhlm.",195 19507,"","Pyramidocarpus","Oliv.",195 19517,"","Raleighia","Gardner",195 913,"","Rawsonia","Harv. & Sond.",195 24701,"","Richeopsis","Arenes",195 914,"","Ryania","Vahl",195 915,"","Ryparosa","Blume",195 916,"","Samyda","Jacq.",195 917,"","Scaphocalyx","Ridl.",195 918,"","Scolopia","Schreb.",195 919,"","Scottellia","Oliv.",195 920,"","Streptothamnus","F.Muell.",195 19513,"","Synandrina","Standl. & L.O.Williams",195 19510,"","Taraktogenos","Hassk.",195 921,"","Tetrathylacium","Poepp.",195 922,"","Tisonia","Baill.",195 923,"","Trichadenia","Thwaites",195 924,"","Trichostephanus","Gilg",195 925,"","Trimeria","Harv.",195 926,"","Xylosma","G.Forst.",195 927,"","Xylotheca","Hochst.",195 928,"","Zuelania","A.Rich.",195 12193,"","Flagellaria","L.",196 1095,"","Fouquieria","Kunth",197 1096,"","Idria","Kellogg",197 977,"","Anthobryum","Phil.",198 978,"","Beatsonia","Roxb.",198 979,"","Frankenia","L.",198 980,"","Hypericopsis","Boiss.",198 981,"","Niederleinia","Hieron.",198 4870,"","Garrya","Douglas ex Lindl.",199 10036,"","Geissoloma","Lindl. ex Kunth",200 7848,"","Adenolisianthus","Gilg",201 24347,"","Aloitis","Raf.",201 25279,"","Anagallidium","Griseb.",201 25576,"","Arctogentia","A.Love",201 7849,"","Bartonia","Muhl. ex Willd.",201 17337,"","Belmontia","E.Mey.",201 7850,"","Bisgoeppertia","Kuntze",201 7851,"","Blackstonia","Huds.",201 24342,"","Calathiana","Delarbre",201 7852,"","Calolisianthus","Gilg",201 7853,"","Canscora","Lam.",201 16609,"","Carissophyllum","Pichon",201 17341,"","Celiantha","Maguire",201 7854,"","Centaurium","Hill",201 7855,"","Chelonanthus","(Griseb.) Gilg",201 7856,"","Chironia","L.",201 19395,"","Chlora","Adans.",201 24341,"","Chondrophylla","A.Nelson",201 7857,"","Chorisepalum","Gleason & Wodehouse",201 7858,"","Cicendia","Adans.",201 24336,"","Ciminalis","Adans.",201 24346,"","Comastoma","Toyok.",201 7859,"","Congolanthus","A.Raynal",201 7860,"","Cotylanthera","Blume",201 7861,"","Coutoubea","Aubl.",201 7862,"","Cracosna","Gagnep.",201 7863,"","Crawfurdia","Wall.",201 7864,"","Curtia","Cham. & Schltdl.",201 24338,"","Dasystephana","Adans.",201 7865,"","Deianira","Cham. & Schltdl.",201 7866,"","Djaloniella","P.Taylor",201 7867,"","Enicostema","Blume",201 17339,"","Erythraea","L.",201 7868,"","Eustoma","Salisb.",201 7869,"","Exaculum","Caruel",201 7870,"","Exacum","L.",201 17338,"","Exochaenium","Griseb.",201 7871,"","Faroa","Welw.",201 24345,"","Favargera","A.Love & D.Love",201 7872,"","Frasera","Walter",201 7873,"","Geniostemon","Engelm. & A.Gray",201 7874,"","Gentiana","L.",201 16170,"","Gentianella","Moench",201 24335,"","Gentianodes","A.Love & D.Love",201 17570,"","Gentianopsis","Ma",201 7875,"","Gentianothamnus","Humbert",201 19394,"","Goeppertia","Griseb.",201 7876,"","Halenia","Borkh.",201 7877,"","Helia","Mart.",201 7878,"","Hockinia","Gardner",201 24339,"","Holubogentia","A.Love & D.Love",201 7879,"","Hoppea","Willd.",201 7880,"","Irlbachia","Mart.",201 7881,"","Ixanthus","Griseb.",201 7882,"","Jaeschkea","Kurz",201 7883,"","Karina","Boutique",201 7884,"","Kingdon-Wardia","C.Marquand",201 25580,"","Kuepferella","M.Lainz",201 7885,"","Lagenanthus","Gilg",201 7886,"","Lagenias","E.Mey.",201 7887,"","Lapithea","Griseb.",201 7888,"","Latouchea","Franch.",201 19393,"","Lecanthus","Griseb.",201 7889,"","Lehmanniella","Gilg",201 22327,"","Leianthus","Griseb.",201 7890,"","Leiphaimos","Cham. & Schltdl.",201 7891,"","Lisianthius","P.Browne",201 24296,"","Lisianthus","P.Browne",201 25321,"","Lomatogoniopsis","T.N.Ho & S.W.Liu",201 7892,"","Lomatogonium","A.Braun",201 7893,"","Macrocarpaea","Gilg",201 24343,"","Megacodon","(Hemsl.) Harry Sm.",201 24340,"","Mehraea","A.Love & D.Love",201 16610,"","Microcala","Hoffmanns. & Link",201 7894,"","Microrphium","C.B.Clarke",201 16611,"","Monodiella","Maire",201 17547,"","Neblinantha","Maguire",201 7895,"","Neurotheca","Salisb. ex Benth.",201 7896,"","Obolaria","L.",201 7897,"","Oreonesion","J.Raynal",201 24334,"","Oreophylax","Endl.",201 17340,"","Ornichia","Klack.",201 7898,"","Orphium","E.Mey.",201 7899,"","Pagaea","Griseb.",201 7900,"","Parajaeschkea","Burkill",201 7901,"","Pitygentias","Gilg",201 7902,"","Pleurogyna","Eschsch. ex Cham. & Schltdl.",201 24228,"","Pleurogyne","Eschsch. ex Griseb.",201 25148,"","Pleurogynella","Ikonn.",201 24337,"","Pneumonanthe","Gled.",201 7903,"","Prepusa","Mart.",201 17578,"","Pterygocalyx","Maxim.",201 7904,"","Purdieanthus","Gilg",201 7905,"","Pycnosphaera","Gilg",201 25575,"","Qaisera","Omer",201 25581,"","Rogersonanthus","Maguire & B.M.Boom",201 7906,"","Rusbyanthus","Gilg",201 7907,"","Sabatia","Adans.",201 7909,"","Schinziella","Gilg",201 7910,"","Schultesia","Mart.",201 7911,"","Sebaea","Sol. ex R.Br.",201 24332,"","Selatium","G.Don",201 7912,"","Senaea","Taub.",201 25583,"","Sipapoantha","Maguire & B.M.Boom",201 7913,"","Stahelia","Jonker",201 7914,"","Swertia","L.",201 22211,"","Swertopsis","Makino",201 7916,"","Symbolanthus","G.Don",201 7917,"","Symphyllophyton","Gilg",201 19396,"","Synallodia","Raf.",201 7918,"","Tachia","Aubl.",201 7919,"","Tachiadenus","Griseb.",201 7920,"","Tapeinostemon","Benth.",201 25582,"","Tetrapollinia","Maguire & B.M.Boom",201 24344,"","Tretorhiza","Adans.",201 18654,"","Tripterospermum","Blume",201 24333,"","Ulostoma","G.Don",201 7921,"","Urogentias","Gilg & Gilg-Ben.",201 7922,"","Veratrilla","(Baill.) Franch.",201 7923,"","Voyria","Aubl.",201 7924,"","Voyriella","Miq.",201 17548,"","Wurdackanthus","Maguire",201 7925,"","Zonanthus","Griseb.",201 7926,"","Zygostigma","Griseb.",201 24965,"","Araeoandra","Lefor",202 1663,"","Balbisia","Cav.",202 1651,"","Biebersteinia","Stephan",202 24966,"","Caesarea","Cambess.",202 24967,"","Cissarobryon","Kunze ex Poepp.",202 1675,"","Dirachma","Schweinf. ex Balf.f.",202 1652,"","Erodium","L'Her. ex Aiton",202 16396,"","Geraniopsis","Chrtek",202 1653,"","Geranium","L.",202 18109,"","Ledocarpon","Desf.",202 1654,"","Monsonia","L.",202 25157,"","Neurophyllodes","(A.Gray) O.Deg.",202 1655,"","Pelargonium","L'Her. ex Aiton",202 1664,"","Rhynchotheca","Ruiz & Pav.",202 1656,"","Sarcocaulon","(DC.) Sweet",202 1662,"","Viviania","Cav.",202 1665,"","Wendtia","Meyen",202 8492,"","Acanthonema","Hook.f.",203 19327,"","Achimenes","P.Browne",203 8493,"","Achimenes","Pers.",203 8494,"","Aeschynanthus","Jack",203 8495,"","Agalmyla","Blume",203 19359,"","Aikinia","R.Br.",203 19290,"","Alagophyla","Raf.",203 17366,"","Allocheilos","W.T.Wang",203 8496,"","Alloplectus","Mart.",203 24357,"","Allostigma","W.T.Wang",203 19294,"","Almana","Raf.",203 8497,"","Alsobia","Hanst.",203 8498,"","Ancylostemon","Craib",203 8499,"","Anetanthus","Hiern ex Benth.",203 19315,"","Anisoplectus","Oerst.",203 8500,"","Anna","Pellegr.",203 8501,"","Anodiscus","Benth.",203 19364,"","Antonia","R.Br.",203 19331,"","Aponoa","Raf.",203 24369,"","Arctocalyx","Fenzl",203 8502,"","Asteranthera","Hanst.",203 19375,"","Babactes","DC.",203 19337,"","Basileophyta","F.Muell.",203 8503,"","Beccarinda","Kuntze",203 8504,"","Bellonia","L.",203 8505,"","Besleria","L.",203 19304,"","Biglandularia","Seem.",203 19376,"","Bilabium","Miq.",203 8506,"","Boea","Comm. ex Lam.",203 8507,"","Boeica","T.Anderson ex C.B.Clarke",203 14210,"","Boeicopsis","H.W.Li",203 8508,"","Bournea","Oliv.",203 19381,"","Brachiostemon","Hand.-Mazz.",203 19282,"","Brachyloma","Hanst.",203 8509,"","Briggsia","Craib",203 23069,"","Briggsiopsis","K.Y.Pan",203 17367,"","Bucinella","Wiehler",203 24358,"","Bucinellina","Wiehler",203 19374,"","Buxiphyllum","W.T.Wang & C.Z.Gao",203 19311,"","Calanthus","Oerst. ex Hanst.",203 14209,"","Calcareoboea","C.Y.Wu",203 19314,"","Caloplectus","Oerst.",203 19377,"","Calosacme","Wall.",203 19283,"","Calycostemma","Hanst.",203 15907,"","Campanea","Decne.",203 8510,"","Capanea","Decne.",203 19368,"","Carolofritschia","Engl.",203 8511,"","Cathayanthe","Chun",203 16633,"","Centrosolenia","Benth.",203 19384,"","Ceratoscyphus","Chun",203 19385,"","Chaixia","Lapeyr.",203 8512,"","Championia","Gardner",203 19353,"","Cheilosandra","Griff. ex Lindl.",203 19354,"","Chiliandra","Griff.",203 8514,"","Chirita","Buch.-Ham. ex D.Don",203 24359,"","Chiritopsis","W.T.Wang",203 19373,"","Chlamydoboea","Stapf",203 8516,"","Chrysothemis","Decne.",203 24356,"","Cobananthus","Wiehler",203 19336,"","Coccanthera","K.Koch & Hanst.",203 8517,"","Codonanthe","(Mart.) Hanst.",203 8518,"","Codonanthopsis","Mansf.",203 8519,"","Codonoboea","Ridl.",203 19332,"","Collandra","Lem.",203 8520,"","Colpogyne","B.L.Burtt",203 8521,"","Columnea","L.",203 8522,"","Conandron","Siebold & Zucc.",203 24363,"","Conradia","Mart.",203 25019,"","Coptocheile","Hoffmanns.",203 8523,"","Corallodiscus","Batalin",203 8524,"","Coronanthera","Vieill. ex C.B.Clarke",203 19352,"","Corysanthera","Wall. ex Endl.",203 8525,"","Corytholoma","(Benth.) Decne.",203 8526,"","Corytoplectus","Oerst.",203 19316,"","Crantzia","Scop.",203 8527,"","Cremosperma","Benth.",203 19284,"","Cryptoloma","Hanst.",203 24360,"","Cubitanthus","Barringer",203 19355,"","Cyananthus","Griff.",203 8528,"","Cyrtandra","J.R.Forst. & G.Forst.",203 8529,"","Cyrtandroidea","F.Br.",203 8530,"","Cyrtandropsis","C.B.Clarke ex DC.",203 19346,"","Cyrtanthemum","Oerst.",203 19306,"","Cyrtodeira","Hanst.",203 8531,"","Dalbergaria","Tussac",203 19379,"","Damrongia","Kerr ex Craib",203 19370,"","Dasydesmus","Craib",203 25018,"","Dayaoshania","W.T.Wang",203 24353,"","Deltocheilos","W.T.Wang",203 8534,"","Depanthus","S.Moore",203 8535,"","Diastema","Benth.",203 19277,"","Diastemella","Oerst.",203 8536,"","Dichiloboea","Stapf",203 19343,"","Dichrotrichum","Reinw. ex de Vriese",203 19272,"","Dicyrta","Regel",203 8539,"","Didissandra","C.B.Clarke",203 8540,"","Didymocarpus","Wall.",203 24361,"","Didymostigma","W.T.Wang",203 8541,"","Diplolegnon","Rusby",203 19299,"","Dircaea","Decne.",203 19301,"","Dolichodiera","Hanst.",203 25528,"","Dolicholoma","D.Fang & W.T.Wang",203 19380,"","Dorcoceras","Bunge",203 8542,"","Drymonia","Mart.",203 19371,"","Ellobum","Blume",203 8543,"","Episcia","Mart.",203 8544,"","Epithema","Blume",203 19345,"","Eriphia","P.Browne",203 19310,"","Erythranthus","Oerst. ex Hanst.",203 8545,"","Eucodonia","Hanst.",203 19263,"","Eucolum","Salisb.",203 19273,"","Eumolpe","Decne. ex Jacques & Herincq",203 19329,"","Eusynetra","Raf.",203 24355,"","Euthamnus","Schltr.",203 8546,"","Fiebrigia","Fritsch",203 8547,"","Fieldia","A.Cunn.",203 19295,"","Fimbrolina","Raf.",203 19267,"","Fritschiantha","Kuntze",203 19347,"","Gasteranthopsis","Oerst.",203 8548,"","Gasteranthus","Benth.",203 19288,"","Gesnera","Mart.",203 8549,"","Gesneria","L.",203 19280,"","Giesleria","Regel",203 19366,"","Glossanthus","Klein ex Benth.",203 19325,"","Glossoloma","Hanst.",203 19287,"x","Gloxinera","Weathers",203 8550,"","Gloxinia","L'Her.",203 19330,"","Glycanthes","Raf.",203 8551,"","Goyazia","Taub.",203 19271,"","Guthnickia","Regel",203 24364,"","Gyrocheilos","W.T.Wang",203 24365,"","Gyrogyne","W.T.Wang",203 8552,"","Haberlea","Friv.",203 19350,"","Halphophyllum","Mansf.",203 19362,"","Hatschbachia","L.B.Sm.",203 19324,"","Heintzia","H.Karst.",203 8554,"","Hemiboea","C.B.Clarke",203 23070,"","Hemiboeopsis","W.T.Wang",203 19372,"","Henckelia","Spreng.",203 8555,"","Heppiella","Regel",203 8556,"","Hexatheca","C.B.Clarke",203 8557,"","Hippodamia","Decne.",203 19360,"","Horsfieldia","Chifflot",203 19285,"","Houttea","Heynh.",203 8558,"","Hygea","Hanst.",203 8559,"","Hypocyrta","Mart.",203 19351,"","Isanthera","Nees",203 19278,"","Isoloma","Benth. ex Decne.",203 8561,"","Isometrum","Craib",203 16215,"","Jancaea","Boiss.",203 16634,"","Jankaea","Boiss.",203 8563,"","Klugia","Schltdl.",203 8564,"","Koellikeria","Regel",203 8565,"","Kohleria","Regel",203 8566,"","Kohlerianthus","Fritsch",203 23071,"","Lagarosolen","W.T.Wang",203 8567,"","Lembocarpus","Leeuwenb.",203 8568,"","Lenbrassia","G.W.Gillett",203 19382,"","Lepadanthus","Ridl.",203 8569,"","Leptoboea","Benth.",203 8570,"","Lietzia","Regel",203 19300,"","Ligeria","Decne.",203 8571,"","Linnaeopsis","Engl.",203 19270,"","Locheria","Regel",203 19318,"","Lophalix","Raf.",203 19317,"","Lophia","Desv.",203 8572,"","Loxocarpus","R.Br.",203 8573,"","Loxonia","Jack",203 19367,"","Loxophyllum","Blume",203 8575,"","Loxostigma","C.B.Clarke",203 19365,"","Loxotis","(R.Br.) Benth.",203 8576,"","Lysionotus","D.Don",203 19309,"","Macrochlamys","Decne.",203 19264,"","Mandirola","Decne.",203 16635,"","Marssonia","H.Karst.",203 19363,"","Matsumuria","Hemsl.",203 19291,"","Megapleilis","Raf.",203 14267,"","Metabriggsia","W.T.Wang",203 24367,"","Metapetrocosmea","W.T.Wang",203 8577,"","Micraeschynanthus","Ridl.",203 19356,"","Miquelia","Blume",203 8578,"","Mitraria","Cav.",203 8579,"","Monophyllaea","R.Br.",203 8580,"","Monopyle","Moritz ex Benth.",203 19361,"","Moultonia","Balf.f. & W.W.Sm.",203 8582,"","Moussonia","Regel",203 19386,"","Myconia","Lapeyr.",203 19276,"","Naegelia","Regel",203 8583,"","Napeanthus","Gardner",203 8584,"","Nautilocalyx","Linden ex Hanst.",203 8585,"","Negria","F.Muell.",203 8586,"","Nematanthus","Schrad.",203 8587,"","Neomortonia","Wiehler",203 8588,"","Niphaea","Lindl.",203 14241,"","Nodonema","B.L.Burtt",203 15194,"","Oerstedina","Wiehler",203 8589,"","Opithandra","B.L.Burtt",203 8590,"","Orchadocarpa","Ridl.",203 8591,"","Oreocharis","Benth.",203 19342,"","Orithalia","Blume",203 8592,"","Ornithoboea","Parish ex C.B.Clarke",203 19303,"","Orthanthe","Lem.",203 8593,"","Ortholoma","Hanst.",203 19358,"","Oshimella","Masam. & Suzuki",203 8594,"","Oxychlamys","Schltr.",203 8595,"","Paliavana","Vell. ex Vand.",203 19348,"","Parabesleria","Oerst.",203 8596,"","Paraboea","(C.B.Clarke) Ridl.",203 8597,"","Paradrymonia","Hanst.",203 8598,"","Parakohleria","Wiehler",203 8599,"","Pearcea","Regel",203 8600,"","Pentadenia","Hanst.",203 8601,"","Pentarhaphia","Lindl.",203 19369,"","Perantha","Craib",203 8603,"","Petrocodon","Hance",203 8604,"","Petrocosmea","Oliv.",203 19388,"","Petrodoxa","Anthony",203 24368,"","Pheidonocarpa","L.E.Skog",203 8605,"","Phinaea","Benth.",203 25723,"","Phyllobaea","Benth.",203 8606,"","Phylloboea","Benth.",203 24362,"","Physodeira","Hanst.",203 8607,"","Platyadenia","B.L.Burtt",203 8608,"","Platystemma","Wall.",203 19275,"","Plectopoma","Hanst.",203 19312,"","Polythysania","Hanst.",203 8609,"","Primulina","Hance",203 19326,"","Prionoplectus","Oerst.",203 19339,"","Protocyrtandra","Hosok.",203 19349,"","Pseudobesleria","Oerst.",203 25529,"","Pseudochirita","W.T.Wang",203 8611,"","Pterobesleria","C.V.Morton",203 19333,"","Pterygoloma","Hanst.",203 19357,"","Quintilia","Endl.",203 8612,"","Ramonda","Rich.",203 8613,"","Raphiocarpus","Chun",203 19297,"","Rechsteineria","Regel",203 8616,"","Reldia","Wiehler",203 8618,"","Resia","H.E.Moore",203 8619,"","Rhabdothamnopsis","Hemsl.",203 8620,"","Rhabdothamnus","A.Cunn.",203 19340,"","Rheithrophyllum","Hassk.",203 8621,"","Rhoogeton","Leeuwenb.",203 8622,"","Rhynchoglossum","Blume",203 8623,"","Rhynchotechum","Blume",203 8624,"","Rhytidophyllum","Mart.",203 8625,"","Roettlera","Vahl",203 19286,"","Rosanowia","Regel",203 8626,"","Rufodorsia","Wiehler",203 19313,"","Saccoplectus","Oerst.",203 8627,"","Saintpaulia","H.Wendl.",203 19265,"","Salisia","Regel",203 8628,"","Sarmienta","Ruiz & Pav.",203 19274,"","Scheeria","Seem.",203 8629,"","Schizoboea","(Fritsch) B.L.Burtt",203 19281,"","Sciadocalyx","Regel",203 19262,"","Scoliotheca","Baill.",203 19266,"","Seemannia","Regel",203 8632,"","Sepikea","Schltr.",203 8633,"","Sinningia","Nees",203 19383,"","Sinoboea","Chun",203 19307,"","Skiophila","Hanst.",203 19389,"","Slackia","Griff.",203 8635,"","Smithiantha","Kuntze",203 8636,"","Solenophora","Benth.",203 8637,"","Stauranthera","Benth.",203 19334,"","Stenanthus","Oerst. ex Hanst.",203 19302,"","Stenogastra","Hanst.",203 8638,"","Streptocarpus","Lindl.",203 19335,"","Stygnanthe","Hanst.",203 19292,"","Styrosinia","Raf.",203 8639,"","Synepilaena","Baill.",203 19296,"","Tapeinotes","DC.",203 19289,"","Tapina","Mart.",203 8640,"","Tengia","Chun",203 19344,"","Tetradema","Schltr.",203 8642,"","Tetraphyllum","Griff. ex C.B.Clarke",203 24370,"","Thamnocharis","W.T.Wang",203 8643,"","Titanotrichum","Soler.",203 8644,"","Trachystigma","C.B.Clarke",203 8645,"","Tremacron","Craib",203 19269,"","Trevirana","Willd.",203 8646,"","Trichantha","Hook.",203 19308,"","Trichodrymonia","Oerst.",203 19341,"","Trichosporum","D.Don",203 8647,"","Trisepalum","C.B.Clarke",203 19378,"","Tromsdorffia","Blume",203 19293,"","Tulisma","Raf.",203 24354,"","Tumidinodus","H.W.Li",203 19305,"","Tussacia","Benth.",203 19279,"","Tydaea","Decne.",203 8648,"","Tylopsacas","Leeuwenb.",203 24371,"","Tylosperma","Leeuwenb.",203 8649,"","Vanhouttea","Lem.",203 19387,"","Vaniotia","H.Lev.",203 19328,"","Vireya","Raf.",203 19338,"","Whitia","Blume",203 8650,"","Whytockia","W.W.Sm.",203 13445,"","Ginkgo","L.",204 4324,"","Gisekia","L.",205 57,"","Glaucidium","Siebold & Zucc.",206 21576,"","Acropterygium","(Diels) Nakai",207 21573,"","Calymella","C.Presl",207 13478,"","Dicranopteris","Bernh.",207 16716,"","Diplopterygium","(Diels) Nakai",207 21575,"","Gleichenella","Ching",207 13479,"","Gleichenia","Sm.",207 21574,"","Gleicheniastrum","C.Presl",207 21577,"","Hicriopteris","C.Presl",207 21578,"","Mertensia","Willd.",207 21579,"","Mesosorus","Hassk.",207 16717,"","Sticherus","C.Presl",207 16246,"","Cockburnia","Balf.f.",208 9121,"","Globularia","L.",208 16645,"","Lytanthus","Wettst.",208 9127,"","Poskea","Vatke",208 13387,"","Gnetum","L.",209 24241,"","Bissea","V.R.Fuentes",210 8163,"","Coeloneurum","Radlk.",210 8172,"","Espadaea","A.Rich.",210 8174,"","Goetzea","Wydler",210 8177,"","Henoonia","Griseb.",210 9861,"","Gomortega","Ruiz & Pav.",211 6779,"","Antherostylis","C.A.Gardner",212 6780,"","Anthotium","R.Br.",212 6796,"","Brunonia","Sm.",212 6781,"","Calogyne","R.Br.",212 6782,"","Catosperma","Benth.",212 24938,"","Catospermum","Benth.",212 6783,"","Coopernookia","Carolin",212 6784,"","Dampiera","R.Br.",212 6785,"","Diaspasis","R.Br.",212 6786,"","Goodenia","Sm.",212 6787,"","Lechenaultia","R.Br.",212 17536,"","Leschenaultia","R.Br.",212 6788,"","Neogoodenia","C.A.Gardner & A.S.George",212 6789,"","Nigromnia","Carolin",212 6790,"","Pentaptilon","E.Pritz.",212 6791,"","Scaevola","L.",212 6792,"","Selliera","Cav.",212 6793,"","Symphyobasis","K.Krause",212 6794,"","Velleia","Sm.",212 6795,"","Verreauxia","Benth.",212 2111,"","Goupia","Aubl.",213 15250,"","Abola","Adans.",214 13759,"","Acamptoclados","Nash",214 14901,"","Achaeta","E.Fourn.",214 12731,"","Achlaena","Griseb.",214 14064,"","Achnatherum","P.Beauv.",214 15253,"","Achneria","Benth.",214 13760,"","Achneria","P.Beauv.",214 15254,"","Achnodon","Link",214 14879,"","Achnodonton","P.Beauv.",214 15255,"","Achrochloa","B.D.Jacks.",214 15256,"","Achroostachys","Benth.",214 15257,"","Achyrodes","Boehm.",214 12733,"","Aciachne","Benth.",214 16012,"","Acicarpa","Raddi",214 14861,"","Acidosasa","C.D.Chu & C.S.Chao",214 15258,"","Acophorum","Steud.",214 16044,"","Acostia","Swallen",214 12734,"","Acrachne","Wight & Arn. ex Chiov.",214 13762,"","Acratherum","Link",214 12735,"","Acritochaete","Pilg.",214 12736,"","Acroceras","Stapf",214 16141,"","Acrochaete","Peter",214 14022,"","Acroelytrum","Steud.",214 15259,"","Acrospelion","Steud.",214 15260,"","Acroxis","Steud.",214 15261,"","Actinochloa","Roem. & Schult.",214 15262,"","Actinochloris","Steud.",214 14858,"","Actinocladum","McClure ex Soderstr.",214 15264,"","Aechmophora","Steud.",214 14372,"","Aegialina","Schult.",214 15265,"","Aegialitis","Trin.",214 15266,"","Aegicon","Adans.",214 14914,"","Aegilemma","A.Love",214 14917,"","Aegilonearum","A.Love",214 15267,"","Aegilopodes","A.Love",214 12737,"","Aegilops","L.",214 14070,"x","Aegilosecale","Cif. & Giacom.",214 17763,"x","Aegilotricale","Tscherm.-Seys.",214 15268,"x","Aegilotrichum","E.G.Camus",214 15269,"x","Aegilotricum","Tscherm.-Seys.",214 14071,"x","Aegilotriticum","E.Fourn.",214 12738,"","Aegopogon","Humb. & Bonpl. ex Willd.",214 15270,"","Aelbroeckia","De Moor",214 12739,"","Aeluropus","Trin.",214 15271,"","Aera","Asch.",214 15272,"","Aeropsis","Asch. & Graebn.",214 15273,"","Aethonopogon","Kuntze",214 13761,"","Afrachneria","Sprague",214 12740,"","Afrotrichloris","Chiov.",214 12741,"","Agenium","Nees",214 16097,"","Aglycia","Steud.",214 14889,"","Agraulus","P.Beauv.",214 15274,"","Agrestis","Bubani",214 14072,"x","Agrocalamagrostis","Asch. & Graebn.",214 14073,"x","Agroelymus","A.Camus",214 14074,"x","Agrohordeum","A.Camus",214 14075,"x","Agropogon","E.Fourn.",214 15275,"x","Agropyrohordeum","A.Camus",214 12742,"","Agropyron","Gaertn.",214 12743,"","Agropyropsis","(Batt. & Trab.) A.Camus",214 14076,"x","Agrositanion","Bowden",214 13764,"","Agrosticula","Raddi",214 12744,"","Agrostis","L.",214 13765,"","Agrostomia","Cerv.",214 14098,"x","Agrotrigia","Tzvelev",214 14077,"x","Agrotrisecale","Cif. & Giacom.",214 14078,"x","Agrotriticum","Cif. & Giacom.",214 15276,"","Aikinia","Wall.",214 12745,"","Aira","L.",214 15278,"","Airella","(Dumort.) Dumort.",214 16162,"","Airidium","Steud.",214 14373,"","Airochloa","Link",214 12746,"","Airopsis","Desv.",214 13766,"","Alectoridia","A.Rich.",214 15279,"","Allagostachyum","Steud.",214 14023,"","Allelotheca","Steud.",214 12747,"","Alloeochaete","C.E.Hubb.",214 15280,"","Alloiatheros","Raf.",214 12748,"","Allolepis","Soderstr. & H.F.Decker",214 12749,"","Alloteropsis","C.Presl",214 14877,"","Alopecuropsis","Opiz",214 12750,"","Alopecurus","L.",214 24097,"","Alvimia","Calderon ex Soderstr. & Londono",214 16163,"","Alycia","Steud.",214 15281,"","Amagris","Raf.",214 15282,"","Amaxitis","Adans.",214 13767,"","Amblyachyrum","Steud.",214 15283,"","Amblychloa","Link",214 12751,"","Amblyopyrum","Eig",214 15284,"","Amblytes","Dulac",214 15285,"x","Ammocalamagrostis","E.Fourn.",214 12752,"","Ammochloa","Boiss.",214 12753,"","Ammophila","Host",214 14932,"","Ampelocalamus","S.L.Chen, T.H.Wen & G.Y.Sheng",214 12754,"","Ampelodesmos","Link",214 14301,"","Ampelodonax","Lojac.",214 12755,"","Amphibromus","Nees",214 12756,"","Amphicarpum","Kunth",214 13768,"","Amphidonax","Nees",214 14325,"","Amphigenes","Janka",214 13769,"","Amphilophis","Nash",214 12757,"","Amphipogon","R.Br.",214 15996,"","Amphochaeta","Andersson",214 14384,"","Anachortus","Jirasek & Chrtek",214 16111,"","Anachyris","Nees",214 16116,"","Anachyrium","Steud.",214 12758,"","Anadelphia","Hack.",214 16106,"","Anastrophus","Schltdl.",214 15286,"","Anatherum","Nabelek",214 13770,"","Anatherum","P.Beauv.",214 12759,"","Ancistrachne","S.T.Blake",214 12760,"","Ancistragrostis","S.T.Blake",214 14903,"","Ancistrochloa","Honda",214 12761,"","Andropogon","L.",214 12762,"","Andropterum","Stapf",214 13771,"","Androscepia","Brongn.",214 14393,"","Anelytrum","Hack.",214 15288,"","Anemagrostis","Trin.",214 16064,"","Anemanthele","Veldkamp",214 14046,"","Aneurolepidium","Nevski",214 14906,"","Anisachne","Keng",214 14054,"","Anisantha","K.Koch",214 12763,"","Aniselytron","Merr.",214 12764,"","Anisopogon","R.Br.",214 15289,"","Anisopyrum","(Griseb.) Gren. & Duval",214 14892,"","Anomalotis","Steud.",214 12765,"","Anomochloa","Brongn.",214 15290,"","Anoplia","Steud.",214 12767,"","Anthaenantiopsis","Mez ex Pilg.",214 12766,"","Anthenantia","P.Beauv.",214 12768,"","Anthephora","Schreb.",214 13772,"","Anthipsimus","Raf.",214 13773,"","Anthistiria","L.f.",214 12769,"","Anthochloa","Nees & Meyen",214 15291,"","Anthopogon","Nutt.",214 14037,"","Anthosachne","Steud.",214 12770,"","Anthoxanthum","L.",214 15292,"","Antichloa","Steud.",214 12771,"","Antinoria","Parl.",214 15293,"","Antitragus","Gaertn.",214 13774,"","Antonella","Caro",214 15294,"","Antoschmidtia","Boiss.",214 12772,"","Apera","Adans.",214 12773,"","Aphanelytrum","Hack.",214 13775,"","Aplexia","Raf.",214 15296,"","Aplocera","Raf.",214 12774,"","Apluda","L.",214 13776,"","Apochaete","(C.E.Hubb.) J.B.Phipps",214 12775,"","Apochiton","C.E.Hubb.",214 12776,"","Apoclada","McClure",214 12777,"","Apocopis","Nees",214 15297,"","Apogon","Steud.",214 13777,"","Apogonia","(Nutt.) E.Fourn.",214 12778,"","Arberella","Soderstr. & Calderon",214 15980,"","Arcangelina","Kuntze",214 12779,"","Arctagrostis","Griseb.",214 14079,"x","Arctodupontia","Tzvelev",214 12780,"","Arctophila","(Rupr.) Andersson",214 14317,"","Arctopoa","(Griseb.) Prob.",214 15981,"","Argillochloa","W.A.Weber",214 13779,"","Argopogon","Mimeur",214 13780,"","Aristaria","Jungh.",214 14388,"","Aristavena","F.Albers & Butzin",214 14066,"","Aristella","Bertol.",214 12781,"","Aristida","L.",214 13781,"","Aristidium","(Endl.) Lindl.",214 14018,"","Aristopsis","Catasus",214 12782,"","Arrhenatherum","P.Beauv.",214 15300,"","Arrozia","Kunth",214 16046,"","Arthragrostis","Lazarides",214 15301,"","Arthratherum","P.Beauv.",214 12783,"","Arthraxon","P.Beauv.",214 15302,"","Arthrochlaena","Benth.",214 15303,"","Arthrochloa","R.Br.",214 15304,"","Arthrochloa","Lorch",214 14309,"","Arthrochortus","Lowe",214 15305,"","Arthrolophis","(Trin.) Chiov.",214 12784,"","Arthropogon","Nees",214 14369,"","Arthrostachya","Link",214 13785,"","Arthrostachys","Desv.",214 12785,"","Arthrostylidium","Rupr.",214 15306,"","Arundarbor","Kuntze",214 12786,"","Arundinaria","Michx.",214 12787,"","Arundinella","Raddi",214 12788,"","Arundo","L.",214 22121,"","Arundoclaytonia","Davidse & R.P.Ellis",214 15307,"","Asperella","Humb.",214 15308,"","Asprella","Schreb.",214 15309,"","Asprella","Host",214 15310,"","Aspris","Adans.",214 15311,"","Asthenatherum","Nevski",214 12789,"","Asthenochloa","Buse",214 12790,"","Astrebla","F.Muell.",214 14874,"","Ataxia","R.Br.",214 15313,"","Athernotus","Dulac",214 15314,"","Atherophora","Steud.",214 13786,"","Atheropogon","Willd.",214 15315,"","Athrolophis","(Trin.) Chiov.",214 12791,"","Athroostachys","Benth.",214 12792,"","Atractantha","McClure",214 13787,"","Atractocarpa","Franch.",214 15316,"","Atropis","(Trin.) Griseb.",214 15317,"","Aulacolepis","Hack.",214 16017,"","Aulaxanthus","Elliott",214 16021,"","Aulaxia","Nutt.",214 12794,"","Aulonemia","Goudot",214 16139,"","Australopyrum","A.Love",214 12795,"","Austrochloris","Lazarides",214 14327,"","Austrofestuca","(Tzvelev) E.B.Alexeev",214 12796,"","Avellinia","Parl.",214 12797,"","Avena","L.",214 15320,"","Avena","Scop.",214 15321,"","Avenaria","Fabr.",214 15322,"","Avenastrum","Opiz",214 14386,"","Avenella","Parl.",214 15323,"","Avenochloa","Holub",214 14364,"","Avenula","(Dumort.) Dumort.",214 12798,"","Axonopus","P.Beauv.",214 15325,"","Balansochloa","Kuntze",214 15326,"","Baldingera","P.Gaertn., B.Mey. & Scherb.",214 13788,"","Baldomiria","Herter",214 15327,"","Bambos","Retz.",214 12799,"","Bambusa","Schreb.",214 15328,"","Bambusa","Caldas",214 15978,"","Baptorhachis","Clayton & Renvoize",214 14924,"","Bashania","Keng f. & T.P.Yi",214 13789,"","Batratherum","Nees",214 13790,"","Bauchea","E.Fourn.",214 13791,"","Bealia","Scribn.",214 16004,"","Beckera","Fresen.",214 14357,"","Beckeria","Bernh.",214 12800,"","Beckeropsis","Fig. & De Not.",214 12801,"","Beckmannia","Host",214 15329,"","Beesha","Kunth",214 15330,"","Beesha","Munro",214 14318,"","Bellardiochloa","Chiov.",214 15331,"","Bennetia","Raf.",214 12802,"","Berchtoldia","C.Presl",214 13792,"","Berghausia","Endl.",214 12803,"","Bewsia","Gooss.",214 12804,"","Bhidea","Stapf ex Bor",214 13793,"","Biatherium","Desv.",214 16120,"","Bifaria","(Hack.) Kuntze",214 15335,"","Blakeochloa","Veldkamp",214 12805,"","Blepharidachne","Hack.",214 13794,"","Blepharochloa","Endl.",214 12806,"","Blepharoneuron","Nash",214 16091,"","Bluffia","Nees",214 15336,"","Blumenbachia","Koeler",214 15337,"","Blyttia","Fr.",214 12807,"","Boissiera","Hochst. ex Steud.",214 15986,"","Boivinella","A.Camus",214 12808,"","Bonia","Balansa",214 13795,"","Boriskellera","Terechov",214 15340,"","Botelua","Lag.",214 12809,"","Bothriochloa","Kuntze",214 12810,"","Bouteloua","Lag.",214 15341,"","Brachatera","Desv.",214 12811,"","Brachiaria","(Trin.) Griseb.",214 12812,"","Brachyachne","(Benth.) Stapf",214 15342,"","Brachyathera","Kuntze",214 12813,"","Brachychloa","S.M.Phillips",214 12814,"","Brachyelytrum","P.Beauv.",214 12815,"","Brachypodium","P.Beauv.",214 14939,"","Brachystachyum","Keng",214 15343,"","Brachystylus","Dulac",214 15344,"","Braconotia","Godr.",214 15345,"","Bracteola","Swallen",214 13797,"","Brandtia","Kunth",214 12816,"","Brasilocalamus","Nakai",214 14050,"","Brevipodium","A.Love & D.Love",214 12817,"","Briza","L.",214 14314,"","Brizochloa","Jirasek & Chrtek",214 15350,"","Brizopyrum","Link",214 15351,"","Brizopyrum","Stapf",214 14358,"","Bromelica","(Thurb.) Farw.",214 14897,"","Bromidium","Nees & Meyen",214 14080,"x","Bromofestuca","Prodan",214 14056,"","Bromopsis","(Dumort.) Fourr.",214 12818,"","Bromuniola","Stapf & C.E.Hubb.",214 15352,"","Bromus","Scop.",214 12819,"","Bromus","L.",214 13799,"","Brousemichea","Balansa",214 15353,"","Bruchmannia","Nutt.",214 12820,"","Brylkinia","F.Schmidt",214 15354,"","Bucetum","Parn.",214 12821,"","Buchloe","Engelm.",214 12822,"","Buchlomimus","Reeder, C.Reeder & Rzed.",214 12823,"","Buergersiochloa","Pilg.",214 15355,"","Bulbilis","Kuntze",214 15356,"","Bulbulus","Swallen",214 14933,"","Burmabambus","Keng f.",214 14925,"","Butania","Keng f.",214 16105,"","Cabrera","Lag.",214 12824,"","Calamagrostis","Adans.",214 15362,"","Calamina","P.Beauv.",214 14081,"x","Calammophila","Brand",214 15363,"","Calamochloa","E.Fourn.",214 13800,"","Calamochloe","Rchb.",214 15364,"x","Calamophila","O.Schwarz",214 12825,"","Calamovilfa","(A.Gray) Hack.",214 15365,"","Calanthera","Hook.",214 14006,"","Calderonella","Soderstr. & H.F.Decker",214 15366,"","Callichloea","Steud.",214 15367,"","Calochloa","Kunze",214 14311,"","Calosteca","Desv.",214 15368,"","Calotheca","P.Beauv.",214 15369,"","Calotheria","Steud.",214 13801,"","Calycodon","Nutt.",214 12826,"","Calyptochloa","C.E.Hubb.",214 14044,"","Campeiostachys","Drobow",214 15371,"","Campelia","Kunth",214 15372,"","Campella","Link",214 15373,"","Campuloa","Desv.",214 13802,"","Campulosus","Desv.",214 13804,"","Camusia","Lorch",214 16053,"","Camusiella","Bosser",214 15374,"","Candollea","Steud.",214 12828,"","Capillipedium","Stapf",214 15375,"","Capriola","Adans.",214 15376,"","Caryochloa","Spreng.",214 13782,"","Caryochloa","Trin.",214 15377,"","Caryophyllea","Opiz",214 15378,"","Casiostega","Galeotti",214 12829,"","Castellia","Tineo",214 12830,"","Catabrosa","P.Beauv.",214 14321,"","Catabrosella","(Tzvelev) Tzvelev",214 12831,"","Catalepis","Stapf & Stent",214 12832,"","Catapodium","Link",214 15997,"","Catatherophora","Steud.",214 12833,"","Cathestecum","C.Presl",214 15991,"","Cenchropsis","Nash",214 12834,"","Cenchrus","L.",214 15381,"","Centosteca","Desv.",214 14866,"","Centotheca","Desv.",214 12836,"","Centrochloa","Swallen",214 13805,"","Centrophorum","Trin.",214 12837,"","Centropodia","Rchb.",214 15382,"","Cephalochloa","Coss. & Durieu",214 12838,"","Cephalostachyum","Munro",214 15384,"","Ceratochaete","Lunell",214 14051,"","Ceratochloa","P.Beauv.",214 16117,"","Cerea","Schltdl.",214 16110,"","Ceresia","Pers.",214 15385,"","Ceytosis","Munro",214 13806,"","Chaboissaea","E.Fourn.",214 15386,"","Chaetaria","P.Beauv.",214 12839,"","Chaetium","Nees",214 12840,"","Chaetobromus","Nees",214 16062,"","Chaetochloa","Scribn.",214 12841,"","Chaetopoa","C.E.Hubb.",214 14856,"","Chaetopogon","Janch.",214 13807,"","Chaetostichium","C.E.Hubb.",214 12842,"","Chaetotropis","Kunth",214 15387,"","Chaeturus","Link",214 15388,"","Chalcoelytrum","Lunell",214 24100,"","Chalynochlamys","Franch.",214 14898,"","Chamaecalamus","Meyen",214 13763,"","Chamaedactylis","T.Nees",214 12844,"","Chamaeraphis","R.Br.",214 15390,"","Chamagrostis","Borkh.",214 12845,"","Chandrasekharania","V.J.Nair, V.S.Ramach. & Sreek.",214 14312,"","Chascolytrum","Desv.",214 16132,"","Chasea","Nieuwl.",214 16089,"","Chasechloa","A.Camus",214 12846,"","Chasmanthium","Link",214 12847,"","Chasmopodium","Stapf",214 15391,"","Chauvinia","Steud.",214 14912,"","Chennapyrum","A.Love",214 12848,"","Chevalierella","A.Camus",214 12849,"","Chikusichloa","Koidz.",214 14880,"","Chilochloa","P.Beauv.",214 12850,"","Chimonobambusa","Makino",214 14931,"","Chimonocalamus","J.R.Xue & T.P.Yi",214 12851,"","Chionachne","R.Br.",214 12852,"","Chionochloa","Zotov",214 16055,"","Chloachne","Stapf",214 14346,"","Chloammia","Raf.",214 12854,"","Chloothamnus","Buse",214 16005,"","Chloridion","Stapf",214 15398,"","Chloridopsis","Hack.",214 12855,"","Chloris","Sw.",214 12856,"","Chlorocalymma","Clayton",214 15399,"","Chloroides","Regel",214 15400,"","Chloropsis","Kuntze",214 15401,"","Chlorostis","Raf.",214 14313,"","Chondrachyrum","Nees",214 15402,"","Chondrochlaena","Kuntze",214 15403,"","Chondrolaena","Nees",214 12857,"","Chondrosum","Desv.",214 24962,"","Chretomeris","Nutt. ex J.G.Sm.",214 12858,"","Chrysochloa","Swallen",214 12859,"","Chrysopogon","Trin.",214 15405,"","Chrysurus","Pers.",214 13808,"","Chumsriella","Bor",214 12860,"","Chusquea","Kunth",214 12861,"","Cinna","L.",214 14900,"","Cinnagrostis","Griseb.",214 14884,"","Cinnastrum","E.Fourn.",214 12862,"","Cladoraphis","Franch.",214 15406,"","Claudia","Opiz",214 25797,"","Clausospicula","Lazarides",214 15982,"","Clavinodum","T.H.Wen",214 16109,"","Cleachne","Adans.",214 12863,"","Cleistachne","Benth.",214 12864,"","Cleistochloa","C.E.Hubb.",214 15409,"","Cleistogenes","Keng",214 15410,"","Cleomena","Roem. & Schult.",214 15411,"","Clinelymus","(Griseb.) Nevski",214 13809,"","Clomena","P.Beauv.",214 14030,"","Cockaynea","Zotov",214 15412,"","Codonachne","Steud.",214 12865,"","Coelachne","R.Br.",214 13811,"","Coelachyropsis","Bor",214 12866,"","Coelachyrum","Hochst. & Nees",214 13812,"","Coelarthron","Hook.f.",214 15413,"","Coelochloa","Steud.",214 12867,"","Coelorachis","Brongn.",214 12868,"","Coix","L.",214 12869,"","Colanthelia","McClure & E.W.Sm.",214 12870,"","Coleanthus","Seidel",214 16133,"","Coleataenia","Griseb.",214 15414,"","Coliquea","Bibra",214 13813,"","Colladoa","Cav.",214 14876,"","Colobachne","P.Beauv.",214 15415,"","Colobanthium","(Rchb.) G.Taylor",214 15416,"","Colobanthus","(Trin.) Spach",214 12871,"","Colpodium","Trin.",214 12872,"","Commelinidium","Stapf",214 14911,"","Comopyrum","A.Love",214 15418,"","Corethrum","Vahl",214 16092,"","Coridochloa","Nees",214 12873,"","Cornucopiae","L.",214 12874,"","Cortaderia","Stapf",214 15420,"","Corycarpus","Spreng.",214 12875,"","Corynephorus","P.Beauv.",214 15421,"","Costia","Willk.",214 12876,"","Cottea","Kunth",214 14307,"","Craepalia","Schrank",214 12877,"","Craspedorhachis","Benth.",214 14310,"","Crassipes","Swallen",214 15422,"","Cremopyrum","Schur",214 17772,"","Criciuma","Soderstr. & Londono",214 12878,"","Crinipes","Hochst.",214 14026,"","Critesion","Raf.",214 14028,"","Critho","E.Mey.",214 14032,"","Crithodium","Link",214 14014,"","Crithopsis","Jaub. & Spach",214 15423,"","Crithopyrum","Steud.",214 13814,"","Crossotropis","Stapf",214 13815,"","Crypsinna","E.Fourn.",214 12879,"","Crypsis","Aiton",214 12880,"","Cryptochloa","Swallen",214 13816,"","Cryptochloris","Benth.",214 15424,"","Cryptopyrum","Heynh.",214 13817,"","Cryptostachys","Steud.",214 14308,"","Crypturus","Trin.",214 12881,"","Ctenium","Panz.",214 12882,"","Ctenopsis","De Not.",214 13818,"","Curtopogon","P.Beauv.",214 12883,"","Cutandia","Willk.",214 15425,"","Cuviera","Koeler",214 12884,"","Cyathopus","Stapf",214 13819,"","Cyathorhachis","Steud.",214 12885,"","Cyclostachya","Reeder & C.Reeder",214 15427,"","Cycloteria","Stapf",214 15426,"","Cylichnium","Dulac",214 14915,"","Cylindropyrum","(Jaub. & Spach) A.Love",214 16118,"","Cymatochloa","Schltdl.",214 15428,"","Cymbachne","Retz.",214 15429,"","Cymbanthelia","Andersson",214 12886,"","Cymbopogon","Spreng.",214 16052,"","Cymbosetaria","Schweick.",214 14082,"x","Cynochloris","Clifford & Everist",214 12888,"","Cynodon","Rich.",214 12889,"","Cynosurus","L.",214 17755,"","Cyperochloa","Lazarides & L.Watson",214 12890,"","Cyphochlaena","Hack.",214 13820,"","Cypholepis","Chiov.",214 15430,"","Cyrenea","F.Allam.",214 12891,"","Cyrtococcum","Stapf",214 15431,"","Cyrtopogon","Spreng.",214 15432,"","Czerniaevia","Ledeb.",214 13821,"","Czernya","C.Presl",214 13822,"","Dactilon","Vill.",214 12892,"","Dactylis","L.",214 12893,"","Dactyloctenium","Willd.",214 15433,"","Dactylodes","Kuntze",214 13823,"","Dactylogramma","Link",214 15434,"","Dactylus","Asch.",214 12894,"","Daknopholis","Clayton",214 15435,"","Dalucum","Adans.",214 12895,"","Danthonia","DC.",214 14368,"","Danthoniastrum","(Holub) Holub",214 12896,"","Danthonidium","C.E.Hubb.",214 12897,"","Danthoniopsis","Stapf",214 15436,"","Danthorhiza","Ten.",214 14099,"x","Danthosieglingia","Domin",214 14347,"","Dasiola","Raf.",214 13824,"","Dasyochloa","Rydb.",214 12898,"","Dasypoa","Pilg.",214 14010,"","Dasypyrum","(Coss. & Durieu) T.Durand",214 24252,"","Davidsea","Soderstr. & R.P.Ellis",214 15437,"","Davyella","Hack.",214 15438,"","Decandolia","Bastard",214 12899,"","Decaryella","A.Camus",214 12900,"","Decaryochloa","A.Camus",214 14033,"","Deina","Alef.",214 15440,"","Demazeria","Dumort.",214 15442,"","Dendragrostis","B.D.Jacks.",214 14945,"","Dendrocalamopsis","(L.C.Chia & H.L.Fung) Keng f.",214 12901,"","Dendrocalamus","Nees",214 12902,"","Dendrochloa","C.E.Parkinson",214 12903,"","Deschampsia","P.Beauv.",214 12904,"","Desmazeria","Dumort.",214 12905,"","Desmostachya","(Stapf) Stapf",214 14024,"","Despretzia","Kunth",214 15444,"","Devauxia","Kunth",214 12906,"","Deyeuxia","Clarion ex P.Beauv.",214 14351,"","Diachroa","Nutt.",214 13825,"","Diachyrium","Griseb.",214 15445,"","Diacisperma","Kuntze",214 24132,"","Diandranthus","Liou",214 13827,"","Diandrochloa","De Winter",214 12907,"","Diandrolyra","Stapf",214 13828,"","Diandrostachya","(C.E.Hubb.) Jacq.-Fel.",214 15446,"","Diarina","Raf.",214 12908,"","Diarrhena","P.Beauv.",214 16073,"","Diastemenanthe","Desv.",214 12909,"","Dichaetaria","Nees ex Steud.",214 15952,"","Dichanthelium","(Hitchc. & Chase) Gould",214 12910,"","Dichanthium","Willemet",214 12911,"","Dichelachne","Endl.",214 16115,"","Dichromus","Schltdl.",214 12912,"","Dictyochloa","(Murb.) E.G.Camus",214 13829,"","Didactylon","Zoll. & Moritzi",214 14899,"","Didymochaeta","Steud.",214 15447,"","Diectomis","P.Beauv.",214 13830,"","Diectomis","Kunth",214 12913,"","Dielsiochloa","Pilg.",214 13831,"","Digastrium","(Hack.) A.Camus",214 15448,"","Digitaria","Adans.",214 12914,"","Digitaria","Haller",214 16124,"","Digitaria","Fabr.",214 16016,"","Digitariella","De Winter",214 16015,"","Digitariopsis","C.E.Hubb.",214 12915,"","Dignathia","Stapf",214 15449,"","Digraphis","Trin.",214 12916,"","Diheteropogon","(Hack.) Stapf",214 15450,"","Dilepyrum","Raf.",214 13832,"","Dilepyrum","Michx.",214 16137,"","Dileucaden","(Raf.) Steud.",214 12917,"","Dilophotriche","(C.E.Hubb.) Jacq.-Fel.",214 13833,"","Dimeiostemon","Raf.",214 12918,"","Dimeria","R.Br.",214 15451,"","Dimesia","Raf.",214 16056,"","Dimorphochloa","S.T.Blake",214 16114,"","Dimorphostachys","E.Fourn.",214 12920,"","Dinebra","Jacq.",214 12921,"","Dinochloa","Buse",214 13834,"","Diperium","Desv.",214 13835,"","Diplachne","P.Beauv.",214 15452,"","Diplachyrium","Nees",214 13836,"","Diplasanthum","Desv.",214 14020,"","Diplax","Benn.",214 13837,"","Diplocea","Raf.",214 15453,"","Diplogon","Poir.",214 12922,"","Diplopogon","R.Br.",214 15455,"","Dipogon","Steud.",214 15456,"","Dipogonia","P.Beauv.",214 15457,"","Diptychum","Dulac",214 13826,"","Disakisperma","Steud.",214 14873,"","Disarrenum","Labill.",214 12923,"","Dissanthelium","Trin.",214 12924,"","Dissochondrus","(W.F.Hillebr.) Kuntze",214 12925,"","Distichlis","Raf.",214 15460,"","Distomomischus","Dulac",214 15461,"","Doellochloa","Kuntze",214 13839,"","Dolichochaete","(C.E.Hubb.) J.B.Phipps",214 15462,"","Donacium","Fr.",214 15463,"","Donax","P.Beauv.",214 12926,"","Drake-Brockmania","Stapf",214 12927,"","Dregeochloa","Conert",214 14934,"","Drepanostachyum","Keng f.",214 14907,"","Drymochloa","Holub",214 15465,"","Drymonaetes","Fourr.",214 12928,"","Dryopoa","Vickery",214 12929,"","Dupontia","R.Br.",214 17759,"x","Dupontopoa","Prob.",214 12930,"","Duthiea","Hack.",214 13840,"","Dybowskia","Stapf",214 16125,"","Eatonia","Raf.",214 13841,"","Eccoilopus","Steud.",214 12931,"","Eccoptocarpha","Launert",214 15469,"","Echinalysium","Trin.",214 13842,"","Echinanthus","Cerv.",214 12932,"","Echinaria","Desf.",214 15992,"","Echinaria","Fabr.",214 16082,"","Echinochlaena","Spreng.",214 12933,"","Echinochloa","P.Beauv.",214 12934,"","Echinolaena","Desv.",214 12935,"","Echinopogon","P.Beauv.",214 15475,"","Ectosperma","Swallen",214 12936,"","Ectrosia","R.Br.",214 12937,"","Ectrosiopsis","(Ohwi) Jansen",214 12938,"","Ehrharta","Thunb.",214 15477,"","Ehrhartia","Weber",214 12939,"","Ekmanochloa","Hitchc.",214 13843,"","Electra","Panz.",214 12940,"","Eleusine","Gaertn.",214 12941,"","Elionurus","Humb. & Bonpl. ex Willd.",214 14083,"x","Elyhordeum","Tsitsin & K.A.Petrova",214 14084,"x","Elyleymus","B.R.Baum",214 12942,"","Elymandra","Stapf",214 15478,"x","Elymopyrum","Cugnac",214 15479,"x","Elymordeum","Lepage",214 14085,"x","Elymostachys","Tzvelev",214 14100,"x","Elymotrigia","Hyl.",214 14086,"x","Elymotriticum","E.Fourn.",214 15480,"","Elymus","Mitch.",214 12943,"","Elymus","L.",214 15481,"","Elyonurus","Willd.",214 14087,"x","Elysitanion","Bowden",214 14035,"","Elytrigia","Desv.",214 16010,"","Elytroblepharum","(Steud.) Schltdl.",214 12944,"","Elytrophorus","P.Beauv.",214 14101,"x","Elytrordeum","Hyl.",214 12945,"","Elytrostachys","McClure",214 15482,"","Endallex","Raf.",214 13844,"","Endodia","Raf.",214 12946,"","Enneapogon","Desv. ex P.Beauv.",214 15483,"","Enodium","Pers. ex Gaudin",214 12947,"","Enteropogon","Nees",214 12948,"","Entolasia","Stapf",214 12949,"","Entoplocamia","Stapf",214 15484,"","Ephebopogon","Steud.",214 13845,"","Epicampes","C.Presl",214 12950,"","Eragrostiella","Bor",214 12951,"","Eragrostis","Wolf",214 12952,"","Eremitis","Doll",214 17773,"","Eremocaulon","Soderstr. & Londono",214 16071,"","Eremochlamys","Peter",214 12953,"","Eremochloa","Buse",214 15486,"","Eremochloe","S.Watson",214 12954,"","Eremopoa","Roshev.",214 13846,"","Eremopogon","Stapf",214 12955,"","Eremopyrum","(Ledeb.) Jaub. & Spach",214 12956,"","Eriachne","R.Br.",214 16098,"","Eriachne","Phil.",214 12957,"","Erianthecium","Parodi",214 13847,"","Erianthus","Michx.",214 14390,"","Erioblastus","Honda",214 16001,"","Eriochaeta","Fig. & De Not.",214 12958,"","Eriochloa","Kunth",214 12959,"","Eriochrysis","P.Beauv.",214 14061,"","Eriocoma","Nutt.",214 16126,"","Eriolytrum","Kunth",214 12960,"","Erioneuron","Nash",214 15488,"","Eriopodium","Hochst.",214 13848,"","Erochloe","Raf.",214 15489,"","Erosion","Lunell",214 15490,"","Erucaria","Cerv.",214 14002,"","Erythranthera","Zotov",214 13850,"","Euchlaena","Schrad.",214 14102,"x","Euchlaezea","Bor",214 12961,"","Euclasta","Franch.",214 15492,"","Eudonax","Fr.",214 15493,"","Eufournia","Reeder",214 13851,"","Euklastaxon","Steud.",214 12962,"","Eulalia","Kunth",214 12963,"","Eulaliopsis","Honda",214 15495,"","Eupogon","Desv.",214 15497,"","Euraphis","(Trin.) Lindl.",214 12964,"","Eustachys","Desv.",214 16049,"","Euthryptochloa","Cope",214 13852,"","Eutriana","Trin.",214 15499,"","Exagrostis","Steud.",214 12965,"","Exotheca","Andersson",214 14353,"","Exydra","Endl.",214 15500,"","Falimiria","Rchb.",214 14303,"","Falona","Adans.",214 12966,"","Fargesia","Franch.",214 12967,"","Farrago","Clayton",214 15502,"","Fartis","Adans.",214 14062,"","Fendleria","Steud.",214 14941,"","Ferrocalamus","J.R.Xue & Keng f.",214 12968,"","Festuca","L.",214 15503,"","Festucaria","Fabr.",214 15504,"","Festucaria","Link",214 16259,"","Festucella","E.B.Alexeev",214 14048,"","Festucopsis","(C.E.Hubb.) Melderis",214 14088,"x","Festulolium","Asch. & Graebn.",214 14089,"x","Festulpia","Stace & R.Cotton",214 13853,"","Fibichia","Koeler",214 13854,"","Filipedium","Raizada & S.K.Jain",214 12969,"","Fingerhuthia","Nees",214 14391,"","Fiorinia","Parl.",214 15505,"","Flavia","Fabr.",214 15506,"","Flexularia","Raf.",214 14344,"","Fluminia","Fr.",214 15509,"","Foenodorum","E.H.L.Krause",214 15511,"","Forasaccus","Bubani",214 15512,"","Fourniera","Scribn.",214 12970,"","Froesiochloa","G.A.Black",214 15515,"","Frumentum","E.H.L.Krause",214 15517,"","Fussia","Schur",214 15518,"","Galeottia","M.Martens & Galeotti",214 13855,"","Gamelythrum","Nees",214 12971,"","Garnotia","Brongn.",214 13856,"","Garnotiella","Stapf",214 12972,"","Gastridium","P.Beauv.",214 14916,"","Gastropyrum","(Jaub. & Spach) A.Love",214 12973,"","Gaudinia","P.Beauv.",214 14376,"","Gaudinopsis","(Boiss.) Eig",214 13857,"","Gazachloa","J.B.Phipps",214 14928,"","Gelidocalamus","T.H.Wen",214 15519,"","Genea","(Dumort.) Dumort.",214 15520,"","Geopogon","Steud.",214 12974,"","Germainia","Balansa & Poitr.",214 15522,"","Gigachilon","Seidl",214 12975,"","Gigantochloa","Kurz ex Munro",214 12976,"","Gilgiochloa","Pilg.",214 15523,"","Ginannia","Bubani",214 16101,"","Glandiloba","(Raf.) Steud.",214 12977,"","Glaziophyton","Franch.",214 12978,"","Glyceria","R.Br.",214 12979,"","Glyphochloa","Clayton",214 15525,"","Gnomonia","Lunell",214 15526,"","Goldbachia","Trin.",214 13858,"","Gossweilerochloa","Renvoize",214 12980,"","Gouinia","E.Fourn.",214 14038,"","Goulardia","Husn.",214 25435,"","Gouldochloa","J.Valdes, Morden & S.L.Hatch",214 13859,"","Gracilea","Hook.f.",214 15528,"","Gramen","Seg.",214 15529,"","Gramen","Krause",214 15530,"","Gramen","W.Young",214 16009,"","Gramerium","Desv.",214 14383,"","Graminastrum","E.H.L.Krause",214 14341,"","Graphephorum","Desv.",214 15984,"","Graya","Steud.",214 15531,"","Greenia","Nutt.",214 12981,"","Greslania","Balansa",214 12982,"","Griffithsochloa","G.J.Pierce",214 15532,"","Guadella","Franch.",214 12983,"","Guadua","Kunth",214 12984,"","Guaduella","Franch.",214 12985,"","Gymnachne","Parodi",214 13860,"","Gymnandropogon","(Nees) Duthie",214 15533,"","Gymnanthelia","Schweinf.",214 12986,"","Gymnopogon","P.Beauv.",214 15534,"","Gymnostichum","Schreb.",214 15998,"","Gymnotrix","P.Beauv.",214 12987,"","Gynerium","P.Beauv.",214 12988,"","Habrochloa","C.E.Hubb.",214 15537,"","Habrurus","Hochst.",214 15538,"","Hackelia","Vasey",214 12989,"","Hackelochloa","Kuntze",214 14009,"","Hainardia","Greuter",214 17762,"x","Hainardiopholis","Castrov.",214 12990,"","Hakonechloa","Makino ex Honda",214 15539,"","Halochloa","Griseb.",214 12991,"","Halopyrum","Stapf",214 13861,"","Haplachne","C.Presl",214 12992,"","Harpachne","Hochst. ex A.Rich.",214 12993,"","Harpochloa","Kunth",214 15543,"","Haynaldia","Schur",214 15544,"x","Haynaldoticum","Cif. & Giacom.",214 16084,"","Hekaterosachne","Steud.",214 15545,"","Heleochloa","Fr.",214 15546,"","Heleochloa","P.Beauv.",214 13862,"","Heleochloa","Roem.",214 12995,"","Helictotrichon","Besser",214 15547,"","Hellera","Doll",214 15548,"","Helleria","E.Fourn.",214 14324,"","Hellerochloa","Rauschert",214 16099,"","Helopus","Trin.",214 12996,"","Hemarthria","R.Br.",214 14355,"","Hemibromus","Steud.",214 16083,"","Hemigymnia","Stapf",214 13863,"","Hemimunroa","Parodi",214 13864,"","Hemisacris","Steud.",214 12997,"","Hemisorghum","C.E.Hubb. ex Bor",214 12998,"","Henrardia","C.E.Hubb.",214 15550,"","Heptaseta","Koidz.",214 12999,"","Hesperochloa","(Piper) Rydb.",214 13000,"","Heterachne","Benth.",214 13001,"","Heteranthelium","Jaub. & Spach",214 13002,"","Heteranthoecia","Stapf",214 14375,"","Heteranthus","Borkh.",214 13865,"","Heterelytron","Jungh.",214 13866,"","Heterocarpha","Stapf & C.E.Hubb.",214 15551,"","Heterochaeta","Schult.",214 13867,"","Heterochloa","Desv.",214 15552,"","Heterolepis","Boiss.",214 13003,"","Heteropholis","C.E.Hubb.",214 13004,"","Heteropogon","Pers.",214 13990,"","Heterosteca","Desv.",214 15555,"","Heuffelia","Schur",214 13868,"","Hexarrhena","C.Presl",214 15556,"x","Hibanobambusa","Maruy. & H.Okamura",214 13005,"","Hickelia","A.Camus",214 13006,"","Hierochloe","R.Br.",214 13007,"","Hilaria","Kunth",214 14935,"","Himalayacalamus","Keng f.",214 16085,"","Hippagrostis","Kuntze",214 13008,"","Hitchcockella","A.Camus",214 15559,"","Holboellia","Hook.",214 13009,"","Holcolemma","Stapf & C.E.Hubb.",214 13010,"","Holcus","L.",214 13869,"","Hologamium","Nees",214 16095,"","Holosetum","Steud.",214 15560,"","Homalachna","Kuntze",214 15561,"","Homalocenchrus","Miegev.",214 13870,"","Homoeatherum","Nees",214 14867,"","Homoiachne","Pilg.",214 13012,"","Homolepis","Chase",214 13013,"","Homopholis","C.E.Hubb.",214 15562,"","Homoplitis","Trin.",214 13871,"","Homopogon","Stapf",214 13014,"","Homozeugos","Stapf",214 16260,"","Hookerochloa","E.B.Alexeev",214 16086,"","Hoplismenus","Hassk.",214 14090,"x","Hordale","Cif. & Giacom.",214 13015,"","Hordelymus","(Jess.) Jess. ex Harz",214 15563,"x","Hordelymus","Bachteev & Darevsk.",214 15564,"x","Hordeopyrum","Simonet",214 14103,"x","Hordeoroegneria","Tzvelev",214 13016,"","Hordeum","L.",214 14948,"","Houzeaubambus","Mattei",214 13017,"","Hubbardia","Bor",214 13018,"","Hubbardochloa","Auquier",214 13019,"","Humbertochloa","A.Camus & Stapf",214 14322,"","Hyalopoa","(Tzvelev) Tzvelev",214 15565,"","Hydrochloa","Hartm.",214 13872,"","Hydrochloa","P.Beauv.",214 15566,"","Hydropoa","(Dumort.) Dumort.",214 13873,"","Hydropyrum","Link",214 13020,"","Hydrothauma","C.E.Hubb.",214 16039,"","Hygrochloa","Lazarides",214 15567,"","Hygrorhiza","Benth.",214 13021,"","Hygroryza","Nees",214 13022,"","Hylebates","Chippind.",214 13023,"","Hymenachne","P.Beauv.",214 13874,"","Hymenothecium","Lag.",214 13024,"","Hyparrhenia","E.Fourn.",214 13025,"","Hyperthelia","Clayton",214 13875,"","Hypogynium","Nees",214 13026,"","Hypseochloa","C.E.Hubb.",214 15988,"","Hypudaerus","A.Braun",214 14940,"","Hystericina","Steud.",214 15569,"","Hystringium","Steud.",214 13027,"","Hystrix","Moench",214 13028,"","Ichnanthus","P.Beauv.",214 13029,"","Imperata","Cirillo",214 14862,"","Indocalamus","Nakai",214 13876,"","Indochloa","Bor",214 13030,"","Indopoa","Bor",214 15570,"","Indoryza","A.N.Henry & B.Roy",214 13031,"","Indosasa","McClure",214 15571,"","Ioackima","Ten.",214 13877,"","Ipnum","Phil.",214 15572,"","Irulia","Bedd.",214 13032,"","Isachne","R.Br.",214 13878,"","Isalus","J.B.Phipps",214 13879,"","Ischaemopogon","Griseb.",214 13033,"","Ischaemum","L.",214 16080,"","Ischnanthus","Roem. & Schult.",214 13880,"","Ischnochloa","Hook.f.",214 13881,"","Ischnurus","Balf.f.",214 14942,"","Ischurochloa","Buse",214 13034,"","Iseilema","Andersson",214 16019,"","Ixalum","G.Forst.",214 13035,"","Ixophorus","Schltdl.",214 13882,"","Jacquesfelixia","J.B.Phipps",214 13036,"","Jansenella","Bor",214 14063,"","Jarava","Ruiz & Pav.",214 13883,"","Jardinea","Steud.",214 14392,"","Joachima","Ten.",214 13884,"","Joannegria","Chiov.",214 13037,"","Jouvea","E.Fourn.",214 15575,"","Kampmannia","Steud.",214 13038,"","Kampochloa","Clayton",214 13039,"","Kaokochloa","De Winter",214 14003,"","Karroochloa","Conert & Turpe",214 13040,"","Kengia","Packer",214 25438,"","Kengyilia","C.Yen & J.L.Yang",214 14319,"","Keniochloa","Melderis",214 16018,"","Kerinozoma","Steud.",214 13041,"","Kerriochloa","C.E.Hubb.",214 15577,"","Kielboul","Adans.",214 14913,"","Kiharapyrum","A.Love",214 13042,"","Klemachloa","R.Parker",214 15578,"","Knappia","Sm.",214 13043,"","Koeleria","Pers.",214 14359,"","Koordersiochloa","Merr.",214 15579,"","Korycarpus","Lag.",214 13778,"","Kralikia","Coss. & Durieu",214 15580,"","Kralikiella","Batt. & Trab.",214 15581,"","Kratzmannia","Opiz",214 14025,"","Krombholzia","E.Fourn.",214 14343,"","Ktenosachne","Steud.",214 14890,"","Lachnagrostis","Trin.",214 15582,"","Lachnochloa","Steud.",214 15583,"","Lachryma-jobi","Ortega",214 15584,"","Lachrymaria","Fabr.",214 15585,"","Lacryma","Medik.",214 15587,"","Laertia","Gromov",214 13044,"","Lagurus","L.",214 13045,"","Lamarckia","Moench",214 15588,"","Lamarkia","Moench",214 13046,"","Lamprothyrsus","Pilg.",214 15589,"","Langsdorffia","Regel",214 15590,"","Lappago","Schreb.",214 16107,"","Lappagopsis","Steud.",214 13047,"","Lasiacis","(Griseb.) Hitchc.",214 15591,"","Lasiagrostis","Link",214 13048,"","Lasiochloa","Kunth",214 13885,"","Lasiolytrum","Steud.",214 13886,"","Lasiorhachis","(Hack.) Stapf",214 15592,"","Lasiostega","Benth.",214 15593,"","Lasiotrichos","Lehm.",214 13049,"","Lasiurus","Boiss.",214 17757,"","Laston","Pau",214 13887,"","Latipes","Kunth",214 15595,"","Lechlera","Steud.",214 13050,"","Lecomtella","A.Camus",214 13051,"","Leersia","Sw.",214 14361,"","Leiopoa","Ohwi",214 14943,"","Leleba","Nakai",214 15596,"","Lenormandia","Steud.",214 13889,"","Lepargochloa","Launert",214 13891,"","Lepeocercis","Trin.",214 13890,"","Lepideilema","Trin.",214 13892,"","Lepidopironia","A.Rich.",214 15597,"","Lepidurus","Janch.",214 15598,"","Lepitoma","Steud.",214 15599,"","Lepiurus","Dumort.",214 13052,"","Leptagrostis","C.E.Hubb.",214 13053,"","Leptaspis","R.Br.",214 13893,"","Leptatherum","Nees",214 14949,"","Leptocanna","L.C.Chia & H.L.Fung",214 13054,"","Leptocarydion","Stapf",214 15600,"","Leptocercus","Raf.",214 13055,"","Leptochloa","P.Beauv.",214 13894,"","Leptochloopsis","H.O.Yates",214 15601,"","Leptochloris","Kuntze",214 13056,"","Leptocoryphium","Nees",214 16014,"","Leptoloma","Chase",214 14379,"","Leptophyllochloa","Calderon",214 13895,"","Leptopogon","Roberty",214 15603,"","Leptopyrum","Raf.",214 13896,"","Leptosaccharum","(Hack.) A.Camus",214 15604,"","Leptostachys","G.Mey.",214 13057,"","Leptothrium","Kunth",214 15605,"","Leptothrix","(Dumort.) Dumort.",214 13897,"","Lepturella","Stapf",214 13058,"","Lepturidium","Hitchc. & Ekman",214 13059,"","Lepturopetium","Morat",214 13898,"","Lepturopsis","Steud.",214 13060,"","Lepturus","R.Br.",214 15606,"","Lepyroxis","E.Fourn.",214 15607,"","Lerchenfeldia","Schur",214 13899,"","Lesourdia","E.Fourn.",214 13061,"","Leucophrys","Rendle",214 13062,"","Leucopoa","Griseb.",214 14091,"x","Leymopyron","Tzvelev",214 14092,"x","Leymostachys","Tzvelev",214 14104,"x","Leymotrigia","Tzvelev",214 17761,"x","Leymotrix","Khark. & Prob.",214 14012,"","Leymus","Hochst.",214 17760,"x","Leytesion","Barkworth",214 15608,"","Libertia","Lej.",214 13063,"","Libyella","Pamp.",214 13064,"","Limnas","Trin.",214 16034,"","Limnetis","Rich.",214 13065,"","Limnodea","L.H.Dewey",214 13066,"","Limnopoa","C.E.Hubb.",214 14333,"","Lindbergella","Bor",214 15612,"","Lindbergia","Bor",214 13067,"","Lingnania","McClure",214 22276,"","Linkagrostis","Romero Garcia, Blanca & C.Morales",214 15613,"","Linosparton","Adans.",214 13068,"","Lintonia","Stapf",214 13069,"","Lithachne","P.Beauv.",214 15614,"","Lithagrostis","Gaertn.",214 13070,"","Littledalea","Hemsl.",214 13901,"","Lodicularia","P.Beauv.",214 14326,"","Lojaconoa","Gand.",214 14335,"","Loliolum","Krecz. & Bobrov",214 13071,"","Lolium","L.",214 14315,"","Lombardochloa","Roseng. & B.R.Arill.",214 13072,"","Lophacme","Stapf",214 13073,"","Lophatherum","Brongn.",214 14356,"","Lophochlaena","Nees",214 13074,"","Lophochloa","Rchb.",214 13075,"","Lopholepis","Decne.",214 13076,"","Lophopogon","Hack.",214 14040,"","Lophopyrum","A.Love",214 13077,"","Lorenzochloa","Reeder & C.Reeder",214 14348,"","Loretia","Duval-Jouve",214 13078,"","Loudetia","Hochst. ex Steud.",214 15617,"","Loudetia","A.Braun",214 13079,"","Loudetiopsis","Conert",214 13080,"","Louisiella","C.E.Hubb. & J.Leonard",214 13081,"","Loxodera","Launert",214 16079,"","Loxostachys","Peter",214 15999,"","Loydia","Delile",214 13902,"","Lucaea","Kunth",214 15618,"","Ludolphia","Willd.",214 13082,"","Luziola","Juss.",214 13083,"","Lycochloa","Sam.",214 13084,"","Lycurus","Kunth",214 13085,"","Lygeum","L.",214 13086,"","Maclurolyra","Calderon & Soderstr.",214 13903,"","Macroblepharus","Phil.",214 24257,"","Macrobriza","(Tzvelev) Tzvelev",214 16000,"","Macrochaeta","Steud.",214 14065,"","Macrochloa","Kunth",214 15619,"","Macronax","Raf.",214 15620,"","Macrostachya","A.Rich.",214 14881,"","Maillea","Parl.",214 16143,"","Maizilla","Schltdl.",214 14047,"","Malacurus","Nevski",214 15624,"x","Maltea","B.Boivin",214 13087,"","Maltebrunia","Kunth",214 15625,"","Malya","Opiz",214 13888,"","Mandelorna","Steud.",214 13088,"","Manisuris","L.",214 15630,"","Mapira","Adans.",214 13904,"","Massia","Balansa",214 13905,"","Matrella","Pers.",214 14920,"","Matudacalamus","F.Maek.",214 15631,"","Mays","Mill.",214 15632,"","Mayzea","Raf.",214 15635,"","Medusather","Candargy",214 13089,"","Megalachne","Steud.",214 13090,"","Megaloprotachne","C.E.Hubb.",214 13091,"","Megastachya","P.Beauv.",214 13092,"","Melanocenchris","Nees",214 13093,"","Melica","L.",214 13094,"","Melinis","P.Beauv.",214 15637,"","Melinum","Link",214 13095,"","Melocalamus","Benth.",214 13096,"","Melocanna","Trin.",214 13906,"","Meoschium","P.Beauv.",214 15638,"","Merathrepta","Raf.",214 16165,"","Meringurus","Murb.",214 13907,"","Merisachne","Steud.",214 13097,"","Merostachys","Spreng.",214 14004,"","Merxmuellera","Conert",214 13098,"","Mesosetum","Steud.",214 23592,"","Metasasa","W.T.Lin",214 14338,"","Metcalfia","Conert",214 16093,"","Mezochloa","Butzin",214 13099,"","Mibora","Adans.",214 15640,"","Micagrostis","Juss.",214 14052,"","Michelaria","Dumort.",214 13100,"","Micraira","F.Muell.",214 13908,"","Microbambus","K.Schum.",214 14298,"","Microbriza","Nicora & Rugolo",214 15641,"","Microcalamus","Gamble",214 13101,"","Microcalamus","Franch.",214 15642,"","Microchlaena","Kuntze",214 13102,"","Microchloa","R.Br.",214 13103,"","Microlaena","R.Br.",214 15643,"","Micropogon","Pfeiff.",214 14342,"","Micropyropsis","Romero Zarco & Cabezudo",214 13104,"","Micropyrum","(Gaudin) Link",214 13105,"","Microstegium","Nees",214 16077,"","Microthuareia","Thouars",214 15645,"","Miegia","Pers.",214 13106,"","Mildbraediochloa","Butzin",214 15646,"","Miliarium","Moench",214 16061,"","Miliastrum","Fabr.",214 13107,"","Milium","L.",214 16127,"","Milium","Adans.",214 15647,"","Miphragtes","Nieuwl.",214 15648,"","Miquelia","Arn. & Nees",214 13909,"","Miscanthidium","Stapf",214 13108,"","Miscanthus","Andersson",214 13910,"","Mitwabochloa","J.B.Phipps",214 13109,"","Mnesithea","Kunth",214 13110,"","Mniochloa","Chase",214 16112,"","Moenchia","Steud.",214 14389,"","Molinerella","Rouy",214 15649,"","Molineria","Parl.",214 13111,"","Molinia","Schrank",214 13911,"","Moliniopsis","Hayata",214 15650,"","Moliniopsis","Gand.",214 13112,"","Monachather","Steud.",214 16131,"","Monachne","P.Beauv.",214 16069,"","Monachyron","Parl.",214 14387,"","Monandraira","Desv.",214 13113,"","Monanthochloe","Engelm.",214 15651,"","Monathera","Raf.",214 13114,"","Monelytrum","Hack. ex Schinz",214 15652,"","Monerma","P.Beauv.",214 15653,"","Monilia","Gray",214 13912,"","Monium","Stapf",214 15654,"","Monocera","Elliott",214 13838,"","Monochaete","Doll",214 24254,"","Monocladus","L.C.Chia & H.L.Fung",214 13116,"","Monocymbium","Stapf",214 16042,"","Monodia","S.W.L.Jacobs",214 13913,"","Monopogon","C.Presl",214 16164,"","Monostachya","Merr.",214 15655,"","Monostemon","Henrard",214 15656,"","Monroa","Torr.",214 15657,"","Moorea","Lem.",214 13117,"","Mosdenia","Stent",214 15658,"","Moulinsia","Raf.",214 13914,"","Muantijamvella","J.B.Phipps",214 13118,"","Muhlenbergia","Schreb.",214 13119,"","Munroa","Torr.",214 15659,"","Mustelia","Steud.",214 15660,"","Mygalurus","Link",214 13915,"","Myriachaeta","Moritzi",214 13120,"","Myriocladus","Swallen",214 13121,"","Myriostachya","(Benth.) Hook.f.",214 14363,"","Nabelekia","Roshev.",214 14349,"","Narduretia","Villar",214 13122,"","Narduroides","Rouy",214 13123,"","Nardurus","(Bluff, Nees & Schauer) Rchb.",214 13124,"","Nardus","L.",214 13916,"","Narenga","Bor",214 13125,"","Nassella","(Trin.) E.Desv.",214 13126,"","Nastus","Juss.",214 15993,"","Nastus","Lunell",214 15664,"","Natschia","Bubani",214 16081,"","Navicularia","Raddi",214 15665,"","Nazia","Adans.",214 13917,"","Neeragrostis","Bush",214 13127,"","Neesiochloa","Pilg.",214 15666,"","Negria","Chiov.",214 13918,"","Nemastachys","Steud.",214 13128,"","Nematopoa","C.E.Hubb.",214 14865,"","Neoaulacolepis","Rauschert",214 15667,"","Neobambus","Keng f.",214 13129,"","Neobouteloua","Gould",214 13130,"","Neohouzeaua","A.Camus",214 16090,"","Neohusnotia","A.Camus",214 14938,"","Neomicrocalamus","Keng f.",214 13131,"","Neomolinia","Honda",214 14926,"","Neosasamorpha","Tatew.",214 14896,"","Neoschischkinia","Tzvelev",214 14947,"","Neosinocalamus","Keng f.",214 13132,"","Neostapfia","Burtt Davy",214 13133,"","Neostapfiella","A.Camus",214 13134,"","Nephelochloa","Boiss.",214 15674,"","Nestlera","Steud.",214 13135,"","Neurachne","R.Br.",214 13136,"","Neurolepis","Meisn.",214 14334,"","Neuropoa","Clayton",214 15675,"","Nevroctola","Raf.",214 14352,"","Nevroloma","Raf.",214 14057,"","Nevskiella","Krecz. & Vved.",214 13137,"","Neyraudia","Hook.f.",214 14927,"","Nipponobambusa","Muroi",214 15163,"","Nipponocalamus","Nakai",214 14034,"","Nivieria","Ser.",214 13784,"","Normanboria","Butzin",214 15679,"","Nothoholcus","Nash",214 15680,"","Notholcus","Hitchc.",214 13138,"","Notochloe","Domin",214 14005,"","Notodanthonia","Zotov",214 14891,"","Notonema","Raf.",214 14885,"","Nowodworskya","C.Presl",214 13139,"","Ochlandra","Thwaites",214 13140,"","Ochthochloa","Edgew.",214 13141,"","Odontelytrum","Hack.",214 13142,"","Odyssea","Stapf",214 16100,"","Oedipachne","Link",214 14923,"","Oligostachyum","Z.P.Wang & G.H.Ye",214 14271,"","Olmeca","Soderstr.",214 13143,"","Olyra","L.",214 15681,"","Omeiocalamus","Keng f.",214 15682,"","Onoea","Franch. & Sav.",214 16087,"","Ophismenus","Poir.",214 16072,"","Ophiurinella","Desv.",214 13144,"","Ophiuros","C.F.Gaertn.",214 13145,"","Opizia","C.Presl",214 13146,"","Oplismenopsis","Parodi",214 13147,"","Oplismenus","P.Beauv.",214 13148,"","Orcuttia","Vasey",214 14919,"","Oreiostachys","Gamble",214 13149,"","Oreobambos","K.Schum.",214 14936,"","Oreocalamus","Keng",214 13150,"","Oreochloa","Link",214 15684,"","Oreopoa","Gand.",214 13151,"","Orinus","Hitchc.",214 16078,"","Ornithocephalochloa","Kurz",214 16123,"","Ornithospermum","Dumoulin",214 13152,"","Oropetium","Trin.",214 15685,"","Orostachys","Steud.",214 14909,"","Orrhopygium","A.Love",214 13153,"","Ortachne","Nees ex Steud.",214 13154,"","Orthoclada","P.Beauv.",214 16088,"","Orthopogon","R.Br.",214 14067,"","Orthoraphium","Nees",214 14300,"x","Oryticum","C.P.Wang & S.H.Tang",214 13155,"","Oryza","L.",214 13156,"","Oryzidium","C.E.Hubb. & Schweick.",214 13157,"","Oryzopsis","Michx.",214 15690,"","Osterdamia","Kuntze",214 16040,"","Otachyrium","Nees",214 14929,"","Otatea","(McClure & E.W.Sm.) Calderon & Soderstr.",214 13158,"","Ottochloa","Dandy",214 13919,"","Oxyanthe","Steud.",214 13159,"","Oxychloris","Lazarides",214 13920,"","Oxydenia","Nutt.",214 13160,"","Oxyrhachis","Pilg.",214 13161,"","Oxytenanthera","Munro",214 15691,"","Pachea","Steud.",214 14017,"","Padia","Moritzi",214 15692,"","Pallasia","Scop.",214 15693,"","Paneion","Lunell",214 15694,"","Panicastrella","Moench",214 15695,"","Panicularia","Fabr.",214 16130,"","Paniculum","Ard.",214 13162,"","Panicum","L.",214 14345,"","Pantathera","Phil.",214 13163,"","Pappagrostis","Roshev.",214 13164,"","Pappophorum","Schreb.",214 14320,"","Paracolpodium","(Tzvelev) Tzvelev",214 13169,"","Paractaenum","P.Beauv.",214 16048,"","Parafestuca","E.B.Alexeev",214 13165,"","Parahyparrhenia","A.Camus",214 13166,"","Paraneurachne","S.T.Blake",214 13167,"","Parapholis","C.E.Hubb.",214 13168,"","Paratheria","Griseb.",214 13170,"","Pariana","Aubl.",214 15696,"","Parodiella","Reeder & C.Reeder",214 16258,"","Parodiochloa","C.E.Hubb.",214 16262,"","Parodiochloa","A.M.Molina",214 24417,"","Parodiolyra","Soderstr. & Zuloaga",214 14380,"","Parvotrisetum","Chrtek",214 14041,"","Pascopyrum","A.Love",214 16142,"","Paspalanthium","Desv.",214 13171,"","Paspalidium","Stapf",214 13172,"","Paspalum","L.",214 14069,"","Patis","Ohwi",214 14910,"","Patropyrum","A.Love",214 15699,"","Pechea","Lapeyr.",214 15700,"","Pectinaria","(Benth.) Hack.",214 15704,"","Peltophorus","Desv.",214 16002,"","Penicillaria","Willd.",214 16121,"","Peniculus","Swallen",214 13173,"","Pennisetum","Rich.",214 13922,"","Pentacraspedon","Steud.",214 13174,"","Pentameris","P.Beauv.",214 13175,"","Pentapogon","R.Br.",214 13176,"","Pentarrhaphis","Kunth",214 13177,"","Pentaschistis","(Nees) Spach",214 16003,"","Pentastachya","Steud.",214 14894,"","Pentatherum","Nabelek",214 13178,"","Pereilema","C.Presl",214 13179,"","Periballia","Trin.",214 15706,"","Perlaria","Fabr.",214 13923,"","Perobachne","C.Presl",214 13180,"","Perotis","Aiton",214 13181,"","Perrierbambus","A.Camus",214 16054,"","Perulifera","A.Camus",214 15707,"","Petriella","Zotov",214 13924,"","Petrina","J.B.Phipps",214 13183,"","Peyritschia","E.Fourn.",214 15708,"","Phacellaria","Steud.",214 13184,"","Phacelurus","Griseb.",214 13185,"","Phaenanthoecium","C.E.Hubb.",214 13186,"","Phaenosperma","Munro ex Benth.",214 15709,"","Phalarella","Boiss.",214 15710,"","Phalaridantha","St.-Lag.",214 14381,"","Phalaridium","Nees & Meyen",214 13187,"","Phalaris","L.",214 14871,"","Phalaroides","Wolf",214 15711,"","Phalona","Dumort.",214 16134,"","Phanopyrum","(Raf.) Nash",214 13188,"","Pharus","P.Browne",214 13189,"","Pheidochloa","S.T.Blake",214 13190,"","Phippsia","(Trin.) R.Br.",214 13191,"","Phleum","L.",214 13192,"","Pholiurus","Trin.",214 13193,"","Phragmites","Adans.",214 13194,"","Phyllorachis","Trimen",214 13195,"","Phyllostachys","Siebold & Zucc.",214 14378,"","Pilgerochloa","Eig",214 14060,"","Piptatherum","P.Beauv.",214 13196,"","Piptochaetium","J.Presl",214 13197,"","Piptophyllum","C.E.Hubb.",214 13925,"","Piptostachya","(C.E.Hubb.) J.B.Phipps",214 13198,"","Piresia","Swallen",214 15722,"","Pithecurus","Kunth",214 16041,"","Plagiantha","Renvoize",214 15723,"","Plagiarthron","P.A.Duvign.",214 13798,"","Plagiochloa","Adamson & Sprague",214 13926,"","Plagiolytrum","Nees",214 13199,"","Plagiosetum","Benth.",214 17913,"","Planichloa","B.K.Simon",214 15724,"","Planotia","Munro",214 15725,"","Plantinia","Bubani",214 15726,"","Platonia","Kunth",214 15727,"","Plazerium","Kunth",214 13200,"","Plectrachne","Henrard",214 13927,"","Pleiadelphia","Stapf",214 13201,"","Pleioblastus","Nakai",214 15728,"","Pleiodon","Rchb.",214 13929,"","Pleioneura","(C.E.Hubb.) J.B.Phipps",214 13930,"","Pleopogon","Nutt.",214 13931,"","Pleuraphis","Torr.",214 13932,"","Pleuroplitis","Trin.",214 13202,"","Pleuropogon","R.Br.",214 13203,"","Plinthanthesis","Steud.",214 15730,"","Plotia","Steud.",214 13204,"","Poa","L.",214 15731,"","Poagris","Raf.",214 13205,"","Poagrostis","Stapf",214 15732,"","Poarion","Rchb.",214 13933,"","Pobeguinea","(Stapf) Jacq.-Fel.",214 14893,"","Podagrostis","(Griseb.) Scribn. & Merr.",214 15733,"","Podinapus","Dulac",214 13206,"","Podophorus","Phil.",214 14059,"","Podopogon","Raf.",214 13934,"","Podosemum","Desv.",214 13207,"","Poecilostachys","Hack.",214 13935,"","Pogochloa","S.Moore",214 13208,"","Pogonachne","Bor",214 13209,"","Pogonarthria","Stapf",214 13210,"","Pogonatherum","P.Beauv.",214 13212,"","Pogonochloa","C.E.Hubb.",214 13211,"","Pogononeura","Napper",214 13936,"","Pogonopsis","C.Presl",214 16050,"","Pohlidium","Davidse, Soderstr. & R.P.Ellis",214 14316,"","Poidium","Nees",214 13213,"","Polevansia","De Winter",214 13937,"","Pollinia","Spreng.",214 13991,"","Pollinidium","Haines",214 13214,"","Polliniopsis","Hayata",214 14045,"","Polyantherix","Nees",214 25744,"","Polyanthus","C.H.Hu & Y.C.Hu",214 16135,"","Polyneura","Peter",214 13928,"","Polyodon","Kunth",214 13215,"","Polypogon","Desf.",214 16166,"x","Polypogonagrostis","(Asch. & Graebn.) Maire & Weiller",214 15735,"","Polyraphis","(Trin.) Lindl.",214 13938,"","Polyschistis","C.Presl",214 13216,"","Polytoca","R.Br.",214 13217,"","Polytrias","Hack.",214 13218,"","Pommereulla","L.f.",214 15736,"","Ponceletia","Thouars",214 15737,"","Poranthera","Raf.",214 14354,"","Porroteranthe","Steud.",214 14007,"","Porteresia","Tateoka",214 15738,"","Potamochloa","Griff.",214 13219,"","Potamophila","R.Br.",214 15739,"","Preissia","Opiz",214 13220,"","Pringleochloa","Scribn.",214 13810,"","Prionachne","Nees",214 13221,"","Prionanthium","Desv.",214 15740,"","Prosphysis","Dulac",214 13222,"","Prosphytochloa","Schweick.",214 14883,"","Psamma","P.Beauv.",214 13223,"","Psammagrostis","C.A.Gardner & C.E.Hubb.",214 13224,"","Psammochloa","Hitchc.",214 13939,"","Psammophila","Schult.",214 17912,"","Psammopyrum","A.Love",214 14011,"","Psathyrostachys","Nevski",214 13225,"","Pseudanthistiria","(Hack.) Hook.f.",214 14362,"","Pseudarrhenatherum","Rouy",214 13226,"","Pseudechinolaena","Stapf",214 16103,"","Pseudobrachiaria","Launert",214 13227,"","Pseudobromus","K.Schum.",214 13228,"","Pseudochaetochloa","Hitchc.",214 13229,"","Pseudocoix","A.Camus",214 13230,"","Pseudodanthonia","Bor & C.E.Hubb.",214 13231,"","Pseudodichanthium","Bor",214 16138,"","Pseudolasiacis","(A.Camus) A.Camus",214 13232,"","Pseudopentameris","Conert",214 13940,"","Pseudophacelurus","A.Camus",214 14882,"","Pseudophleum","Dogan",214 14001,"","Pseudopogonatherum","A.Camus",214 13233,"","Pseudoraphis","Griff.",214 14042,"","Pseudoroegneria","(Nevski) A.Love",214 15742,"","Pseudoryza","Griff.",214 14863,"","Pseudosasa","Makino ex Nakai",214 15743,"","Pseudosecale","(Godr.) Degen",214 13234,"","Pseudosorghum","A.Camus",214 13235,"","Pseudostachyum","Munro",214 14360,"","Pseudostreptogyne","A.Camus",214 13941,"","Pseudovossia","A.Camus",214 24253,"","Pseudoxytenanthera","Soderstr. & R.P.Ellis",214 13236,"","Pseudozoysia","Chiov.",214 13942,"","Psilantha","(K.Koch) Tzvelev",214 14305,"","Psilathera","Link",214 16136,"","Psilochloa","Launert",214 13237,"","Psilolemma","S.M.Phillips",214 13943,"","Psilopogon","Hochst.",214 15745,"","Psilostachys","Steud.",214 13238,"","Psilurus","Trin.",214 14304,"","Pterium","Desv.",214 16094,"","Pterochlaena","Chiov.",214 13944,"","Pterochloris","(A.Camus) A.Camus",214 15746,"","Pteropodium","Steud.",214 13945,"","Pterygostachyum","Steud.",214 14068,"","Ptilagrostis","Griseb.",214 13946,"","Ptiloneilema","Steud.",214 15747,"","Ptilonema","Hook.f.",214 13239,"","Puccinellia","Parl.",214 14093,"x","Pucciphippsia","Tzvelev",214 13240,"","Puelia","Franch.",214 13947,"","Puliculum","Haines",214 13241,"","Pyrrhanthera","Zotov",214 14937,"","Qiongzhuea","J.R.Xue & T.P.Yi",214 13948,"","Rabdochloa","P.Beauv.",214 13242,"","Racemobambos","Holttum",214 15748,"","Raddia","Mazziari",214 13243,"","Raddia","Bertol.",214 13244,"","Raddiella","Swallen",214 24256,"","Raimundochloa","A.M.Molina",214 14021,"","Ramosia","Merr.",214 15994,"","Raram","Adans.",214 15749,"","Raspailia","C.Presl",214 13949,"","Rattraya","J.B.Phipps",214 13245,"","Ratzeburgia","Kunth",214 13950,"","Reana","Brign.",214 15750,"","Rebentischia","Opiz",214 15751,"","Reboulea","Kunth",214 13246,"","Redfieldia","Vasey",214 13247,"","Reederochloa","Soderstr. & H.F.Decker",214 13248,"","Rehia","Fijten",214 13249,"","Reimaria","Flugge",214 16043,"","Reimarochloa","Hitchc.",214 15753,"","Reimbolea","Debeaux",214 13250,"","Reitzia","Swallen",214 14337,"","Relchela","Steud.",214 13951,"","Rendlia","Chiov.",214 14918,"","Rettbergia","Raddi",214 13251,"","Reynaudia","Kunth",214 13952,"","Rhachidospermum","Vasey",214 16074,"","Rhampholepis","Stapf",214 13953,"","Rhaphis","Lour.",214 15754,"","Rhiniachne","Steud.",214 13252,"","Rhipidocladum","McClure",214 13253,"","Rhizocephalus","Boiss.",214 14299,"","Rhombolytrum","Link",214 16068,"","Rhynchelythrum","Nees",214 13254,"","Rhynchelytrum","Nees",214 14008,"","Rhynchoryza","Baill.",214 13255,"","Rhytachne","Desv. ex Ham.",214 15755,"","Rhytidachne","K.Schum.",214 13257,"","Richardsiella","Elffers & Kenn.-O'Byrne",214 15756,"","Riedelia","Kunth",214 15757,"","Ripidium","Trin.",214 13258,"","Robynsiochloa","Jacq.-Fel.",214 14036,"","Roegneria","K.Koch",214 15759,"","Roemeria","Roem. & Schult.",214 13954,"","Roshevitzia","Tzvelev",214 14339,"","Rostraria","Trin.",214 15761,"","Rothia","Borkh.",214 13259,"","Rottboellia","L.f.",214 14105,"","Rouxia","Husn.",214 15762,"","Roylea","Steud.",214 16020,"","Runcina","F.Allam.",214 14371,"","Rupestrina","Prov.",214 13256,"","Rytidosperma","Steud.",214 15763,"","Rytilix","Hitchc.",214 16108,"","Sabsab","Adans.",214 15764,"","Saccharifera","Stokes",214 13260,"","Saccharum","L.",214 13261,"","Sacciolepis","Nash",214 15765,"","Salmasia","Bubani",214 16013,"","Sanguinaria","Bubani",214 16006,"","Sanguinella","Gleichen",214 14886,"","Santia","Savi",214 13955,"","Sarga","Ewart",214 13262,"","Sartidia","De Winter",214 13263,"","Sasa","Makino & Shibata",214 13264,"","Sasaella","Makino",214 13265,"","Sasamorpha","Nakai",214 13266,"","Saugetia","Hitchc. & Chase",214 15767,"","Savastana","Schrank",214 15768,"","Schaffnera","Benth.",214 13267,"","Schaffnerella","Nash",214 13268,"","Schedonnardus","Steud.",214 14323,"","Schedonorus","P.Beauv.",214 13956,"","Schellingia","Steud.",214 15769,"","Schirostachyum","de Vriese",214 13269,"","Schismus","P.Beauv.",214 13957,"","Schistachne","Fig. & De Not.",214 13270,"","Schizachne","Hack.",214 13271,"","Schizachyrium","Nees",214 16036,"","Schizopogon","Rchb. ex Spreng.",214 13272,"","Schizostachyum","Nees",214 13958,"","Schleropelta","Buckley",214 15771,"","Schmidtia","Tratt.",214 13273,"","Schmidtia","Steud. ex J.A.Schmidt",214 15772,"","Schmiedtia","Raf.",214 15773,"","Schnizleinia","Steud.",214 15774,"","Schoenanthus","Adans.",214 13274,"","Schoenefeldia","Kunth",214 15775,"","Schoenodorus","Roem. & Schult.",214 15776,"","Schultesia","Spreng.",214 15777,"","Sciadonardus","Steud.",214 15778,"","Scirpobambus","Kuntze",214 13275,"","Sclerachne","R.Br.",214 15779,"","Sclerachne","Trin.",214 13959,"","Sclerandrium","Stapf & C.E.Hubb.",214 13276,"","Sclerochloa","P.Beauv.",214 13277,"","Sclerodactylon","Stapf",214 14905,"","Sclerodeyeuxia","Pilg.",214 15987,"","Sclerolaena","A.Camus",214 15780,"","Sclerophyllum","Griff.",214 14350,"","Scleropoa","Griseb.",214 13278,"","Scleropogon","Phil.",214 13960,"","Sclerostachya","(Hack.) A.Camus",214 15781,"","Scolochloa","Mert. & W.D.J.Koch",214 13279,"","Scolochloa","Link",214 13280,"","Scribneria","Hack.",214 15983,"","Scrotochloa","Judz.",214 13281,"","Scutachne","Hitchc. & Chase",214 13282,"","Secale","L.",214 15782,"","Secalidium","Schur",214 15783,"x","Secalotricum","Kostov",214 13283,"","Sehima","Forssk.",214 14039,"","Semeiostachys","Drobow",214 14855,"","Semiarundinaria","Nakai",214 14895,"","Senisetum","Honda",214 15784,"","Senites","Adans.",214 15785,"","Sennenia","Sennen",214 13961,"","Sericrostis","Raf.",214 15995,"","Sericura","Hassk.",214 15786,"","Serigrostis","Steud.",214 14053,"","Serrafalcus","Parl.",214 13284,"","Sesleria","Scop.",214 14306,"","Sesleriella","Deyl",214 13285,"","Setaria","P.Beauv.",214 13286,"","Setariopsis","Scribn. ex Millsp.",214 24255,"","Setiacis","S.L.Chen & Y.X.Jin",214 16060,"","Setosa","Ewart",214 13287,"","Shibataea","Makino ex Nakai",214 15788,"","Sibertia","Steud.",214 13796,"","Sieglingia","Bernh.",214 14015,"","Silentvalleya","V.J.Nair, Sreek., Vajr. & Barghavan",214 13288,"","Simplicia","Kirk",214 14860,"","Sinarundinaria","Nakai",214 15789,"","Sinoarundinaria","Ohwi",214 14854,"","Sinobambusa","Makino",214 14946,"","Sinocalamus","McClure",214 13289,"","Sinochasea","Keng",214 13290,"","Sitanion","Raf.",214 14908,"","Sitopsis","(Jaub. & Spach) A.Love",214 14094,"x","Sitordeum","Bowden",214 15790,"","Sitospelos","Adans.",214 15791,"","Smidetia","Raf.",214 13291,"","Snowdenia","C.E.Hubb.",214 13292,"","Soderstromia","C.V.Morton",214 13293,"","Sohnsia","Airy Shaw",214 13962,"","Solenachne","Steud.",214 15792,"","Solenophyllum","Baill.",214 13294,"","Sorghastrum","Nash",214 13295,"","Sorghum","Moench",214 15793,"","Sorgum","Adans.",214 15794,"","Sparteum","P.Beauv.",214 13296,"","Spartina","Schreb.",214 13297,"","Spartochloa","C.E.Hubb.",214 15795,"","Spartum","P.Beauv.",214 13298,"","Spathia","Ewart",214 14031,"","Spelta","Wolf",214 16096,"","Spermachiton","Llanos",214 16102,"","Spermatochiton","Pilg.",214 15797,"","Sphaerella","Bubani",214 15798,"","Sphaerium","Kuntze",214 25436,"","Sphaerobambos","S.Dransf.",214 13299,"","Sphaerocaryum","Nees ex Hook.f.",214 13300,"","Spheneria","Kuhlm.",214 13301,"","Sphenopholis","Scribn.",214 13302,"","Sphenopus","Trin.",214 13303,"","Spinifex","L.",214 15800,"","Spirochloe","Lunell",214 13963,"","Spirotheros","Raf.",214 13304,"","Spodiopogon","Trin.",214 15801,"","Sporichloe","Pilg.",214 13305,"","Sporobolus","R.Br.",214 15802,"","Stapfia","Burtt Davy",214 15803,"","Stapfiola","Kuntze",214 13964,"","Stegosia","Lour.",214 16047,"","Steinchisma","Raf.",214 13306,"","Steirachne","Ekman",214 15804,"","Stelephuros","Adans.",214 14921,"","Stemmatospermum","P.Beauv.",214 14382,"","Stenochloa","Nutt.",214 14058,"","Stenofestuca","(Honda) Nakai",214 14029,"","Stenostachys","Turcz.",214 13307,"","Stenotaphrum","Trin.",214 13308,"","Stephanachne","Keng",214 13309,"","Stereochlaena","Hack.",214 15985,"","Steudelella","Honda",214 16051,"","Steyermarkochloa","Davidse & R.P.Ellis",214 13965,"","Stiburus","Stapf",214 14904,"","Stilpnophleum","Nevski",214 13310,"","Stipa","L.",214 13311,"","Stipagrostis","Nees",214 15805,"","Stipavena","Vierh.",214 14095,"x","Stiporyzopsis","B.L.Johnson & Rogler",214 13312,"","Streblochaete","Pilg.",214 13992,"","Strephium","Nees",214 13783,"","Streptachne","R.Br.",214 15806,"","Streptia","Doll",214 13313,"","Streptochaeta","Schrad. ex Nees",214 13314,"","Streptogyna","P.Beauv.",214 13315,"","Streptolophus","Hughes",214 13316,"","Streptostachys","Desv.",214 15808,"","Strombodurus","Steud.",214 15810,"","Stupa","Asch.",214 15811,"","Sturmia","Hoppe",214 14902,"","Stylagrostis","Mez",214 13317,"","Styppeiochloa","De Winter",214 16065,"","Suardia","Schrank",214 13318,"","Sucrea","Soderstr.",214 14340,"","Suddia","Renvoize",214 13319,"","Swallenia","Soderstr. & H.F.Decker",214 13320,"","Swallenochloa","McClure",214 13966,"","Syllepis","E.Fourn.",214 15812,"","Symbasiandra","Steud.",214 13321,"","Symplectrodia","Lazarides",214 15817,"","Synaphe","Dulac",214 16007,"","Syntherisma","Walter",214 14013,"","Taeniatherum","Nevski",214 16128,"","Talasium","Spreng.",214 16140,"","Tansaniochloa","Rauschert",214 13322,"","Tarigidia","Stent",214 16037,"","Tatianyx","Zuloaga & Soderstr.",214 13323,"","Teinostachyum","Munro",214 16122,"","Tema","Adans.",214 15818,"","Terrellia","Lunell",214 15819,"x","Terrelymus","B.R.Baum",214 13324,"","Tetrachaete","Chiov.",214 13325,"","Tetrachne","Nees",214 14944,"","Tetragonocalamus","Nakai",214 13326,"","Tetrapogon","Desf.",214 13327,"","Tetrarrhena","R.Br.",214 15820,"","Thalysia","Kuntze",214 14864,"","Thamnocalamus","Munro",214 13328,"","Thaumastochloa","C.E.Hubb.",214 13329,"","Thelepogon","Roth ex Roem. & Schult.",214 13967,"","Thellungia","Stapf ex Probst",214 13330,"","Themeda","Forssk.",214 14043,"","Thinopyrum","A.Love",214 15822,"","Thorea","Rouy",214 15823,"","Thoreochloa","Holub",214 16076,"","Thouarsia","Kuntze",214 13331,"","Thrasya","Kunth",214 13332,"","Thrasyopsis","Parodi",214 14367,"","Thrixgyne","Keng",214 13333,"","Thuarea","Pers.",214 15825,"","Thurberia","Benth.",214 13334,"","Thyridachne","C.E.Hubb.",214 16038,"","Thyridolepis","S.T.Blake",214 15826,"","Thyridostachyum","Nees",214 13969,"","Thyrsia","Stapf",214 13335,"","Thyrsostachys","Gamble",214 13970,"","Thysanachne","C.Presl",214 13336,"","Thysanolaena","Nees",214 15827,"","Tiarrhena","(Maxim.) Nakai",214 13337,"","Timouria","Roshev.",214 15828,"","Tinaea","Garzia",214 16075,"","Tisserantiella","Mimeur",214 13972,"","Torgesia","Bornm.",214 14872,"","Torresia","Ruiz & Pav.",214 14332,"","Torreyochloa","Church",214 15829,"","Tosagris","P.Beauv.",214 14857,"","Tovarochloa","Macfarl. & But",214 14875,"","Tozzettia","Savi",214 14049,"","Trachynia","Link",214 16035,"","Trachynotia","Michx.",214 15989,"","Trachyozus","Rchb.",214 15830,"","Trachypoa","Bubani",214 13338,"","Trachypogon","Nees",214 13339,"","Trachys","Pers.",214 15990,"","Trachystachys","A.Dietr.",214 13340,"","Tragus","Haller",214 15831,"","Tragus","Panz.",214 15832,"","Tremularia","Fabr.",214 13973,"","Triachyrum","Hochst.",214 13974,"","Triaena","Kunth",214 15833,"","Trianthium","Desv.",214 13971,"","Triarrhena","(Maxim.) Nakai",214 13975,"","Triathera","Desv.",214 15834,"","Triatherus","Raf.",214 14366,"","Triavenopsis","Candargy",214 13976,"","Tribolium","Desv.",214 16008,"","Trichachne","Nees",214 14370,"","Trichaeta","P.Beauv.",214 13341,"","Trichloris","E.Fourn. ex Benth.",214 16066,"","Trichochlaena","Kuntze",214 15835,"","Trichochloa","DC.",214 15836,"","Trichodiclida","Cerv.",214 14888,"","Trichodium","Michx.",214 15837,"","Trichodon","Benth.",214 13342,"","Tricholaena","Schrad. ex Schult. & Schult.f.",214 13343,"","Trichoneura","Andersson",214 13977,"","Trichoon","Roth",214 15838,"","Trichopteria","Nees",214 13344,"","Trichopteryx","Nees",214 17911,"","Trichopyrum","A.Love",214 15839,"","Trichosantha","Steud.",214 15840,"","Tricuspis","P.Beauv.",214 13345,"","Tridens","Roem. & Schult.",214 14922,"","Triglossum","Roem. & Schult.",214 13346,"","Trikeraia","Bor",214 13347,"","Trilobachne","Schenck ex Henrard",214 13348,"","Triniochloa","Hitchc.",214 14055,"","Triniusa","Steud.",214 13349,"","Triodia","R.Br.",214 15842,"","Triodon","Baumg.",214 15843,"","Triphlebia","Stapf",214 13350,"","Triplachne","Link",214 13351,"","Triplasis","P.Beauv.",214 13978,"","Triplathera","(Endl.) Lindl.",214 13352,"","Triplopogon","Bor",214 13353,"","Tripogon","Roem. & Schult.",214 13354,"","Tripsacum","L.",214 13355,"","Triraphis","R.Br.",214 13356,"","Triscenia","Griseb.",214 13357,"","Trisetaria","Forssk.",214 15844,"","Trisetarium","Poir.",214 14377,"","Trisetobromus","Nevski",214 14096,"x","Trisetokoeleria","Tzvelev",214 13358,"","Trisetum","Pers.",214 13359,"","Tristachya","Nees",214 15847,"","Tristania","Poir.",214 16070,"","Tristegis","Nees",214 15848,"x","Triticale","Muntzing",214 14107,"x","Triticosecale","Wittm. ex A.Camus",214 13360,"","Triticum","L.",214 17764,"x","Tritisecale","Lebedev",214 14106,"x","Trititrigia","Tzvelev",214 14097,"x","Tritordeum","Asch. & Graebn.",214 15849,"","Triunila","Raf.",214 13979,"","Trixostis","Raf.",214 14019,"","Trochera","Rich.",214 15851,"","Tschompskia","Asch. & Graebn.",214 14016,"","Tuctoria","Reeder",214 15852,"","Turraya","Wall.",214 16104,"","Tylothrasya","Doll",214 15853,"","Typhoides","Moench",214 16261,"","Tzvelevia","E.B.Alexeev",214 13361,"","Uniola","L.",214 15854,"","Urachne","Trin.",214 13980,"","Uralepis","Nutt.",214 15855,"","Uralepsis","Nutt.",214 13362,"","Uranthoecium","Stapf",214 13363,"","Urelytrum","Hack.",214 13364,"","Urochlaena","Nees",214 13365,"","Urochloa","P.Beauv.",214 13366,"","Urochondra","C.E.Hubb.",214 14385,"","Vahlodea","Fr.",214 16011,"","Valota","Adans.",214 13981,"","Vaseya","Thurb.",214 13367,"","Vaseyochloa","Hitchc.",214 13368,"","Ventenata","Koeler",214 15856,"","Verinea","Merino",214 13982,"","Veseyochloa","J.B.Phipps",214 13369,"","Vetiveria","Bory",214 25437,"","Vietnamosasa","T.Q.Nguyen",214 13370,"","Viguierella","A.Camus",214 14887,"","Vilfa","Adans.",214 15857,"","Vilfagrostis","Doll",214 13371,"","Vossia","Wall. & Griff.",214 13372,"","Vulpia","C.C.Gmel.",214 14336,"","Vulpiella","(Batt. & Trab.) Andr.",214 13373,"","Wangenheimia","Moench",214 15858,"","Wasatchia","M.E.Jones",214 15859,"","Weingaertneria","Bernh.",214 13374,"","Whiteochloa","C.E.Hubb.",214 15860,"","Wiestia","Boiss.",214 14374,"","Wilhelmsia","W.Koch",214 15861,"","Wilibald-schmidtia","Conrad",214 15862,"","Wilibalda","Roth",214 13983,"","Willbleibia","Herter",214 13375,"","Willkommia","Hack.",214 13984,"","Windsoria","Nutt.",214 16119,"","Wirtgenia","Doll",214 13985,"","Woodrowia","Stapf",214 15866,"","Xanthanthos","St.-Lag.",214 15867,"","Xanthonanthus","St.-Lag.",214 13986,"","Xenochloa","Roem. & Schult.",214 13376,"","Xerochloa","R.Br.",214 13987,"","Xerodanthia","J.B.Phipps",214 15868,"","Xiphagrostis","Coville",214 16067,"","Xyochlaena","Stapf",214 13988,"","Xystidium","Trin.",214 15869,"","Yadakeya","Makino",214 16045,"","Yakirra","Lazarides & R.D.Webster",214 13989,"","Ystia","Compere",214 14930,"","Yushania","Keng f.",214 13377,"","Yvesia","A.Camus",214 13378,"","Zea","L.",214 15870,"","Zeia","Lunell",214 13379,"","Zenkeria","Trin.",214 14027,"","Zeocriton","Wolf",214 15871,"","Zerna","Panz.",214 13380,"","Zeugites","P.Browne",214 13381,"","Zingeria","P.A.Smirn.",214 14878,"","Zingeriopsis","Prob.",214 13382,"","Zizania","L.",214 13383,"","Zizaniopsis","Doll & Asch.",214 13384,"","Zonotriche","(C.E.Hubb.) J.B.Phipps",214 15872,"","Zoydia","Pers.",214 13385,"","Zoysia","Willd.",214 13386,"","Zygochloa","S.T.Blake",214 13692,"","Acrosorus","Copel.",215 13693,"","Adenophorus","Gaudich.",215 21961,"","Amphoradenium","Desv.",215 13694,"","Calymmodon","C.Presl",215 24703,"","Ceradenia","L.E.Bishop",215 21967,"","Chilopteris","(C.Presl) Lindl.",215 13695,"","Cochlidium","Kaulf.",215 21965,"","Cryptosorus","Fee",215 13696,"","Ctenopteris","Blume ex Kunze",215 21966,"","Enterosora","Baker",215 13697,"","Glyphotaenium","J.Sm.",215 13698,"","Grammitis","Sw.",215 25806,"","Lellingeria","A.R.Sm. & R.C.Moran",215 21969,"","Lomaphlebia","J.Sm.",215 21970,"","Micropolypodium","Hayata",215 21971,"","Micropteris","Desv.",215 13699,"","Nematopteris","Alderw.",215 21968,"","Oreogrammitis","Copel.",215 21962,"","Plectopteris","Fee",215 21963,"","Pleurogramme","(Blume) C.Presl",215 13700,"","Prosaptia","C.Presl",215 13701,"","Scleroglossum","Alderw.",215 21964,"","Stenofilix","Nakai",215 13702,"","Xiphopteris","Kaulf.",215 24704,"","Zygadenia","L.E.Bishop",215 24960,"","Zygophlebia","L.E.Bishop",215 3393,"","Greyia","Hook. & Harv.",216 4865,"","Griselinia","J.R.Forst. & G.Forst.",217 20250,"","Botrycarpum","A.Rich.",218 20251,"","Botryocarpium","Spach",218 20252,"","Calobotrya","Spach",218 20253,"","Cerophyllum","Spach",218 20254,"","Chrysobotrya","Spach",218 20255,"","Coreosma","Spach",218 20256,"","Grossularia","Mill.",218 20257,"","Liebichia","Opiz",218 20258,"","Rebis","Spach",218 3396,"","Ribes","L.",218 20259,"","Ribesium","Medik.",218 20260,"","Rolsonia","Rchb.",218 10164,"","Grubbia","Bergius",219 25432,"","Strobilocarpus","Klotzsch",219 3495,"","Gunnera","L.",220 16240,"","Acopanea","Steyerm.",221 19546,"","Adenotrias","Jaub. & Spach",221 1107,"","Allanblackia","Oliv. ex Benth.",221 19547,"","Androsaemum","Duhamel",221 19548,"","Androsemum","Link",221 19561,"","Androstylium","Miq.",221 1188,"","Archytaea","Mart.",221 19549,"","Ascyrum","Mill.",221 19550,"","Ascyrum","L.",221 19562,"","Asthotheca","Miers ex Planch. & Triana",221 1108,"","Astrotheca","Vesque",221 1109,"","Balboa","Planch. & Triana",221 1189,"","Bonnetia","Mart.",221 1110,"","Calophyllum","L.",221 19566,"","Cambogia","L.",221 1151,"","Caraipa","Aubl.",221 1111,"","Chrysochlamys","Poepp.",221 1112,"","Clusia","L.",221 19567,"","Clusianthemum","Vieill.",221 1113,"","Clusiella","Planch. & Triana",221 19563,"","Cochlanthera","Choisy",221 22081,"","Cratoxylon","Blume",221 1099,"","Cratoxylum","Blume",221 1114,"","Decaphalangium","Melch.",221 16243,"","Dystovomita","(Engl.) D'Arcy",221 16248,"","Eliaea","Cambess.",221 16244,"","Eliea","Cambess.",221 1115,"","Endodesmia","Benth.",221 1116,"","Garcinia","L.",221 1159,"","Haploclathra","Benth.",221 19558,"","Haronga","Thouars",221 1101,"","Harungana","Lam.",221 1117,"","Havetia","Kunth",221 1118,"","Havetiopsis","Planch. & Triana",221 1102,"","Hypericum","L.",221 19559,"","Kayea","Wall.",221 1160,"","Kielmeyera","Mart.",221 1119,"","Lebrunia","Staner",221 1120,"","Lorostemon","Ducke",221 1163,"","Mahurea","Aubl.",221 1121,"","Mammea","L.",221 1164,"","Marila","Sw.",221 1122,"","Mesua","L.",221 1123,"","Montrouziera","Planch. & Triana",221 1124,"","Moronobea","Aubl.",221 1190,"","Neblinaria","Maguire",221 16239,"","Neogleasonia","Maguire",221 1191,"","Neotatea","Maguire",221 1125,"","Ochrocarpos","Thouars",221 1126,"","Oedematopus","Planch. & Triana",221 19551,"","Olympia","Spach",221 19568,"","Oxycarpus","Lour.",221 19564,"","Oxystemon","Planch. & Triana",221 16242,"","Paramammea","J.-F.Leroy",221 1127,"","Pentadesma","Sabine",221 1128,"","Pentaphalangium","Warb.",221 1129,"","Pilosperma","Planch. & Triana",221 1130,"","Platonia","Mart.",221 1192,"","Ploiarium","Korth.",221 1131,"","Poeciloneuron","Bedd.",221 1103,"","Psorospermum","Spach",221 1132,"","Quapoya","Aubl.",221 1133,"","Renggeria","Meisn.",221 19565,"","Rengifa","Poepp. & Endl.",221 1134,"","Rheedia","L.",221 19552,"","Sanidophyllum","Small",221 16241,"","Santomasia","N.Robson",221 19553,"","Sarothra","L.",221 1135,"","Septogarcinia","Kosterm.",221 1136,"","Symphonia","L.f.",221 19554,"","Takasagoya","Y.Kimura",221 1104,"","Thornea","Breedlove & E.M.McClint.",221 1137,"","Thysanostemon","Maguire",221 1138,"","Tovomita","Aubl.",221 1139,"","Tovomitidium","Ducke",221 1140,"","Tovomitopsis","Planch. & Triana",221 19555,"","Triadenia","Spach",221 1105,"","Triadenum","Raf.",221 1141,"","Tripetalum","K.Schum.",221 16345,"","Tsimatimia","Jum. & H.Perrier",221 19560,"","Vidalia","Fern.-Vill.",221 1106,"","Vismia","Vand.",221 16344,"","Xanthochymus","Roxb.",221 9663,"","Codonocarpus","A.Cunn. ex Endl.",222 9664,"","Cypselocarpus","F.Muell.",222 9665,"","Didymotheca","Hook.f.",222 9666,"","Gyrostemon","Desf.",222 9667,"","Tersonia","Moq.",222 23208,"","Walteranthus","Keighery",222 24882,"","Anigosanthos","Lemee",223 11664,"","Anigozanthos","Labill.",223 11665,"","Barberetta","Harv.",223 18843,"","Blancoa","Lindl.",223 11666,"","Conostylis","R.Br.",223 11667,"","Dilatris","Bergius",223 11668,"","Haemodorum","Sm.",223 11669,"","Lachnanthes","Elliott",223 18844,"","Macropidia","J.L.Drumm. ex Harv.",223 11672,"","Phlebocarya","R.Br.",223 11673,"","Pyrrorhiza","Maguire & Wurdack",223 11674,"","Schiekia","Meisn.",223 11675,"","Tribonanthes","Endl.",223 11676,"","Wachendorfia","Burm.",223 11677,"","Xiphidium","Aubl.",223 9589,"","Halophytum","Speg.",224 3486,"","Glischrocaryon","Endl.",225 3487,"","Gonocarpus","Thunb.",225 3488,"","Haloragis","J.R.Forst. & G.Forst.",225 3489,"","Haloragodendron","Orchard",225 3490,"","Laurembergia","Bergius",225 16471,"","Loudonia","Lindl.",225 20335,"","Meionectes","R.Br.",225 3491,"","Meziella","Schindl.",225 3492,"","Myriophyllum","L.",225 3493,"","Proserpinaca","L.",225 25324,"","Vinkia","Meijden",225 3471,"","Altingia","Noronha",226 20318,"","Amamelis","Lem.",226 20321,"","Bucklandia","R.Br. ex Griff.",226 3445,"","Chunia","H.T.Chang",226 3446,"","Corylopsis","Siebold & Zucc.",226 20314,"","Diania","Noronha ex Tul.",226 20315,"","Dicocca","Thouars",226 20316,"","Dicophe","Roem.",226 20317,"","Dicorypha","R.Hedw.",226 3447,"","Dicoryphe","Thouars",226 3448,"","Disanthus","Maxim.",226 3449,"","Distyliopsis","P.K.Endress",226 3450,"","Distylium","Siebold & Zucc.",226 3451,"","Embolanthera","Merr.",226 3452,"","Eustigma","Gardner & Champ.",226 3453,"","Exbucklandia","R.W.Br.",226 3454,"","Fortunearia","Rehder & E.H.Wilson",226 3455,"","Fothergilla","L.",226 3456,"","Hamamelis","L.",226 3472,"","Liquidambar","L.",226 20319,"","Lomilis","Raf.",226 3457,"","Loropetalum","R.Br. ex Rchb.",226 3458,"","Maingaya","Oliv.",226 3459,"","Matudaea","Lundell",226 3460,"","Molinadendron","P.K.Endress",226 3461,"","Mytilaria","Lecomte",226 3462,"","Neostrearia","L.S.Sm.",226 23050,"","Noahdendron","Endress, B.Hyland & Tracey",226 3463,"","Ostrearia","Baill.",226 3464,"","Parrotia","C.A.Mey.",226 3465,"","Parrotiopsis","(Nied.) C.K.Schneid.",226 3466,"","Rhodoleia","Champ. ex Hook.",226 20313,"","Saxifragites","Gagnep.",226 20323,"","Sedgwickia","Griff.",226 24964,"","Semiliquidambar","H.T.Chang",226 3467,"","Sinowilsonia","Hemsl.",226 3468,"","Sycopsis","Oliv.",226 20322,"","Symingtonia","Steenis",226 3469,"","Tetrathyrium","Benth.",226 3470,"","Trichocladus","Pers.",226 20320,"","Trilopus","Mitch.",226 12194,"","Hanguana","Blume",227 25425,"","Susum","Blume",227 1089,"","Hectorella","Hook.f.",228 1090,"","Lyallia","Hook.f.",228 19545,"","Reicheella","Pax",228 11611,"","Heliconia","L.",229 4826,"","Helwingia","Willd.",230 11974,"","Hemerocallis","L.",231 23219,"","Corysadenia","Griff.",232 23220,"","Coryzadenia","Griff.",232 23221,"","Gronovia","Blanco",232 9904,"","Gyrocarpus","Jacq.",232 23218,"","Hazomalamia","Capuron",232 23222,"","Henschelia","C.Presl",232 9905,"","Hernandia","L.",232 20100,"","Hernandiopsis","Meisn.",232 20101,"","Hertelia","Neck.",232 9906,"","Illigera","Blume",232 9907,"","Sparattanthelium","Mart.",232 16710,"","Valvanthera","C.T.White",232 18853,"","Clara","Kunth",233 11978,"","Herreria","Ruiz & Pav.",233 11979,"","Herreriopsis","H.Perrier",233 99,"","Galbulimima","F.M.Bailey",234 106,"","Himantandra","F.Muell. ex Diels",234 2395,"","Aesculus","L.",235 2396,"","Billia","Peyr.",235 3494,"","Hippuris","L.",236 8087,"","Hoplestigma","Pierre",237 11984,"","Hosta","Tratt.",238 1548,"","Afrostyrax","Perkins & Gilg",239 1549,"","Hua","Pierre ex De Wild.",239 1550,"","Duckesia","Cuatrec.",240 1551,"","Endopleura","Cuatrec.",240 1552,"","Humiria","Aubl.",240 1553,"","Humiriastrum","(Urb.) Cuatrec.",240 1554,"","Hylocarpa","Cuatrec.",240 1555,"","Sacoglottis","Mart.",240 1556,"","Schistostemon","(Urb.) Cuatrec.",240 1557,"","Vantanea","Aubl.",240 11878,"","Albuca","L.",241 11883,"","Alrawia","(Wendelbo) K.M.Perss. & Wendelbo",241 11885,"","Amphisiphon","W.F.Barker",241 11888,"","Androsiphon","Schltr.",241 18944,"","Battandiera","Maire",241 11903,"","Bellevalia","Lapeyr.",241 18940,"","Botryanthus","Kunth",241 11908,"","Bowiea","Harv. ex Hook.f.",241 18939,"","Brachyscypha","Baker",241 11909,"","Brimeura","Salisb.",241 11919,"","Camassia","Lindl.",241 11925,"","Chionodoxa","Boiss.",241 17492,"x","Chionoscilla","J.Allen ex G.Nicholson",241 11927,"","Chlorogalum","(Lindl.) Kunth",241 11938,"","Daubenya","Lindl.",241 11942,"","Dipcadi","Medik.",241 11947,"","Drimia","Jacq. ex Willd.",241 11948,"","Drimiopsis","Lindl. & Paxton",241 18945,"","Elsiea","F.M.Leight.",241 18943,"","Endymion","Dumort.",241 11957,"","Eucomis","L'Her.",241 14177,"","Fortunatia","J.F.Macbr.",241 11962,"","Galtonia","Decne.",241 17488,"","Hastingsia","S.Watson",241 11980,"","Hesperocallis","A.Gray",241 11985,"","Hyacinthella","Schur",241 11986,"","Hyacinthoides","Heist. ex Fabr.",241 11987,"","Hyacinthus","L.",241 11996,"","Lachenalia","J.Jacq. ex Murray",241 17489,"","Ledebouria","Roth",241 12000,"","Leopoldia","Parl.",241 12005,"","Litanthus","Harv.",241 12011,"","Massonia","Thunb. ex L.f.",241 12022,"","Muscari","Mill.",241 12023,"","Muscarimia","Kostel.",241 12026,"","Neobakeria","Schltr.",241 12028,"","Neopatersonia","Schonl.",241 12035,"","Ornithogalum","L.",241 12046,"","Polyxena","Kunth",241 12047,"","Pseudogaltonia","(Kuntze) Engl.",241 12048,"","Pseudomuscari","Garbari & Greuter",241 12049,"","Puschkinia","Adams",241 18941,"","Resnova","Van der Merwe",241 12051,"","Rhadamanthus","Salisb.",241 12053,"","Rhodocodon","Baker",241 12059,"","Schizobasis","Baker",241 18942,"","Schizocarphus","Van der Merwe",241 12061,"","Schoenolirion","Torr. ex Durand",241 12062,"","Scilla","L.",241 16238,"","Strangweja","Bertol.",241 12077,"","Sypharissa","Salisb.",241 12079,"","Thuranthos","C.H.Wright",241 12095,"","Urginea","Steinh.",241 16230,"","Urgineopsis","Compton",241 12097,"","Veltheimia","Gled.",241 12099,"","Whiteheadia","Harv.",241 12602,"","Hydatella","Diels",242 12603,"","Trithuria","Hook.f.",242 9773,"","Hydnora","Thunb.",243 9774,"","Prosopanche","de Bary",243 20213,"","Adamia","Wall.",244 3333,"","Broussaisia","Gaudich.",244 3334,"","Cardiandra","Siebold & Zucc.",244 3335,"","Carpenteria","Torr.",244 20209,"","Cornidia","Ruiz & Pav.",244 20214,"","Cyanitis","Reinw.",244 3336,"","Decumaria","L.",244 3337,"","Deinanthe","Maxim.",244 3338,"","Deutzia","Thunb.",244 3339,"","Dichroa","Lour.",244 20212,"","Edwinia","A.Heller",244 3340,"","Fendlera","Engelm. & A.Gray",244 3341,"","Fendlerella","A.Heller",244 20210,"","Hortensia","Comm.",244 3342,"","Hydrangea","L.",244 3343,"","Jamesia","Torr. & A.Gray",244 3344,"","Kirengeshoma","Yatabe",244 3345,"","Neodeutzia","(Engl.) Small",244 3346,"","Philadelphus","L.",244 3347,"","Pileostegia","Hook.f. & Thomson",244 3348,"","Platycrater","Siebold & Zucc.",244 20211,"","Sarcostyles","C.Presl ex DC.",244 3349,"","Schizophragma","Siebold & Zucc.",244 3350,"","Whipplea","Torr.",244 16912,"","Anacharis","Rich.",245 15178,"","Apalanthe","Planch.",245 14244,"","Appertiella","C.D.K.Cook & Triest",245 25202,"","Benedictaea","Toledo",245 10689,"","Blyxa","Noronha ex Thouars",245 19207,"","Boottia","Wall.",245 14815,"","Egeria","Planch.",245 10690,"","Elodea","Michx.",245 10691,"","Enhalus","Rich.",245 10692,"","Enhydrias","Ridl.",245 10693,"","Halophila","Thouars",245 10694,"","Hydrilla","Rich.",245 10695,"","Hydrocharis","L.",245 19206,"","Hydromystria","G.Mey.",245 10696,"","Lagarosiphon","Harv.",245 10697,"","Limnobium","Rich.",245 10698,"","Maidenia","Rendle",245 12563,"","Najas","L.",245 10699,"","Nechamandra","Planch.",245 10700,"","Oligolobos","Gagnep.",245 10701,"","Ottelia","Pers.",245 10702,"","Stratiotes","L.",245 10703,"","Thalassia","Banks ex C.Koenig",245 19205,"","Udora","Nutt.",245 10704,"","Vallisneria","L.",245 19208,"","Xystrolobus","Gagnep.",245 19392,"","Andropus","Brand",246 7949,"","Codon","Royen ex L.",246 7950,"","Conanthus","S.Watson",246 7951,"","Draperia","Torr.",246 7952,"","Ellisia","L.",246 7953,"","Emmenanthe","Benth.",246 7954,"","Eriodictyon","Benth.",246 7955,"","Eucrypta","Nutt.",246 7956,"","Hesperochiron","S.Watson",246 7957,"","Hydrolea","L.",246 7958,"","Hydrophyllum","L.",246 7959,"","Lemmonia","A.Gray",246 7960,"","Miltitzia","A.DC.",246 7961,"","Nama","L.",246 7962,"","Nemophila","Nutt.",246 7963,"","Phacelia","Juss.",246 7964,"","Pholistoma","Lilja",246 7965,"","Romanzoffia","Cham.",246 7966,"","Tricardia","Torr.",246 7967,"","Turricula","J.F.Macbr.",246 19391,"","Viticella","Mitch.",246 7968,"","Wigandia","Kunth",246 9763,"","Hydrostachys","Thouars",247 21685,"","Abrodictyum","C.Presl",248 21728,"","Amphipterum","(Copel.) Copel.",248 21724,"","Apteropteris","(Copel.) Copel.",248 21725,"","Buesia","(C.V.Morton) Copel.",248 21686,"","Callistopteris","Copel.",248 21678,"","Cardiomanes","C.Presl",248 21691,"","Cephalomanes","C.Presl",248 21704,"","Craspedoneuron","Bosch",248 21720,"","Craspedophyllum","(C.Presl) Copel.",248 21705,"","Crepidium","C.Presl",248 21681,"","Crepidomanes","(C.Presl) C.Presl",248 24123,"","Crepidophyllum","C.F.Reed",248 21706,"","Crepidopteris","Copel.",248 21690,"","Davalliopsis","Bosch",248 25693,"","Dermatophlebium","C.Presl",248 21702,"","Didymoglossum","Desv.",248 21733,"","Diploophyllum","Bosch",248 21699,"","Feea","Bory",248 21679,"","Gonocormus","Bosch",248 25692,"","Hemicyatheon","(Domin) Copel.",248 21710,"","Hemiphlebium","C.Presl",248 21698,"","Homoeotes","Bory",248 21719,"","Hymenoglossum","C.Presl",248 13538,"","Hymenophyllum","Sm.",248 21700,"","Hymenostachys","Bory",248 21692,"","Lacostea","Bosch",248 21711,"","Lacosteopsis","(Prantl) Nakaike",248 21707,"","Lecanium","C.Presl",248 21703,"","Lecanolepis","Pic.Serm.",248 21729,"","Leptocionium","C.Presl",248 21708,"","Leucomanes","C.Presl",248 21688,"","Macroglena","(C.Presl) Copel.",248 21713,"","Maschalosorus","Bosch",248 21721,"","Mecodium","C.Presl ex Copel.",248 21726,"","Meringium","C.Presl",248 21701,"","Microgonium","C.Presl",248 21731,"","Microtrichomanes","(Mett.) Copel.",248 21694,"","Mortoniopteris","Pic.Serm.",248 21727,"","Myriodon","(Copel.) Copel.",248 21734,"","Myrmecostylum","C.Presl",248 21687,"","Nesopteris","Copel.",248 21697,"","Neuromanes","Trevis.",248 21714,"","Neurophyllum","C.Presl",248 21696,"","Odontomanes","C.Presl",248 21735,"","Pachyloma","Bosch",248 21715,"","Phlebiophyllum","Bosch",248 21684,"","Pleuromanes","(C.Presl) C.Presl",248 21683,"","Polyphlebium","Copel.",248 21695,"","Pteromanes","Pic.Serm.",248 21716,"","Ptilophyllum","Bosch",248 21736,"","Ptychomanes","Hedw.",248 21737,"","Ptychophyllum","C.Presl",248 21717,"","Pyxidaria","Gled.",248 21718,"","Ragatelus","C.Presl",248 21682,"","Reediella","Pic.Serm.",248 21730,"","Rosenstockia","Copel.",248 21689,"","Selenodesmium","(Prantl) Copel.",248 21732,"","Serpyllopsis","Bosch",248 21723,"","Sphaerocionium","C.Presl",248 21709,"","Taschneria","C.Presl",248 13539,"","Trichomanes","L.",248 21693,"","Trigonophyllum","(Prantl) Pic.Serm.",248 21680,"","Vandenboschia","Copel.",248 13546,"","Hymenophyllopsis","K.I.Goebel",249 11832,"","Curculigo","Gaertn.",250 11833,"","Empodium","Salisb.",250 23081,"","Hypoxidia","Friedmann",250 11834,"","Hypoxis","L.",250 18857,"","Ianthe","Salisb.",250 11835,"","Molineria","Colla",250 11836,"","Pauridia","Harv.",250 11837,"","Rhodohypoxis","Nel",250 11838,"","Saniella","Hilliard & B.L.Burtt",250 11839,"","Spiloxene","Salisb.",250 2021,"","Acrocoelium","Baill.",251 17840,"","Adelanthus","Endl.",251 24410,"","Alsodeidium","Engl.",251 2022,"","Alsodeiopsis","Oliv.",251 2023,"","Anisomallon","Baill.",251 2024,"","Apodytes","E.Mey. ex Arn.",251 17838,"","Asterolepidion","Ducke",251 17847,"","Aveledoa","Pittier",251 16421,"","Briquetina","J.F.Macbr.",251 2025,"","Calatola","Standl.",251 2026,"","Cantleya","Ridl.",251 2027,"","Casimirella","Hassl.",251 2028,"","Cassinopsis","Sond.",251 24413,"","Cavanilla","Thunb.",251 17837,"","Chariessa","Miq.",251 24415,"","Chelonecarya","Pierre",251 2029,"","Chlamydocarya","Baill.",251 2030,"","Citronella","D.Don",251 17839,"","Clavapetalum","Pulle",251 2031,"","Codiocarpus","R.A.Howard",251 2032,"","Dendrobangia","Rusby",251 2033,"","Desmostachys","Miers",251 2034,"","Discophora","Miers",251 2035,"","Emmotum","Desv. ex Ham.",251 17841,"","Freeria","Merr.",251 2036,"","Gastrolepis","Tiegh.",251 2037,"","Gomphandra","Wall. ex Lindl.",251 2038,"","Gonocaryum","Miq.",251 2039,"","Grisollea","Baill.",251 2040,"","Hartleya","Sleumer",251 24411,"","Hemilobium","Welw.",251 2041,"","Hosiea","Hemsl. & E.H.Wilson",251 2042,"","Humirianthera","Huber",251 2043,"","Icacina","A.Juss.",251 2044,"","Iodes","Blume",251 2045,"","Irvingbaileya","R.A.Howard",251 17833,"","Kummeria","Mart.",251 2046,"","Lasianthera","P.Beauv.",251 2047,"","Lavigeria","Pierre",251 2048,"","Leptaulus","Benth.",251 17832,"","Leretia","Vell.",251 2049,"","Mappia","Jacq.",251 2050,"","Mappianthus","Hand.-Mazz.",251 2051,"","Medusanthera","Seem.",251 2052,"","Merrilliodendron","Kaneh.",251 2053,"","Metteniusa","H.Karst.",251 2054,"","Miquelia","Meisn.",251 24414,"","Moldenhauera","Spreng.",251 17842,"","Monocephalium","S.Moore",251 2055,"","Natsiatopsis","Kurz",251 2056,"","Natsiatum","Buch.-Ham. ex Arn.",251 17845,"","Neoferetia","Baehni",251 17844,"","Neostachyanthus","Exell & Mendonca",251 2057,"","Nothapodytes","Blume",251 2058,"","Oecopetalum","Greenm. & C.H.Thomps.",251 2059,"","Ottoschulzia","Urb.",251 17834,"","Peekeliodendron","Sleumer",251 2060,"","Pennantia","J.R.Forst. & G.Forst.",251 17835,"","Phlebocalymna","Griff. ex Miers",251 2061,"","Phytocrene","Wall.",251 2062,"","Pittosporopsis","Craib",251 2063,"","Platea","Blume",251 2064,"","Pleurisanthes","Baill.",251 17836,"","Pocillaria","Ridl.",251 2065,"","Polycephalium","Engl.",251 2066,"","Polyporandra","Becc.",251 2067,"","Poraqueiba","Aubl.",251 2068,"","Pseudobotrys","Moeser",251 2069,"","Pyrenacantha","Wight",251 2070,"","Rhaphiostylis","Planch. ex Benth.",251 2071,"","Rhyticaryum","Becc.",251 2072,"","Sarcanthidion","Baill.",251 2073,"","Sarcostigma","Wight & Arn.",251 2074,"","Stachyanthus","Engl.",251 2075,"","Stemonurus","Blume",251 24412,"","Thollonia","Baill.",251 17843,"","Trematosperma","Urb.",251 16422,"","Tridianisia","Baill.",251 17831,"","Tylecarpus","Engl.",251 16423,"","Urandra","Thwaites",251 17846,"","Valetonia","T.Durand",251 15173,"","Villaresia","Ruiz & Pav.",251 16424,"","Villaresiopsis","Sleumer",251 2076,"","Whitmorea","Sleumer",251 78,"","Idiospermum","S.T.Blake",252 1042,"","Achyronychia","Torr. & A.Gray",253 1043,"","Anychia","Michx.",253 1044,"","Cardionema","DC.",253 24705,"","Chaetonychia","(DC.) Sweet",253 1045,"","Cometes","L.",253 1047,"","Dicheranthus","Webb",253 25357,"","Geocarpon","Mack.",253 1049,"","Gymnocarpos","Forssk.",253 19544,"","Hafunia","Chiov.",253 1051,"","Haya","Balf.f.",253 1052,"","Herniaria","L.",253 1053,"","Illecebrum","L.",253 1054,"","Kabulia","Bor & C.E.C.Fisch.",253 1055,"","Lochia","Balf.f.",253 19543,"","Mniarum","J.R.Forst. & G.Forst.",253 1056,"","Paronychia","Mill.",253 19542,"","Pentacaena","Bartl.",253 1057,"","Philippiella","Speg.",253 23088,"","Plettkea","Mattf.",253 1058,"","Pollichia","Aiton",253 1059,"","Pteranthus","Forssk.",253 1060,"","Scleranthus","L.",253 1061,"","Sclerocephalus","Boiss.",253 1062,"","Scopulophila","M.E.Jones",253 1063,"","Siphonychia","Torr. & A.Gray",253 1064,"","Sphaerocoma","T.Anderson",253 1065,"","Xerotia","Oliv.",253 98,"","Illicium","L.",254 16919,"","Acidanthera","Hochst.",255 18631,"","Ainea","Ravenna",255 11685,"","Alophia","Herb.",255 16920,"","Anaclanthe","N.E.Br.",255 11686,"","Anapalina","N.E.Br.",255 11687,"","Anomalesia","N.E.Br.",255 16921,"","Anomalostylus","R.C.Foster",255 11688,"","Anomatheca","Ker Gawl.",255 11689,"","Antholyza","L.",255 11690,"","Aristea","Sol. ex Aiton",255 11691,"","Babiana","Ker Gawl. ex Sims",255 11692,"","Barnardiella","Goldblatt",255 18912,"","Beatonia","Herb.",255 11693,"","Belamcanda","Adans.",255 11694,"","Bobartia","L.",255 11695,"","Calydorea","Herb.",255 11696,"","Cardenanthus","R.C.Foster",255 18630,"","Cardiostigma","Baker",255 14288,"","Catila","Ravenna",255 11697,"","Chamelum","Phil.",255 11698,"","Chasmanthe","N.E.Br.",255 16922,"","Chasmatocallis","R.C.Foster",255 18921,"","Chlamydostylus","Baker",255 11699,"","Cipura","Aubl.",255 16923,"","Cleanthe","Salisb.",255 11700,"","Cobana","Ravenna",255 18917,"","Crociris","Schur",255 11701,"","Crocosmia","Planch.",255 11702,"","Crocus","L.",255 18902,"","Cryptobasis","Nevski",255 16924,"","Curtonus","N.E.Br.",255 11703,"","Cypella","Herb.",255 25548,"","Devia","Goldblatt & J.C.Manning",255 18923,"","Dichone","Salisb.",255 11704,"","Dierama","K.Koch",255 11705,"","Dietes","Salisb. ex Klatt",255 20355,"","Diplarrena","Labill.",255 11706,"","Diplarrhena","Labill.",255 18924,"","Dortania","A.Chev.",255 11707,"","Duthiastrum","M.P.de Vos",255 18928,"","Duthiella","M.P.de Vos",255 11708,"","Eleutherine","Herb.",255 11709,"","Engysiphon","G.J.Lewis",255 11710,"","Ennealophus","N.E.Br.",255 11711,"","Eurynotia","R.C.Foster",255 18915,"","Eustylis","Engelm. & A.Gray",255 16925,"","Exohebea","R.C.Foster",255 11712,"","Ferraria","Burm. ex Mill.",255 11713,"","Fosteria","Molseed",255 11714,"","Freesia","Eckl. ex Klatt",255 11715,"","Galaxia","Thunb.",255 11716,"","Geissorhiza","Ker Gawl.",255 11717,"","Gelasine","Herb.",255 11767,"","Geosiris","Baill.",255 22254,"x","Gladanthera","J.M.Wright",255 11718,"","Gladiolus","L.",255 11719,"","Gynandriris","Parl.",255 18925,"","Hebea","(Pers.) R.Hedw.",255 18929,"","Hebea","L.Bolus",255 16926,"","Helixyra","Salisb. ex N.E.Br.",255 18916,"","Herbertia","Sweet",255 11720,"","Hermodactylus","Mill.",255 11721,"","Hesperantha","Ker Gawl.",255 17497,"","Hesperoxiphion","Baker",255 18930,"","Hewardia","Hook.f.",255 11722,"","Hexaglottis","Vent.",255 11723,"","Homeria","Vent.",255 11724,"","Homoglossum","Salisb.",255 18913,"","Hydrotaenia","Lindl.",255 18904,"","Iridodictyum","Rodion.",255 11725,"","Iris","L.",255 11990,"","Isophysis","T.Moore",255 23084,"","Itysa","Ravenna",255 11726,"","Ixia","L.",255 18903,"","Juno","Tratt.",255 18907,"","Junopsis","Wern.Schulze",255 18919,"","Keitia","Regel",255 18629,"","Kelissa","Ravenna",255 16927,"","Kentrosiphon","N.E.Br.",255 11727,"","Klattia","Baker",255 11728,"","Lapeirousia","Pourr.",255 18910,"","Larentia","Klatt",255 18627,"","Lethia","Ravenna",255 11729,"","Libertia","Spreng.",255 18908,"","Marica","Ker Gawl.",255 11730,"","Mastigostyla","I.M.Johnst.",255 11731,"","Melasphaerula","Ker Gawl.",255 11732,"","Micranthus","(Pers.) Eckl.",255 18927,"","Montbretia","DC.",255 18926,"","Montbretiopsis","L.Bolus",255 11733,"","Moraea","Mill.",255 11734,"","Nemastylis","Nutt.",255 11735,"","Neomarica","Sprague",255 11736,"","Nivenia","Vent.",255 11737,"","Oenostachys","Bullock",255 25045,"","Olsynium","Raf.",255 25087,"","Ona","Ravenna",255 14289,"","Onira","Ravenna",255 11738,"","Orthrosanthus","Sweet",255 25322,"","Pardanthopsis","(Hance) Lenz",255 11739,"","Patersonia","R.Br.",255 22253,"","Petamenes","Salisb. ex J.W.Loudon",255 11740,"","Phaiophleps","Raf.",255 18911,"","Phalocallis","Herb.",255 11741,"","Pillansia","L.Bolus",255 11742,"","Pseudotrimezia","R.C.Foster",255 11743,"","Radinosiphon","N.E.Br.",255 11744,"","Rheome","Goldblatt",255 11745,"","Rigidella","Lindl.",255 11746,"","Roggeveldia","Goldblatt",255 11747,"","Romulea","Maratti",255 18920,"","Salpingostylis","Small",255 11748,"","Savannosiphon","Goldblatt & Marais",255 11749,"","Schizostylis","Backh. & Harv.",255 11750,"","Sessilanthera","Molseed & Cruden",255 17498,"","Sessilistigma","Goldblatt",255 18906,"","Siphonostylis","Wern.Schulze",255 11751,"","Sisyrinchium","L.",255 11752,"","Solenomelus","Miers",255 11753,"","Sparaxis","Ker Gawl.",255 11754,"","Sphenostigma","Baker",255 16928,"","Streptanthera","Sweet",255 18628,"","Sympa","Ravenna",255 18922,"","Symphyostemon","Miers ex Klatt",255 11755,"","Synnotia","Sweet",255 11756,"","Syringodea","Hook.f.",255 16929,"","Tanaosolen","N.E.Br.",255 11757,"","Tapeinia","Comm. ex Juss.",255 11758,"","Thereianthus","G.J.Lewis",255 11759,"","Tigridia","Juss.",255 18918,"","Trichonema","Ker Gawl.",255 11760,"","Trifurcia","Herb.",255 11761,"","Trimezia","Salisb. ex Herb.",255 11762,"","Tritonia","Ker Gawl.",255 11763,"","Tritoniopsis","L.Bolus",255 18914,"","Tucma","Ravenna",255 11764,"","Watsonia","Mill.",255 11765,"","Witsenia","Thunb.",255 18905,"","Xiphium","Mill.",255 18909,"","Zygella","S.Moore",255 11766,"","Zygotritonia","Mildbr.",255 1540,"","Desbordesia","Pierre ex Tiegh.",256 1541,"","Irvingia","Hook.f.",256 1543,"","Klainedoxa","Pierre ex Engl.",256 21543,"","Calamaria","Boehm.",257 21544,"","Cephaloceraton","Gennari",257 21545,"","Isoetella","Gennari",257 13459,"","Isoetes","L.",257 13460,"","Stylites","Amstutz",257 11991,"","Ixiolirion","Herb.",258 1538,"","Allantospermum","Forman",259 24373,"","Cleistanthopsis","Capuron",259 1539,"","Cyrillopsis","Kuhlm.",259 1542,"","Ixonanthes","Jack",259 1544,"","Ochthocosmus","Benth.",259 1545,"","Phyllocosmus","Klotzsch",259 12195,"","Joinvillea","Gaudich. ex Brongn. & Gris",260 10655,"","Alfaroa","Standl.",261 10656,"","Carya","Nutt.",261 10657,"","Cyclocarya","Iljinsk.",261 10658,"","Engelhardtia","Lesch. ex Blume",261 25405,"","Hicorius","Raf.",261 10659,"","Juglans","L.",261 10660,"","Oreomunnea","Oerst.",261 10661,"","Platycarya","Siebold & Zucc.",261 19005,"","Pterilema","Reinw.",261 10662,"","Pterocarya","Kunth",261 10663,"","Rhamphocarya","Kuang",261 19009,"","Andesia","Hauman",262 12196,"","Distichia","Nees & Meyen",262 16236,"","Ebingeria","Chrtek & Krisa",262 12197,"","Juncus","L.",262 12198,"","Luzula","DC.",262 12199,"","Marsippospermum","Desv.",262 12697,"","Microschoenus","C.B.Clarke",262 12200,"","Oxychloe","Phil.",262 16949,"","Patosia","Buchenau",262 12201,"","Prionium","E.Mey.",262 12202,"","Rostkovia","Desv.",262 12564,"","Maundia","F.Muell.",263 12565,"","Tetroncium","Willd.",263 12566,"","Triglochin","L.",263 975,"","Krameria","L. ex Loefl.",264 9222,"","Acanthomintha","(A.Gray) A.Gray",265 9223,"","Achyrospermum","Blume",265 14251,"","Acinos","Mill.",265 9224,"","Acrocephalus","Benth.",265 9225,"","Acrotome","Benth. ex Endl.",265 9226,"","Acrymia","Prain",265 9227,"","Aeollanthus","Mart. ex Spreng.",265 19794,"","Afridia","Duthie",265 9228,"","Agastache","Gronov.",265 9229,"","Ajuga","L.",265 19820,"","Ajugoides","Makino",265 17731,"","Alajja","Ikonn.",265 9230,"","Alvesia","Welw.",265 16174,"","Amaracus","Gled.",265 16650,"","Amethystanthus","Nakai",265 9231,"","Amethystea","L.",265 19800,"","Anaspis","Rech.f.",265 9232,"","Anisochilus","Wall. ex Benth.",265 9233,"","Anisomeles","R.Br.",265 9234,"","Antonina","Vved.",265 19761,"","Aphanochilus","Benth.",265 19788,"","Arischrada","Pobed.",265 19752,"","Ascocarydion","G.Taylor",265 19783,"","Astemon","Regel",265 9235,"","Asterohyptis","Epling",265 19804,"","Atirbesia","Raf.",265 19789,"","Audibertia","Benth. (1831)",265 19767,"","Audibertia","Benth. (1829)",265 19785,"","Audibertiella","Briq.",265 9236,"","Ballota","L.",265 9237,"","Basilicum","Moench",265 9238,"","Becium","Lindl.",265 9239,"","Benguellia","G.Taylor",265 9240,"","Betonica","L.",265 9241,"","Blephilia","Raf.",265 19569,"","Bostrychanthera","Benth.",265 19751,"","Bouetia","A.Chev.",265 9242,"","Bovonia","Chiov.",265 9243,"","Brazoria","Engelm. & A.Gray",265 19759,"","Briquetastrum","Robyns & Lebrun",265 16659,"","Brittonastrum","Briq.",265 25373,"","Brotera","Spreng.",265 19801,"","Brunella","Mill.",265 19757,"","Burnatastrum","Briq.",265 9244,"","Bystropogon","L'Her.",265 9245,"","Calamintha","Mill.",265 9246,"","Capitanopsis","S.Moore",265 9247,"","Capitanya","Schweinf. ex Gurke",265 9248,"","Catoferia","(Benth.) Benth.",265 16249,"","Catopheria","Benth.",265 9249,"","Cedronella","Moench",265 22221,"","Ceranthera","Elliott",265 9250,"","Ceratanthus","F.Muell. ex G.Taylor",265 9251,"","Ceratominthe","Briq.",265 19806,"","Chaiturus","Ehrh. ex Willd.",265 19821,"","Chamaepitys","Hill",265 9252,"","Chamaesphacos","Schrenk ex Fisch. & C.A.Mey.",265 19812,"","Chartocalyx","Regel",265 9253,"","Chaunostoma","Donn.Sm.",265 9254,"","Chelonopsis","Miq.",265 19810,"","Chlainanthus","Briq.",265 9255,"","Cleonia","L.",265 19750,"","Clerodendranthus","Kudo",265 9256,"","Clinopodium","L.",265 9257,"","Colebrookea","Sm.",265 19753,"","Coleus","Lour.",265 9258,"","Collinsonia","L.",265 9259,"","Colquhounia","Wall.",265 9260,"","Comanthosphace","S.Moore",265 25374,"","Condea","Adans.",265 9261,"","Conradina","A.Gray",265 19777,"","Coridothymus","Rchb.f.",265 9262,"","Craniotome","Rchb.",265 19799,"","Cruzia","Phil.",265 24935,"","Cryphia","R.Br.",265 9263,"","Cuminia","Colla",265 9264,"","Cunila","Royen ex L.",265 19762,"","Cyclostegia","Benth.",265 14252,"","Cyclotrichium","(Boiss.) Manden. & Scheng.",265 9265,"","Cymaria","Benth.",265 24281,"","Dalanum","Dostal",265 14850,"","Dauphinea","Hedge",265 19784,"","Dekinia","M.Martens & Galeotti",265 9266,"","Dicerandra","Benth.",265 19754,"","Dielsia","Kudo",265 9267,"","Dorystaechas","Boiss. & Heldr. ex Benth.",265 9268,"","Dracocephalum","L.",265 16651,"","Drepanocaryum","Pojark.",265 9269,"","Dysophylla","Blume",265 9270,"","Eichlerago","Carrick",265 9271,"","Elsholtzia","Willd.",265 9272,"","Endostemon","N.E.Br.",265 9273,"","Englerastrum","Briq.",265 16652,"","Epimeredi","Adans.",265 15195,"","Eplingia","L.O.Williams",265 9274,"","Eremostachys","Bunge",265 19808,"","Erianthera","Benth.",265 9275,"","Eriope","Kunth ex Benth.",265 9276,"","Eriophyton","Benth.",265 9277,"","Eriopidion","Harley",265 9278,"","Eriothymus","(Benth.) Rchb.",265 9279,"","Erythrochlamys","Gurke",265 19769,"","Euhemus","Raf.",265 17732,"","Euhesperida","Brullo & Furnari",265 9280,"","Eurysolen","Prain",265 16653,"","Eusteralis","Raf.",265 19780,"","Faustia","Font Quer & Rothm.",265 19796,"","Fedtschenkiella","Kudr.",265 19790,"","Fenixanthes","Raf.",265 9281,"","Fuerstia","T.C.E.Fr.",265 14254,"","Galeobdolon","Huds.",265 9282,"","Galeopsis","L.",265 9283,"","Gardoquia","Ruiz & Pav.",265 9284,"","Geniosporum","Wall. ex Benth.",265 9285,"","Glechoma","L.",265 9286,"","Glechon","Spreng.",265 25376,"","Gnoteris","Raf.",265 9287,"","Gomphostemma","Wall. ex Benth.",265 16654,"","Gontscharovia","Boriss.",265 19817,"","Hancea","Hemsl.",265 9288,"","Hanceola","Kudo",265 9289,"","Haplostachys","(A.Gray) W.F.Hillebr.",265 16655,"","Harlanlewisia","Epling",265 19813,"","Harmsiella","Briq.",265 9290,"","Haumaniastrum","P.A.Duvign. & Plancke",265 9291,"","Hedeoma","Pers.",265 19782,"","Hedeomoides","Briq.",265 16656,"","Hedyosmos","Mitch.",265 9292,"","Hemiandra","R.Br.",265 9293,"","Hemigenia","R.Br.",265 9294,"","Hemizygia","(Benth.) Briq.",265 19758,"","Hemsleia","Kudo",265 9295,"","Hesperozygis","Epling",265 16657,"","Heterolamium","C.Y.Wu",265 9296,"","Hoehnea","Epling",265 14253,"","Holocheila","(Kudo) S.Chow",265 9297,"","Holostylon","Robyns & Lebrun",265 16658,"","Homalocheilos","J.K.Morton",265 9298,"","Horminum","L.",265 9299,"","Hoslundia","Vahl",265 9300,"","Hymenocrater","Fisch. & C.A.Mey.",265 24776,"","Hypenia","(Mart. ex Benth.) Harley",265 19746,"","Hyperaspis","Briq.",265 9301,"","Hypogomphia","Bunge",265 16661,"","Hypogon","Raf.",265 25377,"","Hypothronia","Schrank",265 24777,"","Hyptidendron","Harley",265 9302,"","Hyptis","Jacq.",265 9303,"","Hyssopus","L.",265 9304,"","Iboza","N.E.Br.",265 9305,"","Icomum","Hua",265 9306,"","Isanthus","Michx.",265 16662,"","Isinia","Rech.f.",265 9307,"","Isodictyophorus","Briq.",265 17733,"","Isodon","(Schrad. ex Benth.) Spach",265 9308,"","Isoleucas","O.Schwartz",265 19770,"","Johowia","Epling & Looser",265 9309,"","Keiskea","Miq.",265 16663,"","Keithia","Benth.",265 9310,"","Kinostemon","Kudo",265 24936,"","Klanderia","F.Muell.",265 19772,"","Koellia","Moench",265 16664,"","Kudrjaschevia","Pojark.",265 9311,"","Kurzamra","Kuntze",265 16665,"","Lagochilopsis","Knorring",265 9312,"","Lagochilus","Bunge",265 9313,"","Lagopsis","Bunge",265 9314,"","Lallemantia","Fisch. & C.A.Mey.",265 9315,"","Lamiastrum","Heist. ex Fabr.",265 19815,"","Lamiophlomis","Kudo",265 9316,"","Lamium","L.",265 19814,"","Lasiocorys","Benth.",265 9317,"","Lavandula","L.",265 9318,"","Leocus","A.Chev.",265 9319,"","Leonotis","(Pers.) R.Br.",265 25352,"","Leonuroides","Rauschert",265 9320,"","Leonurus","L.",265 9321,"","Lepechinia","Willd.",265 9322,"","Leucas","R.Br.",265 19803,"","Leucophae","Webb & Berthel.",265 9323,"","Leucosceptrum","Sm.",265 9324,"","Limniboza","R.E.Fr.",265 9325,"","Lophanthus","Adans.",265 9326,"","Loxocalyx","Hemsl.",265 9327,"","Lycopus","L.",265 9328,"","Macbridea","Elliott ex Nutt.",265 19773,"","Madronella","Mill.",265 16666,"","Mahya","Cordem.",265 19774,"","Majorana","Mill.",265 24930,"x","Majoranamaracus","Rech.f.",265 25761,"","Marmoritis","Benth.",265 9329,"","Marrubium","L.",265 9330,"","Marsypianthes","Mart. ex Benth.",265 19809,"","Matsumurella","Makino",265 9331,"","Meehania","Britton",265 9332,"","Meehaniopsis","Kudo",265 9333,"","Melissa","L.",265 9334,"","Melittis","L.",265 9335,"","Mentha","L.",265 9336,"","Meriandra","Benth.",265 9337,"","Mesona","Blume",265 25375,"","Mesosphaerum","P.Browne",265 9338,"","Metastachydium","Airy Shaw ex C.Y.Wu & H.W.Li",265 19811,"","Metastachys","Knorring",265 19765,"","Micheliella","Briq.",265 9339,"","Microcorys","R.Br.",265 9340,"","Micromeria","Benth.",265 9341,"","Microtoena","Prain",265 9342,"","Minthostachys","(Benth.) Spach",265 19797,"","Moldavica","Fabr.",265 9343,"","Moluccella","L.",265 9344,"","Monarda","L.",265 9345,"","Monardella","Benth.",265 19747,"","Moschosma","Rchb.",265 9346,"","Mosla","(Benth.) Buch.-Ham. ex Maxim.",265 9347,"","Nautochilus","Bremek.",265 14280,"","Neoeplingia","Ramam., Hiriart & Medrano",265 9348,"","Neohyptis","J.K.Morton",265 19755,"","Neomuellera","Briq.",265 9349,"","Nepeta","L.",265 14257,"","Neustruevia","Juz.",265 9350,"","Nosema","Prain",265 9351,"","Notochaete","Benth.",265 9352,"","Ocimum","L.",265 9353,"","Octomeron","Robyns",265 9354,"","Ombrocharis","Hand.-Mazz.",265 19778,"","Oreospacus","Phil.",265 24931,"x","Origanomajorana","Domin",265 9355,"","Origanum","L.",265 19766,"","Orthodon","Benth. & Oliv.",265 9356,"","Orthosiphon","Benth.",265 9357,"","Otostegia","Benth.",265 19807,"","Panzeria","Moench",265 24932,"","Panzerina","Sojak",265 24934,"","Paraeremostachys","Adylov, Kamelin & Machm.",265 9358,"","Paralamium","Dunn",265 9359,"","Paraphlomis","Prain",265 19763,"","Paulseniella","Briq.",265 9360,"","Peltodon","Pohl",265 9361,"","Pentapleura","Hand.-Mazz.",265 9362,"","Perilla","L.",265 9363,"","Perillula","Maxim.",265 19798,"","Perilomia","Kunth",265 9364,"","Perovskia","Kar.",265 9365,"","Perrierastrum","Guillaumin",265 19748,"","Perxo","Raf.",265 9366,"","Phlomidoschema","(Benth.) Vved.",265 9367,"","Phlomis","L.",265 24933,"","Phlomoides","Moench",265 9368,"","Phyllophyton","Kudo",265 9369,"","Phyllostegia","Benth.",265 16667,"","Physoleucas","Jaub. & Spach",265 9370,"","Physostegia","Benth.",265 9371,"","Piloblephis","Raf.",265 9372,"","Pitardia","Batt. ex Pit.",265 9373,"","Platostoma","P.Beauv.",265 19764,"","Platyelasma","Kitag.",265 16660,"","Plectranthastrum","T.C.E.Fr.",265 9374,"","Plectranthus","L'Her.",265 9375,"","Pogogyne","Benth.",265 9376,"","Pogostemon","Desf.",265 9377,"","Polakia","Stapf",265 9378,"","Poliomintha","A.Gray",265 9379,"","Prasium","L.",265 19768,"","Preslia","Opiz",265 9380,"","Prostanthera","Labill.",265 9381,"","Prunella","L.",265 19802,"","Prunellopsis","Kudo",265 9382,"","Pseuderemostachys","Popov",265 24937,"","Pseudochamaesphacos","Parsa",265 19749,"","Pseudocimum","Bremek.",265 16668,"","Pseudocunila","Brade",265 19795,"","Pseudolophanthus","Levin",265 19816,"","Pseudomarrubium","Popov",265 14849,"","Puntia","Hedge",265 9383,"","Pycnanthemum","Michx.",265 19786,"","Pycnosphace","Rydb.",265 9384,"","Pycnostachys","Hook.",265 19779,"","Pycnothymus","(Benth.) Small",265 9385,"","Rabdosia","Hassk.",265 17734,"","Rabdosiella","Codd",265 19791,"","Ramona","Greene",265 9387,"","Renschia","Vatke",265 9388,"","Rhabdocaulon","(Benth.) Epling",265 9386,"","Rhaphiodon","Schauer",265 9389,"","Rhododon","Epling",265 25378,"","Rizoa","Cav.",265 9390,"","Rosmarinus","L.",265 14255,"","Rostrinucula","Kudo",265 9391,"","Roylea","Wall. ex Benth.",265 19819,"","Rubiteucris","Kudo",265 9392,"","Sabaudia","Buscal. & Muschl.",265 14256,"","Saccocalyx","Coss. & Durieu",265 9393,"","Salazaria","Torr.",265 9394,"","Salvia","L.",265 19787,"","Salviastrum","Scheele",265 9395,"","Satureja","L.",265 25379,"","Schaueria","Hassk.",265 9396,"","Schizonepeta","(Benth.) Briq.",265 19792,"","Schraderia","Medik.",265 9397,"","Scutellaria","L.",265 9398,"","Sideritis","L.",265 19818,"","Siphocranion","Kudo",265 19756,"","Skapanthus","C.Y.Wu",265 19771,"","Skottsbergiella","Epling",265 9399,"","Solenostemon","Thonn.",265 19781,"","Soliera","Clos",265 16669,"","Sphacele","Benth.",265 9400,"","Stachydeoma","Small",265 9401,"","Stachyopsis","Popov & Vved.",265 9402,"","Stachys","L.",265 9403,"","Stenogyne","Benth.",265 19760,"","Stiptanthus","Briq.",265 9404,"","Sulaimania","Hedge & Rech.f.",265 25457,"","Susilkumara","Bennet",265 9405,"","Suzukia","Kudo",265 9406,"","Symphostemon","Hiern",265 9407,"","Synandra","Nutt.",265 9408,"","Syncolostemon","E.Mey.",265 9409,"","Taitonia","Yamam.",265 19805,"","Tapeinanthus","Boiss. ex Benth.",265 9411,"","Tetraclea","A.Gray",265 9412,"","Tetradenia","Benth.",265 9413,"","Teucrium","L.",265 25380,"","Theresa","Clos",265 9414,"","Thorncroftia","N.E.Br.",265 9415,"","Thuspeinanta","T.Durand",265 9416,"","Thymbra","L.",265 9417,"","Thymus","L.",265 9418,"","Tinnea","Kotschy & Peyr.",265 9419,"","Trichostema","L.",265 9420,"","Wenchengia","C.Y.Wu & S.Chow",265 9421,"","Westringia","Sm.",265 9422,"","Wiedemannia","Fisch. & C.A.Mey.",265 9423,"","Wrixonia","F.Muell.",265 19793,"","Zappania","Scop.",265 9424,"","Zataria","Boiss.",265 9425,"","Zhumeria","Rech.f. & Wendelbo",265 9426,"","Ziziphora","L.",265 932,"","Lacistema","Sw.",266 933,"","Lozania","S.Mutis ex Caldas",266 9792,"","Lactoris","Phil.",267 11670,"","Lanaria","Aiton",268 327,"","Akebia","Decne.",269 328,"","Boquila","Decne.",269 329,"","Decaisnea","Hook.f. & Thomson",269 330,"","Holboellia","Wall.",269 331,"","Lardizabala","Ruiz & Pav.",269 332,"","Parvatia","Decne.",269 333,"","Sinofranchetia","(Diels) Hemsl.",269 334,"","Stauntonia","DC.",269 22105,"","Acrodiclidium","Nees & Mart.",270 9862,"","Actinodaphne","Nees",270 9863,"","Aiouea","Aubl.",270 9864,"","Alseodaphne","Nees",270 22100,"","Ampelodaphne","Meisn.",270 22092,"","Anaueria","Kosterm.",270 9865,"","Aniba","Aubl.",270 9866,"","Apollonias","Nees",270 23210,"","Aspidostemon","Rohwer & H.G.Richt.",270 22087,"","Aydendron","Nees",270 9867,"","Beilschmiedia","Nees",270 15896,"","Bellota","Gay",270 25725,"","Bernieria","Baill.",270 22099,"","Brassiodendron","C.K.Allen",270 16707,"","Bryantea","Raf.",270 22097,"","Caryodaphne","Blume ex Nees",270 9868,"","Caryodaphnopsis","Airy Shaw",270 9869,"","Cassytha","L.",270 22103,"","Chanekia","Lundell",270 25835,"","Chlorocardium","Rohwer, H.G.Richt. & van der Werff",270 9870,"","Cinnadenia","Kosterm.",270 9871,"","Cinnamomum","Schaeff.",270 22106,"","Clinostemon","Kuhlm. & Samp.",270 9872,"","Cryptocarya","R.Br.",270 22098,"","Cyanodaphne","Blume",270 23211,"","Dahlgrenodendron","J.J.M.van der Merwe & A.E.van Wyk",270 22107,"","Daphnidium","Nees",270 9873,"","Dehaasia","Blume",270 9874,"","Dicypellium","Nees & Mart.",270 9875,"","Dodecadenia","Nees",270 9876,"","Endiandra","R.Br.",270 9877,"","Endlicheria","Nees",270 9878,"","Eusideroxylon","Teijsm. & Binn.",270 22101,"","Goeppertia","Nees",270 16708,"","Hexapora","Hook.f.",270 22102,"","Huberodaphne","Ducke",270 15897,"","Hufelandia","Nees",270 9879,"","Hypodaphnis","Stapf",270 22094,"","Icosandra","Phil.",270 22108,"","Iteadaphne","Blume",270 17568,"","Kubitzkia","van der Werff",270 22088,"","Lauromerrillia","C.K.Allen",270 9880,"","Laurus","L.",270 9881,"","Licaria","Aubl.",270 9882,"","Lindera","Thunb.",270 9883,"","Litsea","Lam.",270 22114,"","Machilus","Nees",270 22095,"","Massoia","Becc.",270 22112,"","Mespilodaphne","Nees",270 9884,"","Mezilaurus","Kuntze ex Taub.",270 9885,"","Micropora","Hook.f.",270 15898,"","Misanteca","Schltdl. & Cham.",270 9886,"","Nectandra","Rol. ex Rottb.",270 9887,"","Neocinnamomum","H.Liu",270 9888,"","Neolitsea","(Benth.) Merr.",270 22089,"","Nesodaphne","Hook.f.",270 22104,"","Nobeliodendron","O.C.Schmidt",270 9889,"","Nothaphoebe","Blume",270 9890,"","Ocotea","Aubl.",270 22113,"","Oreodaphne","Nees & Mart.",270 22109,"","Parabenzoin","Nakai",270 25828,"","Paraia","Rohwer, H.G.Richt. & van der Werff",270 18795,"","Parasassafras","D.G.Long",270 9891,"","Persea","Mill.",270 9892,"","Phoebe","Nees",270 9893,"","Phyllostemonodaphne","Kosterm.",270 9894,"","Pleurothyrium","Nees",270 9895,"","Potameia","Thouars",270 9896,"","Potoxylon","Kosterm.",270 24321,"","Povedadaphne","W.C.Burger",270 22096,"","Pseudocryptocarya","Teschner",270 22116,"","Pseudosassafras","Lecomte",270 9897,"","Ravensara","Sonn.",270 23351,"","Rhodostemonodaphne","Rohwer & Kubitzki",270 9898,"","Sassafras","Nees",270 22093,"","Sassafridium","Meisn.",270 22117,"","Sciadiodaphne","Rchb.",270 22111,"","Silvia","Allemao",270 18796,"","Sinosassafras","H.W.Li",270 16709,"","Stemmatodaphne","Gamble",270 22115,"","Syndiclis","Hook.f.",270 9900,"","Temmodaphne","Kosterm.",270 22110,"","Tetranthera","Jacq.",270 22090,"","Thouvenotia","Danguy",270 9901,"","Triadodaphne","Kosterm.",270 22091,"","Tylostemon","Engl.",270 9902,"","Umbellularia","(Nees) Nutt.",270 9903,"","Urbanodendron","Mez",270 23212,"","Williamodendron","Kubitzki & H.G.Richt.",270 3663,"","Abdulmajidia","Whitmore",271 3664,"","Allantoma","Miers",271 20762,"","Amphoricarpus","Spruce ex Miers",271 3665,"","Asteranthos","Desf.",271 20766,"","Asteranthus","Spreng.",271 3666,"","Barringtonia","J.R.Forst. & G.Forst.",271 24480,"","Barthollesia","Silva Manso",271 24479,"","Bergena","Adans.",271 3667,"","Bertholletia","Bonpl.",271 3668,"","Careya","Roxb.",271 3669,"","Cariniana","Casar.",271 20765,"","Cercophora","Miers",271 3670,"","Chydenanthus","Miers",271 16488,"","Chytroma","Miers",271 16489,"","Combretodendron","A.Chev.",271 3671,"","Corythophora","R.Knuth",271 3672,"","Couratari","Aubl.",271 3673,"","Couroupita","Aubl.",271 3674,"","Crateranthus","Baker f.",271 24475,"","Curatari","J.F.Gmel.",271 24477,"","Curataria","Spreng.",271 3676,"","Eschweilera","Mart. ex DC.",271 3677,"","Foetidia","Comm. ex Lam.",271 16490,"","Goeldinia","Huber",271 3678,"","Grias","L.",271 3679,"","Gustavia","L.",271 16491,"","Holopyxidium","Ducke",271 20757,"","Japarandiba","Adans.",271 3680,"","Jugastrum","Miers",271 3681,"","Lecythis","Loefl.",271 24476,"","Lecythopsis","Schrank",271 16493,"","Napoleona","P.Beauv.",271 3682,"","Napoleonaea","P.Beauv.",271 16492,"","Neohuberia","Ledoux",271 20764,"","Pachylecythis","Ledoux",271 20761,"","Perigaria","Span.",271 20734,"","Petersia","Welw. ex Benth.",271 3683,"","Petersianthus","Merr.",271 20758,"","Pirigara","Aubl.",271 3684,"","Planchonia","Blume",271 24478,"","Pontopidana","Scop.",271 20763,"","Sapucaya","R.Knuth",271 3686,"","Strailia","T.Durand",271 20759,"","Teichmeyeria","Scop.",271 2242,"","Leea","L.",272 14723,"","Abauria","Becc.",273 2956,"","Acrocarpus","Wight ex Arn.",273 2957,"","Adenolobus","(Harv. ex Benth.) Torre & Hillc.",273 14724,"","Afrafzelia","Pierre",273 2958,"","Afzelia","Sm.",273 2959,"","Amherstia","Wall.",273 14725,"","Andradia","Sim",273 2960,"","Androcalymma","Dwyer",273 2961,"","Anthonotha","P.Beauv.",273 2962,"","Apaloxylon","Drake",273 2963,"","Aphanocalyx","Oliv.",273 14726,"","Aprevalia","Baill.",273 2964,"","Apuleia","Mart.",273 2965,"","Arapatiella","Rizzini & A.Mattos",273 2966,"","Arcoa","Urb.",273 2967,"","Augouardia","Pellegr.",273 2968,"","Baikiaea","Benth.",273 2969,"","Balsamocarpon","Clos",273 14727,"","Bandeiraea","Benth.",273 14702,"","Barklya","F.Muell.",273 2970,"","Batesia","Spruce ex Benth.",273 2971,"","Bathiaea","Drake",273 2972,"","Baudouinia","Baill.",273 2973,"","Bauhinia","L.",273 2974,"","Berlinia","Sol. ex Hook.f.",273 14728,"","Biancaea","Tod.",273 2975,"","Brachycylix","(Harms) R.S.Cowan",273 2976,"","Brachystegia","Benth.",273 14703,"","Bracteolanthus","de Wit",273 2977,"","Brenierea","Humbert",273 2978,"","Brodriguesia","R.S.Cowan",273 2979,"","Brownea","Jacq.",273 2980,"","Browneopsis","Huber",273 2981,"","Burkea","Hook.",273 2982,"","Bussea","Harms",273 2983,"","Caesalpinia","L.",273 2984,"","Campsiandra","Benth.",273 14729,"","Cantuffa","J.F.Gmel.",273 14730,"","Cardenasia","Rusby",273 14731,"","Caspareopsis","Britton & Rose",273 2985,"","Cassia","L.",273 14732,"","Cavaraea","Speg.",273 2986,"","Cenostigma","Tul.",273 2987,"","Ceratonia","L.",273 14733,"","Cercidiopsis","Britton & Rose",273 14704,"","Cercidium","Tul.",273 2988,"","Cercis","L.",273 2989,"","Chamaecrista","Moench",273 14734,"","Chamaesenna","(DC.) Raf. ex Pittier",273 2990,"","Chidlowia","Hoyle",273 2991,"","Colophospermum","J.Leonard",273 2992,"","Colvillea","Bojer ex Hook.",273 2993,"","Conzattia","Rose",273 2994,"","Copaifera","L.",273 2995,"","Cordeauxia","Hemsl.",273 14735,"","Cowellocassia","Britton",273 2996,"","Crudia","Schreb.",273 14736,"","Crudya","Batsch",273 2997,"","Cryptosepalum","Benth.",273 14737,"","Cyanothyrsus","Harms",273 14738,"","Cymbosepalum","Baker",273 2998,"","Cynometra","L.",273 2999,"","Daniellia","Benn.",273 14705,"","Dansera","Steenis",273 3000,"","Delonix","Raf.",273 14706,"","Denisophytum","R.Vig.",273 14739,"","Desmodiocassia","Britton & Rose",273 3001,"","Detarium","Juss.",273 14740,"","Dewindtia","De Wild.",273 3002,"","Dialium","L.",273 3003,"","Dicorynia","Benth.",273 3004,"","Dicymbe","Spruce ex Benth.",273 14741,"","Dicymbopsis","Ducke",273 3005,"","Didelotia","Baill.",273 3006,"","Dimorphandra","Schott",273 14742,"","Dipetalanthus","A.Chev.",273 3007,"","Diptychandra","Tul.",273 3008,"","Distemonanthus","Benth.",273 14743,"","Doga","(Baill.) Baill. ex Nakai",273 3009,"","Duparquetia","Baill.",273 14744,"","Earleocassia","Britton",273 14745,"","Echinocalyx","Benth.",273 14746,"","Echinocassia","Britton & Rose",273 3010,"","Eligmocarpus","Capuron",273 3011,"","Elizabetha","R.H.Schomb. ex Benth.",273 3012,"","Endertia","Steenis & de Wit",273 3013,"","Englerodendron","Harms",273 3014,"","Eperua","Aubl.",273 3015,"","Erythrophleum","Afzel. ex G.Don",273 3016,"","Eurypetalum","Harms",273 14432,"","Gamwellia","Baker",273 14747,"","Gaumerocassia","Britton",273 14707,"","Gigasiphon","Drake",273 3017,"","Gilbertiodendron","J.Leonard",273 3018,"","Gilletiodendron","Vermoesen",273 14748,"","Gleditschia","Scop.",273 3019,"","Gleditsia","L.",273 3020,"","Goniorrhachis","Taub.",273 3021,"","Gossweilerodendron","Harms",273 3022,"","Griffonia","Baill.",273 24439,"","Grimaldia","Schrank",273 14792,"","Guaymasia","Britton & Rose",273 3023,"","Guibourtia","Benn.",273 14708,"","Guilandina","L.",273 3024,"","Gymnocladus","Lam.",273 3025,"","Haematoxylum","L.",273 3026,"","Hardwickia","Roxb.",273 14749,"","Herpetica","(DC.) Raf.",273 3027,"","Heterostemon","Desf.",273 3028,"","Hoffmannseggia","Cav.",273 3029,"","Humboldtia","Vahl",273 3030,"","Hylodendron","Taub.",273 3031,"","Hymenaea","L.",273 3032,"","Hymenostegia","(Benth.) Harms",273 14750,"","Ibadja","A.Chev.",273 3033,"","Intsia","Thouars",273 3034,"","Isoberlinia","Craib & Stapf ex Holland",273 14709,"","Isomacrolobium","Aubrev. & Pellegr.",273 3035,"","Jacqueshuberia","Ducke",273 14751,"","Jonesia","Roxb.",273 3036,"","Julbernardia","Pellegr.",273 3037,"","Kalappia","Kosterm.",273 14794,"","Kaoue","Pellegr.",273 3038,"","Kingiodendron","Harms",273 3039,"","Koompassia","Maingay",273 3040,"","Labichea","Gaudich. ex DC.",273 14710,"","Lasiobema","(Korth.) Miq.",273 3041,"","Lebruniodendron","J.Leonard",273 3042,"","Lemuropisum","H.Perrier",273 14711,"","Leonardendron","Aubrev.",273 3043,"","Leonardoxa","Aubrev.",273 14752,"","Leonocassia","Britton",273 3044,"","Leucostegane","Prain",273 3045,"","Librevillea","Hoyle",273 3046,"","Loesenera","Harms",273 3047,"","Lophocarpinia","Burkart",273 3048,"","Lysidice","Hance",273 14712,"","Lysiphyllum","(Benth.) de Wit",273 3049,"","Macroberlinia","(Harms) Hauman",273 3050,"","Macrolobium","Schreb.",273 3051,"","Maniltoa","Scheff.",273 3052,"","Martiodendron","Gleason",273 14753,"","Martiusia","Benth.",273 14754,"","Melanosticta","DC.",273 3053,"","Melanoxylon","Schott",273 3054,"","Mendoravia","Capuron",273 14713,"","Mezoneuron","Desf.",273 3055,"","Michelsonia","Hauman",273 3056,"","Microberlinia","A.Chev.",273 14755,"","Microstegia","Pierre ex Harms",273 3057,"","Moldenhawera","Schrad.",273 3058,"","Monopetalanthus","Harms",273 14756,"","Moparia","Britton & Rose",273 3059,"","Mora","Benth.",273 3107,"","Moullava","Adans.",273 14190,"","Neoapaloxylon","Rauschert",273 3060,"","Neochevalierodendron","J.Leonard",273 14757,"","Nicarago","Britton & Rose",273 3061,"","Oddoniodendron","De Wild.",273 14758,"","Oligostemon","Benth.",273 25298,"","Orphanodendron","Barneby & J.W.Grimes",273 3062,"","Oxystigma","Harms",273 3063,"","Pachyelasma","Harms",273 14759,"","Pahudia","Miq.",273 14760,"","Palmerocassia","Britton",273 3064,"","Paloue","Aubl.",273 14761,"","Palovea","Juss.",273 3065,"","Paloveopsis","R.S.Cowan",273 14762,"","Paraberlinia","Pellegr.",273 14763,"","Paradaniellia","Rolfe",273 3066,"","Paramacrolobium","J.Leonard",273 3067,"","Parkinsonia","L.",273 3068,"","Pellegriniodendron","J.Leonard",273 3069,"","Peltogyne","Vogel",273 14714,"","Peltophoropsis","Chiov.",273 3070,"","Peltophorum","(Vogel) Benth.",273 14764,"","Petalogyne","F.Muell.",273 3071,"","Petalostylis","R.Br.",273 14715,"","Phanera","Lour.",273 14765,"","Phragmocassia","Britton & Rose",273 3072,"","Phyllocarpus","Riedel ex Tul.",273 14716,"","Piliostigma","Hochst.",273 3073,"","Plagiosiphon","Harms",273 14766,"","Podogynium","Taub.",273 3074,"","Poeppigia","C.Presl",273 23580,"","Poinciana","L.",273 14767,"","Poincianella","Britton & Rose",273 3075,"","Polystemonanthus","Harms",273 3076,"","Prioria","Griseb.",273 14768,"","Pryona","Miq.",273 14769,"","Pseudocassia","Britton & Rose",273 14770,"","Pseudocopaiva","Britton & P.Wilson",273 14771,"","Pseudocynometra","Kuntze",273 3077,"","Pseudomacrolobium","Hauman",273 3078,"","Pseudosindora","Symington",273 14772,"","Pseudovouapa","Britton & Rose",273 14773,"","Pterocassia","Britton & Rose",273 3079,"","Pterogyne","Tul.",273 3080,"","Pterolobium","R.Br. ex Wight & Arn.",273 14774,"","Pterygopodium","Harms",273 14775,"","Pynaertiodendron","De Wild.",273 3081,"","Recordoxylon","Ducke",273 14776,"","Rhynchocarpa","Backer ex K.Heyne",273 3082,"","Saraca","L.",273 3083,"","Schizolobium","Vogel",273 14717,"","Schizoscyphus","K.Schum. ex Taub.",273 14777,"","Schizosiphon","K.Schum.",273 14718,"","Schnella","Raddi",273 3084,"","Schotia","Jacq.",273 14778,"","Schrammia","Britton & Rose",273 14779,"","Sciacassia","Britton",273 25461,"","Sciaplea","Rauschert",273 3085,"","Sclerolobium","Vogel",273 3086,"","Scorodophloeus","Harms",273 14491,"","Scottia","Thunb.",273 3087,"","Senna","Mill.",273 14780,"","Seretoberlinia","P.A.Duvign.",273 14781,"","Sericeocassia","Britton",273 3088,"","Sindora","Miq.",273 3089,"","Sindoropsis","J.Leonard",273 14782,"","Sooja","Siebold",273 3090,"","Stachyothyrsus","Harms",273 3091,"","Stahlia","Bello",273 3092,"","Stemonocoleus","Harms",273 3093,"","Stenodrepanum","Harms",273 3094,"","Storckiella","Seem.",273 3095,"","Stuhlmannia","Taub.",273 3096,"","Sympetalandra","Stapf",273 3097,"","Tachigali","Aubl.",273 3098,"","Talbotiella","Baker f.",273 3099,"","Tamarindus","L.",273 14783,"","Tara","Molina",273 3100,"","Tessmannia","Harms",273 3101,"","Tetraberlinia","(Harms) Hauman",273 3102,"","Tetrapterocarpon","Humbert",273 14784,"","Tharpia","Britton & Rose",273 3103,"","Thylacanthus","Tul.",273 14719,"","Toubaouate","Aubrev. & Pellegr.",273 14785,"","Touchiroa","Aubl.",273 14720,"","Trachylobium","Hayne",273 14786,"","Tripetalanthus","A.Chev.",273 14721,"","Triplisomeris","(Baill.) Aubrev. & Pellegr.",273 3104,"","Tylosema","(Schweinf.) Torre & Hillc.",273 14722,"","Uittienia","Steenis",273 3105,"","Umtiza","Sim",273 14787,"","Vogelocassia","Britton",273 3106,"","Vouacapoua","Aubl.",273 25290,"","Wagatea","Dalzell",273 3108,"","Westia","Vahl",273 14788,"","Xerocassia","Britton & Rose",273 3109,"","Zenia","Chun",273 3110,"","Zenkerella","Taub.",273 14789,"","Zingania","A.Chev.",273 3111,"","Zuccagnia","Cav.",273 3112,"","Abarema","Pittier",273 3113,"","Acacia","Mill.",273 14671,"","Acaciella","Britton & Rose",273 14672,"","Acaciopsis","Britton & Rose",273 14790,"","Acanthopteron","Britton",273 14673,"","Acuan","Medik.",273 3114,"","Adenanthera","L.",273 17724,"","Adenopodia","C.Presl",273 3115,"","Affonsea","A.St.-Hil.",273 3116,"","Albizia","Durazz.",273 3117,"","Amblygonocarpus","Harms",273 3118,"","Anadenanthera","Speg.",273 14674,"","Anneslia","Salisb.",273 3119,"","Archidendron","F.Muell.",273 14802,"","Archidendropsis","I.C.Nielsen",273 14394,"","Arthrosamanea","Britton & Rose",273 3120,"","Aubrevillea","Pellegr.",273 14675,"","Bahamia","Britton & Rose",273 24431,"","Cailliea","Guill. & Perr.",273 3121,"","Calliandra","Benth.",273 24961,"","Calliandropsis","H.M.Hern. & Guinet",273 3122,"","Calpocalyx","Harms",273 14654,"","Cathormion","(Benth.) Hassk.",273 14676,"","Caudoleucaena","Britton & Rose",273 3123,"","Cedrelinga","Ducke",273 14791,"","Chloroleucon","(Benth.) Record",273 24440,"","Chloroleucum","(Benth.) Record",273 24432,"","Codonandra","H.Karst.",273 3124,"","Cojoba","Britton & Rose",273 3125,"","Cylicodiscus","Harms",273 14656,"","Cylindrokelupha","Kosterm.",273 14677,"","Cyrtoxiphus","Harms",273 14678,"","Delaportea","Thorel ex Gagnep.",273 3126,"","Desmanthus","Willd.",273 3127,"","Dichrostachys","(A.DC.) Wight & Arn.",273 3128,"","Dinizia","Ducke",273 14657,"","Ebenopsis","Britton & Rose",273 3129,"","Elephantorrhiza","Benth.",273 3130,"","Entada","Adans.",273 14679,"","Entadopsis","Britton",273 3131,"","Enterolobium","Mart.",273 3132,"","Faidherbia","A.Chev.",273 3133,"","Fillaeopsis","Harms",273 14680,"","Fishlockia","Britton & Rose",273 3134,"","Gagnebina","Neck. ex DC.",273 24433,"","Gigalobium","P.Browne",273 3135,"","Goldmania","Rose ex Micheli",273 24429,"","Gonsii","Adans.",273 24443,"","Haitimimosa","Britton",273 14658,"","Hansemannia","K.Schum.",273 3136,"","Havardia","Small",273 24436,"","Hemidesma","Raf.",273 3137,"","Indopiptadenia","Brenan",273 3138,"","Inga","Mill.",273 14681,"","Jupunba","Britton & Rose",273 3139,"","Klugiodendron","Britton & Killip",273 24310,"","Lagonychium","M.Bieb.",273 24308,"","Lemurodendron","Villiers & Guinet",273 24444,"","Leptoglottis","DC.",273 3140,"","Leucaena","Benth.",273 24441,"","Lomoplis","Raf.",273 3141,"","Lysiloma","Benth.",273 24231,"","Macrosamanea","Britton & Rose",273 14682,"","Manganaroa","Speg.",273 3142,"","Marmaroxylon","Killip",273 3143,"","Mimosa","L.",273 14683,"","Mimosopsis","Britton & Rose",273 3144,"","Mimozyganthus","Burkart",273 3145,"","Monoschisma","Brenan",273 14659,"","Morolobium","Kosterm.",273 24445,"","Morongia","Britton",273 14684,"","Myrmecodendron","Britton & Rose",273 14685,"","Neomimosa","Britton & Rose",273 3146,"","Neptunia","Lour.",273 3147,"","Newtonia","Baill.",273 14686,"","Nimiria","Prain ex Craib",273 14687,"","Niopa","(Benth.) Britton & Rose",273 24232,"","Obolinga","Barneby",273 14688,"","Ortholobium","Gagnep.",273 14689,"","Painteria","Britton & Rose",273 14660,"","Paralbizzia","Kosterm.",273 3148,"","Parapiptadenia","Brenan",273 14804,"","Pararchidendron","I.C.Nielsen",273 14661,"","Parasamanea","Kosterm.",273 14803,"","Paraserianthes","I.C.Nielsen",273 14662,"","Parenterolobium","Kosterm.",273 3149,"","Parkia","R.Br.",273 24437,"","Paryphosphaera","H.Karst.",273 3150,"","Pentaclethra","Benth.",273 24434,"","Permia","Raf.",273 3151,"","Piptadenia","Benth.",273 3152,"","Piptadeniastrum","Brenan",273 3153,"","Piptadeniopsis","Burkart",273 14690,"","Pirottantha","Speg.",273 3154,"","Pithecellobium","Mart.",273 14663,"","Pityrocarpa","Britton & Rose",273 3155,"","Plathymenia","Benth.",273 24430,"","Pongelion","Adans.",273 14691,"","Poponax","Raf.",273 3156,"","Prosopidastrum","Burkart",273 3157,"","Prosopis","L.",273 14664,"","Pseudalbizzia","Britton & Rose",273 3158,"","Pseudoentada","Britton & Rose",273 14191,"","Pseudopiptadenia","Rauschert",273 3159,"","Pseudoprosopis","Harms",273 14665,"","Pseudosamanea","Harms",273 24442,"","Pteromimosa","Britton",273 24230,"","Punjuba","Britton & Rose",273 14695,"","Pusaetha","Kuntze",273 24422,"","Racosperma","Mart.",273 14693,"","Ryncholeucaena","Britton & Rose",273 14666,"","Samanea","(DC.) Merr.",273 3160,"","Schleinitzia","Warb.",273 3161,"","Schranckiastrum","Hassl.",273 3162,"","Schrankia","Willd.",273 14694,"","Senegalia","Raf.",273 14667,"","Serialbizzia","Kosterm.",273 3163,"","Serianthes","Benth.",273 14697,"","Siderocarpos","Small",273 14668,"","Sopropis","Britton & Rose",273 24435,"","Strepsilobus","Raf.",273 14669,"","Strombocarpa","(Benth.) A.Gray",273 3164,"","Stryphnodendron","Mart.",273 14698,"","Tauroceras","Britton & Rose",273 3165,"","Tetrapleura","Benth.",273 14670,"","Thailentadopsis","Kosterm.",273 14700,"","Vachellia","Wight & Arn.",273 3166,"","Wallaceodendron","Koord.",273 3167,"","Xerocladia","Harv.",273 3168,"","Xylia","Benth.",273 14701,"","Xylolobus","Kuntze",273 24233,"","Zapoteca","H.M.Hern.",273 3169,"","Zygia","P.Browne",273 2510,"","Abrus","Adans.",273 14509,"","Acanthophaca","Nevski",273 14510,"","Acanthyllis","Pomel",273 24427,"","Acmispon","Raf.",273 2511,"","Acosmium","Schott",273 2512,"","Adenocarpus","DC.",273 2513,"","Adenodolichos","Harms",273 2514,"","Adesmia","DC.",273 14416,"","Adinobotrys","Dunn",273 2515,"","Aenictophyton","A.T.Lee",273 2516,"","Aeschynomene","L.",273 2517,"","Afgekia","Craib",273 14395,"","Afrormosia","Harms",273 2518,"","Aganope","Miq.",273 14511,"","Agati","Adans.",273 2519,"","Airyantha","Brummitt",273 2520,"","Aldina","Endl.",273 14512,"","Alepidocalyx","Piper",273 2521,"","Alexa","Moq.",273 2522,"","Alhagi","Gagnebin",273 2523,"","Alistilus","N.E.Br.",273 14513,"","Alloburkillia","Whitmore",273 25573,"","Almaleea","Crisp & P.H.Weston",273 2524,"","Alysicarpus","Desv.",273 14514,"","Amblytropis","Kitag.",273 2525,"","Amburana","Schwacke & Taub.",273 2526,"","Amicia","Kunth",273 2527,"","Ammodendron","Fisch. ex DC.",273 2528,"","Ammopiptanthus","S.H.Cheng",273 14396,"","Ammothamnus","Bunge",273 2529,"","Amorpha","L.",273 2530,"","Amphicarpaea","Elliott ex Nutt.",273 2531,"","Amphimas","Pierre ex Harms",273 14515,"","Amphiodon","Huber",273 2532,"","Amphithalea","Eckl. & Zeyh.",273 2533,"","Anagyris","L.",273 2534,"","Anarthrophyllum","Benth.",273 14397,"","Anatropostylia","(Plitmann) Kupicha",273 2535,"","Andira","Juss.",273 2536,"","Angylocalyx","Taub.",273 14516,"","Aniotum","Sol. ex Parkinson",273 2537,"","Antheroporum","Gagnep.",273 2538,"","Anthyllis","L.",273 2539,"","Antopetitia","A.Rich.",273 2540,"","Aotus","Sm.",273 14517,"","Aphyllodium","(DC.) Gagnep.",273 2541,"","Apios","Fabr.",273 2542,"","Apoplanesia","C.Presl",273 2543,"","Apurimacia","Harms",273 2544,"","Arachis","L.",273 24455,"","Aragallus","Neck. ex Greene",273 2545,"","Argyrocytisus","(Maire) Raynaud",273 2546,"","Argyrolobium","Eckl. & Zeyh.",273 2547,"","Arthrocarpum","Balf.f.",273 2548,"","Arthroclianthus","Baill.",273 14398,"","Artrolobium","Desv.",273 14518,"","Asagraea","Baill.",273 14519,"","Aspalathoides","(DC.) K.Koch",273 2549,"","Aspalathus","L.",273 14399,"","Aspalthium","Medik.",273 14520,"","Astenolobium","Nevski",273 14521,"","Asterocytisus","(W.D.J.Koch) Schur ex Fuss",273 23051,"","Astracantha","Podlech",273 2550,"","Astragalus","L.",273 2551,"","Ateleia","(DC.) Benth.",273 14522,"","Atelophragma","Rydb.",273 2552,"","Atylosia","Wight & Arn.",273 2553,"","Austrodolichos","Verdc.",273 23052,"","Austrosteenisia","R.Geesink",273 14523,"","Azukia","Takah. ex Ohwi",273 14400,"","Bakerophyton","(J.Leonard) Hutch.",273 14401,"","Balisaea","Taub.",273 2554,"","Baphia","Afzel. ex Lodd.",273 2555,"","Baphiastrum","Harms",273 2556,"","Baphiopsis","Benth. ex Baker",273 2557,"","Baptisia","Vent.",273 14402,"","Barbieria","Spreng.",273 14524,"","Batidophaca","Rydb.",273 14525,"","Bauerella","Schindl.",273 14526,"","Baueropsis","Hutch.",273 2558,"","Baukea","Vatke",273 2559,"","Behaimia","Griseb.",273 2560,"","Belairia","A.Rich.",273 14403,"","Beliceodendron","Lundell",273 2561,"","Bembicidium","Rydb.",273 14404,"","Benedictella","Maire",273 14405,"","Benthamantha","Alef.",273 2562,"","Bergeronia","Micheli",273 2563,"","Biserrula","L.",273 14527,"","Bisrautanenia","Kuntze",273 2564,"","Bituminaria","Heist. ex Fabr.",273 2565,"","Bocoa","Aubl.",273 2566,"","Bolusafra","Kuntze",273 2567,"","Bolusanthus","Harms",273 2568,"","Bolusia","Benth.",273 14528,"","Bonaveria","Scop.",273 14406,"","Borbonia","L.",273 2569,"","Bossiaea","Vent.",273 2570,"","Bowdichia","Kunth",273 2571,"","Bowringia","Champ. ex Benth.",273 14529,"","Brachyphragma","Rydb.",273 2572,"","Brachysema","R.Br.",273 14530,"","Bradburya","Raf.",273 24425,"","Bremontiera","DC.",273 2573,"","Brongniartia","Kunth",273 2574,"","Brya","P.Browne",273 2575,"","Bryaspis","P.A.Duvign.",273 2576,"","Buchenroedera","Eckl. & Zeyh.",273 14531,"","Buergeria","Miq.",273 14532,"","Bugranopsis","Pomel",273 2577,"","Burgesia","F.Muell.",273 14407,"","Burkillia","Ridl.",273 2578,"","Burkilliodendron","Sastry",273 2579,"","Burtonia","R.Br.",273 2580,"","Butea","Roxb. ex Willd.",273 2581,"","Cadia","Forssk.",273 14408,"","Cajalbania","Urb.",273 2582,"","Cajanus","DC.",273 14409,"","Calia","Berland.",273 2583,"","Calicotome","Link",273 2584,"","Calispepla","Vved.",273 14410,"","Callistachys","Vent.",273 14533,"","Callistylon","Pittier",273 2585,"","Calophaca","Fisch. ex DC.",273 2586,"","Calopogonium","Desv.",273 2587,"","Calpurnia","E.Mey.",273 2588,"","Camoensia","Welw. ex Benth.",273 2589,"","Camptosema","Hook. & Arn.",273 2590,"","Campylotropis","Bunge",273 2591,"","Canavalia","DC.",273 2592,"","Candolleodendron","R.S.Cowan",273 14534,"","Canizaresia","Britton",273 14535,"","Cantharospermum","Wight & Arn.",273 14536,"","Capassa","Klotzsch",273 2593,"","Caragana","Fabr.",273 2594,"","Carmichaelia","R.Br.",273 2595,"","Carrissoa","Baker f.",273 24454,"","Carroa","C.Presl",273 2596,"","Cascaronia","Griseb.",273 14411,"","Cashalia","Standl.",273 2597,"","Castanospermum","A.Cunn. ex Hook.",273 14412,"","Catenaria","Benth.",273 14537,"","Caulocarpus","Baker",273 2598,"","Centrolobium","Mart. ex Benth.",273 2599,"","Centrosema","(DC.) Benth.",273 14413,"","Cephalostigmaton","(Yakovlev) Yakovlev",273 2600,"","Chadsia","Bojer",273 2601,"","Chaetocalyx","DC.",273 2602,"","Chamaecytisus","Link",273 14414,"","Chamaespartium","Adans.",273 2603,"","Chapmannia","Torr. & A.Gray",273 2604,"","Chesneya","Lindl. ex Endl.",273 14538,"","Chiovendaea","Speg.",273 24450,"","Chirocalyx","Meisn.",273 2605,"","Chordospartium","Cheeseman",273 2606,"","Chorizema","Labill.",273 2607,"","Christia","Moench",273 14539,"","Chronanthus","K.Koch",273 2608,"","Chrysoscias","E.Mey.",273 14540,"","Chrystolia","Montrouz.",273 2609,"","Cicer","L.",273 2610,"","Cladrastis","Raf.",273 2611,"","Clathrotropis","(Benth.) Harms",273 2612,"","Cleobulia","Mart. ex Benth.",273 2613,"","Clianthus","Sol. ex Lindl.",273 14541,"","Climacorachis","Hemsl. & Rose",273 2614,"","Clitoria","L.",273 2615,"","Clitoriopsis","R.Wilczek",273 14542,"","Cnemidophacos","Rydb.",273 2616,"","Cochlianthus","Benth.",273 2617,"","Codariocalyx","Hassk.",273 2618,"","Coelidium","Vogel ex Walp.",273 14543,"","Colinil","Adans.",273 2619,"","Collaea","DC.",273 2620,"","Cologania","Kunth",273 2621,"","Colutea","L.",273 14415,"","Condylostylis","Piper",273 14544,"","Contortuplicata","Medik.",273 24452,"","Corallodendron","Kuntze",273 2622,"","Corallospartium","J.B.Armstr.",273 14545,"","Cordaea","Spreng.",273 2624,"","Cordyla","Lour.",273 14417,"","Corethrodendron","Fisch. & Basiner",273 14418,"","Cornicina","Boiss.",273 2625,"","Coronilla","L.",273 2626,"","Coroya","Pierre",273 2627,"","Corynella","DC.",273 14546,"","Cosmiusa","Alef.",273 14547,"","Coumarouna","Aubl.",273 2628,"","Coursetia","DC.",273 2629,"","Cracca","Benth.",273 2630,"","Craibia","Harms & Dunn",273 2631,"","Cranocarpus","Benth.",273 2632,"","Craspedolobium","Harms",273 2633,"","Cratylia","Mart. ex Benth.",273 25468,"","Crimaea","Vassilcz.",273 2634,"","Crotalaria","L.",273 2635,"","Cruddasia","Prain",273 14548,"","Cryptophaeseolus","Kuntze",273 14549,"","Cryptorrhynchus","Nevski",273 14550,"","Ctenophyllum","Rydb.",273 2636,"","Cullen","Medik.",273 25342,"","Cupulanthus","Hutch.",273 2637,"","Cyamopsis","DC.",273 14551,"","Cyanostremma","Benth. ex Hook. & Arn.",273 2638,"","Cyathostegia","(Benth.) Schery",273 2639,"","Cyclocarpa","Afzel. ex Baker",273 2640,"","Cyclolobium","Benth.",273 2641,"","Cyclopia","Vent.",273 14419,"","Cylista","Aiton",273 2642,"","Cymbosema","Benth.",273 14552,"","Cystium","(Steven) Steven",273 2643,"","Cytisophyllum","O.Lang",273 2644,"","Cytisopsis","Jaub. & Spach",273 2645,"","Cytisus","Desf.",273 2646,"","Dahlstedtia","Malme",273 2647,"","Dalbergia","L.f.",273 2648,"","Dalbergiella","Baker f.",273 2649,"","Dalea","L.",273 2650,"","Dalhousiea","Wall. ex Benth.",273 14553,"","Daubentonia","DC.",273 14554,"","Daubentoniopsis","Rydb.",273 2651,"","Daviesia","Sm.",273 2652,"","Decorsea","R.Vig.",273 14555,"","Deguelia","Aubl.",273 25464,"","Dendrobrychis","(DC.) Galushko",273 2653,"","Dendrolobium","(Wight & Arn.) Benth.",273 2654,"","Derris","Lour.",273 25505,"","Desmodiastrum","(Prain) A.Pramanik & Thoth.",273 2655,"","Desmodium","Desv.",273 14556,"","Desmofischera","Holthuis",273 14557,"","Despeleza","Nieuwl.",273 2656,"","Dewevrea","Micheli",273 2657,"","Dicerma","DC.",273 2658,"","Dichilus","DC.",273 2659,"","Dicraeopetalum","Harms",273 14420,"","Didymopelta","Regel & Schmalh.",273 14558,"","Diholcos","Rydb.",273 2660,"","Dillwynia","Sm.",273 2661,"","Dioclea","Kunth",273 14559,"","Diphaca","Lour.",273 2662,"","Diphyllarium","Gagnep.",273 2663,"","Diphysa","Jacq.",273 2664,"","Diplotropis","Benth.",273 2665,"","Dipogon","Liebm.",273 2666,"","Dipteryx","Schreb.",273 2667,"","Discolobium","Benth.",273 2668,"","Disynstemon","R.Vig.",273 14560,"","Dolicholus","Medik.",273 2669,"","Dolichopsis","Hassl.",273 2670,"","Dolichos","L.",273 14561,"","Dolichovigna","Hayata",273 14562,"","Dollinera","Endl.",273 14421,"","Dorycnium","Mill.",273 14422,"","Dorycnopsis","Boiss.",273 14423,"","Drepanocarpus","G.Mey.",273 2671,"","Droogmansia","De Wild.",273 24451,"","Duchassaingia","Walp.",273 2672,"","Dumasia","DC.",273 2673,"","Dunbaria","Wight & Arn.",273 2674,"","Dussia","Krug & Urb. ex Taub.",273 15466,"","Duvalia","Bonpl.",273 2675,"","Dysolobium","(Benth.) Prain",273 2676,"","Ebenus","L.",273 14564,"","Ecastaphyllum","P.Browne",273 14424,"","Echinosophora","Nakai",273 2677,"","Echinospartum","(Spach) Fourr.",273 14425,"","Edbakeria","R.Vig.",273 14426,"","Edwardsia","Salisb.",273 2678,"","Eleiotis","DC.",273 2679,"","Eminia","Taub.",273 14566,"","Enantiosparton","K.Koch",273 2680,"","Endomallus","Gagnep.",273 23053,"","Endosamara","R.Geesink",273 2681,"","Eremosparton","Fisch. & C.A.Mey.",273 2682,"","Erichsenia","Hemsl.",273 2683,"","Erinacea","Adans.",273 2684,"","Eriosema","(DC.) Rchb.",273 2685,"","Errazurizia","Phil.",273 14427,"","Ervum","L.",273 2686,"","Erythrina","L.",273 2687,"","Etaballia","Benth.",273 2688,"","Euchilopsis","F.Muell.",273 14428,"","Euchlora","Eckl. & Zeyh.",273 2689,"","Euchresta","Benn.",273 2690,"","Eutaxia","R.Br.",273 2691,"","Eversmannia","Bunge",273 2692,"","Exostyles","Schott",273 2693,"","Eysenhardtia","Kunth",273 2694,"","Factorovskya","Eig",273 14429,"","Fagelia","Neck. ex DC.",273 14567,"","Fairchildia","Britton & Rose",273 14430,"","Fedorouia","Yakovlev",273 14431,"","Ferreirea","Allemao",273 2695,"","Fiebrigiella","Harms",273 2696,"","Fissicalyx","Benth.",273 2697,"","Flemingia","Roxb. ex W.T.Aiton",273 14568,"","Folliculigera","Pasq.",273 2698,"","Fordia","Hemsl.",273 2699,"","Galactia","P.Browne",273 2700,"","Galega","L.",273 2701,"","Gastrolobium","R.Br.",273 2702,"","Geissaspis","Wight & Arn.",273 2703,"","Genista","L.",273 14433,"","Genistella","Ortega",273 2704,"","Genistidium","I.M.Johnst.",273 2705,"","Geoffroea","Jacq.",273 14569,"","Geoprumnon","Rydb.",273 2706,"","Gliricidia","Kunth",273 2707,"","Glottidium","Desv.",273 2708,"","Glycine","Willd.",273 2709,"","Glycyrrhiza","L.",273 14434,"","Goebelia","Bunge ex Boiss.",273 2710,"","Gompholobium","Sm.",273 14435,"","Goniogyna","DC.",273 2711,"","Gonocytisus","Spach",273 2712,"","Goodia","Salisb.",273 14436,"","Gourliea","Gillies ex Hook. & Arn.",273 14287,"","Grazielodendron","H.C.Lima",273 2713,"","Gueldenstaedtia","Fisch.",273 14570,"","Gynophoraria","Rydb.",273 2714,"","Halimodendron","Fisch. ex DC.",273 2715,"","Hallia","Thunb.",273 2716,"","Hammatolobium","Fenzl",273 24446,"","Hamosa","Medik.",273 14437,"","Hanslia","Schindl.",273 2717,"","Haplormosia","Harms",273 2718,"","Hardenbergia","Benth.",273 2719,"","Harleyodendron","R.S.Cowan",273 2720,"","Harpalyce","Moc. & Sesse ex DC.",273 14438,"","Haydonia","R.Wilczek",273 2721,"","Hebestigma","Urb.",273 14571,"","Hedyphylla","Steven",273 2722,"","Hedysarum","L.",273 14439,"","Hegnera","Schindl.",273 14440,"","Heinekenia","Webb ex H.Christ",273 14441,"","Helminthocarpon","A.Rich.",273 14572,"","Herminiera","Guill. & Perr.",273 2723,"","Herpyza","Sauvalle",273 14573,"","Hesperastragalus","A.Heller",273 2724,"","Hesperolaburnum","Maire",273 14574,"","Hesperonix","Rydb.",273 2725,"","Hesperothamnus","Brandegee",273 14442,"","Heylandia","DC.",273 2726,"","Hippocrepis","L.",273 14575,"","Hoepfneria","Vatke",273 14470,"","Hoita","Rydb.",273 14576,"","Holcophacos","Rydb.",273 2727,"","Holocalyx","Micheli",273 14577,"","Holtzea","Schindl.",273 14579,"","Homalobus","Nutt.",273 14443,"","Hosackia","Benth. ex Lindl.",273 2728,"","Hovea","R.Br. ex W.T.Aiton",273 14580,"","Humboldtiella","Harms",273 2729,"","Humularia","P.A.Duvign.",273 14581,"","Huttonella","Kirk",273 14444,"","Hybosema","Harms",273 2730,"","Hymenocarpos","Savi",273 2731,"","Hymenolobium","Benth.",273 2732,"","Hypocalyptus","Thunb.",273 14582,"","Ichtyomethia","Kuntze",273 23054,"","Imbralyx","R.Geesink",273 24426,"","Indigastrum","Jaub. & Spach",273 2733,"","Indigofera","L.",273 2734,"","Inocarpus","J.R.Forst. & G.Forst.",273 14445,"","Isodesmia","Gardner",273 2735,"","Isotropis","Benth.",273 14446,"","Itaobimia","Rizzini",273 2736,"","Jacksonia","R.Br. ex Sm.",273 2737,"","Jansonia","Kippist",273 14583,"","Jonesiella","Rydb.",273 25467,"","Kamiella","Vassilcz.",273 2738,"","Kennedia","Vent.",273 24447,"","Kentrophyta","Nutt.",273 14447,"","Kerstania","Rech.f.",273 14448,"","Kerstingiella","Harms",273 14449,"","Keyserlingia","Bunge ex Boiss.",273 14584,"","Kiapasia","Woronow ex Grossh.",273 14585,"","Konxikas","Raf.",273 14586,"","Kostyczewa","Korsh.",273 2739,"","Kotschya","Endl.",273 14587,"","Kraunhia","Raf.",273 14450,"","Kuhnistera","Lam.",273 2740,"","Kummerowia","Schindl.",273 2741,"","Kunstleria","Prain",273 2742,"","Lablab","Adans.",273 2743,"","Laburnum","Fabr.",273 2744,"","Lamprolobium","Benth.",273 14451,"","Lathriogyne","Eckl. & Zeyh.",273 2745,"","Lathyrus","L.",273 2746,"","Latrobea","Meisn.",273 15594,"","Layia","Hook. & Arn.",273 2747,"","Lebeckia","Thunb.",273 2748,"","Lecointea","Ducke",273 14589,"","Lembotropis","Griseb.",273 2749,"","Lennea","Klotzsch",273 2750,"","Lens","Mill.",273 14590,"","Leobordea","Delile",273 2751,"","Leptoderris","Dunn",273 2752,"","Leptodesmia","(Benth.) Benth.",273 2753,"","Leptosema","Benth.",273 2754,"","Lespedeza","Michx.",273 2755,"","Lessertia","DC.",273 2756,"","Leucomphalos","Benth. ex Planch.",273 14452,"","Leycephyllum","Piper",273 14591,"","Liebrechtsia","De Wild.",273 2757,"","Liparia","L.",273 14453,"","Listia","E.Mey.",273 14454,"","Loddigesia","Sims",273 2758,"","Lonchocarpus","Kunth",273 14592,"","Lonchophaca","Rydb.",273 2759,"","Lotononis","(DC.) Eckl. & Zeyh.",273 2760,"","Lotus","L.",273 14455,"","Lourea","Desv.",273 2761,"","Lovanafia","M.Peltier",273 14593,"","Loxidium","Vent.",273 2762,"","Luetzelburgia","Harms",273 24534,"","Lupinophyllum","Hutch.",273 2763,"","Lupinus","L.",273 14594,"","Lupulina","Noulet",273 2764,"","Luzonia","Elmer",273 14456,"","Lyauteya","Maire",273 14457,"","Lygos","Adans.",273 2765,"","Maackia","Rupr.",273 2766,"","Machaerium","Pers.",273 2767,"","Macropsychanthus","Harms ex K.Schum. & Lauterb.",273 2768,"","Macroptilium","(Benth.) Urb.",273 14595,"","Macrotropis","DC.",273 2769,"","Macrotyloma","(Wight & Arn.) Verdc.",273 14458,"","Macroule","Pierce",273 2770,"","Margaritolobium","Harms",273 2771,"","Marina","Liebm.",273 2772,"","Mastersia","Benth.",273 14596,"","Maughania","J.St.-Hil.",273 2773,"","Mecopus","Benn.",273 2774,"","Medicago","L.",273 2775,"","Melilotus","Mill.",273 24458,"","Melissitus","Medik.",273 2776,"","Melliniella","Harms",273 2777,"","Melolobium","Eckl. & Zeyh.",273 14597,"","Meristotropis","Fisch. & C.A.Mey.",273 14598,"","Microcharis","Benth.",273 14599,"","Microlobium","Liebm.",273 14600,"","Microphacos","Rydb.",273 24449,"","Micropteryx","Walp.",273 2778,"","Mildbraediodendron","Harms",273 2779,"","Millettia","Wight & Arn.",273 14459,"","Minkelersia","M.Martens & Galeotti",273 2780,"","Mirbelia","Sm.",273 14460,"","Moghania","J.St.-Hil.",273 14461,"","Monarthrocarpus","Merr.",273 14601,"","Monoplegma","Piper",273 2781,"","Monopteryx","Spruce ex Benth.",273 14602,"","Monosemion","Raf.",273 2782,"","Mucuna","Adans.",273 2783,"","Muellera","L.f.",273 2784,"","Muelleranthus","Hutch.",273 2785,"","Mundulea","(DC.) Benth.",273 14603,"","Murtonia","Craib",273 2786,"","Myrocarpus","Allemao",273 2787,"","Myrospermum","Jacq.",273 2788,"","Myroxylon","L.f.",273 14604,"","Mystirophora","Nevski",273 2789,"","Nemcia","Domin",273 14605,"","Neobaronia","Baker",273 2790,"","Neocollettia","Hemsl.",273 2791,"","Neocracca","Kuntze",273 2792,"","Neodielsia","Harms",273 2793,"","Neodunnia","R.Vig.",273 2794,"","Neoharmsia","R.Vig.",273 2795,"","Neonotonia","Lackey",273 2796,"","Neorautanenia","Schinz",273 2797,"","Neorudolphia","Britton",273 14462,"","Nepa","Webb",273 2798,"","Nephrodesmus","Schindl.",273 14463,"","Nephromeria","(Benth.) Schindl.",273 2799,"","Nesphostylis","Verdc.",273 14606,"","Neustanthus","Benth.",273 2800,"","Nissolia","Jacq.",273 2801,"","Nogra","Merr.",273 24561,"","Nomismia","Wight & Arn.",273 2802,"","Notodon","Urb.",273 2803,"","Notospartium","Hook.f.",273 14607,"","Oedicephalus","Nevski",273 14464,"","Oleiocarpon","Dwyer",273 2804,"","Olneya","A.Gray",273 14608,"","Onix","Medik.",273 2805,"","Onobrychis","Mill.",273 2806,"","Ononis","L.",273 25474,"","Ophiocarpus","(Bunge) Ikonn.",273 2807,"","Ophrestia","H.M.L.Forbes",273 2808,"","Orbexilum","Raf.",273 2809,"","Oreophysa","(Bunge ex Boiss.) Bornm.",273 2810,"","Ormocarpopsis","R.Vig.",273 2811,"","Ormocarpum","P.Beauv.",273 2812,"","Ormosia","Jacks.",273 14609,"","Ormosiopsis","Ducke",273 2813,"","Ornithopus","L.",273 14465,"","Orobus","L.",273 24448,"","Orophaca","Nutt.",273 2815,"","Ostryocarpus","Hook.f.",273 14466,"","Ostryoderris","Dunn",273 2814,"","Otholobium","C.H.Stirt.",273 2816,"","Otoptera","DC.",273 14467,"","Ougeinia","Benth.",273 14610,"","Oxyglottis","(Bunge) Nevski",273 2817,"","Oxylobium","Andrews",273 2818,"","Oxyrhynchus","Brandegee",273 2819,"","Oxytropis","DC.",273 2820,"","Pachecoa","Standl. & Steyerm.",273 2821,"","Pachyrhizus","Rich. ex DC.",273 2822,"","Padbruggea","Miq.",273 2823,"","Panurea","Spruce ex Benth.",273 2824,"","Paracalyx","Ali",273 23055,"","Paraderris","(Miq.) R.Geesink",273 14468,"","Paraglycine","F.J.Herm.",273 2825,"","Paramachaerium","Ducke",273 2826,"","Paratephrosia","Domin",273 2827,"","Parochetus","Buch.-Ham. ex D.Don",273 14611,"","Parosela","Cav.",273 2828,"","Parryella","Torr. & A.Gray",273 14612,"","Passaea","Adans.",273 2829,"","Pearsonia","Dummer",273 14469,"","Pediomellum","Rydb.",273 24424,"","Pediomelum","Rydb.",273 14471,"","Peekelia","Harms",273 14793,"","Pentadynamis","R.Br.",273 2830,"","Periandra","Mart. ex Benth.",273 2831,"","Pericopsis","Thwaites",273 2832,"","Petaladenium","Ducke",273 14472,"","Petalostemon","Michx.",273 2833,"","Peteria","A.Gray",273 2834,"","Petteria","C.Presl",273 14613,"","Phaca","L.",273 14614,"","Phacomene","Rydb.",273 14615,"","Phacopsis","Rydb.",273 14473,"","Phaenohoffmannia","Kuntze",273 2835,"","Phaseolus","L.",273 2836,"","Phylacium","Benn.",273 2837,"","Phyllodium","Desv.",273 2838,"","Phyllota","(DC.) Benth.",273 2839,"","Phylloxylon","Baill.",273 14474,"","Physanthillis","Boiss.",273 2840,"","Physostigma","Balf.",273 2841,"","Pickeringia","Nutt.",273 2842,"","Pictetia","DC.",273 2843,"","Piptanthus","Sweet",273 2844,"","Piscidia","L.",273 14616,"","Piscipula","Loefl.",273 14617,"","Pisophaca","Rydb.",273 2845,"","Pisum","L.",273 14618,"","Pitcheria","Nutt.",273 14475,"","Placolobium","Miq.",273 2846,"","Plagiocarpus","Benth.",273 14476,"","Plagiolobium","Sweet",273 2847,"","Platycelyphium","Harms",273 2848,"","Platycyamus","Benth.",273 2849,"","Platylobium","Sm.",273 2850,"","Platymiscium","Vogel",273 14477,"","Platyosprion","(Maxim.) Maxim.",273 2851,"","Platypodium","Vogel",273 2852,"","Platysepalum","Welw. ex Baker",273 14619,"","Pleiospora","Harv.",273 14620,"","Ploca","Lour. ex Gomes",273 2853,"","Podalyria","Willd.",273 25473,"","Podocarpium","(Benth.) Y.C.Yang & P.H.Huang",273 2854,"","Podocytisus","Boiss. & Heldr.",273 14478,"","Podolotus","Royle",273 14621,"","Podopetalum","F.Muell.",273 2855,"","Poecilanthe","Benth.",273 14622,"","Poecilocarpus","Nevski",273 2856,"","Poiretia","Vent.",273 2857,"","Poissonia","Baill.",273 2858,"","Poitea","Vent.",273 22224,"","Polhillia","C.H.Stirt.",273 2859,"","Pongamia","Vent.",273 2860,"","Pongamiopsis","R.Vig.",273 24456,"","Possira","Aubl.",273 2861,"","Priestleya","DC.",273 14479,"","Priotropis","Wight & Arn.",273 2862,"","Pseudarthria","Wight & Arn.",273 2863,"","Pseudeminia","Verdc.",273 14623,"","Pseudocadia","Harms",273 2864,"","Pseudoeriosema","Hauman",273 14480,"","Pseudoglycine","F.J.Herm.",273 14481,"","Pseudolotus","Rech.f.",273 14624,"","Pseudomachaerium","Hassl.",273 25471,"","Pseudomelissitus","Ovcz., Rassulova & Kinzik.",273 2865,"","Pseudovigna","(Harms) Verdc.",273 2866,"","Psophocarpus","DC.",273 2867,"","Psoralea","L.",273 14482,"","Psoralidium","Rydb.",273 14483,"","Psorobatus","Rydb.",273 14484,"","Psorodendron","Rydb.",273 2868,"","Psorothamnus","Rydb.",273 2869,"","Pterocarpus","Jacq.",273 2870,"","Pterodon","Vogel",273 14485,"","Pteroloma","Desv. ex Benth.",273 14625,"","Pterophacos","Rydb.",273 2871,"","Ptycholobium","Harms",273 2872,"","Ptychosema","Benth.",273 2873,"","Pueraria","DC.",273 2874,"","Pultenaea","Sm.",273 2875,"","Pycnospora","R.Br. ex Wight & Arn.",273 14626,"","Quirosia","Blanco",273 2876,"","Rafnia","Thunb.",273 14627,"","Raimondianthus","Harms",273 2877,"","Ramirezella","Rose",273 2878,"","Ramorinoa","Speg.",273 24423,"","Rehsonia","Stritch",273 2879,"","Requienia","DC.",273 2880,"","Retama","Raf.",273 2881,"","Rhodopis","Urb.",273 14628,"","Rhynchodium","C.Presl",273 2882,"","Rhynchosia","Lour.",273 2883,"","Rhynchotropis","Harms",273 14486,"","Rhytidomene","Rydb.",273 2884,"","Riedeliella","Harms",273 14487,"","Rivasgodaya","Esteve",273 24457,"","Riveria","Kunth",273 2885,"","Robinia","L.",273 2886,"","Robynsiophyton","R.Wilczek",273 2887,"","Rothia","Pers.",273 14488,"","Ruddia","Yakovlev",273 14489,"","Rudua","F.Maek.",273 2888,"","Sabinea","DC.",273 2889,"","Sakoanala","R.Vig.",273 14629,"","Saldania","Sim",273 2890,"","Salweenia","Baker f.",273 14630,"","Sarcobotrya","R.Vig.",273 2891,"","Sarcodum","Lour.",273 16175,"","Sarothamnus","Wimm.",273 2892,"","Sartoria","Boiss. & Heldr.",273 14490,"","Sauvallella","Rydb.",273 2893,"","Schefflerodendron","Harms",273 2894,"","Scorpiurus","L.",273 14631,"","Secula","Small",273 14492,"","Securigera","DC.",273 14632,"","Seemannantha","Alef.",273 2895,"","Sellocharis","Taub.",273 14633,"","Sesban","Adans.",273 2896,"","Sesbania","Scop.",273 14493,"","Sewerzowia","Regel & Schmalh.",273 2897,"","Shuteria","Wight & Arn.",273 2898,"","Sinodolichos","Verdc.",273 2899,"","Smirnowia","Bunge",273 2900,"","Smithia","Aiton",273 2901,"","Soemmeringia","Mart.",273 2902,"","Sophora","L.",273 2903,"","Spartidium","Pomel",273 2904,"","Spartium","L.",273 16176,"","Spartocytisus","Webb & Berthel.",273 2905,"","Spathionema","Taub.",273 2906,"","Spatholobus","Hassk.",273 2907,"","Sphaerolobium","Sm.",273 2908,"","Sphaerophysa","DC.",273 2909,"","Sphenostylis","E.Mey.",273 2910,"","Sphinctospermum","Rose",273 2911,"","Spirotropis","Tul.",273 24229,"","Spongiocarpella","Yakovlev & N.Ulziykh.",273 2912,"","Stauracanthus","Link",273 25472,"","Steganotropis","Lehm.",273 14494,"","Steinbachiella","Harms",273 14495,"","Stizolobium","P.Browne",273 2913,"","Stracheya","Benth.",273 2914,"","Streblorrhiza","Endl.",273 2915,"","Strongylodon","Vogel",273 2916,"","Strophostyles","Elliott",273 2917,"","Stylosanthes","Sw.",273 14496,"","Styphnolobium","Schott ex Endl.",273 2918,"","Sutherlandia","R.Br. ex W.T.Aiton",273 2919,"","Swainsona","Salisb.",273 2920,"","Swartzia","Schreb.",273 2921,"","Sweetia","Spreng.",273 14634,"","Sweetiopsis","Chodat & Hassk.",273 14635,"","Sylitra","E.Mey.",273 14258,"","Tadehagi","H.Ohashi",273 2922,"","Taralea","Aubl.",273 2923,"","Taverniera","DC.",273 14497,"","Teline","Medik.",273 2924,"","Templetonia","R.Br. ex W.T.Aiton",273 2925,"","Tephrosia","Pers.",273 2926,"","Teramnus","P.Browne",273 14498,"","Terua","Standl. & F.J.Herm.",273 14636,"","Tetradapa","Osbeck",273 14499,"","Tetragonolobus","Scop.",273 2927,"","Teyleria","Backer",273 2928,"","Thermopsis","R.Br.",273 14637,"","Thium","Steud.",273 14500,"","Thornbera","Rydb.",273 25470,"","Tibetia","(Ali) H.P.Tsui",273 2929,"","Tipuana","(Benth.) Benth.",273 14638,"","Torresea","Allemao",273 14639,"","Toulichiba","Adans.",273 14640,"","Tounatea","Aubl.",273 14501,"","Trichocyamos","Yakovlev",273 24453,"","Trichopodium","C.Presl",273 2930,"","Trifidacanthus","Merr.",273 2931,"","Trifolium","L.",273 2932,"","Trigonella","L.",273 24428,"","Tripodion","Medik.",273 25466,"","Turukhania","Vassilcz.",273 2933,"","Uleanthus","Harms",273 2934,"","Ulex","L.",273 2935,"","Uraria","Desv.",273 14505,"","Urariopsis","Schindl.",273 2936,"","Uribea","Dugand & Romero",273 25343,"","Urodon","Turcz.",273 25465,"","Ursia","Vassilcz.",273 2937,"","Vandasia","Domin",273 14192,"","Vandasina","Rauschert",273 14641,"","Varennea","DC.",273 2938,"","Vatairea","Aubl.",273 2939,"","Vataireopsis","Ducke",273 2940,"","Vatovaea","Chiov.",273 14642,"","Vaughania","S.Moore",273 2941,"","Vavilovia","Fed.",273 14643,"","Verdcourtia","R.Wilczek",273 14502,"","Vermifrux","J.B.Gillett",273 14503,"","Vexibia","Raf.",273 14504,"","Vexillifera","Ducke",273 2942,"","Vicia","L.",273 14644,"","Vicilla","Schur",273 14645,"","Vicioides","Moench",273 2943,"","Vigna","Savi",273 14646,"","Vignopsis","De Wild.",273 14647,"","Vilmorinia","DC.",273 2944,"","Viminaria","Sm.",273 2945,"","Virgilia","Poir.",273 14506,"","Voandzeia","Thouars",273 14247,"","Wajira","Thulin",273 14507,"","Walpersia","Harv.",273 2946,"","Weberbauerella","Ulbr.",273 14508,"","Wenderothia","Schltdl.",273 14648,"","Whitfordia","Elmer",273 2947,"","Whitfordiodendron","Elmer",273 2948,"","Wiborgia","Thunb.",273 2949,"","Willardia","Rose",273 2950,"","Wisteria","Nutt.",273 25463,"","Xanthobrychis","Galushko",273 2951,"","Xanthocercis","Baill.",273 14649,"","Xerocarpus","Guill. & Perr.",273 2952,"","Xeroderris","Roberty",273 24311,"","Xerosphaera","Sojak",273 14650,"","Xylophacos","Rydb.",273 14651,"","Xylothermia","Greene",273 2953,"","Yucaratonia","Burkart",273 14652,"","Zeydora","Lour. ex Gomes",273 2954,"","Zollernia","Wied-Neuw. & Nees",273 2955,"","Zornia","J.F.Gmel.",273 10654,"","Leitneria","Chapm.",274 12538,"","Lemna","L.",275 25172,"","Pseudowolffia","Hartog & Plas",275 12539,"","Spirodela","Schleid.",275 12540,"","Wolffia","Horkel ex Schleid.",275 12541,"","Wolffiella","(Hegelm.) Hegelm.",275 25173,"","Wolffiopsis","Hartog & Plas",275 7056,"","Ammobroma","Torr.",276 7057,"","Lennoa","Lex.",276 7058,"","Pholisma","Nutt. ex Hook.",276 19822,"","Akentra","Benj.",277 19823,"","Aranella","Barnhart",277 19824,"","Askofake","Raf.",277 19825,"","Avesicaria","(Kamienski) Barnhart",277 19826,"","Biovularia","Kamienski",277 19827,"","Bucranion","Raf.",277 19828,"","Calpidisca","Barnhart",277 19829,"","Cosmiza","Raf.",277 19830,"","Diurospermum","Edgew.",277 19831,"","Enetophyton","Nieuwl.",277 19832,"","Enskide","Raf.",277 8488,"","Genlisea","A.St.-Hil.",277 19833,"","Hamulia","Raf.",277 19834,"","Lecticula","Barnhart",277 19835,"","Lentibularia","Seg.",277 20951,"","Lepiactis","Raf.",277 19836,"","Megozipa","Raf.",277 19837,"","Meionula","Raf.",277 19838,"","Meloneura","Raf.",277 19839,"","Nelipus","Raf.",277 19840,"","Orchyllium","Barnhart",277 19841,"","Pelidnia","Barnhart",277 19842,"","Personula","Raf.",277 8489,"","Pinguicula","L.",277 19843,"","Plectoma","Raf.",277 19844,"","Pleiochasia","(Kamienski) Barnhart",277 19845,"","Plesisa","Raf.",277 19846,"","Polypompholyx","Lehm.",277 19847,"","Saccolaria","Kuhlm.",277 19848,"","Sacculina","Bosser",277 19849,"","Setiscapella","Barnhart",277 19850,"","Stomoisia","Raf.",277 19851,"","Tetralobus","A.DC.",277 19852,"","Trilobulina","Raf.",277 20952,"","Trixapias","Raf.",277 8490,"","Utricularia","L.",277 19853,"","Vesiculina","Raf.",277 19854,"","Xananthes","Raf.",277 1546,"","Lepidobotrys","Engl.",278 12568,"","Lilaea","Bonpl.",279 18937,"","Amana","Honda",280 11917,"","Calochortus","Pursh",280 11922,"","Cardiocrinum","(Endl.) Lindl.",280 11956,"","Erythronium","L.",280 11960,"","Fritillaria","L.",280 11961,"","Gagea","Salisb.",280 18938,"","Giraldiella","Dammer",280 11994,"","Korolkowia","Regel",280 12003,"","Lilium","L.",280 12007,"","Lloydia","Salisb. ex Rchb.",280 12031,"","Nomocharis","Franch.",280 12032,"","Notholirion","Wall. ex Boiss.",280 18934,"","Petilium","Ludw.",280 18935,"","Rhinopetalum","Fisch. ex D.Don",280 18936,"","Theresia","K.Koch",280 12093,"","Tulipa","L.",280 1660,"","Floerkea","Willd.",281 1661,"","Limnanthes","R.Br.",281 12559,"","Butomopsis","Kunth",282 12561,"","Hydrocleys","Rich.",282 12562,"","Limnocharis","Bonpl.",282 19204,"","Ostenia","Buchenau",282 19203,"","Tenagocharis","Hochst.",282 1520,"","Anisadenia","Wall. ex Meisn.",283 1521,"","Cliococca","Bab.",283 1522,"","Durandea","Planch.",283 1523,"","Hebepetalum","Benth.",283 1524,"","Hesperolinon","(A.Gray) Small",283 1525,"","Hugonia","L.",283 1526,"","Indorouchera","Hallier f.",283 1527,"","Linum","L.",283 1528,"","Philbornea","Hallier f.",283 1529,"","Radiola","Hill",283 1530,"","Reinwardtia","Dumort.",283 1531,"","Roucheria","Planch.",283 1532,"","Sclerolinon","C.M.Rogers",283 1533,"","Tirpitzia","Hallier f.",283 7269,"","Lissocarpa","Benth.",284 20882,"","Acroclasia","C.Presl",285 20892,"","Ancyrostemma","Poepp. & Endl.",285 20883,"","Bartonia","Pursh ex Sims",285 20886,"","Bicuspidaria","Rydb.",285 3980,"","Blumenbachia","Schrad.",285 3981,"","Caiophora","C.Presl",285 20902,"","Cajophora","C.Presl",285 3982,"","Cevallia","Lag.",285 20887,"","Chryostoma","Lilja",285 20888,"","Creslobus","Lilja",285 3983,"","Eucnide","Zucc.",285 20894,"","Fissenia","Endl.",285 3984,"","Fuertesia","Urb.",285 20898,"","Grammatocarpus","C.Presl",285 20900,"","Gripidea","Miers",285 3985,"","Gronovia","L.",285 20896,"","Huidobria","Gay",285 20901,"","Illairea","Lenne & K.Koch",285 3986,"","Kissenia","R.Br. ex Endl.",285 3987,"","Klaprothia","Kunth",285 3988,"","Loasa","Adans.",285 20890,"","Loasella","Baill.",285 3989,"","Mentzelia","L.",285 20891,"","Microsperma","Hook.",285 20899,"","Ochetocarpus","Meyen",285 20897,"","Ortiga","Neck.",285 22567,"","Petalanthera","Nutt.",285 3990,"","Petalonyx","A.Gray",285 17769,"","Plakothira","Florence",285 20903,"","Raphisanthe","Lilja",285 3991,"","Schismocarpus","S.F.Blake",285 3992,"","Sclerothrix","C.Presl",285 3993,"","Scyphanthus","Sweet",285 16520,"","Sympetaleia","A.Gray",285 20889,"","Trachyphytum","Nutt.",285 7815,"","Anthocleista","Afzel. ex R.Br.",286 7816,"","Antonia","Pohl",286 7817,"","Bonyunia","M.R.Schomb. ex Progel",286 16885,"","Coinochlamys","T.Anderson ex Benth.",286 19647,"","Couthovia","A.Gray",286 19648,"","Crateriphytum","Scheff. ex Koord.",286 19645,"","Cynoctonum","J.F.Gmel.",286 19646,"","Cyrtophyllum","Reinw.",286 7819,"","Desfontainia","Ruiz & Pav.",286 7821,"","Fagraea","Thunb.",286 7822,"","Gardneria","Wall.",286 7823,"","Gelsemium","Juss.",286 7824,"","Geniostoma","J.R.Forst. & G.Forst.",286 7826,"","Labordia","Gaudich.",286 19644,"","Leptocladus","Oliv.",286 9164,"","Lithophytum","Brandegee",286 7827,"","Logania","R.Br.",286 7828,"","Mitrasacme","Labill.",286 7829,"","Mitreola","L.",286 7830,"","Mostuea","Didr.",286 7831,"","Nautophylla","Guillaumin",286 7832,"","Neuburgia","Blume",286 7834,"","Norrisia","Gardner",286 7837,"","Plocosperma","Benth.",286 7839,"","Potalia","Aubl.",286 7840,"","Pseudogardneria","Racib.",286 7841,"","Pseudospigelia","Klett",286 16886,"","Scyphostrychnos","S.Moore",286 7845,"","Spigelia","L.",286 7846,"","Strychnos","L.",286 7847,"","Usteria","Willd.",286 12105,"","Acanthocarpus","Lehm.",287 12106,"","Baxteria","R.Br. ex Hook.",287 12108,"","Chamaexeros","Benth.",287 12111,"","Lomandra","Labill.",287 12112,"","Romnalda","P.F.Stevens",287 17625,"","Xerolirion","A.S.George",287 18854,"","Xerotes","R.Br.",287 21895,"","Aconiopteris","C.Presl",288 21889,"","Anapausia","C.Presl",288 21887,"","Arthrobotrya","J.Sm.",288 13628,"","Bolbitis","Schott",288 21890,"","Campium","C.Presl",288 21886,"","Cheiloepton","Fee",288 21891,"","Cyrtogonium","J.Sm.",288 21896,"","Dictyoglossum","J.Sm.",288 13629,"","Edanyoa","Copel.",288 21888,"","Egenolfia","Schott",288 13630,"","Elaphoglossum","Schott ex J.Sm.",288 21892,"","Heteroneurum","C.Presl",288 21897,"","Hymenodium","Fee",288 21893,"","Jenkinsia","Hook.",288 13631,"","Lomagramma","J.Sm.",288 13632,"","Lomariopsis","Fee",288 13633,"","Microstaphyla","C.Presl",288 13634,"","Peltapteris","Link",288 21894,"","Poecilopteris","C.Presl",288 21898,"","Rhipidopteris","Fee",288 13635,"","Teratophyllum","Mett. ex Kuhn",288 13636,"","Thysanosoria","A.Gepp",288 2228,"","Lophopyxis","Hook.f.",289 24148,"","Aciella","Tiegh.",290 24184,"","Acranthemum","Tiegh.",290 24157,"","Acrostachys","(Benth.) Tiegh.",290 24186,"","Acrostephanus","Tiegh.",290 10040,"","Actinanthella","Balle",290 10041,"","Aetanthus","(Eichler) Engl.",290 16337,"","Agelanthus","Tiegh.",290 10042,"","Alepis","Tiegh.",290 24147,"","Allohemia","Raf.",290 24195,"","Alveolina","Tiegh.",290 10043,"","Amyema","Tiegh.",290 10044,"","Amylotheca","Tiegh.",290 24171,"","Antriba","Raf.",290 24196,"","Apodina","Tiegh.",290 24149,"","Arculus","Tiegh.",290 24198,"","Arthraxella","Nakai",290 24197,"","Arthraxon","Tiegh.",290 10047,"","Atkinsonia","F.Muell.",290 10048,"","Bakerella","Tiegh.",290 10049,"","Barathranthus","(Korth.) Miq.",290 24178,"","Beccarina","Tiegh.",290 10050,"","Benthamina","Tiegh.",290 22268,"","Berhautia","Balle",290 24176,"","Blumella","Tiegh.",290 16887,"","Botryoloranthus","(Engl. & K.Krause) Balle",290 24153,"","Candollina","Tiegh.",290 10052,"","Cecarria","Barlow",290 24199,"","Chatinia","Tiegh.",290 24158,"","Chiridium","Tiegh.",290 22129,"","Chorilepidella","Tiegh.",290 22130,"","Chorilepis","Tiegh.",290 16892,"","Choristegeres","Tiegh.",290 16891,"","Choristegia","Tiegh.",290 24172,"","Cichlanthus","(Endl.) Tiegh.",290 10053,"","Cladocolea","Tiegh.",290 16893,"","Cleistoloranthus","Merr.",290 24159,"","Coleobotrys","Tiegh.",290 24168,"","Cyathiscus","Tiegh.",290 10054,"","Cyne","Danser",290 10055,"","Dactyliophora","Tiegh.",290 22131,"","Danserella","Balle",290 10056,"","Decaisnina","Tiegh.",290 10057,"","Dendropemon","(Blume) Rchb.",290 10058,"","Dendrophthoe","Mart.",290 24185,"","Dentimetula","Tiegh.",290 10060,"","Desmaria","Tiegh.",290 24209,"","Desrousseauxia","Tiegh.",290 10061,"","Dicymanthes","Danser",290 10062,"","Diplatia","Tiegh.",290 24204,"","Dipodophyllum","Tiegh.",290 10063,"","Distrianthes","Danser",290 24160,"","Dithecina","Tiegh.",290 24190,"","Eichlerina","Tiegh.",290 10064,"","Elytranthe","(Blume) Blume",290 16333,"","Emelianthe","Danser",290 10065,"","Englerina","Tiegh.",290 24146,"","Epicoila","Raf.",290 10067,"","Erianthemum","Tiegh.",290 24173,"","Etubila","Raf.",290 22125,"","Furarium","Rizzini",290 24143,"","Furcilla","Tiegh.",290 10069,"","Gaiadendron","G.Don",290 10071,"","Globimetula","Tiegh.",290 24200,"","Glossidea","Tiegh.",290 22126,"","Glutago","Comm. ex Poir.",290 24161,"","Helicanthera","Roem. & Schult.",290 16332,"","Helicanthes","Danser",290 24162,"","Helicia","Pers.",290 10072,"","Helixanthera","Lour.",290 24201,"","Hemiarthron","Tiegh.",290 22135,"","Hemitria","Raf.",290 24144,"","Hookerella","Tiegh.",290 16329,"","Ileostylus","Tiegh.",290 24182,"","Ischnanthus","(Engl.) Tiegh.",290 24202,"","Isocaulon","Tiegh.",290 24177,"","Itacania","Raf.",290 10074,"","Ixocactus","Rizzini",290 10075,"","Kingella","Tiegh.",290 10077,"","Lampas","Danser",290 24163,"","Lanthorus","C.Presl",290 10078,"","Lepeostegeres","Blume",290 10079,"","Lepidaria","Tiegh.",290 10080,"","Lepidella","Tiegh.",290 24164,"","Leucobotrys","Tiegh.",290 24187,"","Lichtensteinia","J.C.Wendl.",290 10082,"","Ligaria","Tiegh.",290 24169,"","Locella","Tiegh.",290 24174,"","Lonicera","Gaertn.",290 10083,"","Loranthus","Jacq.",290 24189,"","Loxania","Tiegh.",290 10084,"","Loxanthera","(Blume) Blume",290 10085,"","Lysiana","Tiegh.",290 24210,"","Macrocalyx","Tiegh.",290 10086,"","Macrosolen","(Blume) Rchb.",290 16338,"","Maracanthus","Kuijt",290 24203,"","Martiella","Tiegh.",290 24175,"","Meiena","Raf.",290 24205,"","Meranthera","Tiegh.",290 24206,"","Merismia","Tiegh.",290 24217,"","Metastachys","(Benth.) Tiegh.",290 24179,"","Metula","Tiegh.",290 24188,"","Moquinia","Spreng.",290 10087,"","Moquiniella","Balle",290 10088,"","Muellerina","Tiegh.",290 22124,"","Neamyza","Tiegh.",290 24154,"","Neophylum","Tiegh.",290 10089,"","Notanthera","(DC.) G.Don",290 10091,"","Nuytsia","R.Br. ex G.Don",290 10092,"","Odontella","Tiegh.",290 24141,"","Oedina","Tiegh.",290 10093,"","Oliverella","Tiegh.",290 10094,"","Oncella","Tiegh.",290 16336,"","Oncocalyx","Tiegh.",290 10095,"","Oryctanthus","(Griseb.) Eichler",290 16330,"","Oryctina","Tiegh.",290 25240,"","Panamanthus","Kuijt",290 10096,"","Papuanthes","Danser",290 24192,"","Pasovia","H.Karst.",290 24193,"","Passowia","H.Karst.",290 10097,"","Pedistylis","Wiens",290 10098,"","Peraxilla","Tiegh.",290 24145,"","Perella","(Tiegh.) Tiegh.",290 22133,"","Peristethium","Tiegh.",290 24165,"","Phoenicanthemum","(Blume) Blume",290 16335,"","Phragmanthera","Tiegh.",290 10100,"","Phrygilanthus","Eichler",290 10101,"","Phthirusa","Mart.",290 24170,"","Phyllodesmis","Tiegh.",290 24211,"","Phyllostephanus","Tiegh.",290 10102,"","Pilostigma","Tiegh.",290 10103,"","Plicosepalus","Tiegh.",290 10104,"","Psathyranthus","Ule",290 10105,"","Psittacanthus","Mart.",290 24191,"","Ptychostylus","Tiegh.",290 24155,"","Rhizanthemum","Tiegh.",290 16331,"","Rhizomonanthes","Danser",290 22132,"","Schimperina","Tiegh.",290 10106,"","Scurrula","L.",290 24180,"","Septimetula","Tiegh.",290 10107,"","Septulina","Tiegh.",290 10108,"","Socratina","Balle",290 10109,"","Sogerianthe","Danser",290 24207,"","Solenocalyx","Tiegh.",290 22134,"","Spirostylis","C.Presl ex Schult. & Schult.f.",290 10110,"","Spragueanella","Balle",290 24152,"","Stegastrum","Tiegh.",290 16889,"","Steirotis","Raf.",290 24156,"","Stemmatophyllum","Tiegh.",290 24183,"","Stephaniscus","Tiegh.",290 24166,"","Strepsimela","Raf.",290 10111,"","Struthanthus","Mart.",290 24167,"","Sycophila","Welw. ex Tiegh.",290 24142,"","Taguaria","Raf.",290 10112,"","Tapinanthus","(Blume) Blume",290 22128,"","Tapinostemma","Tiegh.",290 10113,"","Taxillus","Tiegh.",290 10114,"","Tetradyas","Danser",290 10115,"","Thaumasianthes","Danser",290 24181,"","Thelecarpus","Tiegh.",290 10116,"","Tieghemia","Balle",290 16334,"","Tolypanthus","(Blume) Blume",290 24150,"","Treubania","Tiegh.",290 24151,"","Treubella","Tiegh.",290 24194,"","Triarthron","Baill.",290 10117,"","Trilepidea","Tiegh.",290 10118,"","Tripodanthus","(Eichler) Tiegh.",290 10119,"","Tristerix","Mart.",290 10120,"","Trithecanthera","Tiegh.",290 10121,"","Tupeia","Cham. & Schltdl.",290 10122,"","Ungula","Barlow",290 10123,"","Vanwykia","Wiens",290 24208,"","Velvetia","Tiegh.",290 22127,"","Xylochlamys","Domin",290 18816,"","Lowia","Scort.",291 11616,"","Orchidantha","N.E.Br.",291 18817,"","Protamomum","Ridl.",291 18818,"","Wolfia","Post & Kuntze",291 13548,"","Loxsoma","R.Br. ex A.Cunn.",292 13549,"","Loxsomopsis","H.Christ",292 21519,"","Acrostachys","Herter",293 25807,"","Austrolycopodium","Holub",293 21518,"","Copodium","Raf.",293 21520,"","Diphasiastrum","Holub",293 16237,"","Diphasium","C.Presl ex Rothm.",293 21513,"","Huperzia","Bernh.",293 21525,"","Lateristachys","Holub",293 21517,"","Lepidotis","P.Beauv. ex Mirb.",293 21521,"","Lycopodiastrum","Holub ex R.D.Dixit",293 16144,"","Lycopodiella","Holub",293 13456,"","Lycopodium","L.",293 21524,"","Palhinhaea","Franco & Vasc.",293 21516,"","Phlegmariurus","(Herter) Holub",293 13457,"","Phylloglossum","Kunze",293 21514,"","Plananthus","P.Beauv. ex Mirb.",293 21522,"","Pseudodiphasium","Holub",293 21526,"","Pseudolycopodiella","Holub",293 21523,"","Pseudolycopodium","Holub",293 21515,"","Selago","Hill",293 21527,"","Selago","Schur",293 21528,"","Urostachys","(E.Pritz.) Herter",293 3923,"","Adenaria","Kunth",294 16508,"","Amannia","Blume",294 20829,"","Ammanella","Miq.",294 3925,"","Ammannia","L.",294 20838,"","Antherylium","Rohr",294 24508,"","Calyplectus","Ruiz & Pav.",294 3926,"","Capuronia","Lourteig",294 20830,"","Cornelia","Ard.",294 20836,"","Crena","Scop.",294 20837,"","Crenaea","Schreb.",294 3927,"","Crenea","Aubl.",294 20833,"","Cuphaea","Moench",294 3928,"","Cuphea","P.Browne",294 3929,"","Decodon","J.F.Gmel.",294 3930,"","Didiplis","Raf.",294 24507,"","Diplodon","Spreng.",294 20840,"","Diplousodon","Meisn.",294 3931,"","Diplusodon","Pohl",294 20835,"","Dodecas","L.f.",294 3954,"","Duabanga","Buch.-Ham.",294 24506,"","Friedlandia","Cham. & Schltdl.",294 3932,"","Galpinia","N.E.Br.",294 20839,"","Ginora","L.",294 3933,"","Ginoria","Jacq.",294 24957,"","Grislea","Loefl.",294 3934,"","Haitia","Urb.",294 3935,"","Heimia","Link",294 3936,"","Hionanthera","A.Fern. & Diniz",294 25482,"","Hoshiarpuria","Hajra, P.Daniel & Philcox",294 20831,"","Hydrolythrum","Hook.f.",294 23196,"","Koehneria","S.A.Graham, Tobe & Baas",294 3937,"","Lafoensia","Vand.",294 3938,"","Lagerstroemia","L.",294 3939,"","Lawsonia","L.",294 23067,"","Lourtella","S.A.Graham, Baas & Tobe",294 3940,"","Lythrum","L.",294 24503,"","Melanium","P.Browne",294 24504,"","Melvilla","A.Anderson",294 3941,"","Nesaea","Kunth",294 3942,"","Orias","Dode",294 24502,"","Parsonsia","P.Browne",294 3943,"","Pehria","Sprague",294 3944,"","Pemphis","J.R.Forst. & G.Forst.",294 3945,"","Peplis","L.",294 3946,"","Physocalymma","Pohl",294 20841,"","Physocalymna","DC.",294 3947,"","Pleurophora","D.Don",294 24509,"","Ptychodon","Klotzsch ex Rchb.",294 3956,"","Punica","L.",294 16507,"","Quartinia","Endl.",294 20832,"","Rhyacophila","Hochst.",294 3949,"","Rotala","L.",294 20842,"","Rotantha","Baker",294 24505,"","Salicaria","Adans.",294 25568,"","Socotria","Levin",294 3955,"","Sonneratia","L.f.",294 3950,"","Tetrataxis","Hook.f.",294 3951,"","Woodfordia","Salisb.",294 79,"","Alcimandra","Dandy",295 80,"","Aromadendron","Blume",295 14277,"","Dugandiodendron","Lozano",295 81,"","Elmerrillia","Dandy",295 82,"","Kmeria","(Pierre) Dandy",295 83,"","Liriodendron","L.",295 84,"","Magnolia","L.",295 85,"","Manglietia","Blume",295 16339,"","Manglietiastrum","Y.W.Law",295 86,"","Michelia","L.",295 87,"","Pachylarnax","Dandy",295 18656,"","Parakmeria","Hu & W.C.Cheng",295 88,"","Paramichelia","Hu",295 89,"","Talauma","Juss.",295 90,"","Tsoongiodendron","Chun",295 20914,"","Gynopleura","Cav.",296 4021,"","Malesherbia","Ruiz & Pav.",296 1558,"","Acmanthera","Griseb.",297 25092,"","Acosmus","Desv.",297 1559,"","Acridocarpus","Guill. & Perr.",297 1560,"","Adenoporces","Small",297 17784,"","Agoneissos","Zoll. ex Nied.",297 17775,"","Alcoceratothrix","Nied.",297 25094,"","Anomalopteris","(DC.) G.Don",297 25093,"","Anomalopterys","(DC.) G.Don",297 1561,"","Aspicarpa","Rich.",297 1562,"","Aspidopterys","A.Juss.",297 17778,"","Atopocarpus","Cuatrec.",297 18111,"","Banisteria","L.",297 17782,"","Banisterioides","Dubard & Dop",297 1563,"","Banisteriopsis","C.B.Rob. ex Small",297 14188,"","Barnebya","W.R.Anderson & B.Gates",297 1564,"","Blepharandra","Griseb.",297 1565,"","Brachylophon","Oliv.",297 1566,"","Brachypterys","A.Juss.",297 17779,"","Brittonella","Rusby",297 1567,"","Bunchosia","Rich. ex Kunth",297 1568,"","Burdachia","Mart. ex A.Juss.",297 1569,"","Byrsonima","Rich. ex Kunth",297 1570,"","Cabi","Ducke",297 16391,"","Callaeum","Small",297 17776,"","Calyntranthele","Nied.",297 1571,"","Calyptostylis","Arenes",297 1572,"","Camarea","A.St.-Hil.",297 1573,"","Caucanthus","Forssk.",297 1574,"","Clonodia","Griseb.",297 17781,"","Coelostylis","(Juss.) Kuntze",297 1575,"","Coleostachys","A.Juss.",297 1576,"","Cordobia","Nied.",297 17790,"","Cottsia","Dubard & Dop",297 1577,"","Diacidia","Griseb.",297 17785,"","Diaspis","Nied.",297 1578,"","Dicella","Griseb.",297 15179,"","Digoniopterys","Arenes",297 1579,"","Dinemagonum","A.Juss.",297 1580,"","Dinemandra","A.Juss.",297 1581,"","Diplopterys","A.Juss.",297 16392,"","Dolichopterys","Kosterm.",297 1582,"","Echinopterys","A.Juss.",297 25089,"","Ectopopterys","W.R.Anderson",297 17786,"","Eriocaucanthus","Chiov.",297 1583,"","Flabellaria","Cav.",297 1584,"","Flabellariopsis","R.Wilczek",297 25095,"","Gaertnera","Schreb.",297 16393,"","Gallardoa","Hicken",297 1585,"","Galphimia","Cav.",297 1586,"","Gaudichaudia","Kunth",297 1587,"","Glandonia","Griseb.",297 1588,"","Heladena","A.Juss.",297 17780,"","Hemsleyna","Kuntze",297 25096,"","Henlea","Griseb.",297 1589,"","Henleophytum","H.Karst.",297 1590,"","Heteropteris","Kunth",297 17756,"","Heteropterys","Kunth",297 1591,"","Hiptage","Gaertn.",297 1592,"","Hiraea","Jacq.",297 1593,"","Janusia","A.Juss.",297 1594,"","Jubelina","A.Juss.",297 17783,"","Jubistylis","Rusby",297 1595,"","Lasiocarpus","Liebm.",297 1596,"","Lophanthera","A.Juss.",297 1597,"","Lophopterys","A.Juss.",297 25097,"","Malacmaea","Griseb.",297 1598,"","Malpighia","L.",297 15623,"","Malpighiantha","Rojas Acosta",297 17787,"","Malpighiodes","Nied.",297 1600,"","Mascagnia","(Bertero ex DC.) Colla",297 25090,"","Mcvaughia","W.R.Anderson",297 25098,"","Meckelia","(Mart. ex A.Juss.) Griseb.",297 1602,"","Mezia","Schwacke ex Nied.",297 1603,"","Microsteira","Baker",297 1604,"","Mionandra","Griseb.",297 1605,"","Peixotoa","A.Juss.",297 23085,"","Peregrina","W.R.Anderson",297 1606,"","Philgamia","Baill.",297 25099,"","Platynema","Wight & Arn.",297 1607,"","Pterandra","A.Juss.",297 1608,"","Ptilochaeta","Turcz.",297 16394,"","Rhinopterys","Nied.",297 1609,"","Rhynchophora","Arenes",297 25091,"","Rhyssopterys","Blume ex A.Juss.",297 1611,"","Rosanthus","Small",297 1610,"","Ryssopterys","Blume ex A.Juss.",297 1612,"","Schwannia","Endl.",297 17777,"","Sipapoa","Maguire",297 16395,"","Skoliopterys","Cuatrec.",297 1613,"","Spachea","A.Juss.",297 1614,"","Sphedamnocarpus","Planch. ex Benth.",297 17788,"","Sprucina","Nied.",297 25100,"","Stenocalyx","Turcz.",297 1615,"","Stigmaphyllon","A.Juss.",297 1616,"","Tetrapodenia","Gleason",297 1617,"","Tetrapterys","Cav.",297 18110,"","Thryallis","L.",297 1618,"","Thryallis","Mart.",297 1619,"","Triaspis","Burch.",297 1620,"","Tricomaria","Gillies ex Hook. & Arn.",297 1621,"","Tricomariopsis","Dubard",297 1622,"","Triopterys","L.",297 1623,"","Tristellateia","Thouars",297 17789,"","Tritomopterys","(A.Juss. ex Endl.) Nied.",297 1624,"","Verrucularia","A.Juss.",297 14187,"","Verrucularina","Rauschert",297 25101,"","Zymum","Thouars",297 1226,"","Abelmoschus","Medik.",298 16354,"","Abortopetalum","O.Deg.",298 1227,"","Abutilon","Mill.",298 1228,"","Abutilothamnus","Ulbr.",298 17672,"","Acaulimalva","Krapov.",298 16177,"","Alcea","L.",298 17934,"","Allenia","E.Phillips",298 24258,"","Allosidastrum","(Hochr.) Krapov., Fryxell & D.M.Bates",298 15180,"","Allowissadula","D.M.Bates",298 1229,"","Althaea","L.",298 1230,"","Alyogyne","Alef.",298 1231,"","Anisodontea","C.Presl",298 1232,"","Anoda","Cav.",298 15198,"","Anotea","(DC.) Kunth",298 1233,"","Arcynospermum","Turcz.",298 16356,"","Armourea","Lewton",298 17930,"","Asterochlaena","Garcke",298 1234,"","Asterotrichion","Klotzsch",298 16357,"","Atkinsia","R.A.Howard",298 1235,"","Azanza","Alef.",298 15174,"","Bakeridesia","Hochr.",298 1236,"","Bastardia","Kunth",298 17673,"","Bastardiastrum","(Rose) D.M.Bates",298 1237,"","Bastardiopsis","(K.Schum.) Hassl.",298 15181,"","Batesimalva","Fryxell",298 15959,"","Billieturnera","Fryxell",298 1238,"","Blanchetiastrum","Hassl.",298 17928,"","Bogenhardia","Rchb.",298 1239,"","Bombycidendron","Zoll. & Moritzi",298 1240,"","Briquetia","Hochr.",298 16358,"","Brockmania","W.Fitzg.",298 1241,"","Callirhoe","Nutt.",298 1242,"","Calyculogygas","Krapov.",298 1243,"","Calyptraemalva","Krapov.",298 1244,"","Cancellaria","(DC.) Mattei",298 1245,"","Cenocentrum","Gagnep.",298 1246,"","Cephalohibiscus","Ulbr.",298 1247,"","Cienfuegosia","Cav.",298 1248,"","Codonochlamys","Ulbr.",298 1249,"","Corynabutilon","(K.Schum.) Kearney",298 1250,"","Cristaria","Cav.",298 1251,"","Decaschistia","Wight & Arn.",298 1252,"","Dendrosida","Fryxell",298 1253,"","Dicellostyles","Benth.",298 1254,"","Dirhamphis","Krapov.",298 1255,"","Eremalche","Greene",298 1256,"","Erioxylum","Rose & Standl.",298 1257,"","Fioria","Mattei",298 15910,"","Fryxellia","D.M.Bates",298 17935,"","Fugosia","Juss.",298 1258,"","Gaya","Kunth",298 1259,"","Gayoides","(Endl.) Small",298 1260,"","Goethea","Nees",298 1261,"","Gossypioides","Skovst. ex J.B.Hutch.",298 1262,"","Gossypium","L.",298 1263,"","Gynatrix","Alef.",298 1264,"","Halothamnus","F.Muell.",298 1360,"","Hampea","Schltdl.",298 1265,"","Helicteropsis","Hochr.",298 1266,"","Herissantia","Medik.",298 1267,"","Hibiscadelphus","Rock",298 1268,"","Hibiscus","L.",298 1269,"","Hochreutinera","Krapov.",298 1270,"","Hoheria","A.Cunn.",298 1271,"","Horsfordia","A.Gray",298 1272,"","Howittia","F.Muell.",298 1273,"","Humbertianthus","Hochr.",298 1274,"","Humbertiella","Hochr.",298 16359,"","Iliamna","Greene",298 1275,"","Julostylis","Thwaites",298 1276,"","Jumelleanthus","Hochr.",298 1277,"","Kearnemalvastrum","D.M.Bates",298 1278,"","Kitaibela","Willd.",298 1279,"","Kokia","Lewton",298 1280,"","Kosteletzkya","C.Presl",298 1281,"","Krapovickasia","Fryxell",298 1282,"","Kydia","Roxb.",298 1283,"","Laguna","Cav.",298 1284,"","Lagunaria","(DC.) Rchb.",298 1285,"","Lavatera","L.",298 1286,"","Lawrencia","Hook.",298 1287,"","Lebronnecia","Fosberg",298 1288,"","Lopimia","Mart.",298 1289,"","Macrocalyx","Costantin & J.Poiss.",298 1290,"","Macrostelia","Hochr.",298 16370,"","Maga","Urb.",298 17931,"","Malache","Vogel",298 1291,"","Malachra","L.",298 1292,"","Malacothamnus","Greene",298 1293,"","Malope","L.",298 1294,"","Malva","L.",298 1295,"","Malvastrum","A.Gray",298 1296,"","Malvaviscus","Fabr.",298 1297,"","Malvella","Jaub. & Spach",298 16360,"","Malveopsis","C.Presl",298 1298,"","Megistostegium","Hochr.",298 15182,"","Meximalva","Fryxell",298 1299,"","Modiola","Moench",298 1300,"","Modiolastrum","K.Schum.",298 1301,"","Monteiroa","Krapov.",298 1302,"","Montezuma","DC.",298 1303,"","Napaea","L.",298 24259,"","Nayariophyton","T.K.Paul",298 1304,"","Neobaclea","Hochr.",298 1305,"","Neobrittonia","Hochr.",298 1306,"","Neohumbertiella","Hochr.",298 1307,"","Nototriche","Turcz.",298 1308,"","Notoxylinon","Lewton",298 1309,"","Palaua","Cav.",298 16361,"","Palava","Juss.",298 1310,"","Papuodendron","C.T.White",298 17933,"","Pariti","Adans.",298 1311,"","Pavonia","Cav.",298 1312,"","Peltaea","(C.Presl) Standl.",298 16362,"","Peltobractea","Rusby",298 16363,"","Peltostegia","Turcz.",298 1313,"","Periptera","DC.",298 16364,"","Perrieranthus","Hochr.",298 1314,"","Perrierophytum","Hochr.",298 1315,"","Phragmocarpidium","Krapov.",298 15175,"","Phymosia","Desv.",298 25496,"","Physalastrum","Monteiro",298 1316,"","Plagianthus","J.R.Forst. & G.Forst.",298 16366,"","Plarodrigoa","Looser",298 1317,"","Pseudabutilon","R.E.Fr.",298 17929,"","Pseudobastardia","Hassl.",298 1318,"","Pseudopavonia","Hassl.",298 1319,"","Pteropavonia","Mattei",298 1320,"","Radyera","Bullock",298 25323,"","Rhynchosida","Fryxell",298 1321,"","Robinsonella","Rose & Baker f.",298 15962,"","Rojasimalva","Fryxell",298 1322,"","Selenothamnus","Melville",298 1323,"","Selera","Ulbr.",298 1324,"","Senra","Cav.",298 17936,"","Shantzia","Lewton",298 1325,"","Sida","L.",298 1326,"","Sidalcea","A.Gray",298 15176,"","Sidastrum","Baker f.",298 1328,"","Sidopsis","Rydb.",298 1329,"","Sphaeralcea","A.St.-Hil.",298 1330,"","Symphyochlamys","Gurke",298 1331,"","Tarasa","Phil.",298 17927,"","Tetraptera","Phil.",298 1332,"","Tetrasida","Ulbr.",298 1333,"","Thespesia","Sol. ex Correa",298 1334,"","Thespesiopsis","Exell & Hillc.",298 16367,"","Thorntonia","Rchb.",298 1335,"","Thurberia","A.Gray",298 1336,"","Triplochlamys","Ulbr.",298 16368,"","Uladendron","Marc.-Berti",298 1338,"","Ulbrichia","Urb.",298 17937,"","Ultragossypium","Roberty",298 1340,"","Urena","L.",298 1341,"","Urocarpidium","Ulbr.",298 1342,"","Wercklea","Pittier & Standl.",298 1343,"","Wilhelminia","Hochr.",298 1344,"","Wissadula","Medik.",298 11580,"","Afrocalathea","K.Schum.",299 11581,"","Ataenidia","Gagnep.",299 18812,"","Bamburanta","L.Linden",299 11582,"","Calathea","G.Mey.",299 18814,"","Clinogyne","K.Schum.",299 11583,"","Cominsia","Hemsl.",299 11584,"","Ctenanthe","Eichler",299 11585,"","Ctenophrynium","K.Schum.",299 11586,"","Donax","Lour.",299 11587,"","Halopegia","K.Schum.",299 11588,"","Haumania","J.Leonard",299 24294,"","Hybophrynium","K.Schum.",299 11589,"","Hylaeanthe","A.M.E.Jonker & Jonker",299 18815,"","Hymenocharis","Salisb.",299 11590,"","Hypselodelphys","(K.Schum.) Milne-Redh.",299 18811,"","Hytophrynium","K.Schum.",299 11591,"","Ischnosiphon","Korn.",299 25547,"","Koernickanthe","L.Andersson",299 11592,"","Maranta","L.",299 11593,"","Marantochloa","Brongn. ex Gris",299 11594,"","Megaphrynium","Milne-Redh.",299 11595,"","Monophrynium","K.Schum.",299 11596,"","Monophyllanthe","K.Schum.",299 11597,"","Monotagma","K.Schum.",299 11598,"","Myrosma","L.f.",299 11599,"","Phacelophrynium","K.Schum.",299 11600,"","Phrynium","Willd.",299 11601,"","Pleiostachya","K.Schum.",299 23080,"","Sanblasia","L.Andersson",299 11602,"","Saranthe","(Regel & Korn.) Eichler",299 11603,"","Sarcophrynium","K.Schum.",299 11604,"","Schumannianthus","Gagnep.",299 11605,"","Stachyphrynium","K.Schum.",299 11606,"","Stromanthe","Sond.",299 11607,"","Thalia","L.",299 11608,"","Thaumatococcus","Benth.",299 17484,"","Thymocarpus","Nicolson, Steyerm. & Sivad.",299 11609,"","Trachyphrynium","Benth.",299 18813,"","Trachyphrynium","K.Schum.",299 13467,"","Angiopteris","Hoffm.",300 13468,"","Archangiopteris","H.Christ & Giesenh.",300 13472,"","Christensenia","Maxon",300 21560,"","Clementea","Cav.",300 13473,"","Danaea","Sm.",300 21569,"","Danaeopsis","C.Presl",300 21563,"","Discostegia","C.Presl",300 21564,"","Eupodium","J.Sm.",300 21565,"","Gymnotheca","C.Presl",300 21570,"","Heterodanaea","C.Presl",300 21568,"","Kaulfussia","C.Presl",300 13469,"","Macroglossum","Copel.",300 13470,"","Marattia","Sw.",300 21566,"","Myriotheca","Comm. ex Juss.",300 21562,"","Protangiopteris","Hayata",300 13471,"","Protomarattia","Hayata",300 21561,"","Psilodochea","C.Presl",300 21567,"","Stibasia","C.Presl",300 1177,"","Caracasia","Szyszyl.",301 1178,"","Marcgravia","L.",301 1179,"","Norantea","Aubl.",301 1180,"","Ruyschia","Jacq.",301 1181,"","Souroubea","Aubl.",301 22036,"","Calamistrum","L. ex Kuntze",302 22033,"","Lemma","Juss. ex Adans.",302 13754,"","Marsilea","L.",302 13755,"","Pilularia","L.",302 13756,"","Regnellidium","Lindm.",302 22034,"","Spheroidea","Dulac",302 22035,"","Zaluzianskia","Neck.",302 13481,"","Matonia","R.Br. ex Wall.",303 13482,"","Phanerosorus","Copel.",303 24624,"","Biaslia","Vand.",304 24625,"","Coletia","Vell.",304 12131,"","Mayaca","Aubl.",304 24626,"","Syena","Schreb.",304 1195,"","Medusagyne","Baker",305 2078,"","Medusandra","Brenan",306 2079,"","Soyauxia","Oliv.",306 4866,"","Kaliphora","Hook.f.",307 4868,"","Melanophylla","Baker",307 11880,"","Aletris","L.",308 11884,"","Amianthium","A.Gray",308 11830,"","Campynema","Labill.",308 11831,"","Campynemanthe","Baill.",308 11923,"","Chamaelirium","Willd.",308 11926,"","Chionographis","Maxim.",308 11970,"","Harperocallis","McDaniel",308 11972,"","Helonias","L.",308 11973,"","Heloniopsis","A.Gray",308 24418,"","Japonolirion","Nakai",308 11671,"","Lophiola","Ker Gawl.",308 12013,"","Melanthium","L.",308 12015,"","Metanarthecium","Maxim.",308 12024,"","Narthecium","Huds.",308 12029,"","Nietneria","Klotzsch ex Benth.",308 12114,"","Petrosavia","Becc.",308 12044,"","Pleea","Michx.",308 12060,"","Schoenocaulon","A.Gray",308 18960,"","Stenanthella","Rydb.",308 12074,"","Stenanthium","(A.Gray) Kunth",308 12081,"","Tofieldia","Huds.",308 12098,"","Veratrum","L.",308 12102,"","Xerophyllum","Michx.",308 12103,"","Ypsilandra","Franch.",308 12104,"","Zigadenus","Michx.",308 3687,"","Acanthella","Hook.f.",309 3688,"","Aciotis","D.Don",309 3689,"","Acisanthera","P.Browne",309 20828,"","Adamia","Jacq.-Fel.",309 22619,"","Adelbertia","Meisn.",309 3690,"","Adelobotrys","DC.",309 3691,"","Afzeliella","Gilg",309 16494,"","Alifana","Raf.",309 20776,"","Alifanus","Adans.",309 3692,"","Allomaieta","Gleason",309 3693,"","Allomorphia","Blume",309 3694,"","Alloneuron","Pilg.",309 22623,"","Allozygia","Naudin",309 20814,"","Amaraboya","Linden ex Mast.",309 22610,"","Amblyanthera","Blume",309 3696,"","Amphiblemma","Naudin",309 3697,"","Amphitoma","Gleason",309 3698,"","Amphorocalyx","Baker",309 24496,"","Anaectocalyx","Triana ex Hook.f.",309 22601,"","Ancistrodesmus","Naudin",309 3699,"","Anerincleistus","Korth.",309 22597,"","Anisocentrum","Turcz.",309 3700,"","Anoectocalyx","Hook.f.",309 20801,"","Anplectrella","Furtado",309 20797,"","Anplectrum","A.Gray",309 3701,"","Antherotoma","(Naudin) Hook.f.",309 25769,"","Apatitia","Desv.",309 22626,"","Aplectrum","Blume",309 3702,"","Appendicularia","DC.",309 22633,"","Apteuxis","Griff.",309 24486,"","Argyrella","Naudin",309 3703,"","Arthrostemma","Pav. ex D.Don",309 22640,"","Aschistanthera","C.Hansen",309 22611,"","Asterostoma","Blume",309 3704,"","Astrocalyx","Merr.",309 3705,"","Astronia","Blume",309 20815,"","Astronidium","A.Gray",309 3550,"","Aulacocarpus","O.Berg",309 3706,"","Axinaea","Ruiz & Pav.",309 22631,"","Axinanthera","H.Karst.",309 20778,"","Axinea","Juss.",309 20798,"","Backeria","Bakh.f.",309 3708,"","Bamlera","K.Schum. & Lauterb.",309 20775,"","Barbeyastrum","Cogn.",309 3710,"","Barthea","Hook.f.",309 3711,"","Beccarianthus","Cogn.",309 3712,"","Behuria","Cham.",309 3713,"","Bellucia","Neck. ex Raf.",309 3714,"","Benevidesia","Saldanha & Cogn.",309 3715,"","Bertolonia","Raddi",309 3716,"","Bisglaziovia","Cogn.",309 3717,"","Blakea","P.Browne",309 3718,"","Blastus","Lour.",309 3719,"","Boerlagea","Cogn.",309 20790,"","Bourdaria","A.Chev.",309 3720,"","Boyania","Wurdack",309 22622,"","Brachycentrum","Meisn.",309 3721,"","Brachyotum","(DC.) Triana",309 3722,"","Brachypremna","Gleason",309 3723,"","Bredia","Blume",309 3724,"","Brittenia","Cogn.",309 3725,"","Bucquetia","DC.",309 3726,"","Cailliella","Jacq.-Fel.",309 20808,"","Calophysa","DC.",309 3728,"","Calvoa","Hook.f.",309 3729,"","Calycogonium","DC.",309 22621,"","Calyptraria","Naudin",309 3730,"","Calyptrella","Naudin",309 3731,"","Cambessedesia","DC.",309 3732,"","Campimia","Ridl.",309 24499,"","Capitellaria","Naudin",309 3733,"","Carionia","Naudin",309 20787,"","Cassebeeria","Dennst.",309 3734,"","Castratella","Naudin",309 3735,"","Catanthera","F.Muell.",309 3736,"","Catocoryne","Hook.f.",309 24494,"","Catonia","P.Browne",309 3737,"","Centradenia","G.Don",309 3738,"","Centradeniastrum","Cogn.",309 3739,"","Centronia","D.Don",309 20803,"","Cephalomedinilla","Merr.",309 22612,"","Ceramicalyx","Blume",309 22602,"","Chaetogastra","DC.",309 3741,"","Chaetolepis","(DC.) Miq.",309 3742,"","Chaetostoma","DC.",309 3743,"","Charianthus","D.Don",309 22616,"","Chastenaea","DC.",309 3744,"","Cincinnobotrys","Gilg",309 3745,"","Clidemia","D.Don",309 3746,"","Comolia","DC.",309 24239,"","Comoliopsis","Wurdack",309 3747,"","Conostegia","D.Don",309 3748,"","Copedesma","Gleason",309 20825,"","Coryphadenia","Morley",309 3749,"","Creaghiella","Stapf",309 3750,"","Creochiton","Blume",309 3751,"","Cryptophysa","Standl. & J.F.Macbr.",309 3752,"","Cyanandrium","Stapf",309 20780,"","Cycnopodium","Naudin",309 3753,"","Cyphostyla","Gleason",309 3754,"","Cyphotheca","Diels",309 16500,"","Dactyliota","(Blume) Blume",309 20799,"","Dalenia","Korth.",309 22618,"","Davya","DC.",309 3756,"","Desmoscelis","Naudin",309 3757,"","Dicellandra","Hook.f.",309 20802,"","Dicerospermum","Bakh.f.",309 3759,"","Dichaetanthera","Endl.",309 24501,"","Diclemia","Naudin",309 3760,"","Dinophora","Benth.",309 3761,"","Diolena","Naudin",309 3762,"","Dionycha","Naudin",309 3763,"","Dionychastrum","A.Fern. & R.Fern.",309 20773,"","Dionychia","Hook.f.",309 3764,"","Diplarpea","Triana",309 3765,"","Diplectria","(Blume) Rchb.",309 24500,"","Diplodonta","H.Karst.",309 3766,"","Dissochaeta","Blume",309 3767,"","Dissotis","Benth.",309 3768,"","Dolichoura","Brade",309 3769,"","Driessenia","Korth.",309 24483,"","Dupineta","Raf.",309 20800,"","Eisocreochiton","Quisumb. & Merr.",309 3770,"","Ekmaniocharis","Urb.",309 20794,"","Enaulophyton","Steenis",309 3772,"","Enchosanthera","King & Stapf ex Guillaumin",309 3773,"","Eriocnema","Naudin",309 3774,"","Ernestia","DC.",309 22627,"","Erpetina","Naudin",309 20807,"","Eustegia","Raf.",309 3775,"","Everettia","Merr.",309 22634,"","Ewyckia","Blume",309 3776,"","Farringtonia","Gleason",309 3777,"","Feliciadamia","Bullock",309 3778,"","Fordiophyton","Stapf",309 3779,"","Fritzschia","Cham.",309 20821,"","Glossoma","Schreb.",309 20781,"","Graeffenrieda","D.Dietr.",309 3780,"","Graffenrieda","DC.",309 3781,"","Gravesia","Naudin",309 20791,"","Gravesiella","A.Fern. & R.Fern.",309 24490,"","Grischowia","H.Karst.",309 3782,"","Guyonia","Naudin",309 20789,"","Gymnagathis","Stapf",309 22607,"","Haplodesmium","Naudin",309 20793,"","Haplophyllophorus","(Brenan) A.Fern. & R.Fern.",309 16501,"","Hederella","Stapf",309 24484,"","Hedusa","Raf.",309 20768,"","Heeria","Schltdl.",309 20810,"","Henrietia","Rchb.",309 20811,"","Henrietta","Macfad.",309 3783,"","Henriettea","DC.",309 3784,"","Henriettella","Naudin",309 22606,"","Hephestionia","Naudin",309 3785,"","Heterocentron","Hook. & Arn.",309 3786,"","Heteroneuron","Hook.f.",309 22600,"","Heteronoma","DC.",309 24485,"","Heterotis","Benth.",309 3787,"","Heterotrichum","DC.",309 22624,"","Homocentria","Naudin",309 3788,"","Homonoma","Bello",309 16495,"","Hormocalyx","Gleason",309 3789,"","Huberia","DC.",309 3790,"","Huilaea","Wurdack",309 3791,"","Hylocharis","Miq.",309 3792,"","Hypenanthe","(Blume) Blume",309 3793,"","Icaria","J.F.Macbr.",309 3794,"","Itatiaia","Ule",309 22613,"","Kadali","Adans.",309 24482,"","Kadalia","Raf.",309 3795,"","Kendrickia","Hook.f.",309 22641,"","Kerriothyrsus","C.Hansen",309 20816,"","Kibbesia","Walp.",309 3796,"","Kibessia","DC.",309 3797,"","Killipia","Gleason",309 3798,"","Kirkbridea","Wurdack",309 16496,"","Klaineastrum","Pierre ex A.Chev.",309 3799,"","Krassera","O.Schwartz",309 22614,"","Lachnopodium","Blume",309 22603,"","Lasiandra","DC.",309 3800,"","Lavoisiera","DC.",309 20767,"","Lavoisieria","Spreng.",309 3801,"","Leandra","Raddi",309 24488,"","Lepidanthemum","Klotzsch",309 24489,"","Lignieria","A.Chev.",309 20826,"","Lijndenia","Zoll. & Moritzi",309 3802,"","Lithobium","Bong.",309 3803,"","Llewelynia","Pittier",309 24491,"","Loevigia","H.Karst. & Triana",309 3804,"","Lomanodia","Raf.",309 3805,"","Loreya","DC.",309 3806,"","Loricalepis","Brade",309 3807,"","Macairea","DC.",309 3808,"","Macrocentrum","Hook.f.",309 3809,"","Macrolenes","Naudin",309 22635,"","Macroplacis","Blume",309 3810,"","Maguireanthus","Wurdack",309 3811,"","Maieta","Aubl.",309 22615,"","Malabathris","Raf.",309 20804,"","Malanthos","Stapf",309 3812,"","Mallophyton","Wurdack",309 3813,"","Marcetia","DC.",309 3814,"","Marshallfieldia","J.F.Macbr.",309 3815,"","Marumia","Blume",309 3816,"","Mecranium","Hook.f.",309 3817,"","Medinilla","Gaudich.",309 3818,"","Medinillopsis","Cogn.",309 16497,"","Meiandra","Markgr.",309 16502,"","Meisneria","DC.",309 3819,"","Melastoma","L.",309 3820,"","Melastomastrum","Naudin",309 20824,"","Meliandra","Ducke",309 3822,"","Memecylon","L.",309 20806,"","Menendezia","Britton",309 20779,"","Meriana","Vent.",309 3823,"","Meriania","Sw.",309 3824,"","Merianthera","Kuhlm.",309 3825,"","Miconia","Ruiz & Pav.",309 22605,"","Micranthella","Naudin",309 3826,"","Microlepis","(DC.) Miq.",309 3827,"","Microlicia","D.Don",309 20809,"","Microphysa","Naudin",309 3828,"","Microphysca","Naudin",309 3829,"","Mommsenia","Urb. & Ekman",309 3830,"","Monochaetum","(DC.) Naudin",309 3831,"","Monolena","Triana",309 3832,"","Mouriri","Aubl.",309 20817,"","Mouriria","Juss.",309 3833,"","Myrianthemum","Gilg",309 3834,"","Myriaspora","DC.",309 3835,"","Myrmidone","Mart.",309 22632,"","Naudiniella","Krasser",309 3836,"","Neblinanthera","Wurdack",309 3837,"","Necramium","Britton",309 20796,"","Neodissochaeta","Bakh.f.",309 3838,"","Neodriessenia","M.P.Nayar",309 3839,"","Neopetalonema","Brenan",309 3840,"","Nepsera","Naudin",309 3841,"","Nerophila","Naudin",309 22599,"","Noterophila","Mart.",309 24493,"","Notocentrum","Naudin",309 3842,"","Ochthephilus","Wurdack",309 3843,"","Ochthocharis","Blume",309 24497,"","Octonum","Raf.",309 20812,"","Octopleura","Griseb.",309 20818,"","Olisbaea","Hook.f.",309 20819,"","Olisbea","DC.",309 3845,"","Omphalopus","Naudin",309 3846,"","Opisthocentra","Hook.f.",309 22604,"","Oreocosmus","Naudin",309 3847,"","Oritrephes","Ridl.",309 3848,"","Orthogoneuron","Gilg",309 3849,"","Osbeckia","L.",309 24487,"","Osbeckiastrum","Naudin",309 3850,"","Ossaea","DC.",309 3851,"","Otanthera","Blume",309 3852,"","Oxymeris","DC.",309 3853,"","Oxyspora","DC.",309 3854,"","Pachyanthus","Rich.",309 3855,"","Pachycentria","Blume",309 3856,"","Pachydesmia","Gleason",309 3857,"","Pachyloma","DC.",309 22620,"","Pachymeria","Benth.",309 25570,"","Pentossaea","Judd",309 3858,"","Perilimnastes","Ridl.",309 20795,"","Petalonema","Gilg",309 20783,"","Phaeoneuron","Gilg",309 3859,"","Phainantha","Gleason",309 23195,"","Pharmaceum","Kuntze",309 20784,"","Phaulanthus","Ridl.",309 3860,"","Phornothamnus","Baker",309 3861,"","Phyllagathis","Blume",309 16498,"","Phyllapophysis","Mansf.",309 3862,"","Pilocosta","Almeda & Whiffin",309 3863,"","Plagiopetalum","Rehder",309 3864,"","Platycentrum","Naudin",309 3865,"","Pleiochiton","Naudin ex A.Gray",309 16503,"","Pleroma","D.Don",309 3866,"","Plethiandra","Hook.f.",309 3867,"","Podocaelia","(Benth.) A.Fern. & R.Fern.",309 3868,"","Pogonanthera","Blume",309 3869,"","Poikilogyne","Baker f.",309 22642,"","Poilannammia","C.Hansen",309 3870,"","Pomatostoma","Stapf",309 3871,"","Poteranthera","Bong.",309 3872,"","Preussiella","Gilg",309 20792,"","Primularia","Brenan",309 3873,"","Prosanerpis","S.F.Blake",309 3874,"","Pseudodissochaeta","M.P.Nayar",309 3875,"","Pseudoernestia","(Cogn.) Krasser",309 3876,"","Pseudosbeckia","A.Fern. & R.Fern.",309 3877,"","Pternandra","Jack",309 3878,"","Pterocladon","Hook.f.",309 3879,"","Pterogastra","Naudin",309 20772,"","Pterolepis","Endl.",309 3880,"","Pterolepis","(DC.) Miq.",309 3881,"","Ptilanthus","Gleason",309 20770,"","Purpurella","Naudin",309 3883,"","Pyramia","Cham.",309 20813,"","Pyxidanthus","Naudin",309 22636,"","Rectomitra","Blume",309 3884,"","Rhexia","L.",309 3885,"","Rhodosepala","Baker",309 3886,"","Rhynchanthera","DC.",309 3887,"","Roezlia","Regel",309 3888,"","Rousseauxia","DC.",309 3889,"","Saccolena","Gleason",309 16504,"","Sagraea","DC.",309 16505,"","Sakersia","Hook.f.",309 3890,"","Salpinga","Mart. ex DC.",309 3891,"","Sandemania","Gleason",309 3892,"","Sarcopyramis","Wall.",309 22617,"","Sarmentaria","Naudin",309 20769,"","Schizocentron","Meisn.",309 3893,"","Schwackaea","Cogn.",309 24492,"","Schwerinia","H.Karst.",309 3894,"","Scorpiothyrsus","H.L.Li",309 16499,"","Scrobicularia","Mansf.",309 22637,"","Scutula","Lour.",309 3895,"","Siphanthera","Pohl",309 3896,"","Siphantheropsis","Brade",309 3897,"","Sonerila","Roxb.",309 3898,"","Spathandra","Guill. & Perr.",309 22609,"","Spennera","Mart. ex DC.",309 24495,"","Sphaerogyne","Naudin",309 3899,"","Sporoxeia","W.W.Sm.",309 3900,"","Stapfiophyton","H.L.Li",309 22630,"","Staphidiastrum","Naudin",309 22629,"","Staphidium","Naudin",309 3901,"","Stenodon","Naudin",309 24498,"","Stephanotrichum","Naudin",309 22625,"","Stussenia","C.Hansen",309 20782,"","Styrophyton","S.Y.Hu",309 16506,"","Suitramia","Rchb.",309 3902,"","Svitramia","Cham.",309 20786,"","Tashiroea","Matsum.",309 3903,"","Tateanthus","Gleason",309 3904,"","Tayloriophyton","M.P.Nayar",309 3905,"","Tessmannianthus","Markgr.",309 3906,"","Tetraphyllaster","Gilg",309 3907,"","Tetrazygia","Rich. ex DC.",309 25153,"","Tetrazygiopsis","Borhidi",309 3908,"","Tibouchina","Aubl.",309 3909,"","Tibouchinopsis","Markgr.",309 22643,"","Tigridiopalma","C.Chen",309 3910,"","Tococa","Aubl.",309 3911,"","Topobea","Aubl.",309 3912,"","Trembleya","DC.",309 3913,"","Trigynia","Jacq.-Fel.",309 22608,"","Trimeranthus","H.Karst.",309 3914,"","Triolena","Naudin",309 22628,"","Triplectrum","Wight & Arn.",309 3915,"","Tristemma","Juss.",309 3916,"","Triuranthera","Backer",309 3917,"","Tryssophyton","Wurdack",309 25154,"","Tulasnea","Naudin",309 25572,"","Tylanthera","C.Hansen",309 22598,"","Uranthera","Naudin",309 20777,"","Urodesmium","Naudin",309 3919,"","Urotheca","Gilg",309 22638,"","Valikaha","Adans.",309 3920,"","Veprecella","Naudin",309 15186,"","Vietsenia","C.Hansen",309 3921,"","Votomita","Aubl.",309 3922,"","Warneckea","Gilg",309 25768,"","Webera","J.F.Gmel.",309 23120,"","Acanthotrichilia","(Urb.) O.F.Cook & G.N.Collins",310 23117,"","Acrilia","Griseb.",310 1930,"","Aglaia","Lour.",310 23121,"","Ailantopsis","Gagnep.",310 23100,"","Aitonia","Thunb.",310 23151,"","Alliaria","Kuntze",310 23129,"","Amoora","Roxb.",310 23104,"","Antelaea","Gaertn.",310 1931,"","Anthocarapa","Pierre",310 1932,"","Aphanamixis","Blume",310 23131,"","Argophilum","Blanco",310 1933,"","Astrotrichilia","(Harms) T.D.Penn. & Styles",310 23101,"","Aytonia","L.f.",310 1934,"","Azadirachta","A.Juss.",310 23102,"","Azedarach","Mill.",310 23106,"","Barbilus","P.Browne",310 23107,"","Barola","Adans.",310 23136,"","Beddomea","Hook.f.",310 23140,"","Bingeria","A.Chev.",310 1935,"","Cabralea","A.Juss.",310 1936,"","Calodecaryia","J.-F.Leroy",310 23093,"","Calodryum","Desv.",310 23154,"","Cambania","Comm. ex M.Roem.",310 23127,"","Camunium","Roxb.",310 1937,"","Capuronianthus","J.-F.Leroy",310 1938,"","Carapa","Aubl.",310 1939,"","Cedrela","P.Browne",310 23157,"","Cedrus","Mill.",310 23125,"","Charia","C.E.C.Fisch.",310 23166,"","Chickassia","Wight & Arn.",310 1940,"","Chisocheton","Blume",310 1941,"","Chukrasia","A.Juss.",310 16474,"","Chuniodendron","Hu",310 1942,"","Cipadessa","Blume",310 23150,"","Clemensia","Merr.",310 23148,"","Dasycoleum","Turcz.",310 23152,"","Didymocheton","Blume",310 1943,"","Dysoxylum","Blume",310 1944,"","Ekebergia","Sparrm.",310 23108,"","Elcaja","Forssk.",310 23167,"","Elutheria","M.Roem.",310 23142,"","Elutheria","P.Browne",310 1945,"","Entandrophragma","C.E.C.Fisch.",310 16475,"","Epicharis","Blume",310 23134,"","Euphora","Griff.",310 23161,"","Garretia","Welw.",310 23092,"","Gilibertia","J.F.Gmel.",310 23094,"","Ginnania","M.Roem.",310 23098,"","Grevellina","Baill.",310 1946,"","Guarea","L.",310 23153,"","Hartigshea","A.Juss.",310 23137,"","Hearnia","F.Muell.",310 1947,"","Heckeldora","Pierre",310 23164,"","Heimodendron","Sillans",310 23110,"","Heynea","Roxb. ex Sims",310 1948,"","Humbertioturraea","J.-F.Leroy",310 23158,"","Johnsonia","Adans.",310 1949,"","Khaya","A.Juss.",310 23105,"","Lamiofrutex","Lauterb.",310 1950,"","Lansium","Correa",310 23163,"","Leioptyx","Pierre ex De Wild.",310 23138,"","Lepiaglaia","Pierre",310 1951,"","Lepidotrichilia","(Harms) J.-F.Leroy",310 23145,"","Leplaea","Vermoesen",310 23171,"","Litosiphon","Pierre ex Harms",310 1952,"","Lovoa","Harms",310 23156,"","Macrochiton","M.Roem.",310 23116,"","Mafureira","Bertol.",310 23168,"","Mahagoni","Adans.",310 23126,"","Mallea","A.Juss.",310 1953,"","Malleastrum","(Baill.) J.-F.Leroy",310 1954,"","Megaphyllaea","Hemsl.",310 1955,"","Melia","L.",310 23149,"","Melio-Schinzia","K.Schum.",310 23139,"","Merostela","Pierre",310 23128,"","Milnea","Roxb.",310 23176,"","Monosoma","Griff.",310 23112,"","Moschoxylum","A.Juss.",310 1956,"","Munronia","Wight",310 23124,"","Napeodendron","Ridl.",310 1957,"","Naregamia","Wight & Arn.",310 23091,"","Nelanaregam","Adans.",310 23130,"","Nemedra","A.Juss.",310 1958,"","Neobeguea","J.-F.Leroy",310 23133,"","Nimmoia","Wight",310 23099,"","Nurmonia","Harms",310 1959,"","Nymania","Lindb.",310 23111,"","Odontandra","Willd. ex Roem. & Schult.",310 23113,"","Odontosiphon","M.Roem.",310 23135,"","Oraoma","Turcz.",310 1960,"","Owenia","F.Muell.",310 23097,"","Payeria","Baill.",310 23172,"","Persoonia","Willd.",310 23090,"","Philastrea","Pierre",310 23118,"","Pholacilia","Griseb.",310 23122,"","Picroderma","Thorel ex Gagnep.",310 23165,"","Plagiotaxis","Wall. ex Kuntze",310 23143,"","Plumea","Lunan",310 23109,"","Portesia","Cav.",310 23155,"","Prasoxylon","M.Roem.",310 1961,"","Pseudobersama","Verdc.",310 1962,"","Pseudocarapa","Hemsl.",310 1963,"","Pseudocedrela","Harms",310 1964,"","Pterorhachis","Harms",310 23159,"","Pterosiphon","Turcz.",310 16477,"","Quivisia","Cav.",310 1965,"","Quivisianthe","Baill.",310 23175,"","Racapa","M.Roem.",310 1966,"","Reinwardtiodendron","Koord.",310 16476,"","Rhetinosperma","Radlk.",310 23115,"","Rochetia","Delile",310 23169,"","Roia","Scop.",310 1967,"","Ruagea","H.Karst.",310 23096,"","Rutea","M.Roem.",310 23141,"","Samyda","L.",310 1968,"","Sandoricum","Cav.",310 23147,"","Schizochiton","Spreng.",310 1969,"","Schmardaea","H.Karst.",310 23095,"","Scyphostigma","M.Roem.",310 23132,"","Selbya","M.Roem.",310 1970,"","Soymida","A.Juss.",310 1971,"","Sphaerosacme","Wall. ex M.Roem.",310 23170,"","Suitenia","Stokes",310 23160,"","Surenus","Kuntze",310 23123,"","Surwala","M.Roem.",310 1972,"","Swietenia","Jacq.",310 23144,"","Sycocarpus","Britton",310 23119,"","Symphytosiphon","Harms",310 1973,"","Synoum","A.Juss.",310 1974,"","Toona","(Endl.) M.Roem.",310 23114,"","Torpesia","(Endl.) M.Roem.",310 23174,"","Touloucouna","M.Roem.",310 1975,"","Trichilia","P.Browne",310 1976,"","Turraea","L.",310 1977,"","Turraeanthus","Baill.",310 23146,"","Urbanoguarea","Harms",310 1978,"","Vavaea","Benth.",310 1979,"","Walsura","Roxb.",310 23162,"","Wulfhorstia","C.E.C.Fisch.",310 1980,"","Xylocarpus","J.Konig",310 23103,"","Zederachia","Heist. ex Fabr.",310 23173,"","Zurloa","Ten.",310 2400,"","Bersama","Fresen.",311 2401,"","Melianthus","L.",311 2409,"","Meliosma","Blume",312 2410,"","Ophiocaryon","Endl.",312 238,"","Abuta","Aubl.",313 25117,"","Adeliopsis","Benth.",313 239,"","Albertisia","Becc.",313 240,"","Anamirta","Colebr.",313 241,"","Anisocycla","Baill.",313 242,"","Anomospermum","Miers",313 243,"","Antizoma","Miers",313 244,"","Arcangelisia","Becc.",313 245,"","Aspidocarya","Hook.f. & Thomson",313 246,"","Batania","Hatus.",313 247,"","Beirnaertia","Louis ex Troupin",313 248,"","Borismene","Barneby",313 249,"","Burasaia","Thouars",313 250,"","Calycocarpum","Nutt. ex Spach",313 251,"","Carronia","F.Muell.",313 252,"","Caryomene","Barneby & Krukoff",313 253,"","Chasmanthera","Hochst.",313 254,"","Chlaenandra","Miq.",313 255,"","Chondrodendron","Ruiz & Pav.",313 256,"","Cionomene","Krukoff",313 257,"","Cissampelos","L.",313 258,"","Cocculus","DC.",313 259,"","Coscinium","Colebr.",313 260,"","Curarea","Barneby & Krukoff",313 261,"","Cyclea","Arn. ex Wight",313 18708,"","Desmonema","Miers",313 262,"","Dialytheca","Exell & Mendonca",313 263,"","Dioscoreophyllum","Engl.",313 264,"","Diploclisia","Miers",313 265,"","Disciphania","Eichler",313 25311,"","Echinostephia","(Diels) Domin",313 266,"","Elephantomene","Barneby & Krukoff",313 267,"","Eleutharrhena","Forman",313 16269,"","Elissarrhena","Miers",313 16272,"","Epinetrum","Hiern",313 18709,"","Fawcettia","F.Muell.",313 268,"","Fibraurea","Lour.",313 16273,"","Gamopoda","Baker",313 16274,"","Glossopholis","Pierre",313 269,"","Haematocarpus","Miers",313 16275,"","Hyalosepalum","Troupin",313 270,"","Hyperbaena","Miers ex Benth.",313 271,"","Hypserpa","Miers",313 272,"","Jateorhiza","Miers",313 273,"","Kolobopetalum","Engl.",313 274,"","Legnephora","Miers",313 275,"","Leptoterantha","Louis ex Troupin",313 276,"","Limacia","Lour.",313 277,"","Limaciopsis","Engl.",313 278,"","Macrococculus","Becc.",313 279,"","Menispermum","L.",313 16276,"","Miersiophyton","Engl.",313 280,"","Odontocarya","Miers",313 281,"","Orthogynium","Baill.",313 282,"","Orthomene","Barneby & Krukoff",313 283,"","Pachygone","Miers",313 284,"","Parabaena","Miers",313 25411,"","Parapachygone","Forman",313 285,"","Penianthus","Miers",313 286,"","Pericampylus","Miers",313 25118,"","Perichasma","Miers",313 287,"","Platytinospora","(Engl.) Diels",313 288,"","Pleogyne","Miers",313 289,"","Pycnarrhena","Miers ex Hook.f. & Thomson",313 16277,"","Pycnostylis","Pierre",313 16278,"","Rameya","Baill.",313 290,"","Rhaptonema","Miers",313 291,"","Rhigiocarya","Miers",313 292,"","Sarcolophium","Troupin",313 293,"","Sarcopetalum","F.Muell.",313 294,"","Sciadotenia","Miers",313 295,"","Sinomenium","Diels",313 296,"","Somphoxylon","Eichler",313 297,"","Sphenocentrum","Pierre",313 298,"","Spirospermum","Thouars",313 299,"","Stephania","Lour.",313 300,"","Strychnopsis","Baill.",313 301,"","Synandropus","A.C.Sm.",313 302,"","Synclisia","Benth.",313 303,"","Syntriandrium","Engl.",313 304,"","Syrrheonema","Miers",313 305,"","Taubertia","K.Schum. ex Taub.",313 306,"","Telitoxicum","Moldenke",313 307,"","Tiliacora","Colebr.",313 308,"","Tinomiscium","Miers ex Hook.f. & Thomson",313 309,"","Tinospora","Miers",313 310,"","Triclisia","Benth.",313 16279,"","Tripodandra","Baill.",313 311,"","Tylopetalum","Barneby & Krukoff",313 312,"","Ungulipetalum","Moldenke",313 16280,"","Zenkerophytum","Engl. ex Diels",313 17335,"","Fauria","Franch.",314 17336,"","Limnanthemum","S.G.Gmel.",314 7927,"","Liparophyllum","Hook.f.",314 7928,"","Menyanthes","L.",314 7929,"","Nephrophyllidium","Gilg",314 7930,"","Nymphoides","Seg.",314 7931,"","Villarsia","Vent.",314 21761,"","Amphidesmium","Schott ex Kunze",315 13550,"","Metaxya","C.Presl",315 24536,"","Misodendron","G.Don",316 24535,"","Misodendrum","Banks ex DC.",316 10163,"","Myzodendron","R.Br.",316 4270,"","Adenogramma","Rchb.",317 4298,"","Coelanthum","E.Mey. ex Fenzl",317 4302,"","Corbichonia","Scop.",317 1046,"","Corrigiola","L.",317 4325,"","Glinus","L.",317 4326,"","Glischrothamnus","Pilg.",317 4333,"","Hypertelis","E.Mey. ex Fenzl",317 16224,"","Limeum","L.",317 4343,"","Macarthuria","Hugel ex Endl.",317 4352,"","Mollugo","L.",317 25179,"","Orygia","Forssk.",317 4370,"","Pharnaceum","L.",317 4375,"","Polpoda","C.Presl",317 4379,"","Psammotropha","Eckl. & Zeyh.",317 22194,"","Semonvillea","J.Gay",317 4401,"","Suessenguthiella","Friedrich",317 4403,"","Telephium","L.",317 9821,"","Anthobembix","Perkins",318 9822,"","Atherosperma","Labill.",318 9823,"","Austromatthaea","L.S.Sm.",318 9824,"","Bracteanthus","Ducke",318 23217,"","Carnegiea","Perkins",318 9825,"","Carnegieodoxa","Perkins",318 18022,"","Conuleum","A.Rich.",318 9826,"","Daphnandra","Benth.",318 9827,"","Decarydendron","Danguy",318 9828,"","Doryphora","Endl.",318 9829,"","Dryadodaphne","S.Moore",318 9830,"","Ephippiandra","Decne.",318 25555,"","Faika","Philipson",318 9831,"","Glossocalyx","Benth.",318 9832,"","Hedycarya","J.R.Forst. & G.Forst.",318 9833,"","Hedycaryopsis","Danguy",318 9834,"","Hennecartia","Poiss.",318 9835,"","Hortonia","Wight",318 18021,"","Isomerocarpa","A.C.Sm.",318 9836,"","Kairoa","Philipson",318 9837,"","Kibara","Endl.",318 9838,"","Kibaropsis","Vieill. ex Jeremie",318 9839,"","Laurelia","Juss.",318 25553,"","Laureliopsis","Schodde",318 9840,"","Lauterbachia","Perkins",318 9841,"","Levieria","Becc.",318 9842,"","Macropeplus","Perkins",318 9843,"","Macrotorus","Perkins",318 9844,"","Matthaea","Blume",318 9845,"","Mollinedia","Ruiz & Pav.",318 9846,"","Monimia","Thouars",318 9847,"","Nemuaron","Baill.",318 9848,"","Palmeria","F.Muell.",318 25554,"","Parakibara","Philipson",318 18020,"","Paxiodendron","Engl.",318 9849,"","Peumus","Molina",318 9850,"","Phanerogonocarpus","Cavaco",318 9851,"","Schrameckia","Danguy",318 9852,"","Siparuna","Aubl.",318 9853,"","Steganthera","Perkins",318 9854,"","Tambourissa","Sonn.",318 9855,"","Tetrasynandra","Perkins",318 9856,"","Wilkiea","F.Muell.",318 9857,"","Xymalos","Baill.",318 3978,"","Grevea","Baill.",319 3979,"","Montinia","Thunb.",319 10588,"","Acanthinophyllum","Allemao",320 16906,"","Acanthosphaera","Warb.",320 16907,"","Acanthotreculia","Engl.",320 25235,"","Alicastrum","P.Browne",320 25234,"","Aliteria","Benoist",320 25236,"","Allaeanthus","Thwaites",320 10589,"","Ampalis","Bojer ex Bureau",320 10590,"","Androstylanthus","Ducke",320 10591,"","Anonocarpus","Ducke",320 10592,"","Antiaris","Lesch.",320 10593,"","Antiaropsis","K.Schum.",320 10594,"","Artocarpus","J.R.Forst. & G.Forst.",320 10595,"","Bagassa","Aubl.",320 18999,"","Balanostreblus","Kurz",320 10596,"","Batocarpus","H.Karst.",320 17327,"","Bleekrodea","Blume",320 16905,"","Boehmeriopsis","Kom.",320 10597,"","Bosqueia","Thouars ex Baill.",320 10598,"","Bosqueiopsis","De Wild. & T.Durand",320 25277,"","Bosscheria","de Vriese & Teijsm.",320 10599,"","Brosimopsis","S.Moore",320 10600,"","Brosimum","Sw.",320 10601,"","Broussonetia","L'Her. ex Vent.",320 25238,"","Bucephalon","L.",320 25252,"","Calius","Blanco",320 10603,"","Calpidochlamys","Diels",320 25266,"","Caprificus","Gasp.",320 17331,"","Cardiogyne","Bureau",320 10604,"","Castilla","Cerv.",320 18994,"","Castilloa","Endl.",320 25237,"","Cephalotrophis","Blume",320 18978,"","Chevalierodendron","J.-F.Leroy",320 10605,"","Chlorophora","Gaudich.",320 10606,"","Clarisia","Ruiz & Pav.",320 25267,"","Covellia","Gasp.",320 10607,"","Craterogyne","Lanj.",320 10608,"","Ctenocladium","Airy Shaw",320 10609,"","Cudrania","Trecul",320 10610,"","Cyathanthus","Engl.",320 25268,"","Cystogyne","Gasp.",320 10611,"","Dammaropsis","Warb.",320 18979,"","Dimerocarpus","Gagnep.",320 25253,"","Diplocos","Bureau",320 25255,"","Diplothorax","Gagnep.",320 10612,"","Dorstenia","L.",320 25239,"","Dumartroya","Gaudich.",320 18987,"","Epicarpurus","Blume",320 25272,"","Erythrogyne","Gasp.",320 10613,"","Fatoua","Gaudich.",320 10614,"","Ficus","L.",320 25251,"","Fusticus","Raf.",320 18991,"","Galactodendron","Kunth",320 25269,"","Galoglychia","Gasp.",320 25257,"","Gonosuke","Raf.",320 16908,"","Gymnartocarpus","Boerl.",320 10615,"","Helianthostylis","Baill.",320 10616,"","Helicostylis","Trecul",320 10617,"","Hullettia","King ex Hook.f.",320 18997,"","Inophloeum","Pittier",320 25250,"","Ioxylon","Raf.",320 19002,"","Kosaria","Forssk.",320 10618,"","Lanessania","Baill.",320 18989,"","Laurea","Gaudich.",320 25241,"","Lepurandra","Graham",320 10619,"","Maclura","Nutt.",320 25273,"","Macrophthalmia","Gasp.",320 10620,"","Maillardia","Frapp. & Duch.",320 10621,"","Malaisia","Blanco",320 10622,"","Maquira","Aubl.",320 25258,"","Mastosuke","Raf.",320 10623,"","Mesogyne","Engl.",320 17332,"","Milicia","Sim",320 10625,"","Morus","L.",320 10626,"","Naucleopsis","Miq.",320 25259,"","Necalistis","Raf.",320 10627,"","Neosloetiopsis","Engl.",320 18995,"","Noyera","Trecul",320 18996,"","Ogcodeia","Bureau",320 10628,"","Olmedia","Ruiz & Pav.",320 18992,"","Olmedioperebea","Ducke",320 18993,"","Olmediophaena","H.Karst.",320 25242,"","Olmediopsis","H.Karst.",320 25260,"","Oluntos","Raf.",320 10629,"","Pachytrophe","Bureau",320 16909,"","Palmolmedia","Ducke",320 25243,"","Papyrius","Lam.",320 19000,"","Paraclarisia","Ducke",320 10630,"","Parartocarpus","Baill.",320 24605,"","Paratrophis","Blume",320 25256,"","Pella","Gaertn.",320 10631,"","Perebea","Aubl.",320 25261,"","Perula","Raf.",320 24607,"","Pharmacosycea","Miq.",320 18980,"","Phyllochlamys","Bureau",320 16910,"","Piratinera","Aubl.",320 10632,"","Plecospermum","Trecul",320 25275,"","Pogonotrophe","Miq.",320 25244,"","Pontya","A.Chev.",320 10633,"","Poulsenia","Eggers",320 10634,"","Prainea","King ex Hook.f.",320 10635,"","Pseudolmedia","Trecul",320 18981,"","Pseudomorus","Bureau",320 19001,"","Pseudosorocea","Baill.",320 25291,"","Pseudostreblus","Bureau",320 18982,"","Pseudostrophis","T.Durand & B.D.Jacks.",320 18983,"","Pseudotrophis","Warb.",320 25262,"","Rephesis","Raf.",320 10636,"","Sahagunia","Liebm.",320 10637,"","Scyphosyce","Baill.",320 18998,"","Sitodium","Parkinson",320 25245,"","Skutchia","Pax & K.Hoffm. ex C.V.Morton",320 18984,"","Sloetia","Teijsm. & Binn. ex Kurz",320 10638,"","Sloetiopsis","Engl.",320 18988,"","Smithiodendron","Hu",320 10639,"","Sorocea","A.St.-Hil.",320 10640,"","Sparattosyce","Bureau",320 25292,"","Stenochasma","Miq.",320 25278,"","Stilpnophyllum","(Endl.) Drury",320 10641,"","Streblus","Lour.",320 25246,"","Sychinium","Desv.",320 19003,"","Sycodendron","Rojas Acosta",320 25265,"","Sycomorphe","Miq.",320 25274,"","Sycomorus","Gasp.",320 25276,"","Synoecia","Miq.",320 18985,"","Taxotrophis","Blume",320 25270,"","Tenorea","Gasp.",320 18986,"","Teonongia","Stapf",320 10642,"","Treculia","Decne. ex Trecul",320 25263,"","Tremotis","Raf.",320 17328,"","Trilepisium","Thouars",320 10643,"","Trophis","P.Browne",320 25247,"","Trophisomia","Rojas Acosta",320 10644,"","Trymatococcus","Poepp. & Endl.",320 25249,"","Uleodendron","Rauschert",320 25254,"","Uromorus","Bureau",320 24606,"","Urostigma","Gasp.",320 10645,"","Utsetela","Pellegr.",320 25248,"","Vanieria","Lour.",320 25264,"","Varinga","Raf.",320 25271,"","Visiania","Gasp.",320 14836,"","Acanthocalyx","(DC.) Tiegh.",321 14837,"","Cryptothladia","(Bunge) M.J.Cannon",321 5555,"","Morina","L.",321 2487,"","Moringa","Adans.",322 11610,"","Ensete","Horan.",323 11612,"","Musa","L.",323 25549,"","Musella","(Franch.) C.Y.Wu",323 9113,"","Bontia","L.",324 9114,"","Eremophila","R.Br.",324 9115,"","Myoporum","Banks & Sol. ex G.Forst.",324 9117,"","Pholidia","R.Br.",324 20542,"","Stenochilus","R.Br.",324 10665,"","Canacomyrica","Guillaumin",325 25406,"","Comptonia","L'Her. ex Aiton",325 10666,"","Myrica","L.",325 9803,"","Brochoneura","Warb.",326 9804,"","Cephalosphaera","Warb.",326 9805,"","Coelocaryon","Warb.",326 9806,"","Compsoneura","(DC.) Warb.",326 18019,"","Dialyanthera","Warb.",326 23209,"","Endocomia","W.J.de Wilde",326 9807,"","Gymnacranthera","Warb.",326 9808,"","Haematodendron","Capuron",326 9809,"","Horsfieldia","Willd.",326 9810,"","Iryanthera","Warb.",326 9811,"","Knema","Lour.",326 9812,"","Maloutchia","Warb.",326 9813,"","Myristica","Gronov.",326 24631,"","Ochocoa","Pierre",326 9814,"","Osteophloeum","Warb.",326 9815,"","Otoba","(DC.) H.Karst.",326 9816,"","Pycnanthus","Warb.",326 9817,"","Scyphocephalium","Warb.",326 9818,"","Staudtia","Warb.",326 9819,"","Virola","Aubl.",326 3473,"","Myrothamnus","Welw.",327 7106,"","Abromeitia","Mez",328 7107,"","Aegiceras","Gaertn.",328 7108,"","Afrardisia","Mez",328 15893,"","Amatlania","Lundell",328 7109,"","Amblyanthopsis","Mez",328 7110,"","Amblyanthus","A.DC.",328 7111,"","Antistrophe","A.DC.",328 7112,"","Ardisia","Sw.",328 16032,"","Auriculardisia","Lundell",328 7113,"","Badula","Juss.",328 25677,"","Chontalesia","Lundell",328 18086,"","Comomyrsine","Hook.f.",328 7114,"","Conandrium","(K.Schum.) Mez",328 7115,"","Conomorpha","A.DC.",328 7116,"","Correlliana","D'Arcy",328 7117,"","Ctenardisia","Ducke",328 14263,"","Cybianthopsis","(Mez) Lundell",328 7118,"","Cybianthus","Mart.",328 7119,"","Discocalyx","(A.DC.) Mez",328 7120,"","Elingamita","G.T.S.Baylis",328 7121,"","Embelia","Burm.f.",328 25681,"","Emblemantha","B.C.Stone",328 7122,"","Fittingia","Mez",328 7123,"","Geissanthus","Hook.f.",328 14264,"","Gentlea","Lundell",328 7124,"","Grammadenia","Benth.",328 24292,"","Graphardisia","(Mez) Lundell",328 7125,"","Grenacheria","Mez",328 7126,"","Heberdenia","Banks ex DC.",328 7127,"","Hymenandra","(DC.) Spach",328 25676,"","Ibarraea","Lundell",328 15892,"","Icacorea","Aubl.",328 18088,"","Julibaria","Mez",328 7128,"","Labisia","Lindl.",328 7129,"","Loheria","Merr.",328 7130,"","Maesa","Forssk.",328 25382,"","Microconomorpha","(Mez) Lundell",328 7131,"","Monoporus","A.DC.",328 7132,"","Myrsine","L.",328 25678,"","Oerstedianthus","Lundell",328 7133,"","Oncostemum","A.Juss.",328 24251,"","Parardisia","M.P.Nayar & G.S.Giri",328 7134,"","Parathesis","(A.DC.) Hook.f.",328 25381,"","Peckia","Vell.",328 18084,"","Pilogyne","Gagnep.",328 16882,"","Pimelandra","A.DC.",328 7135,"","Pleiomeris","A.DC.",328 7136,"","Rapanea","Aubl.",328 7137,"","Sadiria","Mez",328 18087,"","Samara","L.",328 7138,"","Solonia","Urb.",328 7139,"","Stylogyne","A.DC.",328 7140,"","Suttonia","A.Rich.",328 16881,"","Synardisia","(Mez) Lundell",328 7141,"","Tapeinosperma","Hook.f.",328 7142,"","Tetrardisia","Mez",328 24293,"","Valerioanthus","Lundell",328 7143,"","Vegaea","Urb.",328 7144,"","Wallenia","Sw.",328 7145,"","Walleniella","P.Wilson",328 7146,"","Weigeltia","A.DC.",328 7147,"","Yunckeria","Lundell",328 25679,"","Zunilia","Lundell",328 3536,"","Abbevillea","O.Berg",329 3537,"","Acca","O.Berg",329 25571,"","Accara","Landrum",329 16480,"","Acicalyptus","A.Gray",329 3538,"","Acmena","DC.",329 20735,"","Acmenosperma","Kausel",329 3539,"","Acrandra","O.Berg",329 3540,"","Acreugenia","Kausel",329 3541,"","Actinodium","Schauer",329 20672,"","Agalmanthus","(Endl.) Hombr. & Jacquinot",329 3542,"","Agonis","(DC.) Sweet",329 20705,"","Aguava","Raf.",329 20619,"","Allostis","Raf.",329 3543,"","Allosyncarpia","S.T.Blake",329 20715,"","Amomis","O.Berg",329 3544,"","Amomyrtella","Kausel",329 3545,"","Amomyrtus","(Burret) D.Legrand & Kausel",329 16478,"","Amyrsia","Raf.",329 20698,"","Anamomis","Griseb.",329 14845,"","Angasomyrtus","Trudgen & Keighery",329 3546,"","Angophora","Cav.",329 20736,"","Aphanomyrtus","Miq.",329 3547,"","Archirhodomyrtus","(Nied.) Burret",329 3548,"","Arillastrum","Pancher ex Baill.",329 20663,"","Aromadendron","Andrews ex Steud.",329 20692,"","Aspidogenia","Burret",329 3549,"","Astartea","DC.",329 20644,"","Asteromyrtus","Schauer",329 20607,"","Astraea","Schauer",329 3551,"","Aulomyrcia","O.Berg",329 3552,"","Austromyrtus","(Nied.) Burret",329 20633,"","Auticoryne","Turcz.",329 20622,"","Babingtonia","Lindl.",329 3553,"","Backhousia","Hook. & Harv.",329 3554,"","Baeckea","L.",329 3555,"","Balaustion","Hook.",329 20673,"","Ballardia","Montrouz.",329 24236,"","Barongia","Peter G.Wilson & B.Hyland",329 3556,"","Basisperma","C.T.White",329 20661,"","Baudinia","Lesch. ex DC.",329 3557,"","Beaufortia","R.Br.",329 20639,"","Billotia","R.Br. ex G.Don",329 20660,"","Billottia","Colla",329 3558,"","Blepharocalyx","O.Berg",329 20737,"","Bostrychode","Miq. ex O.Berg",329 3559,"","Britoa","O.Berg",329 20610,"","Bucheria","Heynh.",329 20682,"","Burcardia","Neck. ex Raf.",329 20643,"","Cajuputi","Adans.",329 3560,"","Callistemon","R.Br.",329 3561,"","Calothamnus","Labill.",329 3562,"","Calycampe","O.Berg",329 3563,"","Calycolpus","O.Berg",329 3564,"","Calycorectes","O.Berg",329 20605,"","Calycothrix","Meisn.",329 3565,"","Calyptranthes","Sw.",329 20738,"","Calyptranthus","Blume",329 3566,"","Calyptrogenia","Burret",329 3567,"","Calyptromyrcia","O.Berg",329 20683,"","Calyptropsidium","O.Berg",329 20604,"","Calythrix","Labill.",329 3568,"","Calythropsis","C.A.Gardner",329 3569,"","Calytrix","Labill.",329 20626,"","Camphoromyrtus","Schauer",329 3570,"","Campomanesia","Ruiz & Pav.",329 23064,"","Carpolepis","(J.W.Dawson) J.W.Dawson",329 20739,"","Caryophyllus","L.",329 20732,"","Catinga","Aubl.",329 20740,"","Cerocarpus","Colebr. ex Hassk.",329 20707,"","Cerqueiria","O.Berg",329 3571,"","Chamelaucium","Desf.",329 25770,"","Chamguava","Landrum",329 20638,"","Cheynia","J.Drumm. ex Harv.",329 20720,"","Chloromyrtus","Pierre",329 3572,"","Choricarpia","Domin",329 20602,"","Chrysorhoe","Lindl.",329 20712,"","Chytraculia","P.Browne",329 20710,"","Chytralia","Adans.",329 20741,"","Clavimyrtus","Blume",329 3573,"","Cleistocalyx","Blume",329 3574,"","Cloezia","Brongn. & Gris",329 20694,"","Cluacena","Raf.",329 3575,"","Conothamnus","Lindl.",329 14278,"","Corynanthera","J.W.Green",329 3576,"","Corynemyrtus","(Kiaersk.) Mattos",329 3577,"","Cryptorhiza","Urb.",329 20598,"","Cryptostemon","F.Muell. ex Miq.",329 20706,"","Cumetea","Raf.",329 3675,"","Cupheanthus","Seem.",329 20632,"","Cyathostemon","Turcz.",329 20688,"","Cynomyrtus","Scriv.",329 3578,"","Darwinia","Rudge",329 20603,"","Decalophium","Turcz.",329 3579,"","Decaspermum","J.R.Forst. & G.Forst.",329 20675,"","Draparnaudia","Montrouz.",329 20630,"","Drosodendron","Roem.",329 20721,"","Emurtia","Raf.",329 20662,"","Endesmia","R.Br.",329 20600,"","Enosanthes","A.Cunn. ex Schauer",329 20722,"","Episyzygium","Suess. & A.Ludw.",329 20723,"","Epleienda","Raf.",329 20724,"","Eplejenda","Post & Kuntze",329 14279,"","Eremaea","Lindl.",329 3580,"","Eremaeopsis","Kuntze",329 20635,"","Eremopyxis","Baill.",329 20631,"","Ericomyrtus","Turcz.",329 20666,"","Eucalypton","St.-Lag.",329 3581,"","Eucalyptopsis","C.T.White",329 3582,"","Eucalyptus","L'Her.",329 3583,"","Eugenia","L.",329 20708,"","Eugeniopsis","O.Berg",329 20625,"","Euryomyrtus","Schauer",329 20716,"","Evanesca","Raf.",329 20651,"","Fabricia","Gaertn.",329 20679,"","Feijoa","O.Berg",329 20717,"","Feliciana","Benth.",329 20718,"","Felicianea","Cambess.",329 20701,"","Fenzlia","Endl.",329 23194,"","Francisia","Endl.",329 20676,"","Fremya","Brongn. & Gris",329 20742,"","Gelpkea","Blume",329 20595,"","Genetyllis","DC.",329 3584,"","Gomidesia","O.Berg",329 16479,"","Gomphotis","Raf.",329 20725,"","Greggia","Gaertn.",329 20686,"","Guajava","Mill.",329 20645,"","Gymnagathis","Schauer",329 20628,"","Harmogia","Schauer",329 20596,"","Hedaroma","Lindl.",329 20695,"","Heteromyrtus","Blume",329 3958,"","Heteropyxis","Harv.",329 3585,"","Hexachlamys","O.Berg",329 3586,"","Homalocalyx","F.Muell.",329 20650,"","Homalospermum","Schauer",329 3587,"","Homoranthus","A.Cunn. ex Schauer",329 3588,"","Hottea","Urb.",329 3589,"","Hypocalymma","(Endl.) Endl.",329 20617,"","Imbricaria","Sm.",329 20743,"","Jambos","Adans.",329 20744,"","Jambosa","Adans.",329 20726,"","Jossinia","Comm. ex DC.",329 20615,"","Jungia","Gaertn.",329 20667,"","Kamptzia","Nees",329 22328,"","Kania","Schltr.",329 3590,"","Kjellbergiodendron","Burret",329 20714,"","Krokia","Urb.",329 20709,"","Krugia","Urb.",329 3591,"","Kunzea","Rchb.",329 20681,"","Lacerdaea","O.Berg",329 3592,"","Lamarchea","Gaudich.",329 20656,"","Lamarkea","Rchb.",329 3593,"","Legrandia","Kausel",329 20745,"","Leptomyrtus","Miq. ex O.Berg",329 3594,"","Leptospermopsis","S.Moore",329 3595,"","Leptospermum","J.R.Forst. & G.Forst.",329 3596,"","Lhotskya","Schauer",329 3597,"","Lindsayomyrtus","B.Hyland & Steenis",329 20731,"","Lomastelma","Raf.",329 3598,"","Lophomyrtus","Burret",329 14228,"","Lophostemon","Schott",329 3599,"","Luma","A.Gray",329 3600,"","Lysicarpus","F.Muell.",329 20653,"","Macklottia","Korth.",329 20746,"","Macromyrtus","Miq.",329 20689,"","Macropsidium","Blume",329 20747,"","Malidra","Raf.",329 14844,"","Malleostemon","J.W.Green",329 20658,"","Manglesia","Lindl.",329 3601,"","Marlierea","Cambess.",329 3602,"","Marlieriopsis","Kiaersk.",329 20670,"","Mearnsia","Merr.",329 20647,"","Meladendron","St.-Lag.",329 3603,"","Melaleuca","L.",329 20646,"","Melaleucon","St.-Lag.",329 20648,"","Melanoleuca","St.-Lag.",329 3604,"","Mentodendron","Lundell",329 3605,"","Meteoromyrtus","Gamble",329 3606,"","Metrosideros","Banks ex Gaertn.",329 20748,"","Microjambosa","Blume",329 3607,"","Micromyrtus","Benth.",329 25567,"","Microsideros","Baum.-Bod.",329 3608,"","Mitranthes","O.Berg",329 24237,"","Mitrantia","Peter G.Wilson & B.Hyland",329 16482,"","Mitropsidium","Burret",329 20616,"","Mollia","J.F.Gmel.",329 3609,"","Monimiastrum","J.Gueho & A.J.Scott",329 20699,"","Monoxora","Wight",329 20668,"","Mooria","Montrouz.",329 20690,"","Mosiera","Small",329 16483,"","Mozartia","Urb.",329 20620,"","Murrinea","Raf.",329 20693,"","Myrceugenella","Kausel",329 3610,"","Myrceugenia","O.Berg",329 3611,"","Myrcia","DC. ex Guill.",329 16484,"","Myrcialeucus","Rojas Acosta",329 3612,"","Myrcianthes","O.Berg",329 3613,"","Myrciaria","O.Berg",329 3614,"","Myrciariopsis","Kausel",329 3615,"","Myrrhinium","Schott",329 3616,"","Myrtastrum","Burret",329 3617,"","Myrtekmania","Urb.",329 3618,"","Myrtella","F.Muell.",329 3619,"","Myrteola","O.Berg",329 20749,"","Myrthoides","Wolf",329 20691,"","Myrthus","Scop.",329 3620,"","Myrtus","L.",329 20674,"","Nani","Adans.",329 20703,"","Nelitris","Spreng.",329 23065,"","Neofabricia","Joy Thomps.",329 25569,"","Neomitranthes","Legrand",329 3621,"","Neomyrtus","Burret",329 20618,"","Neuhofia","Stokes",329 3622,"","Nothomyrcia","Kausel",329 23066,"","Ochrosperma","Trudgen",329 3623,"","Octamyrtus","Diels",329 20750,"","Opa","Lour.",329 20700,"","Opanea","Raf.",329 20680,"","Orthostemon","O.Berg",329 3624,"","Osbornia","F.Muell.",329 20629,"","Oxymyrrhine","Schauer",329 3625,"","Paivaea","O.Berg",329 16485,"","Paramitranthes","Burret",329 3626,"","Paramyrciaria","Kausel",329 20751,"","Pareugenia","Turrill",329 20608,"","Paryphantha","Schauer",329 20641,"","Pentagonaster","Klotzsch",329 20652,"","Pericalymma","(Endl.) Endl.",329 20654,"","Pericalymna","Meisn.",329 20727,"","Phyllocalyx","O.Berg",329 3628,"","Phymatocarpus","F.Muell.",329 3629,"","Pileanthus","Labill.",329 3630,"","Pilidiostigma","Burret",329 3631,"","Piliocalyx","Brongn. & Gris",329 3632,"","Pilothecium","(Kiaersk.) Kausel",329 3633,"","Pimenta","Lindl.",329 20713,"","Pimentus","Raf.",329 20611,"","Piptandra","Turcz.",329 3634,"","Pleurocalyptus","Brongn. & Gris",329 3635,"","Plinia","L.",329 20597,"","Polyzone","Endl.",329 20612,"","Pritzelia","Schauer",329 3636,"","Pseudanamomis","Kausel",329 3637,"","Pseudocaryophyllus","O.Berg",329 3638,"","Pseudoeugenia","Scort.",329 16486,"","Pseudomyrcianthes","Kausel",329 20728,"","Psidiastrum","Bello",329 20687,"","Psidiomyrtus","Guillaumin",329 20685,"","Psidiopsis","O.Berg",329 3639,"","Psidium","L.",329 3685,"","Psiloxylon","Thouars ex Tul.",329 20637,"","Punicella","Turcz.",329 3640,"","Purpureostemon","Gugerli",329 20704,"","Pyrenocarpa","H.T.Chang & R.H.Miao",329 3641,"","Regelia","Schauer",329 3642,"","Reichea","Kausel",329 24560,"","Reicheia","Kausel",329 3643,"","Rhodamnia","Jack",329 3644,"","Rhodomyrtus","(DC.) Rchb.",329 20613,"","Rinzia","Schauer",329 14216,"","Ristantia","Peter G.Wilson & J.T.Waterh.",329 16481,"","Rubachia","O.Berg",329 3645,"","Rylstonea","R.T.Baker",329 20702,"","Saffordiella","Merr.",329 20677,"","Salisia","Brongn. & Gris",329 20642,"","Salisia","Lindl.",329 20624,"","Schidiomyrtus","Schauer",329 16487,"","Schizocalomyrtus","Kausel",329 20733,"","Schizocalyx","O.Berg",329 20659,"","Schizopleura","Endl.",329 3646,"","Scholtzia","Schauer",329 20599,"","Schuermannia","F.Muell.",329 3647,"","Sinoga","S.T.Blake",329 3648,"","Siphoneugena","O.Berg",329 20669,"","Spermolepis","Brongn. & Gris",329 24238,"","Sphaerantia","Peter G.Wilson & B.Hyland",329 20729,"","Stenocalyx","O.Berg",329 20671,"","Stenospermum","Sweet ex Heynh.",329 3649,"","Stereocaryum","Burret",329 20752,"","Strongylocalyx","Blume",329 20754,"","Syllisium","Endl.",329 20753,"","Syllysium","Meyen & Schauer",329 20665,"","Symphyomyrtus","Schauer",329 3650,"","Syncarpia","Ten.",329 3651,"","Syzygium","Gaertn.",329 3652,"","Temu","O.Berg",329 3653,"","Tepualia","Griseb.",329 20755,"","Tetraeugenia","Merr.",329 20627,"","Tetrapora","Schauer",329 20634,"","Tetraspora","Miq.",329 20719,"","Tetrastemon","Hook. & Arn.",329 3654,"","Thryptomene","Endl.",329 25433,"","Tillospermum","Griff.",329 20614,"","Tjongina","Adans.",329 20657,"","Trichobasis","Turcz.",329 20606,"","Trichocalyx","Schauer",329 20594,"","Triphelia","R.Br. ex Endl.",329 20621,"","Triplarina","Raf.",329 3655,"","Tristania","R.Br.",329 14229,"","Tristaniopsis","Brongn. & Gris",329 20609,"","Tryptomene","Walp.",329 3656,"","Ugni","Turcz.",329 3657,"","Uromyrtus","Burret",329 3658,"","Verticordia","DC.",329 14846,"","Waterhousea","B.Hyland",329 3659,"","Wehlia","F.Muell.",329 14217,"","Welchiodendron","Peter G.Wilson & J.T.Waterh.",329 3660,"","Whiteodendron","Steenis",329 3661,"","Xanthomyrtus","Diels",329 3662,"","Xanthostemon","F.Muell.",329 20730,"","Xenodendron","K.Schum. & Lauterb.",329 338,"","Nelumbo","Adans.",330 9764,"","Nepenthes","L.",331 9219,"","Nesogenes","A.DC.",332 3293,"","Grielum","L.",333 3294,"","Neurada","L.",333 3295,"","Neuradopsis","Bremek. & Oberm.",333 9430,"","Abronia","Juss.",334 9431,"","Acleisanthes","A.Gray",334 9432,"","Allionia","L.",334 9433,"","Allioniella","Rydb.",334 9434,"","Ammocodon","Standl.",334 9435,"","Andradea","Allemao",334 9436,"","Anulocaulis","Standl.",334 14211,"","Belemia","Pires",334 9437,"","Boerhavia","L.",334 9438,"","Boldoa","Cav. ex Lag.",334 9439,"","Bougainvillea","Comm. ex Juss.",334 23215,"","Calpidia","Thouars",334 9440,"","Caribea","Alain",334 9441,"","Ceodes","J.R.Forst. & G.Forst.",334 9442,"","Cephalotomandra","H.Karst. & Triana",334 9443,"","Colignonia","Endl.",334 16670,"","Colliguonia","Endl.",334 9444,"","Commicarpus","Standl.",334 9445,"","Cryptocarpus","Kunth",334 9446,"","Cuscatlania","Standl.",334 9447,"","Cyphomeris","Standl.",334 9448,"","Grajalesia","Miranda",334 9449,"","Guapira","Aubl.",334 18013,"","Heimerlia","Skottsb.",334 9450,"","Heimerliodendron","Skottsb.",334 16671,"","Hermidium","S.Watson",334 9451,"","Hesperonia","Standl.",334 9452,"","Izabalaea","Lundell",334 9453,"","Leucaster","Choisy",334 9454,"","Mirabilis","L.",334 9455,"","Neea","Ruiz & Pav.",334 25351,"","Neeopsis","Lundell",334 9456,"","Nyctaginia","Choisy",334 9457,"","Okenia","Schltdl. & Cham.",334 9458,"","Oxybaphus","L'Her. ex Willd.",334 9459,"","Phaeoptilum","Radlk.",334 9460,"","Pisonia","L.",334 9461,"","Pisoniella","(Heimerl) Standl.",334 9462,"","Quamoclidion","Choisy",334 9463,"","Ramisia","Glaz. ex Baill.",334 9464,"","Reichenbachia","Spreng.",334 9465,"","Rockia","Heimerl",334 9466,"","Salpianthus","Bonpl.",334 9467,"","Selinocarpus","A.Gray",334 18011,"","Senckenbergia","Post & Kuntze",334 18014,"","Timeroya","Benth.",334 18015,"","Timeroyea","Montrouz.",334 15908,"","Torrubia","Vell.",334 18016,"","Torrukia","Vell.",334 18012,"","Tricycla","Cav.",334 9468,"","Tripterocalyx","(Torr.) Hook.",334 22273,"","Wedelia","Loefl.",334 18010,"","Wedeliella","Cockerell",334 336,"","Barclaya","Wall.",335 337,"","Euryale","Salisb.",335 24686,"","Hydrostemma","Wall.",335 339,"","Nuphar","Sm.",335 340,"","Nymphaea","L.",335 341,"","Ondinea","Hartog",335 342,"","Victoria","Lindl.",335 1876,"","Adenanthe","Maguire, Steyerm. & Wurdack",336 1877,"","Adenarake","Maguire & Wurdack",336 1878,"","Blastemanthus","Planch.",336 1879,"","Brackenridgea","A.Gray",336 17810,"","Campylospermum","Tiegh.",336 1880,"","Cespedesia","Goudot",336 25130,"","Charidion","Bong.",336 17809,"","Diporidium","H.L.Wendl.",336 17812,"","Distephania","Gagnep.",336 1882,"","Elvasia","DC.",336 25789,"","Epiblepharis","Tiegh.",336 1883,"","Euthemis","Jack",336 1884,"","Fleurydora","A.Chev.",336 25787,"","Fournieria","Tiegh.",336 1885,"","Godoya","Ruiz & Pav.",336 16411,"","Gomphia","Schreb.",336 25791,"","Hilairella","Tiegh.",336 25784,"","Hostmannia","Planch.",336 16412,"","Idertia","Farron",336 1886,"","Indosinia","J.E.Vidal",336 1887,"","Indovethia","Boerl.",336 16413,"","Kaieteuria","Dwyer",336 1888,"","Krukoviella","A.C.Sm.",336 16414,"","Lavradia","Vell. ex Vand.",336 1889,"","Leitgebia","Eichler",336 1890,"","Lophira","Banks ex C.F.Gaertn.",336 1891,"","Luxemburgia","A.St.-Hil.",336 16415,"","Neckia","Korth.",336 1892,"","Ochna","L.",336 1893,"","Ouratea","Aubl.",336 1894,"","Pentaspatella","Gleason",336 25790,"","Periblepharis","Tiegh.",336 25302,"","Perissocarpa","Steyerm. & Maguire",336 1895,"","Philacra","Dwyer",336 25786,"","Planchonella","Tiegh.",336 25788,"","Plectanthera","Mart. & Zucc.",336 22220,"","Pleuroridgea","Tiegh.",336 1896,"","Poecilandra","Tul.",336 17811,"","Rhabdophyllum","Tiegh.",336 1897,"","Rhytidanthera","(Planch.) Tiegh.",336 16416,"","Roraimanthus","Gleason",336 1898,"","Sauvagesia","L.",336 1899,"","Schuurmansia","Blume",336 1900,"","Schuurmansiella","Hallier f.",336 1901,"","Sinia","Diels",336 1902,"","Testulea","Pellegr.",336 25131,"","Trichovaselia","Tiegh.",336 1903,"","Tyleria","Gleason",336 25785,"","Vaselia","Tiegh.",336 1904,"","Vausagesia","Baill.",336 1905,"","Wallacea","Spruce ex Hook.",336 24402,"","Acrolobus","Klotzsch",337 1986,"","Anacolosa","(Blume) Blume",337 1987,"","Aptandra","Miers",337 17821,"","Aptandropsis","Ducke",337 1988,"","Brachynema","Benth.",337 1989,"","Cathedra","Miers",337 1990,"","Chaunochiton","Benth.",337 1991,"","Coula","Baill.",337 1992,"","Curupira","G.A.Black",337 1993,"","Diogoa","Exell & Mendonca",337 23087,"","Douradoa","Sleumer",337 24406,"","Drebbelia","Zoll.",337 1994,"","Dulacia","Vell.",337 16419,"","Eganthus","Tiegh.",337 16420,"","Endusa","Miers",337 1995,"","Erythropalum","Blume",337 24403,"","Fissilia","Comm. ex Juss.",337 1996,"","Harmandia","Pierre ex Baill.",337 1997,"","Heisteria","Jacq.",337 17822,"","Hemiheisteria","Tiegh.",337 24401,"","Hesioda","Vell.",337 24407,"","Heymassoli","Aubl.",337 17826,"","Lavallea","Baill.",337 17827,"","Lavalleopsis","Tiegh.",337 17825,"","Liriosma","Poepp. & Endl.",337 25600,"","Malania","Chun & S.K.Lee",337 1998,"","Minquartia","Aubl.",337 1999,"","Ochanostachys","Mast.",337 2000,"","Octoknema","Pierre",337 2001,"","Olax","L.",337 2002,"","Ongokea","Pierre",337 17823,"","Phanerocalyx","S.Moore",337 2004,"","Phanerodiscus","Cavaco",337 24409,"","Pimecaria","Raf.",337 24404,"","Pseudaleia","Thouars",337 2005,"","Ptychopetalum","Benth.",337 17824,"","Rhaptostylum","Humb. & Bonpl.",337 24408,"","Rottboelia","Scop.",337 17828,"","Sagotanthus","Tiegh.",337 2006,"","Schoepfia","Schreb.",337 17829,"","Schoepfiopsis","Miers",337 2007,"","Scorodocarpus","Becc.",337 24405,"","Spermaxyrum","Labill.",337 2008,"","Strombosia","Blume",337 2009,"","Strombosiopsis","Engl.",337 2010,"","Tetrastylidium","Engl.",337 2011,"","Ximenia","L.",337 25602,"","Ximeniopsis","Alain",337 7270,"","Abeliophyllum","Nakai",338 15263,"","Adelia","P.Browne",338 14108,"","Amarolea","Small",338 15295,"","Apilia","Raf.",338 14109,"","Aplilia","Raf.",338 14110,"","Bigelovia","Sm.",338 15334,"","Binia","Noronha ex Thouars",338 14111,"","Bolivaria","Cham. & Schltdl.",338 14112,"","Bonamica","Vell.",338 15338,"","Borya","Willd.",338 15357,"","Busbeckia","Hecart",338 14113,"","Calycomelia","Kostel.",338 15370,"","Calyptrospermum","A.Dietr.",338 14114,"","Campanolea","Gilg & Schellenb.",338 14115,"","Carpoxis","Raf.",338 14116,"","Cartrema","Raf.",338 14117,"","Ceranthus","Schreb.",338 7271,"","Chionanthus","L.",338 14118,"","Chondrospermum","Wall. ex G.Don",338 7272,"","Comoranthus","Knobl.",338 14119,"","Cylindria","Lour.",338 14120,"","Dekindtia","Gilg",338 15443,"","Desfontainesia","Hoffmanns.",338 14121,"","Enaimon","Raf.",338 14122,"","Esquirolia","H.Lev.",338 14123,"","Faulia","Raf.",338 16884,"","Fontainesia","Post & Kuntze",338 7273,"","Fontanesia","Labill.",338 7274,"","Forestiera","Poir.",338 7275,"","Forsythia","Vahl",338 14124,"","Fraxinoides","Medik.",338 7276,"","Fraxinus","L.",338 15513,"","Freyeria","Scop.",338 14125,"","Geisarina","Raf.",338 14126,"","Gymelaea","(Endl.) Spach",338 7277,"","Haenianthus","Griseb.",338 15549,"","Henslowia","Lowe ex DC.",338 7278,"","Hesperelaea","A.Gray",338 15573,"","Jacksonia","Hort. ex Schltdl.",338 15574,"","Jasminium","Dumort.",338 7279,"","Jasminum","L.",338 15576,"","Keiria","Bowdich",338 14127,"","Leptalix","Raf.",338 14128,"","Leuranthus","Knobl.",338 14129,"","Ligustridium","Spach",338 14130,"","Ligustrina","Rupr.",338 7280,"","Ligustrum","L.",338 14131,"","Lilac","Mill.",338 15609,"","Lilaca","Raf.",338 15610,"","Liliacum","Renault",338 7281,"","Linociera","Sw. ex Schreb.",338 15621,"","Majepea","Post & Kuntze",338 15629,"","Mannaphorus","Raf.",338 14132,"","Mayepea","Aubl.",338 14133,"","Meliopsis","Rchb.",338 7282,"","Menodora","Bonpl.",338 14134,"","Menodoropsis","(A.Gray) Small",338 14135,"","Minutia","Vell.",338 14136,"","Mogorium","Juss.",338 15661,"","Myospyrum","Lindl.",338 7283,"","Myxopyrum","Blume",338 14137,"","Nathusia","Hochst.",338 7284,"","Nestegis","Raf.",338 14138,"","Noldeanthus","Knobl.",338 15677,"","Noronhaea","Post & Kuntze",338 7285,"","Noronhia","Stadman ex Thouars",338 7286,"","Notelaea","Vent.",338 15678,"","Notelea","Raf.",338 14139,"","Nudilus","Raf.",338 7287,"","Olea","L.",338 14140,"","Ornanthes","Raf.",338 14141,"","Ornus","Boehm.",338 7288,"","Osmanthus","Lour.",338 14159,"x","Osmarea","Burkwood & Skipwith",338 14142,"","Pachyderma","Blume",338 14143,"","Parasyringa","W.W.Sm.",338 15698,"","Pausia","Raf.",338 14144,"","Petlomelia","Nieuwl.",338 15712,"","Phillyraea","Moench",338 7289,"","Phillyrea","L.",338 15713,"","Philyrea","Blume",338 14145,"","Phlyarodoxa","S.Moore",338 15716,"","Phyllirea","Duhamel",338 7290,"","Picconia","DC.",338 14146,"","Picricarya","Dennst.",338 14148,"","Pogenda","Raf.",338 14149,"","Postuera","Raf.",338 14150,"","Rangium","Juss.",338 14151,"","Rhysospermum","C.F.Gaertn.",338 14152,"","Samarpsea","Raf.",338 7291,"","Schrebera","Roxb.",338 14153,"","Siphonosmanthus","Stapf",338 14154,"","Steganthus","Knobl.",338 14155,"","Stereoderma","Blume",338 7292,"","Syringa","L.",338 7293,"","Tessarandra","Miers",338 14156,"","Tetrapilus","Lour.",338 15824,"","Thuinia","Raf.",338 14158,"","Visiania","DC.",338 13624,"","Arthropteris","J.Sm.",339 21882,"","Lepidoneuron","Fee",339 21883,"","Leptopleuron","C.Presl",339 21881,"","Lindsayoides","Nakai",339 13625,"","Nephrolepis","Schott",339 21884,"","Neuronia","D.Don",339 13626,"","Oleandra","Cav.",339 21885,"","Ophiopteris","Reinw.",339 13627,"","Psammiosorus","C.Chr.",339 3957,"","Olinia","Thunb.",340 24592,"","Plectronia","L.",340 20869,"","Agaosizia","Spach",341 20853,"","Anogra","Spach",341 20854,"","Baumannia","Spach",341 24519,"","Blennoderma","Spach",341 3959,"","Boisduvalia","Spach",341 20843,"","Brebissonia","Spach",341 24525,"","Burragea","Donn.Sm. & Rose",341 20856,"","Calylophis","Spach",341 20855,"","Calylophus","Spach",341 3960,"","Camissonia","Link",341 24513,"","Carlostephania","Bubani",341 20878,"","Chamaenerion","Spach",341 22566,"","Chamerion","(Raf.) Raf.",341 16513,"","Chylismia","Nutt.",341 3961,"","Circaea","L.",341 20851,"","Clarckia","Pursh",341 3962,"","Clarkia","Pursh",341 20879,"","Cordylophorum","Rydb.",341 20870,"","Corynostigma","C.Presl",341 22654,"","Cratericarpium","Spach",341 20880,"","Crossostigma","Spach",341 24515,"","Cubospermum","Lour.",341 20871,"","Danthia","Steud.",341 20873,"","Dantia","Boehm.",341 24518,"","Diplandra","Raf.",341 3963,"","Diplandra","Hook. & Arn.",341 20844,"","Ellobium","Lilja",341 20845,"","Encliandra","Zucc.",341 3964,"","Epilobium","L.",341 20848,"","Eucharidium","Fisch. & C.A.Mey.",341 20857,"","Eulobus","Nutt.",341 16509,"","Fissendocarpa","(Haines) Bennet",341 3965,"","Fuchsia","L.",341 20858,"","Galpinsia","Britton",341 3966,"","Gaura","L.",341 20859,"","Gaurella","Small",341 20876,"","Gauridium","Spach",341 20852,"","Gauropsis","C.Presl",341 20860,"","Gauropsis","(Torr. & Frem.) Cockerell",341 3967,"","Gayophytum","A.Juss.",341 16514,"","Godetia","Spach",341 3968,"","Gongylocarpus","Schltdl. & Cham.",341 20863,"","Hartmannia","Spach",341 3969,"","Hauya","Moc. & Sesse ex DC.",341 16510,"","Hemifuchsia","Herrera",341 3970,"","Heterogaura","Rothr.",341 20861,"","Holostigma","Spach",341 20872,"","Isnardia","L.",341 22141,"","Jehlia","Rose",341 16515,"","Jussiaea","L.",341 22649,"","Kierschlegeria","Spach",341 24510,"","Kirschlegera","Rchb.",341 16516,"","Kneiffia","Spach",341 20864,"","Lavauxia","Spach",341 3971,"","Lopezia","Cav.",341 3972,"","Ludwigia","L.",341 20874,"","Ludwigiantha","(Torr. & A.Gray) Small",341 20846,"","Lyciopsis","Spach",341 16517,"","Megapterium","Spach",341 20862,"","Meriolix","Raf. ex Endl.",341 20847,"","Myrinia","Lilja",341 22647,"","Nahusia","Schneev.",341 24517,"","Nemotopyxis","Miq.",341 24511,"","Ocimastrum","Rupr.",341 3973,"","Oenothera","L.",341 25155,"","Oenotheridium","Reiche",341 20865,"","Onagra","Mill.",341 24521,"","Onosuris","Raf.",341 24522,"","Onosurus","G.Don",341 20875,"","Oocarpon","Micheli",341 20849,"","Opsianthes","Lilja",341 16518,"","Pachylophus","Spach",341 22143,"","Pelozia","Rose",341 20866,"","Peniophyllum","Pennell",341 20850,"","Phaestoma","Spach",341 22144,"","Pisaura","Bonato",341 24516,"","Prieuria","DC.",341 16511,"","Pseudolopezia","Rose",341 22653,"","Pyrogennema","Lunell",341 24514,"","Quadricosta","Dulac",341 22646,"","Quelusia","Vand.",341 22652,"","Quiliusa","Hook.f.",341 16519,"","Raimannia","Rose",341 24512,"","Regmus","Dulac",341 16512,"","Riesenbachia","C.Presl",341 20867,"","Salpingia","(Torr. & A.Gray) Raim.",341 20877,"","Schizocarya","Spach",341 22650,"","Schufia","Spach",341 22142,"","Semeiandra","Hook. & Arn.",341 22645,"","Skinnera","J.R.Forst. & G.Forst.",341 22651,"","Spachia","Lilja",341 24523,"","Sphaerostigma","(Ser.) Fisch. & C.A.Mey.",341 3974,"","Stenosiphon","Spach",341 24524,"","Taraxia","(Nutt.) Raim.",341 22648,"","Thilcum","Molina",341 22644,"","Tilco","Adans.",341 24520,"","Usoricum","Lunell",341 3975,"","Xylonagra","Donn.Sm. & Rose",341 20868,"","Xylopleurum","Spach",341 3976,"","Zauschneria","C.Presl",341 2084,"","Oncotheca","Baill.",342 13464,"","Botrychium","Sw.",343 24116,"","Botryopteris","C.Presl",343 21554,"","Botrypus","Michx.",343 21551,"","Cheiroglossa","C.Presl",343 13465,"","Helminthostachys","Kaulf.",343 21555,"","Japanobotrychium","Masam.",343 21557,"","Lunaria","Hill",343 21558,"","Lunularia","Batsch",343 24117,"","Ophiala","Desv.",343 21552,"","Ophioderma","(Blume) Endl.",343 13466,"","Ophioglossum","L.",343 21559,"","Osmundopteris","(J.Milde) Small",343 21553,"","Rhizoglossum","C.Presl",343 21556,"","Sceptridium","Lyon",343 2012,"","Agonandra","Miers ex Hook.f.",344 2013,"","Cansjera","Juss.",344 2014,"","Champereia","Griff.",344 2015,"","Gjellerupia","Lauterb.",344 2016,"","Lepionurus","Blume",344 17830,"","Leptonium","Griff.",344 2017,"","Melientha","Pierre",344 2018,"","Opilia","Roxb.",344 20354,"","Pentarhopalopilia","(Engl.) Hiepko",344 2019,"","Rhopalopilia","Pierre",344 2020,"","Urobotrya","Stapf",344 10722,"","Aa","Rchb.f.",345 10723,"","Abdominea","J.J.Sm.",345 22329,"","Abola","Lindl.",345 22330,"","Acacallis","Lindl.",345 10724,"","Acampe","Lindl.",345 10725,"","Acanthephippium","Blume",345 22331,"","Acanthoglossum","Blume",345 16913,"","Acanthophippium","Blume",345 10726,"","Aceras","R.Br.",345 10727,"","Aceratorchis","Schltr.",345 22332,"","Achroanthes","Raf.",345 22333,"","Acianthera","Scheidw.",345 10728,"","Acianthus","R.Br.",345 23594,"x","Acinbreea","Hort.",345 10729,"","Acineta","Lindl.",345 22334,"","Aclinia","Griff.",345 22335,"","Acoidium","Lindl.",345 10730,"","Acoridium","Nees & Meyen",345 10731,"","Acostaea","Schltr.",345 22336,"","Acraea","Lindl.",345 10732,"","Acriopsis","Blume",345 22337,"","Acroanthes","Raf.",345 22338,"","Acrochaene","Lindl.",345 10733,"","Acrolophia","Pfitzer",345 22339,"","Acronia","C.Presl",345 22340,"","Acropera","Lindl.",345 25673,"","Acrorchis","Dressler",345 22341,"","Acrostylia","Frapp. ex Cordem.",345 10734,"","Ada","Lindl.",345 22342,"","Adactylus","Rolfe",345 23593,"x","Adaglossum","Hort.",345 22343,"","Adelopetalum","Fitzg.",345 22344,"","Adeneleuterophora","Barb.Rodr.",345 10735,"","Adenochilus","Hook.f.",345 10736,"","Adenoncos","Blume",345 22345,"","Adenostylis","Blume",345 23595,"x","Adioda","Hort.",345 22346,"","Adnula","Raf.",345 10737,"","Adrorhizon","Hook.f.",345 22347,"","Aeonia","Lindl.",345 10738,"","Aerangis","Rchb.f.",345 10739,"","Aeranthes","Lindl.",345 23596,"x","Aerasconetia","Hort.",345 23597,"x","Aeridachnis","Hort.",345 10740,"","Aerides","Lour.",345 23598,"x","Aeridisia","Hort.",345 23599,"x","Aeriditis","Hort.",345 22348,"","Aeridium","Salisb.",345 23600,"x","Aeridocentrum","Hort.",345 23601,"x","Aeridochilus","Hort.",345 23602,"x","Aeridofinetia","Hort.",345 23603,"x","Aeridoglossum","Hort.",345 23604,"x","Aeridopsis","Hort.",345 22349,"","Aeridostachya","(Hook.f.) Brieger",345 23605,"x","Aeridovanda","Hort.",345 23606,"x","Aeridovanisia","Hort.",345 22350,"","Aerobion","Kaempf. ex Spreng.",345 22351,"","Aetheria","Blume ex Endl.",345 10741,"","Aganisia","Lindl.",345 22352,"","Aggeianthus","Wight",345 10742,"","Aglossorhyncha","Schltr.",345 10743,"","Agrostophyllum","Blume",345 23607,"x","Aitkenara","Hort.",345 10744,"","Alamania","Lex.",345 23608,"x","Alexanderara","Hort.",345 23609,"x","Aliceara","Hort.",345 22353,"","Alipsea","Hoffmanns.",345 22354,"","Alismorkis","Thouars",345 23610,"x","Allenara","Hort.",345 10745,"","Allochilus","Gagnep.",345 10746,"","Altensteinia","Kunth",345 22355,"","Alvisia","Lindl.",345 22356,"","Amalia","Rchb.",345 10747,"","Amblostoma","Scheidw.",345 25619,"","Amblyanthe","Rauschert",345 22357,"","Amblyglottis","Blume",345 10748,"","Ambrella","H.Perrier",345 10749,"","Amerorchis","Hulten",345 22358,"","Amesia","A.Nelson & J.F.Macbr.",345 10750,"","Amesiella","Schltr. ex Garay",345 10751,"","Amitostigma","Schltr.",345 10752,"","Amparoa","Schltr.",345 10753,"","Amphigena","Rolfe",345 22359,"","Amphiglottis","Salisb.",345 22360,"","Amphorchis","Thouars",345 24070,"x","Anacamptiplatanthera","E.G.Camus",345 10754,"","Anacamptis","Rich.",345 24071,"x","Anacamptorchis","E.G.Camus",345 22361,"","Anacheilium","Hoffmanns.",345 22362,"","Anathallis","Barb.Rodr.",345 10755,"","Ancistrochilus","Rolfe",345 10756,"","Ancistrorhynchus","Finet",345 23530,"","Andreettaea","Luer",345 23611,"x","Andrewara","Hort.",345 10758,"","Androchilus","Liebm. ex Hartm.",345 10759,"","Androcorys","Schltr.",345 22364,"","Androgyne","Griff.",345 22365,"","Anectochilus","Blume",345 22366,"","Angorchis","Thouars",345 23612,"x","Angraecentrum","Hort.",345 10760,"","Angraecopsis","Kraenzl.",345 23613,"x","Angraecostylis","Hort.",345 10761,"","Angraecum","Bory",345 23614,"x","Angraeorchis","Hort.",345 23615,"x","Angrangis","Hort.",345 23616,"x","Angranthes","Hort.",345 10762,"","Anguloa","Ruiz & Pav.",345 23617,"x","Angulocaste","Hort.",345 22367,"","Ania","Lindl.",345 22368,"","Anisopetalum","Hook.",345 22369,"","Anistylis","Raf.",345 10764,"","Ankylocheilos","Summerh.",345 14282,"","Anneliesia","Brieger & Luckel",345 22993,"","Anocheile","Hoffmanns. ex Rchb.",345 17353,"","Anochilus","Rolfe",345 10765,"","Anoectochilus","Blume",345 23618,"x","Anoectomaria","Hort.",345 22371,"","Anota","Schltr.",345 10766,"","Ansellia","Lindl.",345 23619,"x","Ansidium","Hort.",345 25633,"","Anteriorchis","E.Klein & Strack",345 22372,"","Anthericlis","Raf.",345 10767,"","Anthogonium","Wall. ex Lindl.",345 22373,"","Anthogyas","Raf.",345 10768,"","Anthosiphon","Schltr.",345 10769,"","Anticheirostylis","Fitzg.",345 10770,"","Antillanorchis","Garay",345 22374,"","Aopla","Lindl.",345 22992,"","Apation","Blume",345 22375,"","Apatostelis","Garay",345 22376,"","Apaturia","Lindl.",345 22377,"","Apetalon","Wight",345 10772,"","Aphyllorchis","Blume",345 22378,"","Apista","Blume",345 10773,"","Aplectrum","(Nutt.) Torr.",345 10774,"","Aporostylis","Rupp & Hatch",345 22380,"","Aporum","Blume",345 10775,"","Apostasia","Blume",345 10776,"","Appendicula","Blume",345 23620,"x","Aracampe","Hort.",345 25623,"","Aracamunia","Carnevali & I.Ramirez",345 22991,"","Arachnanthe","Blume",345 10777,"","Arachnis","Blume",345 22381,"","Arachnites","F.W.Schmidt",345 23621,"x","Arachnoglossum","Hort.",345 23622,"x","Arachnoglottis","Hort.",345 23623,"x","Arachnopsis","Hort.",345 23624,"x","Arachnostylis","Hort.",345 23625,"x","Aranda","Hort.",345 23626,"x","Aranthera","Hort.",345 10778,"","Archineottia","S.C.Chen",345 10779,"","Arethusa","L.",345 22382,"","Argyrorchis","Blume",345 22383,"","Arhynchium","Lindl. & Paxton",345 22384,"","Arietinum","Beck",345 22385,"","Arisanorchis","Hayata",345 22386,"","Aristolelea","Lour.",345 23627,"x","Arizara","Hort.",345 10780,"","Armodorum","Breda",345 22990,"","Arnedina","Rchb.f.",345 10781,"","Arnottia","A.Rich.",345 10782,"","Arpophyllum","Lex.",345 22387,"","Arthrochilium","Beck",345 10783,"","Arthrochilus","F.Muell.",345 22388,"","Artomeria","Breda",345 10784,"","Artorima","Dressler & G.E.Pollard",345 10785,"","Arundina","Blume",345 22389,"","Asarca","Lindl.",345 23628,"x","Ascandopsis","Hort.",345 17354,"","Ascidieria","Seidenf.",345 23629,"x","Ascocenda","Hort.",345 10786,"","Ascocentrum","Schltr. ex J.J.Sm.",345 10787,"","Ascochilopsis","Carr",345 17355,"","Ascochilus","Ridl.",345 23630,"x","Ascocleinetia","Hort.",345 23631,"x","Ascofinetia","Hort.",345 23632,"x","Ascogastisia","Hort.",345 10788,"","Ascoglossum","Schltr.",345 23633,"x","Ascoglottis","Hort.",345 25636,"","Ascolabium","S.S.Ying",345 23634,"x","Asconopsis","Hort.",345 23635,"x","Ascorachnis","Hort.",345 22299,"","Ascotainia","Ridl.",345 23636,"x","Ascovandoritis","Hort.",345 10789,"","Aspasia","Lindl.",345 23637,"x","Aspasium","Hort.",345 22391,"","Aspegrenia","Poepp. & Endl.",345 10790,"","Aspidogyne","Garay",345 22989,"","Aspla","Rchb.",345 23638,"x","Aspodonia","Hort.",345 23639,"x","Aspoglossum","Hort.",345 22392,"","Astroglossus","Rchb. ex Benth.",345 22393,"","Ate","Lindl.",345 22394,"","Auliza","Small",345 14232,"","Aulosepalum","Garay",345 13993,"","Aulostylis","Schltr.",345 25654,"","Australorchis","Brieger",345 10791,"","Auxopus","Schltr.",345 22988,"","Aviceps","Lindl.",345 23640,"x","Ayubara","Hort.",345 22312,"","Azadehdelia","Braem",345 23641,"x","Bakerara","Hort.",345 23642,"x","Baldwinara","Hort.",345 23643,"x","Banfieldara","Hort.",345 10793,"","Baptistonia","Barb.Rodr.",345 23644,"x","Barangis","Hort.",345 23646,"x","Barbendrum","Hort.",345 23645,"x","Barbosaara","Hort.",345 10794,"","Barbosella","Schltr.",345 17406,"","Barbrodria","Luer",345 10795,"","Barkeria","Knowles & Westc.",345 24072,"x","Barlaceras","E.G.Camus",345 22396,"","Barlaea","Rchb.f.",345 10796,"","Barlia","Parl.",345 10797,"","Barombia","Schltr.",345 10798,"","Bartholina","R.Br.",345 10799,"","Basigyne","J.J.Sm.",345 10800,"","Basiphyllaea","Schltr.",345 10801,"","Baskervillea","Lindl.",345 10802,"","Batemannia","Lindl.",345 23647,"x","Bateostylis","Hort.",345 22397,"","Bathiea","Schltr.",345 23648,"x","Baumannara","Hort.",345 10803,"","Beadlea","Small",345 23649,"x","Beallara","Hort.",345 23650,"x","Beardara","Hort.",345 10804,"","Beclardia","A.Rich.",345 10805,"","Beloglottis","Schltr.",345 10806,"","Benthamia","A.Rich.",345 25672,"","Benzingia","Dodson",345 22398,"","Bicchia","Parl.",345 16914,"","Bicornella","Lindl.",345 22400,"","Bieneria","Rchb.f.",345 10807,"","Biermannia","King & Pantl.",345 22998,"","Bifolium","Nieuwl.",345 10808,"","Bifrenaria","Lindl.",345 22401,"","Bilabrella","Lindl.",345 10809,"","Binotia","Rolfe",345 10810,"","Bipinnula","Comm. ex Juss.",345 22402,"","Birchea","A.Rich.",345 23651,"x","Bishopara","Hort.",345 23652,"x","Blackara","Hort.",345 22403,"","Blephariglottis","Raf.",345 10812,"","Bletia","Ruiz & Pav.",345 22404,"","Bletiana","Raf.",345 10813,"","Bletilla","Rchb.f.",345 23653,"x","Bloomara","Hort.",345 10814,"","Bogoria","J.J.Sm.",345 23654,"x","Bokchoonara","Hort.",345 22405,"","Bolbidium","Lindl.",345 24617,"","Bolborchis","Lindl.",345 10815,"","Bollea","Rchb.f.",345 10816,"","Bolusiella","Schltr.",345 10817,"","Bonatea","Willd.",345 10818,"","Bonniera","Cordem.",345 10819,"","Bothriochilus","Lem.",345 23655,"x","Bovornara","Hort.",345 25621,"","Braasiella","Braem, Luckel & Russmann",345 10820,"","Brachionidium","Lindl.",345 10821,"","Brachtia","Rchb.f.",345 10822,"","Brachycorythis","Lindl.",345 17356,"","Brachypeza","Garay",345 10823,"","Brachystele","Schltr.",345 22406,"","Brachystepis","Pritz.",345 10824,"","Bracisepalum","J.J.Sm.",345 23656,"x","Bradeara","Hort.",345 23589,"","Braemia","Jenny",345 23657,"x","Brapasia","Hort.",345 23658,"x","Brassada","Hort.",345 10825,"","Brassavola","R.Br.",345 10826,"","Brassia","R.Br.",345 23659,"x","Brassidium","Hort.",345 23660,"x","Brassocattleya","Hort.",345 23661,"x","Brassochilus","Hort.",345 23662,"x","Brassodiacrium","Hort.",345 23663,"x","Brassoepidendrum","Hort.",345 23664,"x","Brassoepilaelia","Hort.",345 23665,"x","Brassokeria","Hort.",345 23666,"x","Brassolaelia","Hort.",345 23667,"x","Brassolaeliocattleya","Hort.",345 23668,"x","Brassophronitis","Hort.",345 23669,"x","Brassotonia","Hort.",345 10827,"","Brenesia","Schltr.",345 25674,"","Briegeria","Senghas",345 23670,"x","Brilliandeara","Hort.",345 10828,"","Bromheadia","Lindl.",345 10829,"","Broughtonia","R.Br.",345 23671,"x","Brownara","Hort.",345 10830,"","Brownleea","Harv. ex Lindl.",345 23672,"x","Brummitara","Hort.",345 22408,"","Bryobium","Lindl.",345 22409,"","Bucculina","Lindl.",345 10831,"","Buchtienia","Schltr.",345 23673,"x","Buiara","Hort.",345 22410,"","Bulbophyllaria","Rchb.f.",345 22411,"","Bulbophyllopsis","Rchb.f.",345 10832,"","Bulbophyllum","Thouars",345 10833,"","Bulleyia","Schltr.",345 23674,"x","Burkillara","Hort.",345 10834,"","Burnettia","Lindl.",345 23675,"x","Burrageara","Hort.",345 22412,"","Byurlingtonia","Lindl.",345 10835,"","Cadetia","Gaudich.",345 10836,"","Caladenia","R.Br.",345 10837,"","Calanthe","Ker Gawl.",345 22413,"","Calanthidum","Pfitzer",345 22414,"","Calcearia","Blume",345 22415,"","Calceolaria","Fabr.",345 22997,"","Calceolus","Nieuwl.",345 10838,"","Caleana","R.Br.",345 22416,"","Caleya","R.Br.",345 22417,"","Calliphyllon","Bubani",345 22418,"","Callista","Lour.",345 22419,"","Callithronum","Ehrh.",345 22420,"","Callostylis","Blume",345 10839,"","Calochilus","R.Br.",345 22421,"","Caloglossum","Schltr.",345 22996,"","Calophyllum","L.",345 10840,"","Calopogon","R.Br.",345 22422,"","Calorchis","Barb.Rodr.",345 25671,"","Caluera","Dodson & Determann",345 10841,"","Calymmanthera","Schltr.",345 10842,"","Calypso","Salisb.",345 22423,"","Calypsodium","Link",345 10843,"","Calyptrochilum","Kraenzl.",345 22424,"","Camaridium","Lindl.",345 10844,"","Camarotis","Lindl.",345 10845,"","Camelostalix","Pfitzer",345 22426,"","Camilleugenia","Frapp. ex Cordem.",345 25646,"","Campanulorchis","Brieger",345 23676,"x","Campbellara","Hort.",345 10846,"","Campylocentrum","Benth.",345 24609,"","Canacorchis","Guillaumin",345 10847,"","Capanemia","Barb.Rodr.",345 10848,"","Cardiochilos","P.J.Cribb",345 22427,"","Cardiophyllum","Ehrh.",345 23677,"x","Carterara","Hort.",345 22428,"","Carteretia","A.Rich.",345 23678,"x","Casoara","Hort.",345 22429,"","Catachaetum","Hoffmanns.",345 23679,"x","Catamodes","Hort.",345 23680,"x","Catanoches","Hort.",345 10849,"","Catasetum","Rich. ex Kunth",345 22430,"","Cathea","Salisb.",345 23681,"x","Cattkeria","Hort.",345 10850,"","Cattleya","Lindl.",345 10851,"","Cattleyopsis","Lem.",345 23682,"x","Cattleyopsisgoa","Hort.",345 23683,"x","Cattleyopsistonia","Hort.",345 23684,"x","Cattleytonia","Hort.",345 23685,"x","Cattotes","Hort.",345 10852,"","Caucaea","Schltr.",345 10853,"","Caularthron","Raf.",345 22431,"","Centranthera","Scheidw.",345 22432,"","Centrochilus","Schauer",345 10854,"","Centrogenium","Schltr.",345 10855,"","Centroglossa","Barb.Rodr.",345 10856,"","Centropetalum","Lindl.",345 22433,"","Centrosia","A.Rich.",345 22434,"","Centrosis","Thouars",345 10857,"","Centrostigma","Schltr.",345 22435,"","Cephalangraecum","Schltr.",345 10858,"","Cephalanthera","Rich.",345 22301,"","Cephalantheropsis","Guillaumin",345 22436,"","Ceraia","Lour.",345 10859,"","Ceratandra","Eckl. ex F.A.Bauer",345 22437,"","Ceratium","Blume",345 24315,"","Ceratocentron","Senghas",345 10860,"","Ceratochilus","Blume",345 22438,"","Ceratopsis","Lindl.",345 10861,"","Ceratostylis","Blume",345 22995,"","Cerochilus","Lindl.",345 22439,"","Cestichis","Thouars",345 10862,"","Chaenanthe","Lindl.",345 22440,"","Chaetocephala","Barb.Rodr.",345 10864,"","Chamaeangis","Schltr.",345 10865,"","Chamaeanthus","Schltr. ex J.J.Sm.",345 22441,"","Chamaegastrodia","Makino & F.Maek.",345 22442,"","Chamaerepes","Spreng.",345 17407,"","Chamelophyton","Garay",345 24073,"x","Chamodenia","E.G.Camus",345 10866,"","Chamorchis","Rich.",345 10867,"","Changnienia","S.S.Chien",345 23686,"x","Charlesworthara","Hort.",345 10868,"","Chaseella","Summerh.",345 10869,"","Chaubardia","Rchb.f.",345 10870,"","Chaubardiella","Garay",345 10871,"","Chauliodon","Summerh.",345 10872,"","Cheiradenia","Lindl.",345 22443,"","Cheiropterocephalus","Barb.Rodr.",345 10873,"","Cheirorchis","Carr",345 10874,"","Cheirostylis","Blume",345 22444,"","Chelonanthera","Blume",345 10875,"","Chelonistele","Pfitzer",345 23687,"x","Chewara","Hort.",345 23688,"x","Chilocentrum","Hort.",345 10876,"","Chiloglottis","R.Br.",345 10877,"","Chilopogon","Schltr.",345 10878,"","Chiloschista","Lindl.",345 10879,"","Chitonanthera","Schltr.",345 10880,"","Chitonochilus","Schltr.",345 10881,"","Chloraea","Lindl.",345 10882,"","Chlorosa","Blume",345 22445,"","Choeradoplectron","Schauer",345 22994,"","Chondradenia","Maxim. ex Makino",345 23689,"x","Chondrobollea","Hort.",345 10883,"","Chondrorhyncha","Lindl.",345 23690,"x","Christieara","Hort.",345 10884,"","Chroniochilus","J.J.Sm.",345 22446,"","Chrysobaphus","Wall.",345 10885,"","Chrysocycnis","Linden & Rchb.f.",345 10886,"","Chrysoglossum","Blume",345 23691,"x","Chuanyenara","Hort.",345 10887,"","Chusua","Nevski",345 23692,"x","Chyletia","Hort.",345 10888,"","Chysis","Lindl.",345 10889,"","Chytroglossa","Rchb.f.",345 22447,"","Cionisaccus","Breda",345 22448,"","Ciripedium","Zumagl.",345 10890,"","Cirrhaea","Lindl.",345 10891,"","Cirrhopetalum","Lindl.",345 23693,"x","Cirrhophyllum","Hort.",345 10892,"","Cischweinfia","Dressler & N.H.Williams",345 22450,"","Cistella","Blume",345 10893,"","Claderia","Hook.f.",345 22295,"","Cladobium","Lindl.",345 22452,"","Cladobium","Schltr.",345 10894,"","Cleisocentron","Bruhl",345 23694,"x","Cleisodes","Hort.",345 22302,"","Cleisomeria","Lindl. ex G.Don",345 23695,"x","Cleisonopsis","Hort.",345 23696,"x","Cleisoquetia","Hort.",345 17345,"","Cleisostoma","Blume",345 10895,"","Cleistes","Rich. ex Lindl.",345 10896,"","Clematepistephium","N.Halle",345 10897,"","Clowesia","Lindl.",345 22454,"","Cnemidia","Lindl.",345 10898,"","Coccineorchis","Schltr.",345 23697,"x","Cochella","Hort.",345 10899,"","Cochleanthes","Raf.",345 23698,"x","Cochlecaste","Hort.",345 23699,"x","Cochlenia","Hort.",345 23700,"x","Cochlepetalum","Hort.",345 22455,"","Cochlia","Blume",345 10900,"","Cochlioda","Lindl.",345 10901,"","Codonorchis","Lindl.",345 10902,"","Codonosiphon","Schltr.",345 22456,"","Coelandria","Fitzg.",345 10903,"","Coelia","Lindl.",345 10904,"","Coeliopsis","Rchb.f.",345 10905,"","Coeloglossum","Hartm.",345 10906,"","Coelogyne","Lindl.",345 24074,"x","Coeloplatanthera","E.G.Camus",345 23546,"","Cogniauxiocharis","(Schltr.) Hoehne",345 22453,"","Cohnia","Rchb.f.",345 10908,"","Cohniella","Pfitzer",345 10909,"","Coilochilus","Schltr.",345 22458,"","Coilostylis","Raf.",345 10910,"","Colax","Lindl.",345 25635,"","Collabiopsis","S.S.Ying",345 10911,"","Collabium","Blume",345 22459,"","Collea","Lindl.",345 23701,"x","Colmanara","Hort.",345 22460,"","Colombiana","Ospina",345 10912,"","Comparettia","Poepp. & Endl.",345 10913,"","Comperia","K.Koch",345 22461,"","Conchidium","Griff.",345 22462,"","Conchochilus","Hassk.",345 14236,"","Condylago","Luer",345 22463,"","Conostalix","(Kraenzl.) Brieger",345 23702,"x","Conphronitis","Hort.",345 10914,"","Constantia","Barb.Rodr.",345 22310,"","Corallorhiza","Chatel.",345 10915,"","Corallorrhiza","Gagnebin",345 10916,"","Cordiglottis","J.J.Sm.",345 22464,"","Cordula","Raf.",345 22465,"","Cordyla","Blume",345 22466,"","Cordylestylis","Falc.",345 10917,"","Coryanthes","Hook.",345 10918,"","Corybas","Salisb.",345 10919,"","Corycium","Sw.",345 23703,"x","Coryhopea","Hort.",345 13994,"","Corymbis","Thouars",345 22468,"","Corymborchis","Thouars",345 10920,"","Corymborkis","Thouars",345 13995,"","Corysanthes","R.Br.",345 22470,"","Costaricaea","Schltr.",345 10921,"","Cottonia","Wight",345 25641,"","Cotylolabium","Garay",345 10922,"","Cranichis","Sw.",345 23704,"x","Crawshayara","Hort.",345 10923,"","Cremastra","Lindl.",345 22471,"","Crepidium","Blume",345 22311,"","Cribbia","Senghas",345 22472,"","Crinonia","Blume",345 25660,"","Criogenes","Salisb.",345 22473,"","Crocodeilanthe","Rchb.f.",345 22474,"","Crossangis","Schltr.",345 10924,"","Crybe","Lindl.",345 10925,"","Cryptanthemis","Rupp",345 10926,"","Cryptarrhena","R.Br.",345 10927,"","Cryptocentrum","Benth.",345 10928,"","Cryptochilus","Wall.",345 22476,"","Cryptoglottis","Blume",345 22478,"","Cryptophoranthus","Barb.Rodr.",345 10930,"","Cryptopus","Lindl.",345 17357,"","Cryptopylos","Garay",345 22479,"","Cryptosanus","Scheidw.",345 10931,"","Cryptostylis","R.Br.",345 22480,"","Ctenorchis","K.Schum.",345 22481,"","Cuculina","Raf.",345 15169,"","Cuitlauzina","La Llave & Lex.",345 25675,"","Cutsis","Burns-Bal., E.W.Greenw. & R.Gonzalez",345 10932,"","Cyanaeorchis","Barb.Rodr.",345 22483,"","Cyanorchis","Thouars",345 22484,"","Cyathoglottis","Poepp. & Endl.",345 25628,"","Cybebus","Garay",345 22485,"","Cybelion","Spreng.",345 10933,"","Cyclopogon","C.Presl",345 10934,"","Cycnoches","Lindl.",345 23705,"x","Cycnodes","Hort.",345 22486,"","Cylindrolobus","(Blume) Brieger",345 10935,"","Cymbidiella","Rolfe",345 10936,"","Cymbidium","Sw.",345 22487,"","Cymbiglossum","Halb.",345 22488,"","Cymboglossum","(J.J.Sm.) Brieger",345 22489,"","Cynorchis","Thouars",345 10937,"","Cynorkis","Thouars",345 22491,"","Cynosorchis","Thouars",345 22492,"","Cyperochis","Blume",345 10938,"","Cyphochilus","Schltr.",345 10939,"","Cypholoron","Dodson & Dressler",345 10940,"","Cypripedium","L.",345 23706,"x","Cyrtellia","Hort.",345 14231,"","Cyrtidiorchis","Rauschert",345 23533,"","Cyrtidium","Schltr.",345 22493,"","Cyrtochilum","Kunth",345 22494,"","Cyrtoglottis","Schltr.",345 22490,"","Cyrtopera","Lindl.",345 10942,"","Cyrtopodium","R.Br.",345 10943,"","Cyrtorchis","Schltr.",345 17358,"","Cyrtosia","Blume",345 22495,"","Cyrtostylis","R.Br.",345 22496,"","Cystochilum","Barb.Rodr.",345 13996,"","Cystopus","Blume",345 10944,"","Cystorchis","Blume",345 23002,"","Cytherea","Salisb.",345 23003,"","Cytheris","Lindl.",345 24075,"x","Dactylella","E.G.Camus",345 24076,"x","Dactylitella","E.G.Camus",345 24077,"x","Dactyloglossum","E.G.Camus",345 24078,"x","Dactylogymnadenia","E.G.Camus",345 22294,"","Dactylorchis","(Klinge) Verm.",345 10945,"","Dactylorhiza","Neck. ex Nevski",345 10946,"","Dactylorhynchus","Schltr.",345 10947,"","Dactylostalix","Rchb.f.",345 22499,"","Dactylostylis","Scheidw.",345 23707,"x","Darwinara","Hort.",345 25657,"","Darwiniella","Braas & Luckel",345 14235,"","Darwiniera","Braas & Luckel",345 23708,"x","Debruyneara","Hort.",345 22500,"","Decaisnea","Brongn.",345 22501,"","Decaisnea","Lindl.",345 23709,"x","Degarmoara","Hort.",345 22307,"","Degranvillea","Determann",345 10948,"","Deiregyne","Schltr.",345 25662,"","Deiregynopsis","Rauschert",345 23710,"x","Dekensara","Hort.",345 10949,"","Dendrobium","Sw.",345 10950,"","Dendrochilum","Blume",345 25618,"","Dendrocoryne","(Lindl.) Brieger",345 22502,"","Dendrolirium","Blume",345 10951,"","Dendrophylax","Rchb.f.",345 23001,"","Dendrorkis","Thouars",345 22503,"","Denslovia","Rydb.",345 22504,"","Deppia","Raf.",345 22505,"","Deroemera","Rchb.f.",345 22506,"","Desmotrichum","Blume",345 23711,"x","Devereuxara","Hort.",345 23712,"x","Diabroughtonia","Hort.",345 23713,"x","Diacattleya","Hort.",345 15954,"","Diacrium","Benth.",345 10952,"","Diadenium","Poepp. & Endl.",345 23714,"x","Dialaelia","Hort.",345 23715,"x","Dialaeliocattleya","Hort.",345 23716,"x","Dialaeliopsis","Hort.",345 22508,"","Dialissa","Lindl.",345 10953,"","Diaphananthe","Schltr.",345 10954,"","Diceratostele","Summerh.",345 10955,"","Dicerostylis","Blume",345 10956,"","Dichaea","Lindl.",345 23000,"","Dichaeopsis","Pfitzer",345 22509,"","Dichopus","Blume",345 25627,"","Dichromanthus","Garay",345 10957,"","Dickasonia","L.O.Williams",345 22510,"","Dicranotaenia","Finet",345 22511,"","Dicrypta","Lindl.",345 17359,"","Dictyophyllaria","Garay",345 22512,"","Didactyle","Lindl.",345 10958,"","Didiciea","King & Prain",345 22513,"","Didothion","Raf.",345 10959,"","Didymoplexiella","Garay",345 10960,"","Didymoplexis","Griff.",345 22514,"","Dienia","Lindl.",345 22515,"","Diglyphis","Blume",345 10961,"","Diglyphosa","Blume",345 15955,"","Dignathe","Lindl.",345 22516,"","Digomphotis","Raf.",345 22517,"","Dikylikostigma","Kraenzl.",345 23717,"x","Dillonara","Hort.",345 10962,"","Dilochia","Lindl.",345 24612,"","Dilochiopsis","(Hook.f.) Brieger",345 10963,"","Dilomilis","Raf.",345 22304,"","Dimerandra","Schltr.",345 10964,"","Dimorphorchis","Rolfe",345 10965,"","Dinema","Lindl.",345 10966,"","Dinklageella","Mansf.",345 10967,"","Diothonea","Lindl.",345 22518,"","Dipera","Spreng.",345 22519,"","Diphryllum","Raf.",345 22520,"","Diphyes","Blume",345 10968,"","Diphylax","Hook.f.",345 10969,"","Diplandrorchis","S.C.Chen",345 22521,"","Diplanthera","Raf.",345 22522,"","Diplectraden","Raf.",345 22523,"","Diplectrum","Pers.",345 10970,"","Diplocaulobium","(Rchb.f.) Kraenzl.",345 10971,"","Diplocentrum","Lindl.",345 22524,"","Diplochilus","Lindl.",345 22525,"","Diploconchium","Schauer",345 22526,"","Diplodium","Sw.",345 10972,"","Diplolabellum","F.Maek.",345 10973,"","Diplomeris","D.Don",345 23718,"x","Diplonopsis","Hort.",345 10974,"","Diploprora","Hook.f.",345 10975,"","Dipodium","R.Br.",345 10976,"","Dipteranthus","Barb.Rodr.",345 10977,"","Dipterostele","Schltr.",345 10978,"","Disa","Bergius",345 10979,"","Discyphus","Schltr.",345 22527,"","Diseris","Wight",345 10980,"","Disperis","Sw.",345 22528,"","Dissorhynchium","Schauer",345 22529,"","Distichis","Thouars",345 22530,"","Distomaea","Spenn.",345 10981,"","Distylodon","Summerh.",345 22531,"","Diteilis","Raf.",345 10982,"","Dithrix","Schltr.",345 25640,"","Dithyridanthus","Garay",345 22533,"","Ditulima","Raf.",345 10983,"","Diuris","Sm.",345 22534,"","Dockrillia","Brieger",345 10984,"","Dodsonia","Ackerman",345 24610,"","Dolichocentrum","(Schltr.) Brieger",345 23719,"x","Domindesmia","Hort.",345 10985,"","Domingoa","Schltr.",345 23720,"x","Domintonia","Hort.",345 23721,"x","Dominyara","Hort.",345 23722,"x","Domliopsis","Hort.",345 23723,"x","Doncollinara","Hort.",345 23724,"x","Dorandopsis","Hort.",345 23725,"x","Doricentrum","Hort.",345 23726,"x","Doriella","Hort.",345 23727,"x","Doriellaopsis","Hort.",345 23728,"x","Dorifinetia","Hort.",345 23729,"x","Doriglossum","Hort.",345 23730,"x","Doristylis","Hort.",345 23731,"x","Doritaenopsis","Hort.",345 10986,"","Doritis","Lindl.",345 23732,"x","Dorthera","Hort.",345 22536,"","Dorycheile","Rchb.",345 10987,"","Dossinia","C.Morren",345 23733,"x","Dossinimaria","Hort.",345 22537,"","Dothilis","Raf.",345 22538,"","Dothilophis","Raf.",345 23734,"x","Downsara","Hort.",345 22539,"","Doxosma","Raf.",345 10988,"","Dracula","Luer",345 23735,"x","Dracuvallia","Hort.",345 10989,"","Drakaea","Lindl.",345 23736,"x","Dresslerara","Hort.",345 10991,"","Dresslerella","Luer",345 10990,"","Dressleria","Dodson",345 25642,"","Dressleriella","Brieger",345 10992,"","Dryadella","Luer",345 10993,"","Dryadorchis","Schltr.",345 10994,"","Drymoanthus","Nicholls",345 10995,"","Drymoda","Lindl.",345 22540,"","Dryopeia","Thouars",345 22541,"","Dryorchis","Thouars",345 22543,"","Dubois-Reymondia","H.Karst.",345 22542,"","Duboisia","H.Karst.",345 10996,"","Duckeella","Porto",345 23737,"x","Duggerara","Hort.",345 23738,"x","Dunnara","Hort.",345 23739,"x","Dunningara","Hort.",345 10997,"","Dunstervillea","Garay",345 23740,"x","Durutyara","Hort.",345 17360,"","Dyakia","Christenson",345 10998,"","Earina","Lindl.",345 23741,"x","Eastonara","Hort.",345 22544,"","Eburophyton","A.Heller",345 23545,"","Echinoglossum","Blume",345 23029,"","Eckartia","Rchb.f.",345 23742,"x","Edeara","Hort.",345 10999,"","Eggelingia","Summerh.",345 22545,"","Elasmatium","Dulac",345 11000,"","Eleorchis","F.Maek.",345 11001,"","Elleanthus","C.Presl",345 25656,"","Eloyella","P.Ortiz",345 23494,"","Eltroplectris","Raf.",345 11002,"","Elythranthera","(Endl.) A.S.George",345 11003,"","Embreea","Dodson",345 22546,"","Empusa","Lindl.",345 22547,"","Empusaria","Rchb.f.",345 22548,"","Encheiridion","Summerh.",345 11005,"","Encyclia","Hook.",345 22549,"","Endeisa","Raf.",345 11006,"","Endresiella","Schltr.",345 22550,"","Enothrea","Raf.",345 22551,"","Entaticus","Gray",345 17361,"","Entomophobia","de Vogel",345 17362,"","Eparmatostigma","Garay",345 22552,"","Ephemerantha","Summerh.",345 11007,"","Ephippianthus","Rchb.f.",345 22553,"","Ephippium","Blume",345 23743,"x","Epibarkiella","Hort.",345 11008,"","Epiblastus","Schltr.",345 11009,"","Epiblema","R.Br.",345 23744,"x","Epibrassonitis","Hort.",345 23745,"x","Epicatonia","Hort.",345 23746,"x","Epicattleya","Hort.",345 22554,"","Epicladium","Small",345 17363,"","Epicranthes","Blume",345 22555,"","Epicrianthus","Blume",345 11010,"","Epidanthus","L.O.Williams",345 23747,"x","Epidella","Hort.",345 11011,"","Epidendropsis","Garay & Dunst.",345 11012,"","Epidendrum","L.",345 23748,"x","Epidiacrium","Hort.",345 11013,"","Epigeneium","Gagnep.",345 23749,"x","Epiglottis","Hort.",345 23750,"x","Epigoa","Hort.",345 23751,"x","Epilaelia","Hort.",345 23752,"x","Epilaeliocattleya","Hort.",345 23753,"x","Epilaeliopsis","Hort.",345 11014,"","Epilyna","Schltr.",345 11015,"","Epipactis","Zinn",345 22556,"","Epiphora","Lindl.",345 23754,"x","Epiphronitis","Hort.",345 11016,"","Epipogium","Borkh.",345 22557,"","Epipogon","S.G.Gmel.",345 11017,"","Epistephium","Kunth",345 23755,"x","Epistoma","Hort.",345 23756,"x","Epitonia","Hort.",345 11018,"","Eria","Lindl.",345 11019,"","Eriaxis","Rchb.f.",345 23027,"","Eriochilum","Ritgen",345 11020,"","Eriochilus","R.Br.",345 23028,"","Eriochylus","Steud.",345 17346,"","Eriodes","Rolfe",345 22558,"","Eriopexis","(Schltr.) Brieger",345 11021,"","Eriopsis","Lindl.",345 22559,"","Erioxantha","Raf.",345 23757,"x","Ernestara","Hort.",345 11022,"","Erycina","Lindl.",345 11023,"","Erythrodes","Blume",345 17364,"","Erythrorchis","Blume",345 11024,"","Esmeralda","Rchb.f.",345 22560,"","Etaeria","Blume",345 11025,"","Euanthe","Schltr.",345 22561,"","Eucnemia","Rchb.",345 22562,"","Eucnemis","Lindl.",345 11026,"","Eucosia","Blume",345 23026,"","Eudisanthema","Neck. ex Post & Kuntze",345 23758,"x","Eulocymbidiella","Hort.",345 11027,"","Eulophia","R.Br. ex Lindl.",345 11028,"","Eulophidium","Pfitzer",345 11029,"","Eulophiella","Rolfe",345 22287,"","Eulophiopsis","Pfitzer",345 22565,"","Euothonaea","Rchb.f.",345 22568,"","Euphlebium","Brieger",345 22569,"","Euproboscis","Griff.",345 23759,"x","Euryangis","Hort.",345 11030,"","Eurycentrum","Schltr.",345 11031,"","Eurychone","Schltr.",345 23760,"x","Eurynopsis","Hort.",345 11032,"","Eurystyles","Wawra",345 22570,"","Evelyna","Poepp. & Endl.",345 17380,"","Evrardia","Gagnep.",345 23497,"","Evrardiana","Aver.",345 23496,"","Evrardianthe","Rauschert",345 22571,"","Exeria","Raf.",345 22572,"","Exophya","Raf.",345 23761,"x","Fergusonaria","Hort.",345 23571,"","Fernandezia","Ruiz & Pav.",345 22573,"","Fieldia","Gaudich.",345 24608,"","Fimbriella","Farw. ex Butzin",345 22574,"","Finetia","Schltr.",345 22575,"","Fissipes","Small",345 22576,"","Fitzgeraldia","F.Muell.",345 11033,"","Flickingeria","A.D.Hawkes",345 11034,"","Forbesina","Ridl.",345 11035,"","Forficaria","Lindl.",345 23762,"x","Forgetara","Hort.",345 22578,"","Fractiunguis","Schltr.",345 23763,"x","Freedara","Hort.",345 11036,"","Fregea","Rchb.f.",345 17408,"","Frondaria","Luer",345 22579,"","Froscula","Raf.",345 11037,"","Fuertesiella","Schltr.",345 23764,"x","Fujioara","Hort.",345 23765,"x","Fujiwarara","Hort.",345 11038,"","Funkiella","Schltr.",345 22580,"","Gabertia","Gaudich.",345 11039,"","Galeandra","Lindl.",345 23766,"x","Galeansellia","Hort.",345 11040,"","Galearis","Raf.",345 22581,"","Galeoglossum","A.Rich. & Galeotti",345 11041,"","Galeola","Lour.",345 22582,"","Galeorchis","Rydb.",345 22583,"","Galeottia","A.Rich.",345 11042,"","Galeottiella","Schltr.",345 22584,"","Galera","Blume",345 22585,"","Gamaria","Raf.",345 22586,"","Gamoplexis","Falc.",345 22587,"","Gamosepalum","Schltr.",345 25645,"","Garayella","Brieger",345 23767,"x","Gastisia","Hort.",345 22588,"","Gastorchis","Thouars",345 23768,"x","Gastritis","Hort.",345 23769,"x","Gastrochiloglottis","Hort.",345 11043,"","Gastrochilus","D.Don",345 11044,"","Gastrodia","R.Br.",345 22589,"","Gastroglottis","Blume",345 22590,"","Gastrorchis","Schltr.",345 23770,"x","Gastrosarcochilus","Hort.",345 23771,"x","Gastrothera","Hort.",345 23772,"x","Gauntlettara","Hort.",345 11045,"","Gavilea","Poepp.",345 17381,"","Geesinkorchis","de Vogel",345 22591,"","Geissanthera","Schltr.",345 11046,"","Gennaria","Parl.",345 25034,"","Genoplesium","R.Br.",345 11047,"","Genyorchis","Schltr.",345 22592,"","Geobina","Raf.",345 17382,"","Geoblasta","Barb.Rodr.",345 25649,"","Geocalpa","Brieger",345 11048,"","Geodorum","Jacks.",345 22593,"","Georchis","Lindl.",345 22594,"","Gersinia","Ne#Araud",345 22595,"","Ghiesbreghtia","A.Rich. & Galeotti",345 22596,"","Gigliolia","Barb.Rodr.",345 11049,"","Giulianettia","Rolfe",345 11050,"","Glomera","Blume",345 22669,"","Glossapis","Spreng.",345 11051,"","Glossodia","R.Br.",345 11052,"","Glossorhyncha","Ridl.",345 22670,"","Glossula","Lindl.",345 11053,"","Goadbyella","R.S.Rogers",345 23773,"x","Goffara","Hort.",345 23025,"","Goldschmidtia","Dammer",345 11054,"","Gomesa","R.Br.",345 23774,"x","Gomochilus","Hort.",345 11055,"","Gomphichis","Lindl.",345 11056,"","Gonatostylis","Schltr.",345 11057,"","Gongora","Ruiz & Pav.",345 24314,"","Goniochilus","M.W.Chase",345 22672,"","Gonogona","Link",345 23775,"x","Goodaleara","Hort.",345 11058,"","Goodyera","R.Br.",345 23523,"","Gorgoglossum","F.Lehm.",345 23776,"x","Gottererara","Hort.",345 11059,"","Govenia","Lindl.",345 22673,"","Govindooia","Wight",345 23024,"","Grafia","A.D.Hawkes",345 11060,"","Grammangis","Rchb.f.",345 23777,"x","Grammatocymbidium","Hort.",345 11061,"","Grammatophyllum","Blume",345 11062,"","Graphorkis","Thouars",345 22674,"","Grastidium","Blume",345 17383,"","Greenwoodia","Burns-Bal.",345 11063,"","Grobya","Lindl.",345 17384,"","Grosourdya","Rchb.f.",345 25661,"","Gularia","Garay",345 22308,"","Gunnarella","Senghas",345 24611,"","Gunnarorchis","Brieger",345 22675,"","Gunnia","Lindl.",345 23554,"","Gussonea","A.Rich.",345 23584,"","Gyaladenia","Schltr.",345 22676,"","Gyas","Salisb.",345 11064,"","Gymnadenia","R.Br.",345 11065,"","Gymnadeniopsis","Rydb.",345 24079,"x","Gymnaglossum","E.G.Camus",345 24080,"x","Gymnanacamptis","E.G.Camus",345 24081,"x","Gymnaplatanthera","E.G.Camus",345 24082,"x","Gymnigritella","E.G.Camus",345 11066,"","Gymnochilus","Blume",345 23023,"","Gynizodon","Raf.",345 11067,"","Gynoglottis","J.J.Sm.",345 23021,"","Gyrostachis","Blume",345 22677,"","Gyrostachys","Pers. ex Blume",345 11068,"","Habenaria","Willd.",345 22936,"","Habenaria","Nimmo",345 23587,"","Habenella","Small",345 22678,"","Habenorkis","Thouars",345 22679,"","Haemaria","Lindl.",345 22680,"","Haematorchis","Blume",345 23778,"x","Hagerara","Hort.",345 15168,"","Hagsatera","Tamayo",345 11069,"","Hakoneaste","F.Maek.",345 23779,"x","Hamelwellsara","Hort.",345 16217,"","Hammarbya","Kuntze",345 11070,"","Hancockia","Rolfe",345 23780,"x","Hanesara","Hort.",345 17385,"","Hapalochilus","(Schltr.) Senghas",345 11071,"","Hapalorchis","Schltr.",345 22681,"","Haplochilus","Endl.",345 22682,"","Haplostellis","Endl.",345 11072,"","Haraella","Kudo",345 11073,"","Harrisella","Fawc. & Rendle",345 23781,"x","Hartara","Hort.",345 15542,"","Hartwegia","Lindl.",345 23782,"x","Hasegawaara","Hort.",345 23783,"x","Hattoriara","Hort.",345 23784,"x","Hausermannara","Hort.",345 23785,"x","Hawaiiara","Hort.",345 23786,"x","Hawkesara","Hort.",345 23787,"x","Hawkinsara","Hort.",345 22684,"","Hecabe","Raf.",345 17386,"","Hederorkis","Thouars",345 11074,"","Helcia","Lindl.",345 23520,"","Helictonia","Ehrh.",345 23560,"","Helleborine","Kuntze",345 11075,"","Helleriella","A.D.Hawkes",345 23561,"","Hellerorchis","A.D.Hawkes",345 25629,"","Helonoma","Garay",345 22685,"","Helorchis","Schltr.",345 22686,"","Hemiperis","Frapp. ex Cordem.",345 11076,"","Hemipilia","Lindl.",345 11077,"","Hemiscleria","Lindl.",345 22687,"","Henosis","Hook.f.",345 23788,"x","Herbertara","Hort.",345 11078,"","Herminium","L.",345 22688,"","Herpetophytum","(Schltr.) Brieger",345 11079,"","Herpysma","Lindl.",345 22689,"","Herschelia","Lindl.",345 22290,"","Herschelianthe","Rauschert",345 24106,"x","Herscheliodisa","Linder",345 11080,"","Hetaeria","Blume",345 22690,"","Heterotaxis","Lindl.",345 24313,"","Heterozeuxine","Hashim.",345 11081,"","Hexadesmia","Brongn.",345 11082,"","Hexalectris","Raf.",345 22691,"","Hexameria","R.Br.",345 11083,"","Hexisea","Lindl.",345 22692,"","Hexopia","Bateman ex Lindl.",345 23789,"x","Higashiara","Hort.",345 23790,"x","Hildaara","Hort.",345 11084,"","Himantoglossum","K.Koch",345 23791,"x","Himoriara","Hort.",345 11085,"","Hintonella","Ames",345 11086,"","Hippeophyllum","Schltr.",345 22693,"","Hippoglossum","Breda",345 23562,"","Hippopodium","Harv.",345 23020,"","Hipporkis","Thouars",345 14830,"","Hirtzia","Dodson",345 25626,"","Hispaniella","Braem",345 11087,"","Hoehneella","Ruschi",345 22694,"","Hofmeistera","Rchb.f.",345 11088,"","Hofmeisterella","Rchb.f.",345 11089,"","Holcoglossum","Schltr.",345 11090,"","Holmesia","P.J.Cribb",345 11091,"","Hologyne","Pfitzer",345 11092,"","Holopogon","Kom. & Nevski",345 11093,"","Holothrix","Rich. ex Lindl.",345 23792,"x","Holttumara","Hort.",345 11094,"","Homalopetalum","Rolfe",345 23793,"x","Hookerara","Hort.",345 17387,"","Horichia","Jenny",345 11095,"","Hormidium","(Lindl.) Heynh.",345 17388,"","Horvatia","Garay",345 11096,"","Houlletia","Brongn.",345 23794,"x","Howeara","Hort.",345 22695,"","Huebneria","Schltr.",345 23795,"x","Hueylihara","Hort.",345 23796,"x","Hugofreedara","Hort.",345 22696,"","Humboldtia","Ruiz & Pav.",345 23797,"x","Huntleanthes","Hort.",345 11097,"","Huntleya","Bateman ex Lindl.",345 11098,"","Huttonaea","Harv.",345 22697,"","Hyacinthorchis","Blume",345 22698,"","Hyalosema","Rolfe",345 11099,"","Hybochilus","Schltr.",345 23019,"","Hydranthus","Kuhl & Hasselt ex Rchb.f.",345 23563,"","Hyerochilus","Pfitzer",345 24114,"","Hygrochilus","Pfitzer",345 11100,"","Hylophila","Lindl.",345 22699,"","Hymanthoglossum","Tod.",345 11101,"","Hymenorchis","Schltr.",345 22700,"","Hypodema","Rchb.",345 22701,"","Hypodematium","A.Rich.",345 23559,"","Hysteria","Reinw.",345 22702,"","Iantha","Hook.",345 23519,"","Ibidium","Salisb. ex Small",345 23018,"","Iebine","Raf.",345 11102,"","Imerinaea","Schltr.",345 22297,"","Inobulbon","(Schltr.) Schltr.",345 22703,"","Ione","Lindl.",345 23799,"x","Ionocidium","Hort.",345 11104,"","Ionopsis","Kunth",345 22704,"","Ionorchis","Beck",345 11105,"","Ipsea","Lindl.",345 22705,"","Iridorchis","Blume",345 22706,"","Iridorkis","Thouars",345 23800,"x","Irvingara","Hort.",345 11106,"","Isabelia","Barb.Rodr.",345 23801,"x","Isaoara","Hort.",345 11107,"","Ischnocentrum","Schltr.",345 11108,"","Ischnogyne","Schltr.",345 11109,"","Isochilus","R.Br.",345 11110,"","Isotria","Raf.",345 22707,"","Itaculumia","Hoehne",345 23802,"x","Iwanagara","Hort.",345 23803,"x","Izumiara","Hort.",345 11111,"","Jacquiniella","Schltr.",345 25625,"","Jamaiciella","Braem",345 22708,"","Jansenia","Barb.Rodr.",345 17389,"","Jejosephia","A.N.Rao & Mani",345 22709,"","Jenmania","Rolfe",345 22710,"","Jensoa","Raf.",345 23804,"x","Jewellara","Hort.",345 23805,"x","Jimenezara","Hort.",345 22711,"","Jimensia","Raf.",345 23806,"x","Joannara","Hort.",345 23807,"x","Johnkellyara","Hort.",345 23798,"x","Jonettia","Hort.",345 22288,"","Josephia","Wight",345 23808,"x","Jumanthes","Hort.",345 11112,"","Jumellea","Schltr.",345 23809,"x","Kagawara","Hort.",345 25622,"","Kalimpongia","Pradhan",345 11113,"","Kalopternix","Garay & Dunst.",345 23810,"x","Kanzerara","Hort.",345 22713,"","Katherinea","A.D.Hawkes",345 23811,"x","Kawamotoara","Hort.",345 23812,"x","Keferanthes","Hort.",345 11114,"","Kefersteinia","Rchb.f.",345 22714,"","Kegelia","Rchb.f.",345 11115,"","Kegeliella","Mansf.",345 11116,"","Kerigomnia","P.Royen",345 25617,"","Kinetochilus","(Schltr.) Brieger",345 11117,"","Kingidium","P.F.Hunt",345 22715,"","Kingiella","Rolfe",345 25663,"","Kionophyton","Garay",345 23813,"x","Kirchara","Hort.",345 23814,"x","Knappara","Hort.",345 23815,"x","Knudsonara","Hort.",345 22716,"","Kochiophyton","Schltr. ex Cogn.",345 22300,"","Koellensteinia","Rchb.f.",345 23816,"x","Komkrisara","Hort.",345 11118,"","Konantzia","Dodson & N.H.Williams",345 11119,"","Kraenzlinella","Kuntze",345 23817,"x","Kraussara","Hort.",345 11120,"","Kreodanthus","Garay",345 22718,"","Kryptostoma","(Summerh.) Geerinck",345 11121,"","Kuhlhasseltia","J.J.Sm.",345 11122,"","Lacaena","Lindl.",345 11123,"","Laelia","Lindl.",345 23818,"x","Laeliocatonia","Hort.",345 23819,"x","Laeliocattkeria","Hort.",345 23820,"x","Laeliocattleya","Hort.",345 23821,"x","Laeliokeria","Hort.",345 23822,"x","Laeliopleya","Hort.",345 11124,"","Laeliopsis","Lindl. & Paxton",345 23823,"x","Laelonia","Hort.",345 23824,"x","Lagerara","Hort.",345 23825,"x","Lancebirkara","Hort.",345 11125,"","Lanium","(Lindl.) Benth.",345 11126,"","Lankesterella","Ames",345 22719,"","Larnandra","Raf.",345 22720,"","Lathrisia","Sw.",345 22721,"","Latourea","Blume",345 22732,"","Latourorchis","Brieger",345 23826,"x","Lauara","Hort.",345 23827,"x","Laycockara","Hort.",345 11127,"","Leaoa","Schltr. & Porto",345 11128,"","Lecanorchis","Blume",345 13998,"","Lectandra","J.J.Sm.",345 22723,"","Ledgeria","F.Muell.",345 23828,"x","Leeara","Hort.",345 23829,"x","Lemaireara","Hort.",345 15191,"","Lemboglossum","Halb.",345 22724,"","Lemuranthe","Schltr.",345 11129,"","Lemurella","Schltr.",345 11130,"","Lemurorchis","Kraenzl.",345 11131,"","Leochilus","Knowles & Westc.",345 23830,"x","Leocidium","Hort.",345 23831,"x","Leocidmesa","Hort.",345 22725,"","Leopardanthus","Blume",345 11132,"","Lepanthes","Sw.",345 11133,"","Lepanthopsis","Ames",345 22726,"","Lepervenchea","Cordem.",345 11134,"","Lepidogyne","Blume",345 11135,"","Leporella","A.S.George",345 22727,"","Leptocentrum","Schltr.",345 23566,"","Leptoceras","(R.Br.) Lindl.",345 23832,"x","Leptolaelia","Hort.",345 23011,"","Leptorkis","Thouars",345 11136,"","Leptotes","Lindl.",345 23833,"x","Leptovola","Hort.",345 22728,"","Lequeetia","Bubani",345 24312,"","Lesliea","Seidenf.",345 23834,"x","Leslieara","Hort.",345 11137,"","Leucohyle","Klotzsch",345 22729,"","Leucolaena","Ridl.",345 22730,"","Leucorchis","Blume",345 22731,"","Leucorchis","E.Mey.",345 23010,"","Leucostachys","Hoffmanns.",345 23835,"x","Lewisara","Hort.",345 23836,"x","Liaopsis","Hort.",345 23549,"","Lichinora","Wight",345 23837,"x","Liebmanara","Hort.",345 11138,"","Ligeophila","Garay",345 23838,"x","Limara","Hort.",345 22734,"","Limatodes","Blume",345 22735,"","Limnorchis","Rydb.",345 11139,"","Limodorum","Boehm.",345 23555,"","Lindblomia","Fr.",345 22736,"","Lindleyella","Schltr.",345 11140,"","Lindsayella","Ames & C.Schweinf.",345 23839,"x","Lioponia","Hort.",345 11141,"","Liparis","Rich.",345 22737,"","Lissochilus","R.Br.",345 11142,"","Listera","R.Br.",345 11143,"","Listrostachys","Rchb.",345 22738,"","Lobogyne","Schltr.",345 23840,"x","Lockcidium","Hort.",345 11144,"","Lockhartia","Hook.",345 23841,"x","Lockochilus","Hort.",345 11145,"","Loefgrenianthus","Hoehne",345 23009,"","Lonchitis","Bubani",345 22739,"","Lophiaris","Raf.",345 22740,"","Lophoglottis","Raf.",345 22741,"","Loroglossum","Rich.",345 23582,"","Lothiania","Kraenzl.",345 22742,"","Lothoniana","Kraenzl.",345 23842,"x","Lowara","Hort.",345 23843,"x","Lowsonara","Hort.",345 14237,"","Loxomorchis","Rauschert",345 23844,"x","Luascotia","Hort.",345 11146,"","Ludisia","A.Rich.",345 11147,"","Lueddemannia","Rchb.f.",345 22743,"","Luerella","Braas",345 23845,"x","Luicentrum","Hort.",345 23846,"x","Luichilus","Hort.",345 23847,"x","Luinetia","Hort.",345 23848,"x","Luinopsis","Hort.",345 23849,"x","Luisanda","Hort.",345 11148,"","Luisia","Gaudich.",345 23850,"x","Luivanetia","Hort.",345 23851,"x","Lutherara","Hort.",345 11149,"","Lycaste","Lindl.",345 23852,"x","Lycasteria","Hort.",345 11150,"","Lycomormium","Rchb.f.",345 23853,"x","Lymanara","Hort.",345 23854,"x","Lyonara","Hort.",345 11151,"","Lyperanthus","R.Br.",345 23008,"","Lyraea","Lindl.",345 11152,"","Lyroglossa","Schltr.",345 22744,"","Lysias","Salisb. ex Rydb.",345 22745,"","Lysiella","Rydb.",345 22746,"","Lysimnia","Raf.",345 23855,"x","Maccoyara","Hort.",345 22747,"","Macdonaldia","Gunn ex Lindl.",345 23856,"x","Maclellanara","Hort.",345 23857,"x","Maclemoreara","Hort.",345 11153,"","Macodes","(Blume) Lindl.",345 23858,"x","Macomaria","Hort.",345 11154,"","Macradenia","R.Br.",345 23859,"x","Macradesa","Hort.",345 23567,"","Macrocentrum","Phil.",345 22748,"","Macrochilus","Knowles & Westc.",345 22749,"","Macroclinium","Barb.Rodr.",345 22750,"","Macrolepis","A.Rich.",345 22751,"","Macroplectrum","Pfitzer",345 11155,"","Macropodanthus","L.O.Williams",345 22752,"","Macrostomium","Blume",345 22753,"","Macrostylis","Breda",345 23007,"","Maelenia","Dumort.",345 23860,"x","Mailamaiara","Hort.",345 22754,"","Malachadenia","Lindl.",345 11156,"","Malaxis","Sol. ex Sw.",345 11157,"","Malleola","J.J.Sm. & Schltr.",345 11158,"","Manniella","Rchb.f.",345 11159,"","Margelliantha","P.J.Cribb",345 22755,"","Mariarisqueta","Guinea",345 22756,"","Marsupiaria","Hoehne",345 11160,"","Masdevallia","Ruiz & Pav.",345 22757,"","Maturna","Raf.",345 23861,"x","Maxillacaste","Hort.",345 11161,"","Maxillaria","Ruiz & Pav.",345 23862,"x","Maymoirara","Hort.",345 22759,"","Meciclis","Raf.",345 23538,"","Mecosa","Blume",345 11162,"","Mediocalcar","J.J.Sm.",345 22758,"","Megaclinium","Lindl.",345 11163,"","Megalorchis","H.Perrier",345 17390,"","Megalotus","Garay",345 11164,"","Megastylis","Schltr.",345 11165,"","Meiracyllium","Rchb.f.",345 22760,"","Menadena","Raf.",345 22303,"","Menadenium","Raf.",345 11166,"","Mendoncella","A.D.Hawkes",345 23016,"","Menephora","Raf.",345 11167,"","Mesadenella","Pabst & Garay",345 11168,"","Mesadenus","Schltr.",345 22761,"","Mesoclastes","Lindl.",345 23547,"","Mesodactylis","Wall.",345 15956,"","Mesoglossum","Halb.",345 22762,"","Mesoptera","Raf.",345 11169,"","Mesospinidium","Rchb.f.",345 22763,"","Metachilum","Lindl.",345 11170,"","Mexicoa","Garay",345 23863,"x","Micholitzara","Hort.",345 22764,"","Microchilus","C.Presl",345 11171,"","Microcoelia","Lindl.",345 25643,"","Microepidendrum","Brieger",345 23495,"","Microholmesia","P.J.Cribb",345 17347,"","Micropera","Lindl.",345 22765,"","Microphytanthe","(Schltr.) Brieger",345 11172,"","Microsaccus","Blume",345 13999,"","Microstylis","(Nutt.) Eaton",345 11173,"","Microtatorchis","Schltr.",345 24614,"","Microterangis","Senghas",345 22767,"","Microtheca","Schltr.",345 25639,"","Microthelys","Garay",345 11174,"","Microtis","R.Br.",345 23864,"x","Milpasia","Hort.",345 23865,"x","Milpilia","Hort.",345 23866,"x","Miltada","Hort.",345 23867,"x","Miltadium","Hort.",345 23868,"x","Miltassia","Hort.",345 11175,"","Miltonia","Lindl.",345 23869,"x","Miltonidium","Hort.",345 23870,"x","Miltonioda","Hort.",345 14283,"","Miltonioides","Brieger & Luckel",345 11176,"","Miltoniopsis","God.-Leb.",345 25653,"","Minicolumna","Brieger",345 22292,"","Mischobulbon","Schltr.",345 11177,"","Mischobulbum","Schltr.",345 23006,"","Mitopetalum","Blume",345 22768,"","Mitostigma","Blume",345 23871,"x","Mizutara","Hort.",345 11178,"","Mobilabium","Rupp",345 11179,"","Moerenhoutia","Blume",345 23872,"x","Moirara","Hort.",345 23873,"x","Mokara","Hort.",345 22769,"","Monachanthus","Lindl.",345 11180,"","Monadenia","Lindl.",345 22770,"","Monanthos","(Schltr.) Brieger",345 23005,"","Monixus","Finet",345 23556,"","Monochilus","Wall. ex Lindl.",345 11181,"","Monomeria","Lindl.",345 11182,"","Monophyllorchis","Schltr.",345 23557,"","Monorchis","Agosti",345 11183,"","Monosepalum","Schltr.",345 22771,"","Monotris","Lindl.",345 22772,"","Montolivaea","Rchb.f.",345 22773,"","Monustes","Raf.",345 23874,"x","Moonara","Hort.",345 22774,"","Moorea","Rolfe",345 11184,"","Mormodes","Lindl.",345 11185,"","Mormolyca","Fenzl",345 23875,"x","Moscosoara","Hort.",345 17391,"","Muluorchis","J.J.Wood",345 22775,"","Myanthus","Lindl.",345 22777,"","Mycaranthes","Blume",345 22778,"","Mycaridanthes","Blume",345 22779,"","Myoda","Lindl.",345 22780,"","Myodium","Salisb.",345 17392,"","Myoxanthus","Poepp. & Endl.",345 11186,"","Myrmechis","(Lindl.) Blume",345 24615,"","Myrmecophila","Rolfe",345 22781,"","Myrobroma","Salisb.",345 11187,"","Myrosmodes","Rchb.f.",345 11188,"","Mystacidium","Lindl.",345 22296,"","Nabaluia","Ames",345 11189,"","Nageliella","L.O.Williams",345 23876,"x","Nakagawaara","Hort.",345 23877,"x","Nakamotoara","Hort.",345 11190,"","Nanodes","Lindl.",345 23014,"","Narica","Raf.",345 23878,"x","Nashara","Hort.",345 22783,"","Nasonia","Lindl.",345 22784,"","Nauenia","Klotzsch",345 23879,"x","Naugleara","Hort.",345 22785,"","Neippergia","C.Morren",345 22786,"","Nemaconia","Knowles & Westc.",345 22787,"","Nematoceras","Hook.f.",345 23013,"","Nemuranthes","Raf.",345 11191,"","Neo-urbania","Fawc. & Rendle",345 11192,"","Neobartlettia","Schltr.",345 11193,"","Neobathiea","Schltr.",345 23880,"x","Neobatopus","Hort.",345 11194,"","Neobenthamia","Rolfe",345 11195,"","Neobolusia","Schltr.",345 11196,"","Neoclemensia","Carr",345 11197,"","Neocogniauxia","Schltr.",345 11198,"","Neodryas","Rchb.f.",345 11199,"","Neofinetia","Hu",345 11200,"","Neogardneria","Schltr. ex Garay",345 22305,"","Neogyna","Rchb.f.",345 11201,"","Neogyne","Rchb.f.",345 11202,"","Neokoehleria","Schltr.",345 11203,"","Neolauchea","Kraenzl.",345 11204,"","Neolehmannia","Kraenzl.",345 23542,"","Neolindleya","Kraenzl.",345 11205,"","Neomoorea","Rolfe",345 23881,"x","Neostylis","Hort.",345 25632,"","Neotainiopsis","Bennet & Raizada",345 11206,"","Neotinea","Rchb.f.",345 11207,"","Neottia","Guett.",345 11208,"","Neottianthe","(Rchb.) Schltr.",345 22788,"","Neottidium","Schltdl.",345 11209,"","Neowilliamsia","Garay",345 11210,"","Nephelaphyllum","Blume",345 11211,"","Nephrangis","(Schltr.) Summerh.",345 22789,"","Nephranthera","Hassk.",345 22790,"","Nerissa","Raf.",345 11212,"","Nervilia","Comm. ex Gaudich.",345 11213,"","Neuwiedia","Blume",345 23882,"x","Ngara","Hort.",345 11214,"","Nidema","Britton & Millsp.",345 22791,"","Nidus","Riv.",345 23543,"","Niemeyera","F.Muell.",345 22792,"","Nienokuea","A.Chev.",345 11215,"","Nigritella","Rich.",345 22793,"","Nipponorchis","Masam.",345 23883,"x","Nobleara","Hort.",345 23884,"x","Nonaara","Hort.",345 22794,"","Norna","Wahlenb.",345 23885,"x","Northenara","Hort.",345 23886,"x","Norwoodara","Hort.",345 24107,"","Nothodoritis","Z.H.Tsi",345 25670,"","Nothostele","Garay",345 11216,"","Notylia","Lindl.",345 23887,"x","Notylidium","Hort.",345 23004,"","Nyctosma","Raf.",345 11217,"","Oakes-Amesia","C.Schweinf. & P.H.Allen",345 11218,"","Oberonia","Lindl.",345 22795,"","Ocampoa","A.Rich. & Galeotti",345 22306,"","Octadesmia","Benth.",345 25647,"","Octandrorchis","Brieger",345 11219,"","Octarrhena","Thwaites",345 11220,"","Octomeria","R.Br.",345 22796,"","Odonectis","Raf.",345 23888,"x","Odontioda","Hort.",345 23889,"x","Odontobrassia","Hort.",345 11221,"","Odontochilus","Blume",345 23890,"x","Odontocidium","Hort.",345 11222,"","Odontoglossum","Kunth",345 23891,"x","Odontonia","Hort.",345 23892,"x","Odontorettia","Hort.",345 11223,"","Odontorrhynchus","M.N.Correa",345 22797,"","Odontostyles","Breda",345 11224,"","Oeceoclades","Lindl.",345 11225,"","Oeonia","Lindl.",345 11226,"","Oeoniella","Schltr.",345 17393,"","Oerstedella","Rchb.f.",345 23893,"x","Okaara","Hort.",345 22798,"","Olgasis","Raf.",345 17394,"","Oligophyton","Linder",345 11227,"","Oliveriana","Rchb.f.",345 22799,"","Ommatodium","Lindl.",345 11228,"","Omoea","Blume",345 23894,"x","Oncidenia","Hort.",345 23895,"x","Oncidesa","Hort.",345 23896,"x","Oncidettia","Hort.",345 23897,"x","Oncidiella","Hort.",345 23898,"x","Oncidioda","Hort.",345 11229,"","Oncidium","Sw.",345 23899,"x","Oncidpilia","Hort.",345 22800,"","Oncodia","Lindl.",345 23532,"","Onkeripus","Raf.",345 23900,"x","Onoara","Hort.",345 22801,"","Onychium","Blume",345 14233,"","Ophidion","Luer",345 11230,"","Ophrys","L.",345 23901,"x","Opsisanda","Hort.",345 23902,"x","Opsiscattleya","Hort.",345 23903,"x","Opsistylis","Hort.",345 24083,"x","Orchiaceras","E.G.Camus",345 22802,"","Orchiastrum","Seg.",345 24084,"x","Orchidactyla","E.G.Camus",345 22803,"","Orchidium","Sw.",345 22804,"","Orchidofunckia","A.Rich. & Galeotti",345 22805,"","Orchidotypus","Kraenzl.",345 24085,"x","Orchigymnadenia","E.G.Camus",345 24086,"x","Orchimantoglossum","E.G.Camus",345 23558,"","Orchiodes","Kuntze",345 11231,"","Orchipedum","Breda",345 11232,"","Orchis","L.",345 11233,"","Oreorchis","Lindl.",345 11234,"","Orestias","Ridl.",345 11235,"","Orleanesia","Barb.Rodr.",345 22806,"","Ormostema","Raf.",345 24689,"","Ornitharium","Lindl. & Paxton",345 11236,"","Ornithidium","R.Br.",345 11237,"","Ornithocephalus","Hook.",345 11238,"","Ornithochilus","(Lindl.) Benth.",345 23904,"x","Ornithocidium","E.G.Camus",345 11239,"","Ornithophora","Barb.Rodr.",345 22807,"","Orsidice","Rchb.f.",345 11240,"","Orthoceras","R.Br.",345 22808,"","Orthochilus","Hochst. ex A.Rich.",345 22809,"","Orthopenthea","Rolfe",345 22810,"","Ortmannia","Opiz",345 22811,"","Orxera","Raf.",345 23905,"x","Osmentara","Hort.",345 11241,"","Osmoglossum","(Schltr.) Schltr.",345 17395,"","Ossiculum","P.J.Cribb & Laan",345 22812,"","Osyricera","Blume",345 23906,"x","Otaara","Hort.",345 22813,"","Otandra","Salisb.",345 11242,"","Otochilus","Lindl.",345 23907,"x","Otocolax","Hort.",345 11243,"","Otoglossum","(Schltr.) Garay & Dunst.",345 23908,"x","Otonisia","Hort.",345 22814,"","Otopetalum","Lehm. & Kraenzl.",345 23909,"x","Otosepalum","Hort.",345 11244,"","Otostylis","Schltr.",345 23910,"x","Owensara","Hort.",345 14000,"","Oxyanthera","Brongn.",345 22816,"","Oxysepala","Wight",345 22817,"","Oxystophyllum","Blume",345 23590,"","Pabstia","Garay",345 22818,"","Pabstiella","Brieger & Senghas",345 11246,"","Pachites","Lindl.",345 22819,"","Pachychilus","Blume",345 22820,"","Pachyne","Salisb.",345 11247,"","Pachyphyllum","Kunth",345 11248,"","Pachyplectron","Schltr.",345 16915,"","Pachyrhizanthe","(Schltr.) Nakai",345 11249,"","Pachystele","Schltr.",345 22822,"","Pachystelis","Rauschert",345 11250,"","Pachystoma","Blume",345 24618,"","Pachystylis","Blume",345 23911,"x","Pageara","Hort.",345 22823,"","Paliris","Dumort.",345 23912,"x","Palmerara","Hort.",345 22824,"","Palmoglossum","Klotzsch ex Rchb.f.",345 11251,"","Palmorchis","Barb.Rodr.",345 11252,"","Palumbina","Rchb.f.",345 11253,"","Panisea","(Lindl.) Lindl.",345 22825,"","Panstrepis","Raf.",345 23913,"x","Pantapaara","Hort.",345 25843,"","Pantlingia","Prain",345 11254,"","Paphinia","Lindl.",345 11255,"","Paphiopedilum","Pfitzer",345 11256,"","Papilionanthe","Schltr.",345 22826,"","Papiliopsis","E.Morren",345 11257,"","Papillilabium","Dockrill",345 11258,"","Papperitzia","Rchb.f.",345 11259,"","Papuaea","Schltr.",345 22827,"","Paracalanthe","Kudo",345 11260,"","Paracaleana","Blaxell",345 23914,"x","Parachilus","Hort.",345 11261,"","Paradisanthus","Rchb.f.",345 22828,"","Paragnathis","Spreng.",345 22829,"","Parapactis","W.Zimm.",345 11263,"","Paraphalaenopsis","A.D.Hawkes",345 24903,"","Parapteroceras","Aver.",345 11262,"","Parhabenaria","Gagnep.",345 22831,"","Parlatorea","Barb.Rodr.",345 23915,"x","Parnataara","Hort.",345 22832,"","Pattonia","Wight",345 23916,"x","Paulsenara","Hort.",345 22833,"","Paxtonia","Lindl.",345 11265,"","Pecteilis","Raf.",345 22834,"","Pectinaria","Cordem.",345 22835,"","Pedilea","Lindl.",345 11266,"","Pedilochilus","Schltr.",345 22836,"","Pedilonum","Blume",345 23917,"x","Pehara","Hort.",345 23918,"x","Pelacentrum","Hort.",345 23919,"x","Pelachilus","Hort.",345 11267,"","Pelatantheria","Ridl.",345 23920,"x","Pelatoritis","Hort.",345 11268,"","Pelexia","Poit. ex Lindl.",345 22837,"","Pelma","Finet",345 11269,"","Pennilabium","J.J.Sm.",345 22838,"","Penthea","Lindl.",345 23552,"","Pentulops","Raf.",345 22839,"","Peramium","Salisb. ex Coult.",345 22840,"","Pergamena","Finet",345 11270,"","Peristeranthus","T.E.Hunt",345 11271,"","Peristeria","Hook.",345 11272,"","Peristylus","Blume",345 23921,"x","Perreiraara","Hort.",345 11273,"","Perrieriella","Schltr.",345 23586,"","Perularia","Lindl.",345 23922,"x","Pescatobollea","Hort.",345 11274,"","Pescatoria","Rchb.f.",345 23923,"x","Pescawarrea","Hort.",345 23924,"x","Pescoranthes","Hort.",345 22841,"","Pesomeria","Lindl.",345 11275,"","Petalocentrum","Schltr.",345 11276,"","Petalochilus","R.S.Rogers",345 23925,"x","Pettitara","Hort.",345 23522,"","Phadrosanthus","Neck. ex Raf.",345 23926,"x","Phaiocalanthe","Hort.",345 23927,"x","Phaiocymbidium","Hort.",345 11277,"","Phaius","Lour.",345 11278,"","Phalaenopsis","Blume",345 23928,"x","Phalaerianda","Hort.",345 23929,"x","Phalandopsis","Hort.",345 23930,"x","Phalanetia","Hort.",345 23931,"x","Phaliella","Hort.",345 22842,"","Phaniasia","Blume ex Miq.",345 11279,"","Philippinaea","Schltr. & Ames",345 23932,"x","Phillipsara","Hort.",345 22843,"","Phloeophila","Hoehne & Schltr.",345 11281,"","Pholidota","Lindl. ex Hook.",345 22844,"","Phormangis","Schltr.",345 23933,"x","Phragmipaphium","Hort.",345 11282,"","Phragmipedium","Rolfe",345 11283,"","Phragmorchis","L.O.Williams",345 11284,"","Phreatia","Lindl.",345 22845,"","Phyllomphax","Schltr.",345 22846,"","Phyllorkis","Thouars",345 11285,"","Phymatidium","Lindl.",345 11286,"","Physinga","Lindl.",345 11287,"","Physoceras","Schltr.",345 25638,"","Physogyne","Garay",345 22847,"","Physosiphon","Lindl.",345 22848,"","Physothallis","Garay",345 22849,"","Physurus","L.",345 22850,"","Pierardia","Raf.",345 11290,"","Pilophyllum","Schltr.",345 22851,"","Pilumna","Lindl.",345 23039,"","Pinalia","Lindl.",345 11291,"","Pinelia","Lindl.",345 22852,"","Pinelianthe","Rauschert",345 23585,"","Piperia","Rydb.",345 22853,"","Pittierella","Schltr.",345 11292,"","Pityphyllum","Schltr.",345 23040,"","Placostigma","Blume",345 11293,"","Platanthera","Rich.",345 22854,"","Platyclinis","Benth.",345 11294,"","Platycoryne","Rchb.f.",345 11295,"","Platyglottis","L.O.Williams",345 11296,"","Platylepis","A.Rich.",345 22855,"","Platypus","Small & Nash",345 11297,"","Platyrhiza","Barb.Rodr.",345 22856,"","Platysma","Blume",345 11298,"","Platystele","Schltr.",345 22857,"","Platystylis","Lindl.",345 11299,"","Platythelys","Garay",345 23934,"x","Plectochilus","Hort.",345 11300,"","Plectorrhiza","Dockrill",345 23935,"x","Plectrelgraecum","Hort.",345 11301,"","Plectrelminthus","Raf.",345 11302,"","Plectrophora","H.Focke",345 22858,"","Plecturus","Raf.",345 11303,"","Pleione","D.Don",345 22859,"","Pleuranthium","Benth.",345 22860,"","Pleurobotryum","Barb.Rodr.",345 11305,"","Pleurothallis","R.Br.",345 11306,"","Pleurothallopsis","Porto",345 22861,"","Plexaure","Endl.",345 11307,"","Plocoglottis","Blume",345 11308,"","Poaephyllum","Ridl.",345 11309,"","Podangis","Schltr.",345 22862,"","Podanthera","Wight",345 11310,"","Podochilus","Blume",345 22863,"","Pogochilus","Falc.",345 11311,"","Pogonia","Juss.",345 11312,"","Pogoniopsis","Rchb.f.",345 22864,"","Pollinirhiza","Dulac",345 25659,"","Polybactrum","Salisb.",345 22865,"","Polychilos","Breda",345 11313,"","Polycycnis","Rchb.f.",345 11314,"","Polyotidium","Garay",345 11315,"","Polyradicion","Garay",345 11316,"","Polyrrhiza","Pfitzer",345 11317,"","Polystachya","Hook.",345 22866,"","Polystylus","Hasselt ex Hassk.",345 23570,"","Polytoma","Lour. ex Gomes",345 23936,"x","Pomacentrum","Hort.",345 23937,"x","Pomatisia","Hort.",345 11318,"","Pomatocalpa","Breda, Kuhl & Hasselt",345 11319,"","Ponera","Lindl.",345 11320,"","Ponerorchis","Rchb.f.",345 11321,"","Ponthieva","R.Br.",345 11322,"","Porolabium","T.Tang & F.T.Wang",345 11323,"","Porpax","Lindl.",345 11324,"","Porphyrodesme","Schltr.",345 11325,"","Porphyroglottis","Ridl.",345 11326,"","Porphyrostachys","Rchb.f.",345 11327,"","Porroglossum","Schltr.",345 11328,"","Porrorhachis","Garay",345 23938,"x","Potinara","Hort.",345 11329,"","Prasophyllum","R.Br.",345 22867,"","Preptanthe","Rchb.f.",345 11330,"","Prescottia","Lindl.",345 11331,"","Pristiglottis","Cretz. & J.J.Sm.",345 23939,"x","Prolax","Hort.",345 11332,"","Promenaea","Lindl.",345 23940,"x","Propetalum","Hort.",345 22868,"","Prosthechea","Knowles & Westc.",345 11333,"","Pseudacoridium","Ames",345 24087,"x","Pseudadenia","E.G.Camus",345 25644,"","Pseudelleanthus","Brieger",345 22869,"","Pseudepidendrum","Rchb.f.",345 11334,"","Pseuderia","Schltr.",345 22870,"","Pseuderiopsis","Rchb.f.",345 24088,"x","Pseudinium","E.G.Camus",345 24089,"x","Pseuditella","E.G.Camus",345 11335,"","Pseudocentrum","Lindl.",345 25630,"","Pseudocranichis","Garay",345 22873,"","Pseudoctomeria","Kraenzl.",345 11337,"","Pseudodiphryllum","Nevski",345 22871,"","Pseudoeria","(Schltr.) Schltr.",345 11338,"","Pseudoeurystyles","Hoehne",345 11339,"","Pseudogoodyera","Schltr.",345 25652,"","Pseudohexadesmia","Brieger",345 11340,"","Pseudolaelia","Porto",345 22875,"","Pseudoliparis","Finet",345 22876,"","Pseudomacodes","Rolfe",345 11341,"","Pseudomaxillaria","Hoehne",345 22874,"","Pseudoorleanesia","Rauschert",345 25651,"","Pseudoponera","Brieger",345 11342,"","Pseudorchis","Seg.",345 24090,"x","Pseudorhiza","E.G.Camus",345 25634,"","Pseudorleanesia","Rauschert",345 11343,"","Pseudostelis","Schltr.",345 17396,"","Pseudovanilla","Garay",345 11344,"","Psilochilus","Barb.Rodr.",345 22879,"","Psittacoglossum","La Llave & Lex.",345 23540,"","Psychechilos","Breda",345 22880,"","Psychilis","Raf.",345 25624,"","Psychopsiella","Luckel & Braem",345 22881,"","Psychopsis","Raf.",345 11345,"","Psygmorchis","Dodson & Dressler",345 11346,"","Pterichis","Lindl.",345 11347,"","Pteroceras","Hasselt ex Hassk.",345 22882,"","Pterochilus","Hook. & Arn.",345 11348,"","Pteroglossa","Schltr.",345 11349,"","Pteroglossaspis","Rchb.f.",345 11350,"","Pterostemma","Kraenzl.",345 11351,"","Pterostylis","R.Br.",345 11352,"","Pterygodium","Sw.",345 22883,"","Ptilocnema","D.Don",345 11353,"","Ptychogyne","Pfitzer",345 11354,"","Pygmaeorchis","Brade",345 11355,"","Quekettia","Lindl.",345 22884,"","Queteletia","Blume",345 17397,"","Quisqueya","D.Don",345 22885,"","Radinocion","Ridl.",345 23941,"x","Raganara","Hort.",345 23942,"x","Ramasamyara","Hort.",345 22886,"","Ramonia","Schltr.",345 23536,"","Ramphidia","Miq.",345 24091,"x","Randactyle","E.G.Camus",345 11356,"","Rangaeris","(Schltr.) Summerh.",345 17398,"","Rauhiella","Pabst & Braga",345 25669,"","Raycadenco","Dodson",345 23943,"x","Recchara","Hort.",345 22887,"","Regnellia","Barb.Rodr.",345 11357,"","Reichenbachanthus","Barb.Rodr.",345 23944,"x","Renades","Hort.",345 23945,"x","Renafinanda","Hort.",345 23946,"x","Renaglottis","Hort.",345 23947,"x","Renancentrum","Hort.",345 23948,"x","Renanetia","Hort.",345 23949,"x","Renanopsis","Hort.",345 23950,"x","Renanstylis","Hort.",345 23951,"x","Renantanda","Hort.",345 11358,"","Renanthera","Lour.",345 11359,"","Renantherella","Ridl.",345 23952,"x","Renanthoglossum","Hort.",345 23953,"x","Renanthopsis","Hort.",345 11360,"","Renata","Ruschi",345 11361,"","Restrepia","Kunth",345 11362,"","Restrepiella","Garay & Dunst.",345 11363,"","Restrepiopsis","Luer",345 22888,"","Reymondia","H.Karst. & Kuntze",345 11364,"","Rhaesteria","Summerh.",345 23534,"","Rhamphidia","Lindl.",345 11365,"","Rhamphorhynchus","Garay",345 23553,"","Rhaphidorhynchus","Finet",345 11366,"","Rhinerrhiza","Rupp",345 23954,"x","Rhinochilus","Hort.",345 22889,"","Rhipidoglossum","Schltr.",345 11368,"","Rhizanthella","R.S.Rogers",345 24092,"x","Rhizanthera","E.G.Camus",345 23531,"","Rhomboda","Lindl.",345 22890,"","Rhynchadenia","A.Rich.",345 22891,"","Rhynchandra","Rchb.f.",345 22892,"","Rhynchanthera","Blume",345 23955,"x","Rhynchocentrum","Hort.",345 17399,"","Rhynchogyna","Seidenf. & Garay",345 11369,"","Rhyncholaelia","Schltr.",345 23956,"x","Rhynchonopsis","Hort.",345 22893,"","Rhynchopera","Klotzsch",345 11370,"","Rhynchophreatia","Schltr.",345 23957,"x","Rhynchorides","Hort.",345 22894,"","Rhynchostele","Rchb.f.",345 11371,"","Rhynchostylis","Blume",345 23958,"x","Rhynchovanda","Hort.",345 23959,"x","Rhyndoropsis","Hort.",345 23960,"x","Richardmizutaara","Hort.",345 23961,"x","Richardsonara","Hort.",345 23544,"","Ridleya","(Hook.f.) Pfitzer",345 23962,"x","Ridleyara","Hort.",345 11372,"","Ridleyella","Schltr.",345 11373,"","Rimacola","Rupp",345 11374,"","Risleya","King & Pantl.",345 22895,"","Ritaia","King & Pantl.",345 23963,"x","Robifinetia","Hort.",345 23964,"x","Robinara","Hort.",345 11375,"","Robiquetia","Gaudich.",345 23965,"x","Rodrassia","Hort.",345 23966,"x","Rodrettia","Hort.",345 23967,"x","Rodrettiopsis","Hort.",345 23968,"x","Rodrichilus","Hort.",345 23969,"x","Rodricidium","Hort.",345 23970,"x","Rodridenia","Hort.",345 23971,"x","Rodriglossum","Hort.",345 22896,"","Rodrigoa","Braas",345 11376,"","Rodriguezia","Ruiz & Pav.",345 11377,"","Rodrigueziella","Kuntze",345 11378,"","Rodrigueziopsis","Schltr.",345 23972,"x","Rodriopsis","Hort.",345 23973,"x","Rodritonia","Hort.",345 11379,"","Roeperocharis","Rchb.f.",345 11380,"","Roezliella","Schltr.",345 22897,"","Rolfea","Zahlbr.",345 23974,"x","Rolfeara","Hort.",345 11381,"","Rolfeella","Schltr.",345 23975,"x","Ronnyara","Hort.",345 23537,"","Rophostemon","Endl.",345 23030,"","Roptrostemon","Blume",345 23976,"x","Rosakirschara","Hort.",345 23977,"x","Roseara","Hort.",345 11382,"","Rossioglossum","(Schltr.) Garay & G.C.Kenn.",345 23978,"x","Rothara","Hort.",345 11383,"","Rudolfiella","Hoehne",345 23979,"x","Rumrillara","Hort.",345 11384,"","Rusbyella","Rolfe ex Rusby",345 22898,"","Saccidium","Lindl.",345 22899,"","Saccochilus","Blume",345 11385,"","Saccoglossum","Schltr.",345 11386,"","Saccolabiopsis","J.J.Sm.",345 11387,"","Saccolabium","Blume",345 22900,"","Sacodon","Raf.",345 22901,"","Sacoila","Raf.",345 23980,"x","Sagarikara","Hort.",345 23539,"","Salacistis","Rchb.f.",345 11388,"","Salpistele","Dressler",345 23981,"x","Sanderara","Hort.",345 11389,"","Sanderella","Kuntze",345 23982,"x","Sappanara","Hort.",345 22298,"","Sarcanthopsis","Garay",345 11390,"","Sarcanthus","Lindl.",345 22904,"","Sarcobodium","Beer",345 23983,"x","Sarcocentrum","Hort.",345 11391,"","Sarcochilus","R.Br.",345 22905,"","Sarcoglossum","Beer",345 11392,"","Sarcoglottis","C.Presl",345 22293,"","Sarcoglyphis","Garay",345 23984,"x","Sarconopsis","Hort.",345 24616,"","Sarcophyton","Garay",345 22906,"","Sarcopodium","Lindl.",345 11393,"","Sarcorhynchus","Schltr.",345 11394,"","Sarcostoma","Blume",345 23985,"x","Sarcothera","Hort.",345 23986,"x","Sarcovanda","Hort.",345 23987,"x","Saridestylis","Hort.",345 11395,"","Sarothrochilus","Schltr.",345 22907,"","Sarracenella","Luer",345 23988,"x","Sartylis","Hort.",345 23529,"","Satorkis","Thouars",345 11396,"","Satyridium","Lindl.",345 11397,"","Satyrium","Sw.",345 23989,"x","Sauledaara","Hort.",345 11398,"","Saundersia","Rchb.f.",345 11399,"","Sauroglossum","Lindl.",345 22908,"","Sayeria","Kraenzl.",345 11400,"","Scaphosepalum","Pfitzer",345 11401,"","Scaphyglottis","Poepp. & Endl.",345 23036,"","Scaredederis","Thouars",345 25616,"","Scelochiloides","Dodson & M.W.Chase",345 11402,"","Scelochilus","Klotzsch",345 23569,"","Schaenomorphus","Thorel ex Gagnep.",345 23990,"x","Schafferara","Hort.",345 11403,"","Schiedeella","Schltr.",345 22909,"","Schismoceras","C.Presl",345 11404,"","Schistotylus","Dockrill",345 11405,"","Schizochilus","Sond.",345 11406,"","Schizodium","Lindl.",345 25658,"","Schizopedium","Salisb.",345 22910,"","Schlechterella","Hoehne",345 11407,"","Schlimmia","Planch. & Linden",345 22911,"","Schoenleinia","Klotzsch ex Lindl.",345 11408,"","Schoenorchis","Blume",345 23991,"x","Schombavola","Hort.",345 23992,"x","Schombocatonia","Hort.",345 23993,"x","Schombocattleya","Hort.",345 23994,"x","Schombodiacrium","Hort.",345 23995,"x","Schomboepidendrum","Hort.",345 23996,"x","Schombolaelia","Hort.",345 23997,"x","Schombonia","Hort.",345 23998,"x","Schombonitis","Hort.",345 11409,"","Schomburgkia","Lindl.",345 11410,"","Schwartzkopffia","Kraenzl.",345 22912,"","Scleropterys","Scheidw.",345 23043,"","Scoliochilus","Rchb.f.",345 22913,"","Scopularia","Lindl.",345 23999,"x","Scottara","Hort.",345 24000,"x","Scullyara","Hort.",345 11411,"","Scuticaria","Lindl.",345 24001,"x","Seahexa","Hort.",345 11412,"","Sedirea","Garay & H.R.Sweet",345 11413,"","Seidenfadenia","Garay",345 11414,"","Selenipedium","Rchb.f.",345 22914,"","Semiphajus","Gagnep.",345 11415,"","Sepalosaccus","Schltr.",345 11416,"","Sepalosiphon","Schltr.",345 11417,"","Seraphyta","Fisch. & C.A.Mey.",345 11418,"","Serapias","L.",345 22915,"","Serapiastrum","Kuntze",345 24093,"x","Serapirhiza","E.G.Camus",345 22916,"","Serrastylis","Rolfe",345 23044,"","Sertifera","Lindl. & Rchb.f.",345 25650,"","Sessilibulbum","Brieger",345 22917,"","Sestochilos","Breda",345 24002,"x","Severinara","Hort.",345 24003,"x","Shigeuraara","Hort.",345 24004,"x","Shipmanara","Hort.",345 22919,"","Siagonanthus","Poepp. & Endl.",345 24005,"x","Sidranara","Hort.",345 23568,"","Sieberia","Spreng.",345 11420,"","Sievekingia","Rchb.f.",345 22918,"","Sigmatochilus","Rolfe",345 23045,"","Sigmatogyne","Pfitzer",345 11422,"","Sigmatostalix","Rchb.f.",345 24006,"x","Silpaprasertara","Hort.",345 11423,"","Silvorchis","J.J.Sm.",345 11424,"","Sinorchis","S.C.Chen",345 11425,"","Sirhookera","Kuntze",345 25637,"","Skeptrostachys","Garay",345 24007,"x","Sladeara","Hort.",345 23583,"","Smallia","Nieuwl.",345 11426,"","Smithorchis","T.Tang & F.T.Wang",345 25763,"","Smithsonia","C.J.Saldanha",345 11427,"","Smitinandia","Holttum",345 24008,"x","Sobennigraecum","Hort.",345 11428,"","Sobennikoffia","Schltr.",345 11429,"","Sobralia","Ruiz & Pav.",345 11430,"","Sodiroella","Schltr.",345 11431,"","Solenangis","Schltr.",345 25668,"","Solenidiopsis","Senghas",345 11432,"","Solenidium","Lindl.",345 11433,"","Solenocentrum","Schltr.",345 24009,"x","Sophrocattleya","Hort.",345 24010,"x","Sophrolaelia","Hort.",345 24011,"x","Sophrolaeliocattleya","Hort.",345 22920,"","Sophronia","Lindl.",345 11434,"","Sophronitella","Schltr.",345 11435,"","Sophronitis","Lindl.",345 17400,"","Soterosanthus","Lehm. ex Jenny",345 22921,"","Spathiger","Small",345 11436,"","Spathoglottis","Blume",345 22922,"","Specklinia","Lindl.",345 11437,"","Sphyrarhynchus","Mansf.",345 11438,"","Sphyrastylis","Schltr.",345 11439,"","Spiculaea","Lindl.",345 11440,"","Spiranthes","Rich.",345 22289,"","Spongiola","J.J.Wood & A.L.Lamb",345 24012,"x","Staalara","Hort.",345 23046,"","Stachyanthus","Engl.",345 24013,"x","Stacyara","Hort.",345 25631,"","Stalkya","Garay",345 24014,"x","Stamariaara","Hort.",345 24015,"x","Stanfieldara","Hort.",345 24016,"x","Stangora","Hort.",345 24017,"x","Stanhocycnis","Hort.",345 11441,"","Stanhopea","Frost ex Hook.",345 22925,"","Stanhopeastrum","Rchb.f.",345 22923,"","Staurites","Rchb.f.",345 11442,"","Staurochilus","Ridl. ex Pfitzer",345 22924,"","Stauroglottis","Schauer",345 23550,"","Stauropsis","Rchb.f.",345 22926,"","Steliopsis","Brieger",345 11443,"","Stelis","Sw.",345 24018,"x","Stellamizutaara","Hort.",345 11444,"","Stellilabium","Schltr.",345 24613,"","Stellorchis","Thouars",345 22927,"","Stellorkis","Thouars",345 11445,"","Stenia","Lindl.",345 11446,"","Stenocoryne","Lindl.",345 11447,"","Stenoglossum","Kunth",345 11448,"","Stenoglottis","Lindl.",345 22928,"","Stenopolen","Raf.",345 11449,"","Stenoptera","C.Presl",345 11450,"","Stenorrhynchos","Rich. ex Spreng.",345 11451,"","Stephanothelys","Garay",345 11452,"","Stereosandra","Blume",345 11453,"","Steveniella","Schltr.",345 23047,"","Stevenorchis","Wankow & Kraenzl.",345 24019,"x","Stewartara","Hort.",345 22929,"","Stichorkis","Thouars",345 25615,"","Stictophyllum","Dodson & M.W.Chase",345 11455,"","Stigmatodactylus","Maxim. ex Makino",345 25667,"","Stigmatosema","Garay",345 22930,"","Stimegas","Raf.",345 11456,"","Stolzia","Schltr.",345 22932,"","Strateuma","Raf.",345 22931,"","Strateuma","Salisb.",345 22933,"","Sturmia","Rchb.f.",345 22934,"","Styloglossum","Breda",345 25666,"","Suarezia","Dodson",345 23012,"","Sulpitia","Raf.",345 11457,"","Summerhayesia","P.J.Cribb",345 11458,"","Sunipia","Buch.-Ham. ex Lindl.",345 24020,"x","Sutingara","Hort.",345 11459,"","Sutrina","Lindl.",345 25655,"","Svenkoeltzia","Burns-Bal.",345 22935,"","Sylvalismis","Thouars",345 11460,"","Symphyglossum","Schltr.",345 11461,"","Symphyosepalum","Hand.-Mazz.",345 23035,"","Synadena","Raf.",345 22309,"","Synanthes","Burns-Bal., H.Rob. & M.S.Foster",345 23541,"","Synassa","Lindl.",345 22938,"","Synoplectris","Raf.",345 22939,"","Synptera","Llanos",345 11463,"","Systeloglossum","Schltr.",345 11464,"","Taeniophyllum","Blume",345 11465,"","Taeniorrhiza","Summerh.",345 11466,"","Tainia","Blume",345 11467,"","Tainiopsis","Schltr.",345 22941,"","Talpinaria","H.Karst.",345 11468,"","Tangtsinia","S.C.Chen",345 22942,"","Tankervillia","Link",345 11469,"","Tapeinoglossum","Schltr.",345 22944,"","Taurostalix","Rchb.f.",345 11470,"","Telipogon","Kunth",345 24021,"x","Teohara","Hort.",345 11471,"","Tetragamestus","Rchb.f.",345 24022,"x","Tetrakeria","Hort.",345 24023,"x","Tetraliopsis","Hort.",345 11472,"","Tetramicra","Lindl.",345 22945,"","Tetrapeltis","Lindl.",345 24024,"x","Tetratonia","Hort.",345 11473,"","Teuscheria","Garay",345 11474,"","Thaia","Seidenf.",345 17401,"","Thecopus","Seidenf.",345 11475,"","Thecostele","Rchb.f.",345 11476,"","Thelasis","Blume",345 23526,"","Thelychiton","Endl.",345 11477,"","Thelymitra","J.R.Forst. & G.Forst.",345 25665,"","Thelyschista","Garay",345 23551,"","Theodorea","Barb.Rodr.",345 24025,"x","Thesaera","Hort.",345 22946,"","Thicuania","Raf.",345 22947,"","Thiebautia","Colla",345 22948,"","Thorvaldsenia","Liebm.",345 11478,"","Thrixspermum","Lour.",345 17402,"","Thulinia","P.J.Cribb",345 11479,"","Thunia","Rchb.f.",345 22949,"","Thylacis","Gagnep.",345 22950,"","Thysanochilus","Falc.",345 11480,"","Thysanoglossa","Porto",345 15192,"","Ticoglossum","Lucas Rodr. ex Halb.",345 22951,"","Tinea","Biv.",345 11481,"","Tipularia","Nutt.",345 22952,"","Titania","Endl.",345 22953,"","Todaroa","A.Rich. & Galeotti",345 22954,"","Tolumnia","Raf.",345 22955,"","Tomotris","Raf.",345 11482,"","Townsonia","Cheeseman",345 22956,"","Trachelosiphon","Schltr.",345 11483,"","Trachoma","Garay",345 22957,"","Trachyrhizum","(Schltr.) Brieger",345 11484,"","Traunsteinera","Rchb.",345 24026,"x","Trautara","Hort.",345 24027,"x","Trevorara","Hort.",345 11485,"","Trevoria","F.Lehm.",345 11486,"","Triaristella","Brieger",345 25620,"","Triaristellina","Rauschert",345 11487,"","Trias","Lindl.",345 22958,"","Tribrachia","Lindl.",345 11488,"","Triceratorhynchus","Summerh.",345 11489,"","Trichocentrum","Poepp. & Endl.",345 11490,"","Trichoceros","Kunth",345 24028,"x","Trichocidium","Hort.",345 11491,"","Trichoglottis","Blume",345 24029,"x","Trichonopsis","Hort.",345 11492,"","Trichopilia","Lindl.",345 24030,"x","Trichopsis","Hort.",345 14831,"","Trichosalpinx","Luer",345 23034,"","Trichosia","Blume",345 22959,"","Trichosma","Lindl.",345 24031,"x","Trichostylois","Hort.",345 11493,"","Trichotosia","Blume",345 24032,"x","Trichovanda","Hort.",345 23588,"","Tricochilus","Ames",345 11494,"","Tridactyle","Schltr.",345 25648,"","Trigonanthe","(Schltr.) Brieger",345 11495,"","Trigonidium","Lindl.",345 22960,"","Triorchis","Agosti",345 22961,"","Triorchos","Small & Nash",345 11496,"","Triphora","Nutt.",345 22962,"","Tripleura","Lindl.",345 23521,"","Triplorhiza","Ehrh.",345 15957,"","Trisetella","Luer",345 22963,"","Tritelandra","Raf.",345 11497,"","Trizeuxis","Lindl.",345 22964,"","Trophianthus","Scheidw.",345 11498,"","Tropidia","Lindl.",345 22965,"","Tropilis","Raf.",345 17403,"","Trudelia","Garay",345 22966,"","Tryphia","Lindl.",345 11499,"","Tsaiorchis","T.Tang & F.T.Wang",345 24033,"x","Tubaecum","Hort.",345 11500,"","Tuberolabium","Yamam.",345 11501,"","Tubilabium","J.J.Sm.",345 24034,"x","Tuckerara","Hort.",345 22967,"","Tulexis","Raf.",345 11502,"","Tulotis","Raf.",345 22968,"","Tussaca","Raf.",345 22969,"","Tussacia","Raf. ex Desv.",345 22970,"","Tylochilus","Nees",345 11503,"","Tylostigma","Schltr.",345 22971,"","Tylostylis","Blume",345 22972,"","Ulantha","Hook.",345 11504,"","Uleiorchis","Hoehne",345 11505,"","Uncifera","Lindl.",345 22973,"","Uropedium","Lindl.",345 22974,"","Urostachya","(Lindl.) Brieger",345 24035,"x","Vanalstyneara","Hort.",345 24036,"x","Vancampe","Hort.",345 11506,"","Vanda","Jones ex R.Br.",345 24037,"x","Vandachnis","Hort.",345 24038,"x","Vandaenopsis","Hort.",345 24039,"x","Vandaeranthes","Hort.",345 24040,"x","Vandewegheara","Hort.",345 24041,"x","Vandofinetia","Hort.",345 24042,"x","Vandofinides","Hort.",345 24043,"x","Vandopsides","Hort.",345 11507,"","Vandopsis","Pfitzer",345 24044,"x","Vandoritis","Hort.",345 24045,"x","Vanglossum","Hort.",345 11508,"","Vanilla","Mill.",345 11509,"","Vargasiella","C.Schweinf.",345 24046,"x","Vascostylis","Hort.",345 25664,"","Vasqueziella","Dodson",345 24047,"x","Vaughnara","Hort.",345 17404,"","Ventricularia","Garay",345 11510,"","Vexillabium","F.Maek.",345 22975,"","Vieillardorchis","Kraenzl.",345 22976,"","Vonroemeria","J.J.Sm.",345 11511,"","Vrydagzynea","Blume",345 24048,"x","Vuylstekeara","Hort.",345 22977,"","Wailesia","Lindl.",345 23049,"","Waluewa","Regel",345 11512,"","Warmingia","Rchb.f.",345 24049,"x","Warneara","Hort.",345 11513,"","Warrea","Lindl.",345 11514,"","Warreella","Schltr.",345 11515,"","Warreopsis","Garay",345 22978,"","Warscewiczella","Rchb.f.",345 24050,"x","Westara","Hort.",345 24051,"x","Wilburchangara","Hort.",345 24052,"x","Wilkinsara","Hort.",345 24053,"x","Wilsonara","Hort.",345 24054,"x","Wingfieldara","Hort.",345 24055,"x","Withnerara","Hort.",345 24056,"x","Wooara","Hort.",345 11516,"","Wullschlaegelia","Rchb.f.",345 22979,"","Xaritonia","Raf.",345 22980,"","Xeilyathum","Raf.",345 17405,"","Xenikophyton","Garay",345 11517,"","Xerorchis","Schltr.",345 22981,"","Xiphizusa","Rchb.f.",345 22982,"","Xiphophyllum","Ehrh.",345 22983,"","Xiphosium","Griff.",345 11518,"","Xylobium","Lindl.",345 24057,"x","Yahiroara","Hort.",345 24058,"x","Yamadara","Hort.",345 24059,"x","Yapara","Hort.",345 11519,"","Yoania","Maxim.",345 11520,"","Yolanda","Hoehne",345 24060,"x","Yoneoara","Hort.",345 11521,"","Ypsilopus","Summerh.",345 24061,"x","Yusofara","Hort.",345 11522,"","Zetagyne","Ridl.",345 11523,"","Zeuxine","Lindl.",345 23528,"","Zoophora","Bernh.",345 14234,"","Zootrophion","Luer",345 22984,"","Zosterostylis","Blume",345 24062,"x","Zygobatemannia","Hort.",345 24063,"x","Zygocaste","Hort.",345 24064,"x","Zygocella","Hort.",345 24065,"x","Zygocolax","Hort.",345 22985,"","Zygoglossum","Reinw.",345 24066,"x","Zygolum","Hort.",345 24067,"x","Zygonisia","Hort.",345 11524,"","Zygopetalum","Hook.",345 24068,"x","Zygorhyncha","Hort.",345 11525,"","Zygosepalum","Rchb.f.",345 11526,"","Zygostates","Lindl.",345 24069,"x","Zygostylis","Hort.",345 21571,"","Aphyllocalpa","Lag., D.Garcia & Clemente",346 13474,"","Leptopteris","C.Presl",346 13475,"","Osmunda","L.",346 24118,"","Osmundastrum","C.Presl",346 24119,"","Plenasium","C.Presl",346 21572,"","Struthopteris","Bernh.",346 13476,"","Todea","Willd. ex Bernh.",346 24382,"","Acetosella","Kuntze",347 1670,"","Averrhoa","L.",347 1666,"","Biophytum","DC.",347 24389,"","Bolboxalis","Small",347 1671,"","Dapania","Korth.",347 24387,"","Hesperoxalis","Small",347 1667,"","Hypseocharis","J.Remy",347 24383,"","Ionoxalis","Small",347 24384,"","Lotoxalis","Small",347 24388,"","Otoxalis","Small",347 1668,"","Oxalis","L.",347 24380,"","Oxys","Mill.",347 24386,"","Pseudoxalis","Rose",347 1672,"","Sarcotheca","Blume",347 24381,"","Sassia","Molina",347 24681,"","Toddavaddia","Kuntze",347 15841,"","Trifoliada","Rojas Acosta",347 24385,"","Xanthoxalis","Small",347 58,"","Paeonia","L.",348 16950,"","Acanthococos","Barb.Rodr.",349 12205,"","Acanthophoenix","H.Wendl.",349 19012,"","Acanthorrhiza","H.Wendl.",349 19026,"","Acanthosabal","Prosch.",349 12206,"","Acoelorrhaphe","H.Wendl.",349 23232,"","Acrista","O.F.Cook",349 12207,"","Acrocomia","Mart.",349 19087,"","Acrostigma","O.F.Cook & Doyle",349 12208,"","Actinokentia","Dammer",349 19117,"","Actinophloeus","(Becc.) Becc.",349 12209,"","Actinorhytis","H.Wendl. & Drude",349 19097,"","Adelodypsis","Becc.",349 19120,"","Adelonenga","Hook.f.",349 19114,"","Adonidia","Becc.",349 19062,"","Aeria","O.F.Cook",349 12210,"","Aiphanes","Willd.",349 19156,"","Alfonsia","Kunth",349 12211,"","Allagoptera","Nees",349 12212,"","Alloschmidia","H.E.Moore",349 14266,"","Alsmithia","H.E.Moore",349 12213,"","Ammandra","O.F.Cook",349 19163,"","Amylocarpus","Barb.Rodr.",349 19045,"","Ancistrophyllum","(G.Mann & H.Wendl.) H.Wendl.",349 16951,"","Anothea","O.F.Cook",349 16952,"","Antia","O.F.Cook",349 12214,"","Antongilia","Jum.",349 25748,"","Aphandra","Barfod",349 19089,"","Arausiaca","Blume",349 12215,"","Archontophoenix","H.Wendl. & Drude",349 12216,"","Areca","L.",349 12217,"","Arecastrum","(Drude) Becc.",349 12218,"","Arenga","Labill.",349 19148,"","Arikury","Becc.",349 12219,"","Arikuryroba","Barb.Rodr.",349 16953,"","Aristeyera","H.E.Moore",349 19029,"","Arrudaria","Macedo",349 19084,"","Asraoa","J.Joseph",349 12220,"","Asterogyne","H.Wendl.",349 12221,"","Astrocaryum","G.Mey.",349 23233,"","Atitara","O.F.Cook",349 24249,"x","Attabignya","Balick, A.B.Anderson & Med.-Costa",349 12222,"","Attalea","Kunth",349 19161,"","Augustinea","Mart.",349 19165,"","Avoira","Giseke",349 12223,"","Bactris","Jacq.",349 19107,"","Bacularia","F.Muell. ex Hook.f.",349 12224,"","Balaka","Becc.",349 12225,"","Barbosa","Becc.",349 12226,"","Barcella","(Trail) Trail ex Drude",349 19127,"","Barkerwebbia","Becc.",349 12227,"","Basselinia","Vieill.",349 16954,"","Beata","O.F.Cook",349 12228,"","Beccariophoenix","Jum. & H.Perrier",349 23231,"","Beethovenia","Engel",349 19053,"","Bejaudia","Gagnep.",349 12229,"","Bentinckia","Berry ex Roxb.",349 19130,"","Bentinckiopsis","Becc.",349 12230,"","Bismarckia","Hildebrandt & H.Wendl.",349 19102,"","Bisnicholsonia","Kuntze",349 19078,"","Blancoa","Blume",349 12231,"","Borassodendron","Becc.",349 12232,"","Borassus","L.",349 12233,"","Brahea","Mart. ex Endl.",349 12234,"","Brassiophoenix","Burret",349 12235,"","Brongniartikentia","Becc.",349 12236,"","Burretiokentia","Pic.Serm.",349 12237,"","Butia","(Becc.) Becc.",349 19052,"","Calamosagus","Griff.",349 12238,"","Calamus","L.",349 19144,"","Calappa","Steck",349 12239,"","Calospatha","Becc.",349 12240,"","Calyptrocalyx","Blume",349 12241,"","Calyptrogyne","H.Wendl.",349 12242,"","Calyptronoma","Griseb.",349 12243,"","Campecarpus","H.Wendl. ex Becc.",349 12244,"","Carpentaria","Becc.",349 12245,"","Carpoxylon","H.Wendl. & Drude",349 12246,"","Caryota","L.",349 19099,"","Catis","O.F.Cook",349 12247,"","Catoblastus","H.Wendl.",349 16955,"","Catostigma","O.F.Cook & Doyle",349 12248,"","Ceratolobus","Blume",349 12249,"","Ceroxylon","Bonpl. ex DC.",349 12250,"","Chamaedorea","Willd.",349 19058,"","Chamaephoenix","H.Wendl. ex Curtiss",349 19016,"","Chamaeriphe","Steck",349 19017,"","Chamaeriphes","Ponted. ex Gaertn.",349 12251,"","Chamaerops","L.",349 12252,"","Chambeyronia","Vieill.",349 12253,"","Chelyocarpus","Dammer",349 12254,"","Chrysalidocarpus","H.Wendl.",349 12255,"","Chrysallidosperma","H.E.Moore",349 12256,"","Chuniophoenix","Burret",349 16956,"","Cladandra","O.F.Cook",349 19122,"","Cladosperma","Griff.",349 19040,"","Cleophora","Gaertn.",349 12257,"","Clinosperma","Becc.",349 12258,"","Clinostigma","H.Wendl.",349 19131,"","Clinostigmopsis","Becc.",349 12259,"","Coccothrinax","Sarg.",349 19145,"","Coccus","Mill.",349 19168,"","Cocops","O.F.Cook",349 12260,"","Cocos","L.",349 19031,"","Codda-Pana","Adans.",349 19048,"","Coelococcus","H.Wendl.",349 19110,"","Coleospadix","Becc.",349 19070,"","Collinia","(Liebm.) Liebm. ex Oerst.",349 12261,"","Colpothrinax","Griseb. & H.Wendl.",349 12262,"","Copernicia","Mart. ex Endl.",349 16957,"","Cornera","Furtado",349 16958,"","Corozo","Jacq. ex Giseke",349 12263,"","Corypha","L.",349 16959,"","Coryphomia","Rojas Acosta",349 12264,"","Cryosophila","Blume",349 16960,"","Cuatrecasea","Dugand",349 19042,"","Cucifera","Delile",349 19158,"","Curima","O.F.Cook",349 19060,"","Cyclospathe","O.F.Cook",349 12265,"","Cyphokentia","Brongn.",349 12266,"","Cyphophoenix","H.Wendl. ex Hook.f.",349 12267,"","Cyphosperma","H.Wendl. ex Hook.f.",349 12268,"","Cyrtostachys","Blume",349 19037,"","Dachel","Adans.",349 12269,"","Daemonorops","Blume",349 16961,"","Dahlgrenia","Steyerm.",349 19022,"","Dammera","Lauterb. & K.Schum.",349 19071,"","Dasystachys","Oerst.",349 12270,"","Deckenia","H.Wendl. ex Seem.",349 19085,"","Deckeria","H.Karst.",349 19109,"","Denea","O.F.Cook",349 12271,"","Desmoncus","Mart.",349 19133,"","Dicrosperma","H.Wendl. & Drude ex W.Watson",349 12272,"","Dictyocaryum","H.Wendl.",349 12273,"","Dictyosperma","H.Wendl. & Drude",349 19079,"","Didymosperma","H.Wendl. & Drude ex Hook.f.",349 19027,"","Diglossophyllum","H.Wendl. ex Salomon",349 19010,"","Diodosperma","H.Wendl.",349 19150,"","Diplothemium","Mart.",349 16962,"","Discoma","O.F.Cook",349 16963,"","Docanthe","O.F.Cook",349 19129,"","Dolichokentia","Becc.",349 19044,"","Doma","Poir.",349 19043,"","Douma","Poir.",349 12274,"","Drymophloeus","Zipp.",349 19094,"","Dypsidium","Baill.",349 12275,"","Dypsis","Noronha ex Mart.",349 12276,"","Elaeis","Jacq.",349 12277,"","Eleiodoxa","(Becc.) Burret",349 19171,"","Elephantusia","Willd.",349 19072,"","Eleutheropetalum","H.Wendl.",349 19155,"","Englerophoenix","Kuntze",349 19105,"","Eora","O.F.Cook",349 12278,"","Eremospatha","(G.Mann & H.Wendl.) H.Wendl.",349 15167,"","Erythea","S.Watson",349 16964,"","Eucheila","O.F.Cook",349 12279,"","Eugeissona","Griff.",349 19023,"","Eupritchardia","Kuntze",349 12280,"","Euterpe","Mart.",349 16965,"","Exorrhiza","Becc.",349 19038,"","Fulchironia","Lesch.",349 12281,"","Gastrococos","Morales",349 12282,"","Gaussia","H.Wendl.",349 19033,"","Gembanga","Blume",349 12283,"","Geonoma","Willd.",349 16966,"","Gigliolia","Becc.",349 19028,"","Glaucothea","O.F.Cook",349 19149,"","Glaziova","Mart. ex Drude",349 19077,"","Gomutus","Correa",349 12284,"","Goniocladus","Burret",349 19138,"","Goniosperma","Burret",349 19108,"","Grisebachia","Drude & H.Wendl.",349 12285,"","Gronophyllum","Scheff.",349 14798,"","Guihaia","J.Dransf., S.K.Lee & F.N.Wei",349 19160,"","Guilielma","Mart.",349 12286,"","Gulubia","Becc.",349 19121,"","Gulubiopsis","Becc.",349 19170,"","Gynestum","Poit.",349 16967,"","Haitiella","L.H.Bailey",349 14799,"","Halmoorea","J.Dransf. & N.W.Uhl",349 19095,"","Haplodypsis","Baill.",349 19096,"","Haplophloga","Baill.",349 19082,"","Harina","Buch.-Ham.",349 12287,"","Hedyscepe","H.Wendl. & Drude",349 16968,"","Hemithrinax","Hook.f.",349 12288,"","Heterospathe","Scheff.",349 19166,"","Hexopetion","Burret",349 12289,"","Howea","Becc.",349 12290,"","Hydriastele","H.Wendl. & Drude",349 12291,"","Hyophorbe","Gaertn.",349 12292,"","Hyospathe","Mart.",349 12293,"","Hyphaene","Gaertn.",349 12294,"","Iguanura","Blume",349 19034,"","Inodes","O.F.Cook",349 12295,"","Iriartea","Ruiz & Pav.",349 12296,"","Iriartella","H.Wendl.",349 12297,"","Itaya","H.E.Moore",349 12298,"","Jessenia","H.Karst.",349 12299,"","Johannesteijsmannia","H.E.Moore",349 12300,"","Juania","Drude",349 12301,"","Jubaea","Kunth",349 12302,"","Jubaeopsis","Becc.",349 19115,"","Kajewskia","Guillaumin",349 16969,"","Kalbreyera","Burret",349 19119,"","Kentia","Blume",349 12303,"","Kentiopsis","Brongn.",349 19128,"","Keppleria","Mart. ex Endl.",349 19139,"","Keppleria","Meisn.",349 14193,"","Kerriodoxa","J.Dransf.",349 19075,"","Kinetostigma","Dammer",349 19061,"","Klopstockia","H.Karst.",349 12304,"","Korthalsia","Blume",349 19068,"","Kunthea","Humb. & Bonpl.",349 12305,"","Laccospadix","Drude & H.Wendl.",349 12306,"","Laccosperma","(G.Mann & H.Wendl.) Drude",349 19146,"","Langsdorffia","Raddi",349 12307,"","Latania","Comm. ex Juss.",349 12308,"","Lavoixia","H.E.Moore",349 16970,"","Legnea","O.F.Cook",349 25757,"","Lemurophoenix","J.Dransf.",349 12309,"","Leopoldinia","Mart.",349 12310,"","Lepidocaryum","Mart.",349 19056,"","Lepidococcus","H.Wendl. & Drude",349 12311,"","Lepidorrhachis","(H.Wendl. & Drude) O.F.Cook",349 16971,"","Leptophoenix","Becc.",349 16972,"","Liberbaileya","Furtado",349 12312,"","Licuala","Thunb.",349 19134,"","Linoma","O.F.Cook",349 12313,"","Linospadix","H.Wendl.",349 19106,"","Linospadix","Becc. ex Hook.f.",349 19151,"","Lithocarpos","Ant.Targ.Tozz.",349 12314,"","Livistona","R.Br.",349 16973,"","Lobia","O.F.Cook",349 12315,"","Lodoicea","Comm. ex DC.",349 19041,"","Lontarus","Adans.",349 16974,"","Lophospatha","Burret",349 16975,"","Lophothele","O.F.Cook",349 19104,"","Loroma","O.F.Cook",349 12316,"","Louvelia","Jum. & H.Perrier",349 12317,"","Loxococcus","H.Wendl. & Drude",349 12318,"","Lytocaryum","Toledo",349 12319,"","Mackeea","H.E.Moore",349 22249,"","Macrocladus","Griff.",349 19093,"","Macrophloga","Becc.",349 19091,"","Malortiea","H.Wendl.",349 12320,"","Manicaria","Gaertn.",349 19157,"","Marara","H.Karst.",349 12321,"","Marojejya","Humbert",349 19100,"","Martinezia","Ruiz & Pav.",349 16976,"","Mascarena","L.H.Bailey",349 12322,"","Masoala","Jum.",349 16977,"","Mauranthe","O.F.Cook",349 12323,"","Mauritia","L.f.",349 16978,"","Mauritiella","Burret",349 12324,"","Maxburretia","Furtado",349 12325,"","Maximiliana","Mart.",349 12326,"","Medemia","Wurttemb. ex H.Wendl.",349 16979,"","Meiota","O.F.Cook",349 19086,"","Metasocratea","Dugand",349 12327,"","Metroxylon","Rottb.",349 19143,"","Micrococos","Phil.",349 12328,"","Microcoelum","Burret & Potztal",349 19135,"","Microkentia","H.Wendl. ex Hook.f.",349 16980,"","Micronoma","H.Wendl. ex Hook.f.",349 16981,"","Migandra","O.F.Cook",349 19125,"","Mischophloeus","Scheff.",349 19142,"","Molinaea","Bertero",349 17311,"","Moratia","H.E.Moore",349 16982,"","Morenia","Ruiz & Pav.",349 12329,"","Myrialepis","Becc.",349 12330,"","Nannorrhops","H.Wendl.",349 24619,"","Neanthe","O.F.Cook",349 12331,"","Nenga","H.Wendl. & Drude",349 12332,"","Nengella","Becc.",349 19046,"","Neoancistrophyllum","Rauschert",349 12333,"","Neodypsis","Baill.",349 12334,"","Neonicholsonia","Dammer",349 12335,"","Neophloga","Baill.",349 12336,"","Neoveitchia","Becc.",349 19030,"","Neowashingtonia","Sudw.",349 19136,"","Nephrocarpus","Dammer",349 12337,"","Nephrosperma","Balf.f.",349 19057,"","Nipa","Thunb.",349 12338,"","Normanbya","F.Muell. ex Becc.",349 19066,"","Nunnezharia","Ruiz & Pav.",349 19067,"","Nunnezia","Willd.",349 12339,"","Nypa","Steck",349 12340,"","Oenocarpus","Mart.",349 12341,"","Oncocalamus","(G.Mann & H.Wendl.) Hook.f.",349 12342,"","Oncosperma","Blume",349 19015,"","Oothrinax","O.F.Cook",349 19123,"","Ophiria","Becc.",349 12343,"","Opsiandra","O.F.Cook",349 12344,"","Orania","Zipp.",349 14800,"","Oraniopsis","J.Dransf., A.K.Irvine & N.W.Uhl",349 12345,"","Orbignya","Mart. ex Endl.",349 19101,"","Oreodoxa","Willd.",349 19055,"","Orophoma","Spruce",349 12346,"","Palandra","O.F.Cook",349 19035,"","Palma","Mill.",349 19051,"","Palmjuncus","Kuntze",349 16983,"","Paragulubia","Burret",349 12347,"","Parajubaea","Burret",349 16984,"","Paralinospadix","Burret",349 16985,"","Paranthe","O.F.Cook",349 12348,"","Parascheelea","Dugand",349 25829,"","Paschalococos","J.Dransf.",349 19025,"","Paurotis","O.F.Cook",349 12349,"","Pelagodoxa","Becc.",349 19021,"","Pericycla","Blume",349 12350,"","Phloga","Noronha ex Hook.f.",349 19092,"","Phlogella","Baill.",349 12351,"","Phoenicophorium","H.Wendl.",349 12352,"","Phoenix","L.",349 12353,"","Pholidocarpus","Blume",349 12354,"","Pholidostachys","H.Wendl. ex Hook.f.",349 12355,"","Physokentia","Becc.",349 12356,"","Phytelephas","Ruiz & Pav.",349 12357,"","Pichisermollia","H.C.Monteiro",349 12358,"","Pigafetta","(Blume) Becc.",349 19090,"","Pilophora","Jacq.",349 12359,"","Pinanga","Blume",349 19152,"","Pindarea","Barb.Rodr.",349 16996,"","Pithodes","O.F.Cook",349 19147,"","Platenia","H.Karst.",349 16986,"","Platythea","O.F.Cook",349 16987,"","Plectis","O.F.Cook",349 12360,"","Plectocomia","Mart. ex Blume",349 12361,"","Plectocomiopsis","Becc.",349 12362,"","Podococcus","G.Mann & H.Wendl.",349 12363,"","Pogonotium","J.Dransf.",349 12364,"","Polyandrococos","Barb.Rodr.",349 16988,"","Ponapea","Becc.",349 12365,"","Prestoea","Hook.f.",349 12366,"","Pritchardia","Seem. & H.Wendl.",349 12367,"","Pritchardiopsis","Becc.",349 12368,"","Pseudophoenix","H.Wendl. ex Sarg.",349 19124,"","Pseudopinanga","Burret",349 16989,"","Ptychandra","Scheff.",349 12369,"","Ptychococcus","Becc.",349 19132,"","Ptychoraphis","Becc.",349 12370,"","Ptychosperma","Labill.",349 19162,"","Pyrenoglyphis","H.Karst.",349 16990,"","Ranevea","L.H.Bailey",349 12371,"","Raphia","P.Beauv.",349 19065,"","Rathea","H.Karst.",349 12372,"","Ravenea","C.D.Bouche",349 19140,"","Regelia","Hort. ex H.Wendl.",349 16991,"","Rehderophoenix","Burret",349 19064,"","Reineckea","H.Karst.",349 12373,"","Reinhardtia","Liebm.",349 12374,"","Retispatha","J.Dransf.",349 12375,"","Rhapidophyllum","H.Wendl. & Drude",349 12376,"","Rhapis","L.f. ex Aiton",349 12377,"","Rhopaloblaste","Scheff.",349 12378,"","Rhopalostylis","H.Wendl. & Drude",349 19137,"","Rhynchocarpa","Becc.",349 12379,"","Rhyticocos","Becc.",349 25758,"","Roebelia","Engel",349 19118,"","Romanowia","Sander ex Andre",349 16992,"","Rooseveltia","O.F.Cook",349 12380,"","Roscheria","H.Wendl. ex Balf.f.",349 19050,"","Rotang","Adans.",349 19049,"","Rotanga","Boehm.",349 12381,"","Roystonea","O.F.Cook",349 12382,"","Sabal","Adans.",349 19111,"","Saguaster","Kuntze",349 19076,"","Saguerus","Steck",349 19054,"","Sagus","Gaertn.",349 19047,"","Sagus","Steck",349 12383,"","Salacca","Reinw.",349 19059,"","Sargentia","H.Wendl. & Drude ex Salomon",349 19019,"","Saribus","Blume",349 16993,"","Sarinia","O.F.Cook",349 12384,"","Satakentia","H.E.Moore",349 12385,"","Scheelea","H.Karst.",349 12386,"","Schippia","Burret",349 16994,"","Schizospatha","Furtado",349 19080,"","Schunda-Pana","Adans.",349 12387,"","Sclerosperma","G.Mann & H.Wendl.",349 19116,"","Seaforthia","R.Br.",349 12388,"","Serenoa","Hook.f.",349 16995,"","Simpsonia","O.F.Cook",349 12389,"","Sindroa","Jum.",349 12390,"","Siphokentia","Burret",349 19126,"","Slackia","Griff.",349 12391,"","Socratea","H.Karst.",349 19112,"","Solfia","Rech.",349 12392,"","Sommieria","Becc.",349 19073,"","Spathoscaphe","Oerst.",349 19069,"","Stachyophorbe","(Liebm. ex Mart.) Liebm.",349 19074,"","Stephanostachys","(Klotzsch) Klotzsch ex O.E.Schulz",349 19141,"","Stevensonia","Duncan ex Balf.f.",349 16997,"","Strongylocaryum","Burret",349 19024,"","Styloma","O.F.Cook",349 19063,"","Sublimia","Comm. ex Mart.",349 12393,"","Syagrus","Mart.",349 19018,"","Symphyogyne","Burret",349 12394,"","Synechanthus","H.Wendl.",349 16998,"","Taenianthera","Burret",349 19032,"","Taliera","Mart.",349 12395,"","Taveunia","Burret",349 12396,"","Tectiphiala","H.E.Moore",349 16999,"","Tessmanniodoxa","Burret",349 19011,"","Tessmanniophoenix","Burret",349 19020,"","Teysmannia","Rchb. & Zoll.",349 12397,"","Thrinax","Sw.",349 19013,"","Thrincoma","O.F.Cook",349 19014,"","Thringis","O.F.Cook",349 19081,"","Thuessinkia","Korth. ex Miq.",349 19159,"","Tilmia","O.F.Cook",349 19167,"","Toxophoenix","Schott",349 12398,"","Trachycarpus","H.Wendl.",349 19098,"","Trichodypsis","Baill.",349 12399,"","Trithrinax","Mart.",349 12402,"","Veillonia","H.E.Moore",349 12400,"","Veitchia","H.Wendl.",349 12401,"","Verschaffeltia","H.Wendl.",349 19113,"","Vitiphoenix","Becc.",349 22082,"","Voanioala","J.Dransf.",349 12403,"","Vonitra","Becc.",349 19169,"","Vouay","Aubl.",349 12404,"","Wallichia","Roxb.",349 12405,"","Washingtonia","H.Wendl.",349 12406,"","Welfia","H.Wendl.",349 12407,"","Wendlandiella","Dammer",349 19088,"","Wettinella","O.F.Cook & Doyle",349 12408,"","Wettinia","Poepp.",349 17000,"","Wettiniicarpus","Burret",349 12409,"","Wissmannia","Burret",349 14797,"","Wodyetia","Irvine",349 19103,"","Woodsonia","L.H.Bailey",349 19083,"","Wrightea","Roxb.",349 12410,"","Yarina","O.F.Cook",349 19154,"","Ynesa","O.F.Cook",349 19164,"","Yuyba","(Barb.Rodr.) L.H.Bailey",349 12411,"","Zalaccella","Becc.",349 19039,"","Zelonops","Raf.",349 12412,"","Zombia","L.H.Bailey",349 20948,"","Bennettia","R.Br.",350 14162,"","Centroplacus","Pierre",350 20949,"","Cremostachys","Tul.",350 10517,"","Galearia","Zoll. & Moritzi",350 10518,"","Microdesmis","Hook.f. ex Hook.",350 10519,"","Panda","Pierre",350 24604,"","Porphyranthus","Engl.",350 20947,"","Tetragyne","Miq.",350 12413,"","Freycinetia","Gaudich.",351 12414,"","Pandanus","Parkinson",351 12415,"","Sararanga","Hemsl.",351 348,"","Adlumia","Raf. ex DC.",352 349,"","Arctomecon","Torr. & Frem.",352 350,"","Argemone","L.",352 351,"","Bocconia","L.",352 352,"","Canbya","Parry ex A.Gray",352 24696,"","Capnoides","Mill.",352 17526,"","Cathcartia","Hook.f.",352 353,"","Ceratocapnos","Durieu",352 354,"","Chelidonium","L.",352 17527,"","Chiazospermum","Bernh.",352 24952,"","Coreanomecon","Nakai",352 355,"","Corydalis","DC.",352 356,"","Cryptocapnos","Rech.f.",352 17528,"","Cumminsia","King ex Prain",352 357,"","Cysticapnos","Mill.",352 16281,"","Cysticorydalis","Fedde ex Ikonn.",352 358,"","Dactylicapnos","Wall.",352 18713,"","Dactyliocapnos","Spreng.",352 359,"","Dendromecon","Benth.",352 360,"","Dicentra","Borkh. ex Bernh.",352 361,"","Dicranostigma","Hook.f. & Thomson",352 362,"","Discocapnos","Cham. & Schltdl.",352 24372,"","Dissosperma","Sojak",352 363,"","Eomecon","Hance",352 18711,"","Eschholtzia","Rchb.",352 16283,"","Escholtzia","Dumort.",352 18712,"","Eschscholtzia","Bernh.",352 364,"","Eschscholzia","Cham.",352 365,"","Fumaria","L.",352 366,"","Fumariola","Korsh.",352 367,"","Glaucium","Mill.",352 368,"","Hesperomecon","Greene",352 369,"","Hunnemannia","Sweet",352 370,"","Hylomecon","Maxim.",352 371,"","Hypecoum","L.",352 372,"","Macleaya","R.Br.",352 373,"","Meconella","Nutt.",352 374,"","Meconopsis","R.Vig.",352 375,"","Papaver","L.",352 17529,"","Petromecon","Greene",352 376,"","Phacocapnos","Bernh.",352 377,"","Platycapnos","(DC.) Bernh.",352 378,"","Platystemon","Benth.",352 16282,"","Platystigma","Benth.",352 24697,"","Pseudofumaria","Medik.",352 379,"","Pteridophyllum","Siebold & Zucc.",352 380,"","Roborowskia","Batalin",352 381,"","Roemeria","Medik.",352 382,"","Romneya","Harv.",352 383,"","Rupicapnos","Pomel",352 384,"","Sanguinaria","L.",352 385,"","Sarcocapnos","DC.",352 386,"","Stylomecon","G.Taylor",352 387,"","Stylophorum","Nutt.",352 388,"","Trigonocapnos","Schltr.",352 3395,"","Paracryphia","Baker f.",353 13488,"","Ceratopteris","Brongn.",354 21603,"","Ellobocarpus","Kaulf.",354 21604,"","Furcaria","Desv.",354 21602,"","Parkeria","Hook.",354 21605,"","Teleozoma","R.Br.",354 20207,"","Cryptopetalum","Hook. & Arn.",355 3311,"","Lepuropetalon","Elliott",355 3330,"","Parnassia","L.",355 4003,"","Adenia","Forssk.",356 4004,"","Ancistrothyrsus","Harms",356 4005,"","Androsiphonia","Stapf",356 25738,"","Anthactinia","Bory ex M.Roem.",356 25735,"","Asephananthes","Bory",356 25734,"","Baldwinia","Raf.",356 4006,"","Barteria","Hook.f.",356 4007,"","Basananthe","Peyr.",356 24529,"","Blepharanthes","Sm.",356 20906,"","Carania","Chiov.",356 25742,"","Ceratosepalum","Oerst.",356 25732,"","Cieca","Medik.",356 22655,"","Clemanthus","Klotzsch",356 4008,"","Crossostemma","Planch. ex Benth.",356 25739,"","Decaloba","M.Roem.",356 4009,"","Deidamia","Noronha ex Thouars",356 4010,"","Dilkea","Mast.",356 25737,"","Disemma","Labill.",356 20909,"","Echinothamnus","Engl.",356 4011,"","Efulensia","C.H.Wright",356 24530,"","Erythrocarpus","M.Roem.",356 24527,"","Giorgiella","De Wild.",356 25731,"","Granadilla","Mill.",356 4012,"","Hollrungia","K.Schum.",356 20908,"","Hounea","Baill.",356 20910,"","Jaeggia","Schinz",356 20911,"","Keramanthus","Hook.f.",356 24531,"","Kolbia","P.Beauv.",356 20912,"","Machadoa","Welw. ex Hook.f.",356 24533,"","Microblepharis","(Wight & Arn.) M.Roem.",356 4013,"","Mitostemma","Mast.",356 22146,"","Modecca","Lam.",356 25736,"","Monactineirma","Bory",356 25733,"","Murucuja","Medik.",356 20913,"","Ophiocaulon","Hook.f.",356 4014,"","Paropsia","Noronha ex Thouars",356 4015,"","Paropsiopsis","Engl.",356 24532,"","Paschanthus","Burch.",356 4016,"","Passiflora","L.",356 25740,"","Pentaria","M.Roem.",356 25741,"","Poggendorffia","H.Karst.",356 4017,"","Schlechterina","Harms",356 24528,"","Sematanthera","Pierre ex Harms",356 4018,"","Smeathmannia","Sol. ex R.Br.",356 20904,"","Tacsonia","Juss.",356 4019,"","Tetrapathaea","Rchb.",356 20905,"","Tetrastylis","Barb.Rodr.",356 24526,"","Thompsonia","R.Br.",356 20907,"","Tryphostemma","Harv.",356 4020,"","Viridivia","J.H.Hemsl. & Verdc.",356 8784,"","Ceratotheca","Endl.",357 8785,"","Craniolaria","L.",357 8786,"","Dicerocaryum","Bojer",357 8787,"","Harpagophytum","DC. ex Meisn.",357 8788,"","Holubia","Oliv.",357 14270,"","Ibicella","Van Eselt.",357 8789,"","Josephinia","Vent.",357 8790,"","Linariopsis","Welw.",357 8791,"","Martynia","L.",357 15971,"","Pedaliodiscus","Ihlenf.",357 20342,"","Pedaliophyton","Engl.",357 8792,"","Pedalium","L.",357 16251,"","Pretrea","J.Gay",357 16252,"","Pretreothamnus","Engl.",357 8793,"","Proboscidea","Schmidel",357 8794,"","Pterodiscus","Hook.",357 8795,"","Rogeria","J.Gay ex Delile",357 8796,"","Sesamothamnus","Welw.",357 8797,"","Sesamum","L.",357 20343,"","Sigmatosiphon","Engl.",357 8799,"","Trapella","Oliv.",357 16253,"","Uncaria","Burch.",357 8800,"","Uncarina","(Baill.) Stapf",357 1187,"","Pelliciera","Planch. & Triana ex Benth.",358 10029,"","Brachysiphon","A.Juss.",359 10030,"","Endonema","A.Juss.",359 10031,"","Glischrocolla","(Endl.) A.DC.",359 10032,"","Penaea","L.",359 10033,"","Saltera","Bullock",359 18018,"","Sarcocolla","Kunth",359 10034,"","Sonderothamnus","R.Dahlgren",359 10035,"","Stylapterus","A.Juss.",359 6880,"","Pentaphragma","Wall. ex G.Don",360 1182,"","Pentaphylax","Gardner & Champ.",361 3435,"","Penthorum","L.",362 929,"","Peridiscus","Benth.",363 930,"","Whittonia","Sandwith",363 11871,"","Petermannia","F.Muell.",364 2085,"","Phelline","Labill.",365 11902,"","Behnia","Didr.",366 11958,"","Eustrephus","R.Br.",366 11965,"","Geitonoplesium","A.Cunn. ex R.Br.",366 11997,"","Lapageria","Ruiz & Pav.",366 12009,"","Luzuriaga","Ruiz & Pav.",366 17485,"x","Philageria","Mast.",366 12042,"","Philesia","Comm. ex Juss.",366 12123,"","Helmholtzia","F.Muell.",367 12124,"","Orthothylax","(Hook.f.) Skottsb.",367 12125,"","Philydrella","Caruel",367 12126,"","Philydrum","Banks ex Gaertn.",367 11876,"","Agrostocrinum","F.Muell.",368 11939,"","Dianella","Lam.",368 25552,"","Eccremis","Baker",368 11959,"","Excremis","Willd.",368 12043,"","Phormium","J.R.Forst. & G.Forst.",368 12076,"","Stypandra","R.Br.",368 23083,"","Thelionema","R.J.F.Hend.",368 12101,"","Xeronema","Brongn. & Gris",368 9201,"","Phryma","L.",369 13436,"","Phyllocladus","Rich. ex Mirb.",370 790,"","Physena","Noronha ex Thouars",371 9648,"","Anisomeria","D.Don",372 9649,"","Ercilla","A.Juss.",372 16693,"","Flueckigera","Kuntze",372 9650,"","Gallesia","Casar.",372 9651,"","Hilleria","Vell.",372 9652,"","Ledenbergia","Klotzsch ex Moq.",372 9653,"","Lophiocarpus","Turcz.",372 9654,"","Microtea","Sw.",372 18009,"","Mohlana","Mart.",372 9655,"","Monococcus","F.Muell.",372 25522,"","Nowickea","J.Martinez & J.A.McDonald",372 9656,"","Petiveria","L.",372 9657,"","Phytolacca","L.",372 9658,"","Rivina","L.",372 9659,"","Schindleria","H.Walter",372 9660,"","Seguieria","Loefl.",372 9661,"","Trichostigma","A.Rich.",372 18007,"","Villamilla","Ruiz & Pav.",372 13392,"","Abies","Mill.",373 13393,"","Cathaya","Chun & Kuang",373 13394,"","Cedrus","Trew",373 24895,"","Chrysolarix","H.E.Moore",373 24900,"","Hesperopeuce","(Engelm.) Lemmon",373 24902,"x","Hesperotsuga","C.N.Page",373 13395,"","Keteleeria","Carriere",373 13396,"","Larix","Mill.",373 24901,"","Nothotsuga","Hu ex C.N.Page",373 13397,"","Picea","A.Dietr.",373 13398,"","Pinus","L.",373 13399,"","Pseudolarix","Gordon",373 13400,"","Pseudotsuga","Carriere",373 13401,"","Tsuga","Carriere",373 15902,"","Anderssoniopiper","Trel.",374 9784,"","Arctottonia","Trel.",374 25358,"","Discipiper","Trel. & Stehle",374 25360,"","Lepianthes","Raf.",374 20102,"","Lindeniopiper","Trel.",374 9785,"","Macropiper","Miq.",374 9786,"","Manekia","Trel.",374 20103,"","Ottonia","Spreng.",374 9787,"","Peperomia","Ruiz & Pav.",374 9788,"","Piper","L.",374 25359,"","Piperanthera","C.DC.",374 16705,"","Pleistachyopiper","Trel.",374 20104,"","Pothomorphe","Miq.",374 16706,"","Sarcorhachis","Trel.",374 9789,"","Trianaeopiper","Trel.",374 9790,"","Verhuellia","Miq.",374 9791,"","Zippelia","Blume",374 22219,"","Bentleya","E.M.Benn.",375 936,"","Billardiera","Sm.",375 937,"","Bursaria","Cav.",375 938,"","Cheiranthera","A.Cunn. ex Brongn.",375 939,"","Citriobatus","A.Cunn. ex Putt.",375 940,"","Hymenosporum","R.Br. ex F.Muell.",375 941,"","Marianthus","Hugel ex Endl.",375 942,"","Pittosporum","Banks ex Sol.",375 943,"","Pronaya","Hugel",375 944,"","Sollya","Lindl.",375 13477,"","Plagiogyria","(Kunze) Mett.",376 1494,"","Plagiopteron","Griff.",377 9427,"","Bougueria","Decne.",378 9428,"","Littorella","Bergius",378 9429,"","Plantago","L.",378 10653,"","Platanus","L.",379 13487,"","Platyzoma","R.Br.",380 7059,"","Acantholimon","Boiss.",381 7060,"","Aegialitis","R.Br.",381 17423,"","Aeoniopsis","Rech.f.",381 25518,"","Afrolimon","Lincz.",381 7061,"","Armeria","Willd.",381 7062,"","Bamiania","Lincz.",381 7063,"","Bubania","Girard",381 7064,"","Bukiniczia","Lincz.",381 7065,"","Cephalorhizum","Popov & Korovin",381 7066,"","Ceratostigma","Bunge",381 7067,"","Chaetolimon","(Bunge) Lincz.",381 17424,"","Dictyolimon","Rech.f.",381 7068,"","Dyerophytum","Kuntze",381 23058,"","Eremolimon","Lincz.",381 25519,"","Ghaznianthus","Lincz.",381 7069,"","Gladiolimon","Mobayen",381 7070,"","Goniolimon","Boiss.",381 7071,"","Ikonnikovia","Lincz.",381 7072,"","Limoniastrum","Fabr.",381 7073,"","Limoniopsis","Lincz.",381 7074,"","Limonium","Mill.",381 25517,"","Muellerolimon","Lincz.",381 7075,"","Neogontscharovia","Lincz.",381 7076,"","Plumbagella","Spach",381 7077,"","Plumbago","L.",381 7078,"","Popoviolimon","Lincz.",381 7079,"","Psylliostachys","(Jaub. & Spach) Nevski",381 18124,"","Statice","L.",381 25520,"","Vassilczenkoa","Lincz.",381 18125,"","Vogelia","Lam.",381 2484,"","Campylopetalum","Forman",382 2485,"","Dobinea","Buch.-Ham. ex D.Don",382 25424,"","Podoon","Baill.",382 13432,"","Acmopyle","Pilg.",383 24224,"","Afrocarpus","(Buchholz & N.E.Gray) C.N.Page",383 24219,"","Dacrycarpus","(Endl.) de Laub.",383 13433,"","Dacrydium","Lamb.",383 17377,"","Decussocarpus","de Laub.",383 24220,"","Falcatifolium","de Laub.",383 14286,"","Halocarpus","Quinn",383 14240,"","Lagarostrobos","Quinn",383 24221,"","Lepidothamnus","Phil.",383 13434,"","Microcachrys","Hook.f.",383 13435,"","Microstrobos","J.Garden & L.A.S.Johnson",383 17376,"","Nageia","Gaertn.",383 24223,"","Parasitaxus","de Laub.",383 24218,"","Pherosphaera","Archer",383 13437,"","Podocarpus","L'Her. ex Pers.",383 24222,"","Prumnopitys","Phil.",383 24225,"","Retrophyllum","C.N.Page",383 13438,"","Saxegothaea","Lindl.",383 25032,"","Stachycarpus","(Endl.) Tiegh.",383 24226,"","Sundacarpus","C.N.Page",383 16697,"","Anastrophea","Wedd.",384 9716,"","Angolaea","Wedd.",384 9717,"","Apinagia","Tul.",384 16698,"","Blandowia","Willd.",384 9718,"","Butumia","G.Taylor",384 17997,"","Carajaea","(Tul.) Wedd.",384 9719,"","Castelnavia","Tul. & Wedd.",384 9720,"","Ceratolacis","(Tul.) Wedd.",384 9721,"","Cladopus","H.Moeller",384 17996,"","Crenias","Spreng.",384 16699,"","Dalzellia","Wight",384 9722,"","Devillea","Tul. & Wedd.",384 9723,"","Dicraeanthus","Engl.",384 9724,"","Dicraeia","Thouars",384 25364,"","Diplobryum","C.Cusset",384 24287,"","Djinga","C.Cusset",384 17989,"","Dufourea","Bory ex Willd.",384 9725,"","Endocaulos","C.Cusset",384 9726,"","Farmeria","Willis ex Trimen",384 9727,"","Griffithella","(Tul.) Warm.",384 9728,"","Heterotristicha","Tobler",384 16700,"","Hydrobryopsis","Engl.",384 9729,"","Hydrobryum","Endl.",384 9730,"","Indotristicha","P.Royen",384 9731,"","Jenmaniella","Engl.",384 17992,"","Lacis","Lindl.",384 16701,"","Lawia","Griff. ex Tul.",384 25365,"","Lecomtea","Koidz.",384 9732,"","Ledermanniella","Engl.",384 9733,"","Leiothylax","Warm.",384 9734,"","Letestuella","G.Taylor",384 17994,"","Ligea","Poit. ex Tul.",384 9735,"","Lonchostephus","Tul.",384 9736,"","Lophogyne","Tul.",384 9737,"","Macarenia","P.Royen",384 9738,"","Macropodiella","Engl.",384 24322,"","Malaccotristicha","C.Cusset & G.Cusset",384 9739,"","Marathrum","Bonpl.",384 17990,"","Mnianthus","Walp.",384 9740,"","Mniopsis","Mart. & Zucc.",384 9741,"","Monandriella","Engl.",384 9742,"","Monostylis","Tul.",384 9743,"","Mourera","Aubl.",384 17995,"","Neolacis","Wedd.",384 17993,"","Oenone","Tul.",384 9744,"","Oserya","Tul. & Wedd.",384 9745,"","Paleodicraeia","C.Cusset",384 9746,"","Podostemum","Michx.",384 9747,"","Pohliella","Engl.",384 9748,"","Polypleurella","Engl.",384 9749,"","Polypleurum","(Tul.) Warm.",384 9750,"","Rhyncholacis","Tul.",384 9751,"","Saxicolella","Engl.",384 9752,"","Sphaerothylax","Bisch. ex Krauss",384 9753,"","Stonesia","G.Taylor",384 9754,"","Terniola","Tul.",384 24105,"","Terniopsis","H.C.Chao",384 9755,"","Thelethylax","C.Cusset",384 9756,"","Torrenticola","Domin",384 9757,"","Tristicha","Thouars",384 17991,"","Tulasnea","Wight",384 9758,"","Tulasneantha","P.Royen",384 9759,"","Weddellina","Tul.",384 9760,"","Wettsteiniola","Suess.",384 9761,"","Willisia","Warm.",384 9762,"","Winklerella","Engl.",384 24286,"","Zehnderia","C.Cusset",384 16702,"","Zeylanidium","(Tul.) Engl.",384 17333,"","Acanthogilia","A.G.Day & Moran",385 19401,"","Aegochloa","Benth.",385 16612,"","Aliciella","Brand",385 7932,"","Allophyllum","(Nutt.) A.D.Grant & V.E.Grant",385 19406,"","Batanthes","Raf.",385 7933,"","Bonplandia","Cav.",385 19412,"","Caldasia","Willd.",385 19407,"","Callisteris","Greene",385 7934,"","Cantua","Juss. ex Lam.",385 7935,"","Collomia","Nutt.",385 19398,"","Courtoisia","Rchb.",385 19404,"","Dactylophyllum","Spach",385 7936,"","Eriastrum","Wooton & Standl.",385 19403,"","Fenzlia","Benth.",385 19397,"","Fonna","Adans.",385 7937,"","Gilia","Ruiz & Pav.",385 19399,"","Giliastrum","Rydb.",385 7938,"","Gymnosteris","Greene",385 19411,"","Hoitzia","Juss.",385 19408,"","Hugelia","Benth.",385 7939,"","Huthia","Brand",385 7940,"","Ipomopsis","Michx.",385 7941,"","Langloisia","Greene",385 7942,"","Leptodactylon","Hook. & Arn.",385 19402,"","Leptosiphon","Benth.",385 16613,"","Linanthastrum","Ewan",385 7943,"","Linanthus","Benth.",385 7944,"","Loeselia","L.",385 17334,"","Loeseliastrum","(Brand) Timbrook",385 7945,"","Microsteris","Greene",385 7946,"","Navarretia","Ruiz & Pav.",385 19413,"","Periphragmos","Ruiz & Pav.",385 7947,"","Phlox","L.",385 19410,"","Polemoniella","A.Heller",385 7948,"","Polemonium","L.",385 19405,"","Siphonella","(A.Gray) A.Heller",385 19400,"","Tintinabulum","Rydb.",385 19414,"","Tunaria","Kuntze",385 19409,"","Welwitschia","Rchb.",385 17522,"","Acanthocladus","Klotzsch ex Hassk.",386 948,"","Atroxima","Stapf",386 949,"","Badiera","DC.",386 25799,"","Balgoya","Morat & Meijden",386 950,"","Barnhartia","Gleason",386 951,"","Bredemeyera","Willd.",386 952,"","Carpolobia","G.Don",386 953,"","Comesperma","Labill.",386 954,"","Diclidanthera","Mart.",386 24702,"","Epirhizanthes","Blume",386 955,"","Eriandra","P.Royen & Steenis",386 24953,"","Eystathes","Lour.",386 17524,"","Hualania","Phil.",386 956,"","Monnina","Ruiz & Pav.",386 16317,"","Monrosia","Grondona",386 957,"","Moutabea","Aubl.",386 17525,"","Mundia","Kunth",386 958,"","Muraltia","DC.",386 959,"","Nylandtia","Dumort.",386 960,"","Phlebotaenia","Griseb.",386 961,"","Polygala","L.",386 962,"","Salomonia","Lour.",386 963,"","Securidaca","L.",386 976,"","Xanthophyllum","Roxb.",386 25361,"","Acanthogonum","Torr.",387 17998,"","Acanthoscyphus","Small",387 18004,"","Acetosa","Mill.",387 24886,"","Acetosella","(Meisn.) Fourr.",387 24309,"","Aconogonon","(Meisn.) Rchb.",387 18000,"","Aconogonum","(Meisn.) Rchb.",387 9671,"","Afrobrunnichia","Hutch. & Dalziel",387 9672,"","Antenoron","Raf.",387 9673,"","Antigonon","Endl.",387 25228,"","Aristocapsa","Reveal & Hardham",387 9674,"","Atraphaxis","L.",387 24889,"","Bilderdykia","Dumort.",387 24890,"","Bistorta","(L.) Adans.",387 9675,"","Brunnichia","Banks ex Gaertn.",387 24887,"","Bucephalora","Pau",387 9676,"","Calligonum","L.",387 18005,"","Campderia","Benth.",387 9677,"","Centrostegia","A.Gray",387 9678,"","Chorizanthe","R.Br. ex Benth.",387 9679,"","Coccoloba","P.Browne",387 9680,"","Dedeckera","Reveal & J.T.Howell",387 24891,"","Delopyrum","Small",387 16694,"","Dentoceras","Small",387 25229,"","Dodecahema","Reveal & Hardham",387 24892,"","Duravia","(S.Watson) Greene",387 9681,"","Emex","Neck. ex Campd.",387 9682,"","Enneatypus","Herzog",387 16695,"","Eriogonella","Goodman",387 9683,"","Eriogonum","Michx.",387 24108,"","Eskemukerjea","Malick & Sengupta",387 9684,"","Fagopyrum","Mill.",387 9685,"","Fallopia","Adans.",387 9686,"","Gilmania","Coville",387 25362,"","Gonopyrum","Fisch. & C.A.Mey.",387 9687,"","Goodmania","Reveal & Ertter",387 16696,"","Gymnogonum","Parry",387 9688,"","Gymnopodium","Rolfe",387 9689,"","Harfordia","Greene & Parry",387 9690,"","Harpagocarpus","Hutch. & Dandy",387 9691,"","Hollisteria","S.Watson",387 9692,"","Homalocladium","(F.Muell.) L.H.Bailey",387 24282,"","Knorringia","(Czukav.) Tzvelev",387 9693,"","Koenigia","L.",387 9694,"","Lastarriaea","J.Remy",387 9695,"","Leptogonum","Benth.",387 9696,"","Millspaughia","B.L.Rob.",387 25230,"","Mucronea","Benth.",387 9697,"","Muehlenbeckia","Meisn.",387 9698,"","Nemacaulis","Nutt.",387 9699,"","Neomillspaughia","S.F.Blake",387 9700,"","Oxygonum","Burch. ex Campd.",387 9701,"","Oxyria","Hill",387 9702,"","Oxytheca","Nutt.",387 25363,"","Parapteropyrum","A.J.Li",387 24888,"","Persicaria","(L.) Mill.",387 17999,"","Phyllogonum","Coville",387 9703,"","Physopyrum","Popov",387 18001,"","Pleuropteropyrum","Gross",387 9704,"","Podopterus","Bonpl.",387 9705,"","Polygonella","Michx.",387 9706,"","Polygonum","L.",387 22272,"","Pterococcus","Pall.",387 9707,"","Pteropyrum","Jaub. & Spach",387 9708,"","Pterostegia","Fisch. & C.A.Mey.",387 9709,"","Pteroxygonum","Dammer & Diels",387 24893,"","Reynoutria","Houtt.",387 9710,"","Rheum","L.",387 24283,"","Rubrivena","Kral",387 9711,"","Rumex","L.",387 9712,"","Ruprechtia","C.A.Mey.",387 9713,"","Stenogonum","Nutt.",387 9714,"","Symmeria","Benth.",387 25231,"","Systenotheca","Reveal & Hardham",387 18002,"","Thysanella","A.Gray",387 18003,"","Tovara","Adans.",387 9715,"","Triplaris","Loefl. ex L.",387 13705,"","Aglaomorpha","Schott",388 21997,"","Alcicornium","Gaudich. ex Underw.",388 22018,"","Anapeltis","J.Sm.",388 13703,"","Anarthropteris","Copel.",388 22022,"","Anaxetum","Schott",388 22002,"","Apalophlebia","C.Presl",388 13706,"","Arthromeris","(T.Moore) J.Sm.",388 13707,"","Belvisia","Mirb.",388 21987,"","Campylogramma","Alderw.",388 13708,"","Campyloneurum","C.Presl",388 22003,"","Candollea","Mirb.",388 22020,"","Cheilogramme","(Blume) Underw.",388 21976,"","Cheiropteris","H.Christ",388 13709,"","Christopteris","Copel.",388 22024,"","Chrysopteris","Link",388 13710,"","Colysis","C.Presl",388 22019,"","Craspedaria","Link",388 21992,"","Crypsinopsis","Pic.Serm.",388 13711,"","Crypsinus","C.Presl",388 22029,"","Ctenopteris","Newman",388 22013,"","Cuspidaria","Fee",388 22000,"","Cyclophorus","Desv.",388 22011,"","Cyrtophlebium","(R.Br.) J.Sm.",388 13712,"","Dendroconche","Copel.",388 21981,"","Dendroglossa","C.Presl",388 13713,"","Diblemma","J.Sm.",388 13714,"","Dicranoglossum","J.Sm.",388 13715,"","Dictymia","J.Sm.",388 13716,"","Drymoglossum","C.Presl",388 13717,"","Drymotaenium","Makino",388 13718,"","Drynaria","(Bory) J.Sm.",388 13719,"","Drynariopsis","(Copel.) Ching",388 21988,"","Dryostachyum","J.Sm.",388 22012,"","Eschatogramme","Trevis. ex C.Chr.",388 22004,"","Galeoglossa","C.Presl",388 13720,"","Goniophlebium","C.Presl",388 13721,"","Grammatopteridium","Alderw.",388 21993,"","Grammatopteris","Alderw.",388 21984,"","Gymnopteris","C.Presl",388 22005,"","Gyrosorium","C.Presl",388 21989,"","Hemistachyum","(Copel.) Ching",388 13722,"","Holcosorus","T.Moore",388 13723,"","Holostachyum","(Copel.) Ching",388 21974,"","Hyalolepis","Kunze",388 22014,"","Hyalotricha","Copel.",388 13724,"","Hyalotrichopteris","W.H.Wagner",388 21973,"","Hymenolepis","Kaulf.",388 21986,"","Kaulinia","B.K.Nayar",388 21979,"","Lecanium","Reinw.",388 13725,"","Lecanopteris","Reinw.",388 13726,"","Lemmaphyllum","C.Presl",388 22030,"","Lepicystis","(J.Sm.) J.Sm.",388 22026,"","Lepidogrammitis","Ching",388 25698,"","Lepidomicrosorium","Ching & K.H.Shing",388 16733,"","Lepisorus","(J.Sm.) Ching",388 13727,"","Leptochilus","Kaulf.",388 22015,"","Lopholepis","(J.Sm.) J.Sm.",388 13704,"","Loxogramme","(Blume) C.Presl",388 21975,"","Macroplethus","C.Presl",388 22028,"","Marginaria","Bory",388 13728,"","Marginariopsis","C.Chr.",388 22017,"","Mecosorus","Klotzsch",388 13729,"","Merinthosorus","Copel.",388 25700,"","Metapolypodium","Ching",388 21991,"","Microferus","C.Presl",388 13730,"","Microgramma","C.Presl",388 23061,"","Microphlebodium","L.D.Gomez",388 22031,"","Micropteris","J.Sm.",388 13731,"","Microsorum","Link",388 22247,"","Myrmecophila","H.Christ ex Nakai",388 21978,"","Myrmecopteris","Pic.Serm.",388 13732,"","Myuropteris","C.Chr.",388 13733,"","Neocheiropteris","H.Christ",388 21977,"","Neolepisorus","Ching",388 22006,"","Neoniphopsis","Nakai",388 13734,"","Neurodium","Fee",388 21999,"","Neuroplatyceros","Fee",388 13735,"","Niphidium","J.Sm.",388 22001,"","Niphobolus","Kaulf.",388 22007,"","Niphopsis","J.Sm.",388 21983,"","Nistarika","B.K.Nayar, Madhus. & Molly",388 21995,"","Oetosis","Neck. ex Kuntze",388 22246,"","Oleandropsis","Copel.",388 21980,"","Onychium","Reinw.",388 25694,"","Paltonium","C.Presl",388 16734,"","Paragramma","(Blume) T.Moore",388 21982,"","Paraleptochilus","Copel.",388 14848,"","Pecluma","M.G.Price",388 13736,"","Pessopteris","Underw. & Maxon",388 13737,"","Phlebodium","(R.Br.) J.Sm.",388 13738,"","Photinopteris","J.Sm.",388 21994,"","Phymatopsis","J.Sm.",388 13739,"","Phymatopteris","Pic.Serm.",388 21985,"","Phymatosorus","Pic.Serm.",388 13740,"","Platycerium","Desv.",388 25704,"","Platygyria","Ching & S.K.Wu",388 13741,"","Pleopeltis","Humb. & Bonpl. ex Willd.",388 22248,"x","Pleopodium","Schelpe & N.C.Anthony",388 22023,"","Pleuridium","(C.Presl) Fee",388 22016,"","Pleurogonium","(C.Presl) Lindl.",388 13743,"","Podosorus","Holttum",388 22008,"","Polycampium","C.Presl",388 25705,"","Polypodiastrum","Ching",388 25706,"","Polypodioides","Ching",388 22027,"","Polypodiopsis","Copel.",388 13744,"","Polypodiopteris","C.F.Reed",388 13745,"","Polypodium","L.",388 24129,"","Pseudocolysis","L.D.Gomez",388 13746,"","Pseudodrynaria","C.Chr. ex Ching",388 21990,"","Psygmium","C.Presl",388 21998,"","Pteropsis","Desv.",388 13747,"","Pycnoloma","C.Chr.",388 13748,"","Pyrrosia","Mirb.",388 22025,"","Rhizophyllum","Newman",388 21996,"","Saxiglossum","Ching",388 22032,"","Schellolepis","J.Sm.",388 22009,"","Scyopteris","C.Presl",388 13749,"","Selliguea","Bory",388 13750,"","Solanopteris","Copel.",388 22010,"","Sphaerostichum","C.Presl",388 16735,"","Synammia","J.Sm.",388 13751,"","Thayeria","Copel.",388 13752,"","Thylacopteris","Kunze ex J.Sm.",388 25709,"","Tricholepidium","Ching",388 13753,"","Weatherbya","Copel.",388 12115,"","Eichhornia","Kunth",389 12116,"","Eurystemon","Alexander",389 12117,"","Heteranthera","Ruiz & Pav.",389 12118,"","Hydrothrix","Hook.f.",389 12119,"","Monochoria","C.Presl",389 12120,"","Pontederia","L.",389 12121,"","Reussia","Endl.",389 12122,"","Scholleropsis","H.Perrier",389 15190,"","Zosterella","Small",389 25428,"","Amphipetalum","Bacigalupo",390 1066,"","Anacampseros","L.",390 1067,"","Calandrinia","Kunth",390 25122,"","Calandriniopsis","E.Franz",390 1068,"","Calyptridium","Nutt.",390 1069,"","Calyptrotheca","Gilg",390 1070,"","Ceraria","H.Pearson & Stephens",390 1071,"","Claytonia","L.",390 16186,"","Claytoniella","Jurtzev",390 1072,"","Crunocallis","Rydb.",390 1073,"","Grahamia","Gillies ex Hook. & Arn.",390 1074,"","Lenzia","Phil.",390 1075,"","Lewisia","Pursh",390 16328,"","Limnalsine","Rydb.",390 24707,"","Limnia","Haw.",390 24954,"","Maxia","O.Nilsson",390 16340,"","Mona","O.Nilsson",390 1076,"","Monocosmia","Fenzl",390 1077,"","Montia","L.",390 16179,"","Montiastrum","Rydb.",390 1078,"","Montiopsis","Kuntze",390 16341,"","Naiocrene","(Torr. & A.Gray) Rydb.",390 16342,"","Neopaxia","O.Nilsson",390 1079,"","Oreobroma","Howell",390 24708,"","Paxia","O.Nilsson",390 1080,"","Philippiamra","Kuntze",390 1081,"","Portulaca","L.",390 1082,"","Portulacaria","Jacq.",390 16690,"","Rumicastrum","Ulbr.",390 24706,"","Sabouraea","Leandri",390 23203,"","Schreiteria","Carolin",390 1083,"","Sedopsis","(Engl.) Exell & Mendonca",390 1084,"","Silvaea","Phil.",390 1085,"","Spraguea","Torr.",390 25427,"","Talinaria","Brandegee",390 1086,"","Talinella","Baill.",390 1087,"","Talinopsis","A.Gray",390 1088,"","Talinum","Adans.",390 12573,"","Posidonia","K.Koenig",391 12570,"","Groenlandia","J.Gay",392 12571,"","Potamogeton","L.",392 12572,"","Ruppia","L.",392 7080,"","Anagallis","L.",393 7081,"","Androsace","L.",393 7082,"","Apochoris","Duby",393 7083,"","Ardisiandra","Hook.f.",393 18126,"","Aretia","Link",393 18127,"","Aretia","L.",393 7084,"","Asterolinon","Hoffmanns. & Link",393 7085,"","Bryocarpum","Hook.f. & Thomson",393 18083,"","Centunculus","L.",393 7086,"","Coris","L.",393 7087,"","Cortusa","L.",393 7088,"","Cyclamen","L.",393 7089,"","Dionysia","Fenzl",393 7091,"","Dodecatheon","L.",393 7092,"","Douglasia","Lindl.",393 7093,"","Glaux","L.",393 18128,"","Gregoria","Duby",393 7094,"","Hottonia","L.",393 7095,"","Kaufmannia","Regel",393 7096,"","Lysimachia","L.",393 18082,"","Naumburgia","Moench",393 7097,"","Omphalogramma","(Franch.) Franch.",393 7098,"","Pelletiera","A.St.-Hil.",393 7099,"","Pomatosace","Maxim.",393 7100,"","Primula","L.",393 16879,"","Pseudoprimula","(Pax) O.Schwarz",393 7101,"","Samolus","L.",393 7102,"","Soldanella","L.",393 25383,"","Sredinskya","(Stein) Fed.",393 7103,"","Steironema","Raf.",393 7104,"","Stimpsonia","C.Wright ex A.Gray",393 7105,"","Trientalis","L.",393 16737,"","Vitaliana","Sesl.",393 9908,"","Adenanthos","Labill.",394 9909,"","Agastachys","R.Br.",394 25747,"","Alloxylon","P.H.Weston & Crisp",394 9910,"","Aulax","Bergius",394 9911,"","Austromuellera","C.T.White",394 9912,"","Banksia","L.f.",394 9913,"","Beauprea","Brongn. & Gris",394 9914,"","Beaupreopsis","Virot",394 9915,"","Bellendena","R.Br.",394 9916,"","Bleasdalea","F.Muell. ex Domin",394 9917,"","Brabejum","L.",394 9918,"","Buckinghamia","F.Muell.",394 9919,"","Cardwellia","F.Muell.",394 9920,"","Carnarvonia","F.Muell.",394 9921,"","Cenarrhenes","Labill.",394 9922,"","Conospermum","Sm.",394 16712,"","Cyanocarpus","F.M.Bailey",394 9923,"","Darlingia","F.Muell.",394 9924,"","Diastella","Salisb. ex Knight",394 9925,"","Dilobeia","Thouars",394 18017,"","Diploptera","C.A.Gardner",394 9926,"","Dryandra","R.Br.",394 9927,"","Embothrium","J.R.Forst. & G.Forst.",394 9928,"","Euplassa","Salisb. ex Knight",394 9929,"","Faurea","Harv.",394 9930,"","Finschia","Warb.",394 9931,"","Franklandia","R.Br.",394 9932,"","Garnieria","Brongn. & Gris",394 9933,"","Gevuina","Molina",394 9934,"","Grevillea","R.Br. ex Knight",394 9935,"","Hakea","Schrad.",394 9936,"","Helicia","Lour.",394 9937,"","Heliciopsis","Sleumer",394 9938,"","Hicksbeachia","F.Muell.",394 9939,"","Hollandaea","F.Muell.",394 9940,"","Isopogon","R.Br. ex Knight",394 9941,"","Kermadecia","Brongn. & Gris",394 9942,"","Knightia","R.Br.",394 9943,"","Lambertia","Sm.",394 9944,"","Leucadendron","R.Br.",394 9945,"","Leucospermum","R.Br.",394 9946,"","Lomatia","R.Br.",394 9947,"","Macadamia","F.Muell.",394 17767,"","Malagasia","L.A.S.Johnson & B.G.Briggs",394 9948,"","Mimetes","Salisb.",394 9949,"","Musgravea","F.Muell.",394 9950,"","Neorites","L.S.Sm.",394 22269,"","Nivenia","R.Br.",394 9951,"","Opisthiolepis","L.S.Sm.",394 9952,"","Oreocallis","R.Br.",394 9953,"","Orites","R.Br.",394 9954,"","Orothamnus","Pappe ex Hook.",394 9955,"","Panopsis","Salisb. ex Knight",394 9956,"","Paranomus","Salisb.",394 9957,"","Persoonia","Sm.",394 9958,"","Petrophile","R.Br. ex Knight",394 9959,"","Placospermum","C.T.White & W.D.Francis",394 9960,"","Protea","L.",394 9961,"","Roupala","Aubl.",394 9962,"","Serruria","Salisb.",394 9963,"","Sleumerodendron","Virot",394 9964,"","Sorocephalus","R.Br.",394 9965,"","Spatalla","Salisb.",394 16711,"","Spatallopsis","E.Phillips",394 9966,"","Sphalmium","B.G.Briggs, B.Hyland & L.A.S.Johnson",394 9967,"","Stenocarpus","R.Br.",394 9968,"","Stirlingia","Endl.",394 9969,"","Strangea","Meisn.",394 9970,"","Symphionema","R.Br.",394 9971,"","Synaphea","R.Br.",394 9972,"","Telopea","R.Br.",394 24316,"","Turrillia","A.C.Sm.",394 17766,"","Vexatorella","Rourke",394 9973,"","Xylomelum","Sm.",394 21548,"","Bernhardia","Willd. ex Bernh.",395 21549,"","Hoffmannia","Willd.",395 13462,"","Psilotum","Sw.",395 13463,"","Tmesipteris","Bernh.",395 21550,"","Tristeca","P.Beauv.",395 1981,"","Cedrelopsis","Baill.",396 1982,"","Ptaeroxylon","Eckl. & Zeyh.",396 13499,"","Acrostichum","L.",397 13492,"","Afropteris","Alston",397 13493,"","Anopteris","Prantl ex Diels",397 21609,"","Aropteris","Alston",397 21610,"","Campteria","C.Presl",397 21667,"","Chrysodium","Fee",397 21611,"","Copelandiopteris","B.C.Stone",397 21612,"","Hemipteris","Rosenst.",397 21615,"","Heterophlebium","Fee",397 13494,"","Idiopteris","T.G.Walker",397 21616,"","Lathyropteris","H.Christ",397 21617,"","Lemapteris","Raf.",397 21613,"","Litobrochia","C.Presl",397 21618,"","Monogonia","C.Presl",397 13495,"","Nevrocallis","Fee",397 13496,"","Ochropteris","J.Sm.",397 21619,"","Peripteris","Raf.",397 21620,"","Phyllitis","Raf.",397 21621,"","Pteridium","Raf.",397 21622,"","Pterilis","Raf.",397 13497,"","Pteris","L.",397 21623,"","Pycnodoria","C.Presl",397 21614,"","Schizostege","W.F.Hillebr.",397 21625,"","Schizostegeopsis","Copel.",397 21624,"","Thelipteris","Adans.",397 1807,"","Pterostemon","Schauer",398 1142,"","Froesia","Pires",399 1143,"","Lacunaria","Ducke",399 1144,"","Quiina","Aubl.",399 1145,"","Touroulia","Aubl.",399 9765,"","Apodanthes","Poit.",400 9766,"","Bdallophyton","Eichler",400 25326,"","Berlinianche","(Harms) Vattimo",400 22271,"","Brugmansia","Blume",400 9767,"","Cytinus","L.",400 25407,"","Mitrastemma","Makino",400 9768,"","Mitrastemon","Makino",400 9769,"","Pilostyles","Guill.",400 9770,"","Rafflesia","R.Br.",400 9771,"","Rhizanthes","Dumort.",400 9772,"","Sapria","Griff.",400 1,"","Aconitum","L.",401 2,"","Actaea","L.",401 3,"","Adonis","L.",401 25116,"","Alexeya","Pachom.",401 25355,"","Anemoclema","(Franch.) W.T.Wang",401 4,"","Anemone","L.",401 5,"","Anemonella","Spach",401 25491,"","Anemonidium","(Spach) A.Love & D.Love",401 6,"","Anemonopsis","Siebold & Zucc.",401 25492,"","Anetilla","Galushko",401 24672,"","Aphanostemma","A.St.-Hil.",401 7,"","Aquilegia","L.",401 24668,"","Archiclematis","(Tamura) Tamura",401 24676,"","Arcteranthis","Greene",401 24956,"","Arsenjevia","Starod.",401 8,"","Aspidophyllum","Ulbr.",401 9,"","Asteropyrum","J.R.Drumm. & Hutch.",401 17514,"","Atragene","L.",401 10,"","Barneoudia","Gay",401 17515,"","Batrachium","(DC.) Gray",401 17516,"","Beckwithia","Jeps.",401 11,"","Beesia","Balf.f. & W.W.Sm.",401 12,"","Calathodes","Hook.f. & Thomson",401 13,"","Callianthemum","C.A.Mey.",401 14,"","Caltha","L.",401 15,"","Capethia","Britton",401 24673,"","Casalea","A.St.-Hil.",401 25545,"","Ceratocephala","Moench",401 16,"","Ceratocephalus","Pers.",401 18655,"","Chienia","W.T.Wang",401 17,"","Cimicifuga","Wernisch.",401 18,"","Clematis","L.",401 19,"","Clematopsis","Bojer ex Hutch.",401 20,"","Consolida","Gray",401 21,"","Coptis","Salisb.",401 24669,"","Coriflora","Weber",401 24677,"","Cyrtorhyncha","Nutt.",401 22,"","Delphinium","L.",401 24680,"","Dichocarpum","W.T.Wang & P.K.Hsiao",401 25494,"","Diedropetala","Galushko",401 23,"","Enemion","Raf.",401 24,"","Eranthis","Salisb.",401 17517,"","Eriocapitella","Nakai",401 24674,"","Ficaria","Schaeff.",401 25,"","Gampsoceras","Steven",401 26,"","Garidella","L.",401 27,"","Halerpestes","Greene",401 28,"","Hamadryas","Comm. ex Juss.",401 29,"","Helleborus","L.",401 30,"","Hepatica","Mill.",401 31,"","Hydrastis","L.",401 32,"","Isopyrum","L.",401 25493,"","Jurtsevia","A.Love & D.Love",401 33,"","Kingdonia","Balf.f. & W.W.Sm.",401 34,"","Knowltonia","Salisb.",401 35,"","Komaroffia","Kuntze",401 17513,"","Krapfia","DC.",401 24678,"","Kumlienia","Greene",401 36,"","Laccopetalum","Ulbr.",401 37,"","Leptopyrum","Rchb.",401 17518,"","Megaleranthis","Ohwi",401 24671,"","Metanemone","W.T.Wang",401 38,"","Miyakea","Miyabe & Tatew.",401 39,"","Myosurus","L.",401 40,"","Naravelia","Adans.",401 41,"","Nigella","L.",401 42,"","Oreithales","Schltdl.",401 43,"","Oxygraphis","Bunge",401 44,"","Paraquilegia","J.R.Drumm. & Hutch.",401 45,"","Paropyrum","Ulbr.",401 46,"","Paroxygraphis","W.W.Sm.",401 17519,"","Piuttia","Mattei",401 24679,"","Psychrophila","(DC.) Bercht. & J.Presl",401 16187,"","Pulsatilla","Mill.",401 47,"","Ranunculus","L.",401 24675,"","Rhopalopodium","Ulbr.",401 48,"","Schlagintweitiella","Ulbr.",401 49,"","Semiaquilegia","Makino",401 17520,"","Shibateranthis","Nakai",401 50,"","Souliea","Franch.",401 17530,"","Stipularia","Delpino",401 17521,"","Syndesmon","(Hoffmanns. ex Endl.) Britton",401 51,"","Thalictrum","L.",401 52,"","Trautvetteria","Fisch. & C.A.Mey.",401 53,"","Trollius","L.",401 54,"","Urophysa","Ulbr.",401 24670,"","Viorna","Rchb.",401 55,"","Xanthorhiza","Marshall",401 12177,"","Amphiphyllum","Gleason",402 12178,"","Cephalostemon","R.H.Schomb.",402 12179,"","Duckea","Maguire",402 12180,"","Epidryos","Maguire",402 18901,"","Epiphyton","Maguire",402 12181,"","Guacamaya","Maguire",402 12182,"","Kunhardtia","Maguire",402 17499,"","Marahuacaea","Maguire",402 12183,"","Maschalocephalus","Gilg & K.Schum.",402 12184,"","Monotrema","Korn.",402 12185,"","Phelpsiella","Maguire",402 12186,"","Potarophytum","Sandwith",402 12187,"","Rapatea","Aubl.",402 12188,"","Saxofridericia","R.H.Schomb.",402 12189,"","Schoenocephalium","Seub.",402 12190,"","Spathanthus","Desv.",402 12191,"","Stegolepis","Klotzsch ex Korn.",402 12192,"","Windsorina","Gleason",402 17511,"","Astrocarpa","Dumort.",403 17512,"","Astrocarpus","Duby",403 804,"","Caylusea","A.St.-Hil.",403 805,"","Homalodiscus","Bunge ex Boiss.",403 806,"","Ochradenus","Delile",403 807,"","Oligomeris","Cambess.",403 808,"","Randonia","Coss.",403 809,"","Reseda","L.",403 810,"","Sesamoides","Ortega",403 12604,"","Alexgeorgea","Carlquist",404 12605,"","Anthochortus","Nees",404 25795,"","Antochortus","Nees",404 12606,"","Askidiosperma","Steud.",404 24641,"","Calopsis","P.Beauv. ex Desv.",404 12607,"","Calorophus","Labill.",404 12608,"","Cannomois","P.Beauv. ex Desv.",404 17018,"","Ceratocaryum","Nees",404 12609,"","Chaetanthus","R.Br.",404 12610,"","Chondropetalum","Rottb.",404 12611,"","Coleocarya","S.T.Blake",404 12612,"","Dielsia","Gilg",404 17019,"","Dovea","Kunth",404 12613,"","Elegia","L.",404 12614,"","Empodisma","L.A.S.Johnson & D.F.Cutler",404 12615,"","Harperia","W.Fitzg.",404 12616,"","Hopkinsia","W.Fitzg.",404 24644,"","Hydrophilus","Linder",404 12617,"","Hypodiscus","Nees",404 12618,"","Hypolaena","R.Br.",404 24638,"","Ischyrolepis","Steud.",404 17020,"","Lamprocaulos","Mast.",404 12619,"","Lepidobolus","Nees",404 12620,"","Leptocarpus","R.Br.",404 12621,"","Lepyrodia","R.Br.",404 12622,"","Loxocarya","R.Br.",404 12623,"","Lyginia","R.Br.",404 24645,"","Mastersiella","Gilg-Ben.",404 12624,"","Meeboldina","Suess.",404 24639,"","Megalotheca","F.Muell.",404 19211,"","Mesanthus","Nees",404 24643,"","Nevillea","Esterh. & H.P.Linder",404 12625,"","Onychosepalum","Steud.",404 12626,"","Phyllocomos","Mast.",404 24640,"","Platycaulos","Linder",404 24894,"","Pseudoloxocarya","Linder",404 12627,"","Restio","Rottb.",404 24642,"","Rhodocoma","Nees",404 19212,"","Schlechteria","Mast.",404 12628,"","Sporadanthus","F.Muell.",404 12629,"","Staberoha","Kunth",404 12630,"","Thamnochortus","Bergius",404 12631,"","Willdenowia","Thunb.",404 23059,"","Winifredia","L.A.S.Johnson & B.G.Briggs",404 7842,"","Retzia","Thunb.",405 1813,"","Rhabdodendron","Gilg & Pilg.",406 2173,"","Adolphia","Meisn.",407 2174,"","Alphitonia","Reissek ex Endl.",407 2175,"","Alvimiantha","Grey-Wilson",407 2176,"","Ampelozizyphus","Ducke",407 17862,"","Apteron","Kurz",407 16437,"","Araliorhamnus","H.Perrier",407 2177,"","Auerodendron","Urb.",407 17868,"","Barcena","Duges",407 2178,"","Bathiorhamnus","Capuron",407 2179,"","Berchemia","Neck. ex DC.",407 2180,"","Berchemiella","Nakai",407 2181,"","Blackallia","C.A.Gardner",407 2182,"","Ceanothus","L.",407 16438,"","Chacaya","Escal.",407 2183,"","Chaydaia","Pit.",407 2184,"","Colletia","Comm. ex Juss.",407 2185,"","Colubrina","Rich. ex Brongn.",407 2186,"","Condalia","Cav.",407 2187,"","Condaliopsis","(Weberb.) Suess.",407 2188,"","Cormonema","Reissek ex Endl.",407 2189,"","Crumenaria","Mart.",407 2190,"","Cryptandra","Sm.",407 17865,"","Dallachya","F.Muell.",407 25596,"","Disaster","Gilli",407 2191,"","Discaria","Hook.",407 2192,"","Doerpfeldia","Urb.",407 2193,"","Emmenosperma","F.Muell.",407 16188,"","Frangula","Mill.",407 2194,"","Gouania","Jacq.",407 2195,"","Helinus","E.Mey. ex Endl.",407 2196,"","Hovenia","Thunb.",407 2197,"","Hybosperma","Urb.",407 16441,"","Karlea","Pierre",407 2198,"","Karwinskia","Zucc.",407 2199,"","Kentrothamnus","Suess. & Overkott",407 2200,"","Krugiodendron","Urb.",407 17867,"","Lamellisepalum","Engl.",407 2201,"","Lasiodiscus","Hook.f.",407 2202,"","Macrorhamnus","Baill.",407 2203,"","Maesopsis","Engl.",407 16439,"","Marlothia","Engl.",407 17864,"","Microrhamnus","A.Gray",407 2204,"","Nesiota","Hook.f.",407 2205,"","Noltea","Rchb.",407 17869,"","Notophaena","Miers",407 17870,"","Ochetophila","Poepp. ex Reissek",407 16440,"","Oreoherzogia","W.Vent",407 2206,"","Oreorhamnus","Ridl.",407 2207,"","Paliurus","Mill.",407 2208,"","Phylica","L.",407 17866,"","Phyllogeiton","(Weberb.) Herzog",407 2209,"","Pleuranthodes","Weberb.",407 2210,"","Pomaderris","Labill.",407 2211,"","Reissekia","Endl.",407 2212,"","Retanilla","(DC.) Brongn.",407 2213,"","Reynosia","Griseb.",407 2214,"","Rhamnella","Miq.",407 2215,"","Rhamnidium","Reissek",407 2216,"","Rhamnus","L.",407 2217,"","Sageretia","Brongn.",407 17863,"","Sarcomphalus","P.Browne",407 2218,"","Schistocarpaea","F.Muell.",407 2219,"","Scutia","(DC.) Brongn.",407 2220,"","Siegfriedia","C.A.Gardner",407 2221,"","Smythea","Seem.",407 2222,"","Spyridium","Fenzl",407 16442,"","Stenanthemum","Reissek",407 2223,"","Talguenea","Miers ex Endl.",407 2224,"","Trevoa","Miers ex Hook.",407 2225,"","Trymalium","Fenzl",407 2226,"","Ventilago","Gaertn.",407 2227,"","Ziziphus","Mill.",407 16225,"","Rhipogonum","J.R.Forst. & G.Forst.",408 25415,"","Ripogonum","J.R.Forst. & G.Forst.",408 3498,"","Anopyxis","(Pierre) Engl.",409 24471,"","Anstrutheria","Gardner",409 24465,"","Barraldeia","Thouars",409 3499,"","Blepharistemma","Wall. ex Benth.",409 3500,"","Bruguiera","Sav.",409 3501,"","Carallia","Roxb.",409 3502,"","Cassipourea","Aubl.",409 3503,"","Ceriops","Arn.",409 24469,"","Comiphyton","Floret",409 3505,"","Crossostylis","J.R.Forst. & G.Forst.",409 16472,"","Dactylopetalum","Benth.",409 24464,"","Diatoma","Lour.",409 3506,"","Gynotroches","Blume",409 20340,"","Haplopetalon","A.Gray",409 20341,"","Haplopetalum","Miq.",409 3507,"","Kandelia","(DC.) Wight & Arn.",409 20338,"","Kanilia","Blume",409 24466,"","Karekandel","Wolf",409 24470,"","Legnotis","Sw.",409 3508,"","Macarisia","Thouars",409 20336,"","Mangium","Rumph. ex Scop.",409 20337,"","Paletuviera","Thouars ex DC.",409 3509,"","Pellacalyx","Korth.",409 24474,"","Petalodactylis","Arenes",409 24467,"","Petelotoma","DC.",409 20339,"","Plaesiantha","Hook.f.",409 3512,"","Rhizophora","L.",409 24472,"","Richaeia","Thouars",409 24473,"","Richea","Kuntze",409 3513,"","Sagittipetalum","Merr.",409 3514,"","Sterigmapetalum","Kuhlm.",409 16473,"","Weihea","Spreng.",409 10664,"","Rhoiptelea","Diels & Hand.-Mazz.",410 3948,"","Rhynchocalyx","Oliv.",411 3440,"","Roridula","Burm.f. ex L.",412 3170,"","Acaena","Mutis ex L.",413 3171,"","Acomastylis","Greene",413 3172,"","Adenostoma","Hook. & Arn.",413 3173,"","Agrimonia","L.",413 3174,"","Alchemilla","L.",413 3175,"","Amelanchier","Medik.",413 20954,"","Amygdalopersica","Daniel",413 20955,"","Amygdalophora","M.Roem.",413 20957,"","Amygdalopsis","M.Roem.",413 20958,"","Amygdalus","L.",413 3176,"","Aphanes","L.",413 3177,"","Aremonia","Neck. ex Nestl.",413 20160,"","Argentina","Hill",413 20168,"","Aria","(Pers.) Host",413 25180,"","Ariosorbus","Koidz.",413 3178,"","Aronia","Medik.",413 3179,"","Aruncus","L.",413 16451,"","Atomostigma","Kuntze",413 25181,"","Batidaea","(Dumort.) Greene",413 3180,"","Bencomia","Webb & Berthel.",413 22228,"","Bollwilleria","Zabel",413 25182,"","Brachycaulos","Dikshit & Panigrahi",413 20164,"","Brayera","Kunth",413 20959,"","Cerapadus","Buia",413 20960,"","Ceraseidos","Siebold & Zucc.",413 20961,"","Cerasus","Mill.",413 3181,"","Cercocarpus","Kunth",413 3182,"","Chaenomeles","Lindl.",413 3183,"","Chamaebatia","Benth.",413 3184,"","Chamaebatiaria","(Porter) Maxim.",413 3185,"","Chamaemeles","Lindl.",413 3186,"","Chamaerhodos","Bunge",413 3187,"","Cliffortia","L.",413 3188,"","Coleogyne","Torr.",413 3189,"","Coluria","R.Br.",413 20161,"","Comarella","Rydb.",413 20157,"","Comarobatia","Greene",413 20159,"","Comaropsis","Rich.",413 3190,"","Comarum","L.",413 20162,"","Commarum","Schrank",413 20169,"","Cormus","Spach",413 3191,"","Cotoneaster","Medik.",413 3192,"","Cowania","D.Don",413 22229,"x","Cratae-Mespilus","E.G.Camus",413 22230,"+","Crataegomespilus","Simon-Louis & Bellair",413 3193,"","Crataegus","L.",413 3194,"","Cydonia","Mill.",413 20163,"","Dasiphora","Raf.",413 16189,"","Dendriopoterium","Svent.",413 3195,"","Dichotomanthes","Kurz",413 3196,"","Docynia","Decne.",413 25183,"","Dryadanthe","Endl.",413 3197,"","Dryas","L.",413 3198,"","Drymocallis","Fourr. ex Rydb.",413 3199,"","Duchesnea","Sm.",413 16452,"","Eleiosina","Raf.",413 20963,"","Emplectocladus","Torr.",413 3200,"","Eriobotrya","Lindl.",413 20154,"","Eriogynia","Hook.",413 20170,"","Eriolobus","(DC.) M.Roem.",413 25184,"","Erythrocoma","Greene",413 3201,"","Exochorda","Lindl.",413 3202,"","Fallugia","Endl.",413 22277,"","Farinopsis","Chrtek & Sojak",413 3203,"","Filipendula","Mill.",413 3204,"","Fragaria","L.",413 3205,"","Geum","L.",413 3206,"","Gillenia","Moench",413 3207,"","Guamatela","Donn.Sm.",413 3208,"","Hagenia","J.F.Gmel.",413 3209,"","Hesperomeles","Lindl.",413 16453,"","Heteromeles","M.Roem.",413 3210,"","Holodiscus","(K.Koch) Maxim.",413 3211,"","Horkelia","Cham. & Schltdl.",413 3212,"","Horkeliella","(Rydb.) Rydb.",413 20166,"","Hulthemia","Dumort.",413 20167,"","Hulthemosa","Juz.",413 3213,"","Ivesia","Torr. & A.Gray",413 3214,"","Kageneckia","Ruiz & Pav.",413 3215,"","Kelseya","Rydb.",413 3216,"","Kerria","DC.",413 24459,"","Lachemilla","(Focke) Rydb.",413 20964,"","Lauro-Cerasus","Duhamel",413 3217,"","Leucosidea","Eckl. & Zeyh.",413 3218,"","Lindleya","Kunth",413 20155,"","Lindleyella","Rydb.",413 3219,"","Luetkea","Bong.",413 3220,"","Lyonothamnus","A.Gray",413 3221,"","Maddenia","Hook.f. & Thomson",413 3222,"","Malacomeles","(Decne.) Engl.",413 3223,"","Malus","Mill.",413 16190,"","Marcetella","Svent.",413 22231,"x","Margyracaena","Bitter",413 3224,"","Margyricarpus","Ruiz & Pav.",413 3225,"","Mespilus","L.",413 22226,"","Micromeles","Decne.",413 16457,"","Nagelia","Lindl.",413 3226,"","Neillia","D.Don",413 20156,"","Neolindleyella","Fedde",413 16454,"","Neosieversia","Bolle",413 3227,"","Neviusia","A.Gray",413 3228,"","Novosieversia","F.Bolle",413 20969,"","Nuttallia","Torr. & A.Gray",413 3229,"","Oemleria","Rchb.",413 16456,"","Oncostylus","(Schltdl.) Bolle",413 24235,"","Oreogeum","(Ser.) E.I.Golubk.",413 3230,"","Orthurus","Juz.",413 16455,"","Osmaronia","Greene",413 3231,"","Osteomeles","Lindl.",413 24461,"","Padellus","Vassilcz.",413 20965,"","Padus","Mill.",413 20158,"","Parageum","Nakai & H.Hara",413 3232,"","Pentactina","Nakai",413 3233,"","Pentaphylloides","Duhamel",413 3234,"","Peraphyllum","Nutt.",413 20966,"","Persica","Mill.",413 3235,"","Petrophytum","(Nutt.) Rydb.",413 3236,"","Photinia","Lindl.",413 3237,"","Physocarpus","(Cambess.) Maxim.",413 20968,"","Plagiospermum","Oliv.",413 3238,"","Pleiosepalum","Hand.-Mazz.",413 3239,"","Polylepis","Ruiz & Pav.",413 16458,"","Porteranthus","Britton",413 3240,"","Potaninia","Maxim.",413 3241,"","Potentilla","L.",413 20165,"","Poteridium","Spach",413 3242,"","Poterium","L.",413 3243,"","Pourthiaea","Decne.",413 3244,"","Prinsepia","Royle",413 3245,"","Prunus","L.",413 3246,"","Pseudocydonia","(C.K.Schneid.) C.K.Schneid.",413 3247,"","Purpusia","Brandegee",413 3248,"","Purshia","DC. ex Poir.",413 20967,"","Pygeum","Gaertn.",413 3249,"","Pyracantha","M.Roem.",413 23581,"x","Pyronia","Veitch ex Trab.",413 3250,"","Pyrus","L.",413 3251,"","Quillaja","Molina",413 3252,"","Rhaphiolepis","Lindl.",413 3253,"","Rhodotypos","Siebold & Zucc.",413 3254,"","Rosa","L.",413 3255,"","Rubus","L.",413 3256,"","Sanguisorba","L.",413 3257,"","Sarcopoterium","Spach",413 25534,"","Schistophyllidium","(Juz. ex Fed.) Ikonn.",413 25798,"","Sericotheca","Raf.",413 3258,"","Sibbaldia","L.",413 3259,"","Sibbaldianthe","Juz.",413 3260,"","Sibbaldiopsis","Rydb.",413 3261,"","Sibiraea","Maxim.",413 3262,"","Sieversia","Willd.",413 25535,"","Sinoplagiospermum","Rauschert",413 3263,"","Sorbaria","(Ser. ex DC.) A.Braun",413 22232,"x","Sorbaronia","C.K.Schneid.",413 22227,"x","Sorbopyrus","C.K.Schneid.",413 3264,"","Sorbus","L.",413 3265,"","Spenceria","Trimen",413 3266,"","Spiraea","L.",413 3267,"","Spiraeanthus","(Fisch. & C.A.Mey.) Maxim.",413 3268,"","Stellariopsis","(Baill.) Rydb.",413 3269,"","Stephanandra","Siebold & Zucc.",413 3270,"","Stranvaesia","Lindl.",413 25533,"","Taihangia","T.T.Yu & C.L.Li",413 3271,"","Tetraglochin","Poepp.",413 25762,"","Trichothalamus","Spreng.",413 3272,"","Tylosperma","Botsch.",413 3273,"","Vauquelinia","Correa ex Humb. & Bonpl.",413 3274,"","Waldsteinia","Willd.",413 16250,"","Xerospiraea","Henr.",413 24460,"","Zygalchemilla","Rydb.",413 17462,"","Abbottia","F.Muell.",414 16754,"","Abramsia","Gillespie",414 18448,"","Acmostigma","Raf.",414 4896,"","Acranthera","Arn. ex Meisn.",414 4897,"","Acrobotrys","K.Schum. & K.Krause",414 18158,"","Acrodryon","Spreng.",414 18166,"","Acrostoma","Didr.",414 17365,"","Acrosynanthus","Urb.",414 17463,"","Acunaeanthus","Borhidi, Komlodi & Moncada",414 18282,"","Adenosacme","Wall.",414 18175,"","Adenothola","Lem.",414 4898,"","Adina","Salisb.",414 4899,"","Adinauclea","Ridsdale",414 18174,"","Aeginetia","Cav.",414 18530,"","Aetheonema","Rchb.",414 18327,"","Afrohamelia","Wernham",414 4900,"","Afroknoxia","Verdc.",414 4901,"","Agathisanthemum","Klotzsch",414 18160,"","Agylophora","Neck. ex Raf.",414 4902,"","Aidia","Lour.",414 17550,"","Aidiopsis","Tirveng.",414 4903,"","Airosperma","K.Schum. & Lauterb.",414 4904,"","Aitchisonia","Hemsl. ex Aitch.",414 16755,"","Alberta","E.Mey.",414 4905,"","Aleisanthia","Ridl.",414 4906,"","Alibertia","A.Rich. ex DC.",414 4907,"","Allaeophania","Thwaites",414 4908,"","Alleizettea","Dubard & Dop",414 4909,"","Alleizettella","Pit.",414 4910,"","Allenanthus","Standl.",414 4911,"","Alseis","Schott",414 4912,"","Amaioua","Aubl.",414 4913,"","Amaracarpus","Blume",414 4914,"","Amaralia","Welw. ex Hook.f.",414 18558,"","Ambraria","Fabr.",414 18389,"","Ammianthus","Spruce ex Benth.",414 4915,"","Amphiasma","Bremek.",414 4916,"","Amphidasya","Standl.",414 4917,"","Ancylanthos","Desf.",414 18437,"","Ancylanthus","Steud.",414 23242,"","Andersonia","Willd.",414 18270,"","Androtropis","R.Br.",414 15166,"","Anisomeris","C.Presl",414 18232,"","Anistelma","Raf.",414 4918,"","Anomanthodia","Hook.f.",414 18253,"","Anotis","DC.",414 18424,"","Antacanthus","A.Rich. ex DC.",414 4919,"","Antherostele","Bremek.",414 18478,"","Antherura","Lour.",414 4920,"","Anthocephalus","A.Rich.",414 25299,"","Anthorrhiza","C.R.Huxley & Jebb",414 4921,"","Anthospermum","L.",414 4922,"","Antirhea","Comm. ex Juss.",414 16749,"","Antirhoea","Comm. ex Juss.",414 18401,"","Antirrhoea","Endl.",414 18472,"","Antoniana","Tussac",414 23243,"","Aoranthe","Somers",414 23244,"","Aparinanthus","Fourr.",414 18596,"","Aparine","Guett.",414 18597,"","Aparinella","Fourr.",414 4923,"","Aphaenandra","Miq.",414 4924,"","Aphanocarpus","Steyerm.",414 16750,"","Apomuria","Bremek.",414 4925,"","Appunettia","R.D.Good",414 4926,"","Appunia","Hook.f.",414 18202,"","Arachnimorpha","Desv.",414 14164,"","Arachnothryx","Planch.",414 18169,"","Arariba","Mart.",414 16751,"","Arbulocarpus","Tennant",414 4927,"","Arcytophyllum","Willd. ex Schult. & Schult.f.",414 18458,"","Argocoffea","(Pierre ex De Wild.) Lebrun",414 4928,"","Argocoffeopsis","Lebrun",414 4929,"","Argostemma","Wall.",414 4930,"","Argostemmella","Ridl.",414 4931,"","Ariadne","Urb.",414 16752,"","Asemanthia","Ridl.",414 4932,"","Asemnantha","Hook.f.",414 18598,"","Aspera","Moench",414 23245,"x","Asperugalium","E.Fourn.",414 4933,"","Asperula","L.",414 18188,"","Aspidanthera","Benth.",414 18348,"","Assidora","A.Chev.",414 23246,"","Asterophyllum","Schimp. & Spenn.",414 4934,"","Astiella","Jovet",414 4935,"","Atractocarpus","Schltr. & K.Krause",414 4936,"","Atractogyne","Pierre",414 18479,"","Aucubaephyllum","Ahlb.",414 4937,"","Augusta","Pohl",414 23247,"","Augustea","DC.",414 4938,"","Aulacocalyx","Hook.f.",414 18285,"","Aulacodiscus","Hook.f.",414 18287,"","Axanthes","Blume",414 18288,"","Axanthopsis","Korth.",414 18159,"","Axolus","Raf.",414 18449,"","Baconia","DC.",414 4939,"","Badusa","A.Gray",414 18603,"","Balfourina","Kuntze",414 4940,"","Balmea","Martinez",414 18155,"","Bamboga","Baill.",414 23248,"","Bancalus","Kuntze",414 18539,"","Bartlingia","Rchb.",414 18346,"","Basanacantha","Hook.f.",414 18599,"","Bataprine","Nieuwl.",414 4941,"","Bathysa","C.Presl",414 18193,"","Bathysograya","Kuntze",414 4942,"","Batopedina","Verdc.",414 25368,"","Baumannia","DC.",414 4943,"","Baumannia","K.Schum.",414 23249,"","Becheria","Ridl.",414 16753,"","Belicia","Lundell",414 18268,"","Belilla","Adans.",414 18295,"","Bellardia","Schreb.",414 4944,"","Bellynkxia","Mull.Arg.",414 4945,"","Belonophora","Hook.f.",414 18442,"","Bemsetia","Raf.",414 14296,"","Benkara","Adans.",414 23251,"","Benteca","Adans.",414 4946,"","Benzonia","Schumach.",414 4947,"","Berghesia","Nees",414 18358,"","Berghias","Juss.",414 18359,"","Bergkias","Sonn.",414 23252,"","Berthiera","Vent.",414 4948,"","Bertiera","Aubl.",414 18360,"","Bertuchia","Dennst.",414 18573,"","Bigelovia","Spreng.",414 18574,"","Bigelowia","DC.",414 4949,"","Bikkia","Reinw.",414 18196,"","Bikkiopsis","Brongn. & Gris",414 18469,"","Billardiera","Vahl",414 18319,"","Billiotia","G.Don",414 4950,"","Billiottia","DC.",414 4951,"","Blandibractea","Wernham",414 4952,"","Blepharidium","Standl.",414 18604,"","Blepharostemma","Fourr.",414 4953,"","Bobea","Gaudich.",414 4954,"","Boholia","Merr.",414 18344,"","Bonatia","Schltr. & K.Krause",414 18216,"","Bonifacia","Silva Manso ex Steud.",414 4956,"","Borojoa","Cuatrec.",414 23253,"","Borrera","Spreng.",414 15200,"","Borreria","G.Mey.",414 4957,"","Bothriospora","Hook.f.",414 4958,"","Botryarrhena","Ducke",414 4959,"","Bouvardia","Salisb.",414 4960,"","Brachytome","Hook.f.",414 4961,"","Bradea","Standl. ex Brade",414 4962,"","Brenania","Keay",414 4963,"","Breonadia","Ridsdale",414 4964,"","Breonia","A.Rich. ex DC.",414 18273,"","Brignolia","DC.",414 18271,"","Bruinsmania","Miq.",414 16756,"","Bubalina","Raf.",414 18592,"","Buchia","Kunth",414 18546,"","Buchozia","L'Her. ex Juss.",414 18187,"","Buena","Pohl",414 18274,"","Buena","Cav.",414 18385,"","Bunburya","Meisn. ex Hochst.",414 18406,"","Bunophila","Willd. ex Roem. & Schult.",414 18559,"","Bupleuroides","Moench",414 4965,"","Burchellia","R.Br.",414 18408,"","Burneya","Cham. & Schltdl.",414 4966,"","Burttdavya","Hoyle",414 16757,"","Buseria","T.Durand",414 4967,"","Byrsophyllum","Hook.f.",414 23254,"","Cadamba","Sonn.",414 23255,"","Caelospermum","Blume",414 23256,"","Cafe","Adans.",414 4968,"","Calanda","K.Schum.",414 18170,"","Calderonia","Standl.",414 18480,"","Callicocca","Schreb.",414 4969,"","Callipeltis","Steven",414 4970,"","Calochone","Keay",414 4971,"","Calycodendron","A.C.Sm.",414 4972,"","Calycophyllum","DC.",414 4973,"","Calycosia","A.Gray",414 4974,"","Calycosiphonia","Pierre ex Robbr.",414 4975,"","Campanocalyx","Valeton",414 17466,"","Camptophytum","Pierre ex A.Chev.",414 18481,"","Camptopus","Hook.f.",414 18305,"","Campylobotrys","Lem.",414 4976,"","Canephora","Juss.",414 18341,"","Canthiopsis","Seem.",414 4977,"","Canthium","Lam.",414 4978,"","Canthopsis","Miq.",414 4979,"","Capirona","Spruce",414 23257,"","Caprosma","G.Don",414 4980,"","Captaincookia","N.Halle",414 23258,"","Caquepira","J.F.Gmel.",414 23259,"","Carandra","Gaertn.",414 18482,"","Carapichea","Aubl.",414 18517,"","Carinta","W.Wight",414 16758,"","Carmenocania","Wernham",414 4981,"","Carpacoce","Sond.",414 4982,"","Carphalea","Juss.",414 18379,"","Carpothalis","E.Mey.",414 23260,"","Carterella","Terrell",414 18416,"","Caruelina","Kuntze",414 18275,"","Caryococca","Willd. ex Roem. & Schult.",414 4983,"","Casasia","A.Rich.",414 4984,"","Cascarilla","Wedd.",414 4985,"","Cassupa","Humb. & Bonpl.",414 4986,"","Catesbaea","L.",414 23261,"","Catesbya","Cothen.",414 18212,"","Cattutella","Rchb.",414 4987,"","Catunaregam","Wolf",414 18357,"","Censcus","Gaertn.",414 15177,"","Cephaelis","Sw.",414 4988,"","Cephalanthus","L.",414 23262,"","Cephaleis","Vahl",414 18153,"","Cephalidium","A.Rich. ex DC.",414 18151,"","Cephalina","Thonn.",414 4989,"","Cephalodendron","Steyerm.",414 17678,"","Ceratites","Miers",414 4990,"","Ceratopyxis","Hook.f.",414 4991,"","Ceriscoides","(Hook.f.) Tirveng.",414 23263,"","Ceriscus","Gaertn. ex Nees",414 4992,"","Ceuthocarpus","Aiello",414 23264,"","Chaenocarpus","Juss.",414 4993,"","Chaetostachydium","Airy Shaw",414 18611,"","Chaetostachys","Valeton",414 4994,"","Chalazocarpus","Hiern",414 4995,"","Chalepophyllum","Hook.f.",414 23265,"","Chamaedaphne","Mitch.",414 4996,"","Chamaepentas","Bremek.",414 18254,"","Chamisme","Raf.",414 4997,"","Chapelieria","A.Rich. ex DC.",414 23266,"","Charpentiera","Vieill.",414 4998,"","Chassalia","Comm. ex Poir.",414 4999,"","Chazaliella","E.Petit & Verdc.",414 23267,"","Chesnea","Scop.",414 5000,"","Chimarrhis","Jacq.",414 5001,"","Chiococca","P.Browne",414 5002,"","Chione","DC.",414 24326,"","Chlorochorion","Puff & Robbr.",414 23268,"","Chlorostemma","(Lange) Fourr.",414 5003,"","Chomelia","Jacq.",414 5004,"","Chondrococcus","Steyerm.",414 18219,"","Choristes","Benth.",414 5005,"","Choulettia","Pomel",414 18199,"","Chrysoxylon","Wedd.",414 16760,"","Chytropsia","Bremek.",414 5006,"","Cigarrilla","Aiello",414 5007,"","Cinchona","L.",414 5008,"","Cladoceras","Bremek.",414 5009,"","Clarkella","Hook.f.",414 23269,"","Clavenna","Neck. ex Standl.",414 24593,"","Clavennaea","Neck. ex Post & Kuntze",414 5010,"","Cleisocratera","Korth.",414 20351,"","Clusiophyllea","Baill.",414 14222,"","Coccochondra","Rauschert",414 5011,"","Coccocypselum","P.Browne",414 23270,"","Codaria","Kuntze",414 5012,"","Coddia","Verdc.",414 5013,"","Coelopyrena","Valeton",414 5014,"","Coelospermum","Blume",414 18457,"","Cofeanthus","A.Chev.",414 5015,"","Coffea","L.",414 5016,"","Coleactina","N.Halle",414 23271,"","Colladonia","Spreng.",414 5017,"","Colletoecema","E.Petit",414 23272,"","Commianthus","Benth.",414 5018,"","Commitheca","Bremek.",414 18296,"","Condalia","Ruiz & Pav.",414 5019,"","Condaminea","DC.",414 18516,"","Congdonia","Mull.Arg.",414 23273,"","Conosiphon","Poepp.",414 5020,"","Conostomium","(Stapf) Cufod.",414 18177,"","Conotrichia","A.Rich.",414 5021,"","Coprosma","J.R.Forst. & G.Forst.",414 5022,"","Coptophyllum","Korth.",414 5023,"","Coptosapelta","Korth.",414 23274,"","Coptospelta","K.Schum.",414 5024,"","Coptosperma","Hook.f.",414 18321,"","Cordiera","A.Rich.",414 5025,"","Corynanthe","Welw.",414 5026,"","Corynula","Hook.f.",414 5027,"","Coryphothamnus","Steyerm.",414 5028,"","Cosmibuena","Ruiz & Pav.",414 5029,"","Cosmocalyx","Standl.",414 18330,"","Coupoui","Aubl.",414 18332,"","Coupuia","Raf.",414 18333,"","Coupuya","Raf.",414 5030,"","Coursiana","Homolle",414 5031,"","Coussarea","Aubl.",414 5032,"","Coutaportla","Urb.",414 5033,"","Coutarea","Aubl.",414 5034,"","Cowiea","Wernham",414 5035,"","Craterispermum","Benth.",414 23275,"","Creaghia","Scort.",414 5036,"","Creatantha","Standl.",414 5037,"","Cremaspora","Benth.",414 5038,"","Cremocarpon","Baill.",414 23276,"","Crinita","Houtt.",414 5039,"","Crobylanthe","Bremek.",414 5040,"","Crocyllis","E.Mey. ex Hook.f.",414 5041,"","Crossopteryx","Fenzl",414 5042,"","Crucianella","L.",414 5043,"","Cruciata","Mill.",414 5044,"","Cruckshanksia","Hook. & Arn.",414 23277,"","Crusea","A.Rich.",414 5045,"","Crusea","Cham. & Schltdl.",414 23278,"","Cryptospermum","Young ex Pers.",414 18201,"","Cuatrecasasia","Standl.",414 5046,"","Cuatrecasasiodendron","Standl. & Steyerm.",414 5047,"","Cubanola","Aiello",414 23279,"","Cuncea","Buch.-Ham. ex D.Don",414 23280,"","Cunina","Gay",414 23281,"","Cunninghamia","Schreb.",414 18343,"","Cupi","Adans.",414 23282,"","Cupia","(Schult.) DC.",414 7345,"","Cupirana","Miers",414 23284,"","Cupuia","Raf.",414 5048,"","Cuviera","DC.",414 5049,"","Cyclophyllum","Hook.f.",414 23285,"","Cymelonema","C.Presl",414 16761,"","Cynanchica","Fourr.",414 23286,"","Cyrtanthus","Schreb.",414 5050,"","Damnacanthus","C.F.Gaertn.",414 5051,"","Danais","Comm. ex Vent.",414 18519,"","Dasus","Lour.",414 5052,"","Dasycephala","(DC.) Hook.f.",414 23287,"","Dasys","Lem.",414 18534,"","Daun-Contu","Adans.",414 18361,"","Decameria","Welw.",414 23288,"","Decapenta","Raf.",414 14291,"","Deccania","Tirveng.",414 5053,"","Declieuxia","Kunth",414 18483,"","Delpechia","Montrouz.",414 18547,"","Democritea","DC.",414 5054,"","Dendrosipanea","Ducke",414 5055,"","Dentella","J.R.Forst. & G.Forst.",414 23289,"","Dentillaria","Kuntze",414 5056,"","Deppea","Cham. & Schltdl.",414 5057,"","Diacrodon","Sprague",414 5058,"","Dibrachionostylus","Bremek.",414 5059,"","Dichilanthe","Thwaites",414 5060,"","Dichrospermum","Bremek.",414 20353,"","Dicrobotryum","Willd. ex Roem. & Schult.",414 5061,"","Dictyandra","Welw. ex Hook.f.",414 18235,"","Dictyospora","Hook.f.",414 5062,"","Didymaea","Hook.f.",414 5063,"","Didymochlamys","Hook.f.",414 5064,"","Didymoecium","Bremek.",414 5065,"","Didymopogon","Bremek.",414 5066,"","Didymosalpinx","Keay",414 23290,"","Dillenia","Heist. ex Fabr.",414 25156,"","Dimetia","(Wight & Arn.) Meisn.",414 5067,"","Dinocanthium","Bremek.",414 18567,"","Diodella","Small",414 5068,"","Diodia","L.",414 18575,"","Diodioides","Loefl.",414 18585,"","Diodois","Pohl",414 14841,"","Dioecrescis","Tirveng.",414 5069,"","Dioicodendron","Steyerm.",414 23291,"","Dioneiodon","Raf.",414 23292,"","Diotocarpus","Hochst.",414 16762,"","Diotocranus","Bremek.",414 18576,"","Diphragmus","C.Presl",414 18380,"","Diplocrater","Hook.f.",414 18237,"","Diplophragma","(Wight & Arn.) Meisn.",414 5070,"","Diplospora","DC.",414 18429,"","Diplosporopsis","Wernham",414 18231,"","Dirichletia","Klotzsch",414 18381,"","Discocoffea","A.Chev.",414 18386,"","Discospermum","Dalzell",414 18535,"","Disodea","Pers.",414 18543,"","Disperma","J.F.Gmel.",414 5071,"","Diyaminauclea","Ridsdale",414 5072,"","Dolianthus","C.H.Wright",414 19250,"","Dolichanthera","Schltr. & K.Krause",414 5073,"","Dolichodelphys","K.Schum. & K.Krause",414 5074,"","Dolicholobium","A.Gray",414 5075,"","Dolichometra","K.Schum.",414 18433,"","Dondisia","DC.",414 18394,"","Donkelaaria","Lem.",414 5076,"","Doricera","Verdc.",414 5077,"","Dorisia","Gillespie",414 5078,"","Dorothea","Wernham",414 18484,"","Douarrea","Montrouz.",414 5079,"","Dressleriopsis","Dwyer",414 18276,"","Duggena","Vahl",414 18301,"","Duhamelia","Pers.",414 5080,"","Duidania","Standl.",414 16763,"","Dukea","Dwyer",414 18262,"","Dunalia","Spreng.",414 5081,"","Dunnia","Tutcher",414 5082,"","Duperrea","Pierre ex Pit.",414 5083,"","Duroia","L.f.",414 17467,"","Durringtonia","R.J.F.Hend. & Guymer",414 18252,"","Duvaucellia","Bowdich",414 18485,"","Dychotria","Raf.",414 18239,"","Dyctiospora","Reinw. ex Korth.",414 18548,"","Dysoda","Lour.",414 18525,"","Dysodidendron","Gardner",414 18526,"","Dysosmia","Miq.",414 18568,"","Ebelia","Rchb.",414 18425,"","Echinodendrum","A.Rich.",414 5084,"","Ecpoma","K.Schum.",414 18395,"","Edechi","Loefl.",414 5085,"","Edithea","Standl.",414 18244,"","Edrastima","Raf.",414 18328,"","Ehrenbergia","Spreng.",414 18391,"","Einsteinia","Ducke",414 16764,"","Eionitis","Bremek.",414 5086,"","Eizia","Standl.",414 5087,"","Elaeagia","Wedd.",414 16765,"","Elattospermum","Soler.",414 18563,"","Eleutheranthus","K.Schum.",414 5088,"","Eleuthranthes","F.Muell.",414 5089,"","Emmenopterys","Oliv.",414 18194,"","Emmenopteryx","Dalla Torre & Harms",414 5090,"","Emmeorhiza","Pohl ex Endl.",414 18382,"","Empogona","Hook.f.",414 18473,"","Encopea","C.Presl",414 18586,"","Endlichera","C.Presl",414 23293,"","Endolasia","Turcz.",414 18390,"","Endolithodes","Bartl.",414 18569,"","Endopogon","Raf.",414 18184,"","Enkylista","Hook.f.",414 16766,"","Enterospermum","Hiern",414 5091,"","Eosanthe","Urb.",414 18527,"","Epidendroides","Sol.",414 18312,"","Epitaberna","K.Schum.",414 18392,"","Epithinia","Jack",414 18258,"","Ereicotis","(DC.) Kuntze",414 18157,"","Eresimus","Raf.",414 5092,"","Eriosemopsis","Robyns",414 18374,"","Eriostoma","Boivin ex Baill.",414 18412,"","Erithalis","G.Forst.",414 5093,"","Erithalis","P.Browne",414 5094,"","Ernestimeyera","Kuntze",414 5095,"","Ernodea","Sw.",414 18306,"","Erosmia","A.Juss.",414 18549,"","Erythrodanum","Thouars",414 23294,"","Etericius","Desv.",414 18553,"","Euathronia","Nutt. ex A.Gray",414 5096,"","Euclinia","Salisb.",414 18183,"","Eukylista","Benth.",414 17468,"","Eumachia","DC.",414 17469,"","Eumorphanthus","A.C.Sm.",414 18307,"","Euosmia","Kunth",414 18409,"","Eupyrena","Wight & Arn.",414 18486,"","Eurhotia","Neck.",414 18554,"","Eurynome","DC.",414 18487,"","Evea","Aubl.",414 18308,"","Evosmia","Humb. & Bonpl.",414 5097,"","Exallage","Bremek.",414 16767,"","Exandra","Standl.",414 5098,"","Exechostylus","K.Schum.",414 5099,"","Exostema","(Pers.) Humb. & Bonpl.",414 23295,"","Exostemma","DC.",414 19249,"","Exostemon","Post & Kuntze",414 5100,"","Fadogia","Schweinf.",414 5101,"","Fadogiella","Robyns",414 14293,"","Fagerlindia","Tirveng.",414 23296,"","Famarea","Vitman",414 5102,"","Faramea","Aubl.",414 18189,"","Ferdinandea","Pohl",414 5103,"","Ferdinandusa","Pohl",414 18185,"","Fereiria","Vell. ex Vand.",414 5104,"","Feretia","Delile",414 5105,"","Fergusonia","Hook.f.",414 5106,"","Fernelia","Comm. ex Lam.",414 18467,"","Figuierea","Montrouz.",414 5107,"","Flagenium","Baill.",414 18342,"","Flemingia","Hunter ex Ridl.",414 5108,"","Flexanthera","Rusby",414 18347,"","Foscarenia","Vell. ex Vand.",414 23297,"","Franchetia","Baill.",414 18351,"","Franciella","Guillaumin",414 18470,"","Froehlichia","D.Dietr.",414 18471,"","Froelichia","Vahl",414 18531,"","Fructesca","DC. ex Meisn.",414 18278,"","Fuchsia","Sw.",414 25565,"","Furcatella","Baum.-Bod.",414 5109,"","Gaertnera","Lam.",414 23298,"","Gaillionia","Endl.",414 18572,"","Gaillonia","A.Rich. ex DC.",414 18577,"","Galianthe","Griseb.",414 23299,"x","Galiasperula","Ronniger",414 5110,"","Galiniera","Delile",414 5111,"","Galium","L.",414 5112,"","Gallienia","Dubard & Dop",414 18601,"","Gallion","Pohl",414 23300,"","Gallium","Mill.",414 5113,"","Galopina","Thunb.",414 18488,"","Galvania","Vand.",414 16768,"","Gamatopea","Bremek.",414 23301,"","Ganguebina","Vell.",414 18325,"","Garapatica","H.Karst.",414 23302,"","Gardena","Adans.",414 5114,"","Gardenia","Ellis",414 18322,"","Gardeniola","Cham.",414 5115,"","Gardeniopsis","Miq.",414 5116,"","Genipa","L.",414 18323,"","Genipella","A.Rich. ex DC.",414 24111,"","Gentingia","J.T.Johanss. & K.M.Wong",414 18518,"","Geocardia","Standl.",414 18544,"","Geoherpum","Willd. ex Schult.",414 5117,"","Geophila","D.Don",414 18245,"","Gerontogea","Cham. & Schltdl.",414 23303,"","Gilipus","Raf.",414 5118,"","Gillespiea","A.C.Sm.",414 5119,"","Gleasonia","Standl.",414 15187,"","Glionnetia","Tirveng.",414 5120,"","Globulostylis","Wernham",414 18489,"","Gloneria","Andre",414 17433,"","Glossostipula","Lorence",414 18550,"","Gomezia","Mutis",414 18552,"","Gomosia","Lam.",414 23304,"","Gomoza","Cothen.",414 18551,"","Gomozia","Mutis ex L.f.",414 5121,"","Gomphocalyx","Baker",414 18190,"","Gomphosia","Wedd.",414 23305,"","Gonianthes","A.Rich.",414 18246,"","Gonotheca","Blume ex DC.",414 5122,"","Gonyanera","Korth.",414 5123,"","Gonzalagunia","Ruiz & Pav.",414 18277,"","Gonzalea","Pers.",414 5124,"","Gouldia","A.Gray",414 5125,"","Greenea","Wight & Arn.",414 5126,"","Greeniopsis","Merr.",414 5127,"","Griffithia","Wight & Arn.",414 18197,"","Grisia","Brongn.",414 18578,"","Gruhlmannia","Neck. ex Raf.",414 18490,"","Grumilea","Gaertn.",414 18491,"","Grundlea","Steud.",414 23306,"","Grunilea","Poir.",414 18176,"","Guagnebina","Vell.",414 5128,"","Guettarda","L.",414 14847,"","Guettardella","Benth.",414 18461,"","Gutenbergia","Walp.",414 18462,"","Guttenbergia","Zoll. & Moritzi",414 18345,"","Gynaecopachys","Hassk.",414 5129,"","Gynochthodes","Blume",414 17549,"","Gynopachis","Blume",414 5130,"","Gyrostipula","J.-F.Leroy",414 5131,"","Habroneuron","Standl.",414 18396,"","Habsia","Steud.",414 5132,"","Haldina","Ridsdale",414 18397,"","Halesia","P.Browne",414 17470,"","Hallea","J.-F.Leroy",414 5133,"","Hamelia","Jacq.",414 5134,"","Hamiltonia","Roxb.",414 5135,"","Hayataella","Masam.",414 18263,"","Hecistocarpus","Post & Kuntze",414 5136,"","Hedstromia","A.C.Sm.",414 5137,"","Hedyotis","L.",414 5138,"","Hedythyrsus","Bremek.",414 5139,"","Heinsenia","K.Schum.",414 5140,"","Heinsia","DC.",414 5141,"","Hekistocarpa","Hook.f.",414 18410,"","Heliospora","Hook.f.",414 18411,"","Helospora","Jack",414 16769,"","Hemidiodia","K.Schum.",414 18313,"","Henisia","Walp.",414 17471,"","Henlea","H.Karst.",414 5142,"","Henriquezia","Spruce ex Benth.",414 18421,"","Herrera","Adans.",414 5143,"","Heterophyllaea","Hook.f.",414 18329,"","Hexactina","Willd. ex Schltdl.",414 18570,"","Hexasepalum","Bartl. ex DC.",414 18453,"","Hexepta","Raf.",414 18609,"","Hexodontocarpus","Dulac",414 18222,"","Heymia","Dennst.",414 18309,"","Higginsia","Pers.",414 5144,"","Hillia","Jacq.",414 5145,"","Himalrandia","T.Yamaz.",414 5146,"","Hindsia","Benth. ex Lindl.",414 5147,"","Hintonia","Bullock",414 5148,"","Hippotis","Ruiz & Pav.",414 5149,"","Hitoa","Nadeaud",414 5150,"","Hodgkinsonia","F.Muell.",414 5151,"","Hoffmannia","Sw.",414 18420,"","Holocarpa","Baker",414 23307,"","Holocarya","T.Durand",414 5152,"","Holostyla","Endl.",414 17472,"","Holstianthus","Steyerm.",414 16770,"","Holtonia","Standl.",414 5153,"","Homaloclados","Hook.f.",414 5154,"","Homollea","Arenes",414 5155,"","Homolliella","Arenes",414 18431,"","Hondbessen","Adans.",414 5156,"","Houstonia","L.",414 18200,"","Howardia","Wedd.",414 5157,"","Hutchinsonia","Robyns",414 5158,"","Hydnophytum","Jack",414 5159,"","Hydrophylax","L.f.",414 18451,"","Hymendocarpum","Pierre ex Pit.",414 5160,"","Hymenocnemis","Hook.f.",414 5161,"","Hymenocoleus","Robbr.",414 5162,"","Hymenodictyon","Wall.",414 5163,"","Hymenopogon","Wall.",414 17473,"","Hyperacanthus","E.Mey. ex Bridson",414 5164,"","Hypobathrum","Blume",414 18579,"","Hypodematium","A.Rich.",414 5165,"","Hyptianthera","Wight & Arn.",414 16771,"","Ibetralia","Bremek.",414 5166,"","Imantina","Hook.f.",414 5167,"","Indopolysolenia","Bennet",414 18492,"","Ipecacuahna","Arruda",414 23308,"","Isartia","Dumort.",414 5168,"","Isertia","Schreb.",414 5169,"","Isidorea","A.Rich. ex DC.",414 5170,"","Ixora","L.",414 18393,"","Jackia","Wall.",414 5171,"","Jackiopsis","Ridsdale",414 24591,"","Jainia","N.P.Balakr.",414 18302,"","Jangaraca","Raf.",414 5172,"","Janotia","J.-F.Leroy",414 5173,"","Jaubertia","Guill.",414 17474,"","Javorkaea","Borhidi & Komlodi",414 18340,"","Jocayena","Raf.",414 18297,"","Jontanea","Raf.",414 5174,"","Joosia","H.Karst.",414 5175,"","Jovetia","Guedes",414 18580,"","Jurgensia","Raf.",414 5176,"","Justenia","Hiern",414 5177,"","Kadua","Cham. & Schltdl.",414 14295,"","Kailarsenia","Tirveng.",414 5178,"","Kajewskiella","Merr. & Perry",414 18247,"","Karamyschewia","Fisch. & C.A.Mey.",414 18213,"","Katoutheka","Adans.",414 5179,"","Keenania","Hook.f.",414 16235,"","Keetia","E.Phillips",414 5180,"","Kelloggia","Torr. ex Benth.",414 17475,"","Kerianthera","J.H.Kirkbr.",414 18430,"","Kerstingia","K.Schum.",414 5181,"","Khasiaclunea","Ridsdale",414 19247,"","Kinkina","Adans.",414 5182,"","Klossia","Ridl.",414 5183,"","Knoxia","L.",414 15184,"","Kochummenia","K.M.Wong",414 18310,"","Koehneago","Kuntze",414 5184,"","Kohautia","Cham. & Schltdl.",414 23309,"","Kotchubaea","Hook.f.",414 5186,"","Kraussia","Harv.",414 18362,"","Kumbaya","Endl. ex Steud.",414 18172,"","Kurria","Hochst. ex Steud.",414 5185,"","Kutchubaea","Fisch. ex DC.",414 18334,"","Kyrtanthus","J.F.Gmel.",414 18452,"","Lachnastoma","Korth.",414 18354,"","Lachnosiphonium","Hochst.",414 23310,"","Lachnostoma","Hassk.",414 5187,"","Ladenbergia","Klotzsch",414 18561,"","Lagotis","E.Mey.",414 5188,"","Lagynias","E.Mey. ex Robyns",414 5189,"","Lamprothamnus","Hiern",414 18269,"","Landia","Comm. ex Juss.",414 5190,"","Lasianthus","Jack",414 18171,"","Lasionema","D.Don",414 5191,"","Lasiostoma","Benth.",414 5192,"","Lathraeocarpa","Bremek.",414 18398,"","Laugeria","L.",414 18403,"","Laugeria","Vahl ex Hook.f.",414 18283,"","Lawia","Wight",414 18607,"","Laxmannia","S.G.Gmel. ex Trin.",414 5193,"","Lecananthus","Jack",414 5194,"","Lecanosperma","Rusby",414 5195,"","Lecariocalyx","Bremek.",414 18536,"","Lecontea","A.Rich.",414 5196,"","Leiochilus","Hook.f.",414 5197,"","Lelya","Bremek.",414 5198,"","Lemyrea","(A.Chev.) A.Chev. & Beille",414 5199,"","Lepidostoma","Bremek.",414 17476,"","Lepipogon","G.Bertol.",414 5200,"","Leptactina","Hook.f.",414 5201,"","Leptodermis","Wall.",414 5202,"","Leptomischus","Drake",414 18241,"","Leptopetalum","Hook. & Arn.",414 5203,"","Leptoscela","Hook.f.",414 14166,"","Leptostigma","Arn.",414 16772,"","Leptunis","Steven",414 5204,"","Lerchea","L.",414 5205,"","Leroya","Cavaco",414 25414,"","Leroyia","Cavaco",414 5206,"","Leucocodon","Gardner",414 5207,"","Leucolophus","Bremek.",414 18203,"","Lightfootia","Schreb.",414 5208,"","Limnosipanea","Hook.f.",414 5209,"","Lindenia","Benth.",414 18298,"","Lipostoma","D.Don",414 18223,"","Lippaya","Endl.",414 18248,"","Listeria","Neck. ex Raf.",414 5210,"","Litosanthes","Blume",414 5211,"","Loretoa","Standl.",414 5212,"","Lucinaea","DC.",414 5213,"","Luculia","Sweet",414 5214,"","Lucya","DC.",414 5215,"","Ludekia","Ridsdale",414 18432,"","Lycioserissa","Roem. & Schult.",414 18178,"","Lygistrum","P.Browne",414 5216,"","Lygodisodea","Ruiz & Pav.",414 5217,"","Macbrideina","Standl.",414 5218,"","Machaonia","Bonpl.",414 18249,"","Macrandria","Meisn.",414 5219,"","Macrocnemum","P.Browne",414 18182,"","Macrosiphon","Miq.",414 5220,"","Macrosphyra","Hook.f.",414 5221,"","Maguireocharis","Steyerm.",414 5222,"","Maguireothamnus","Steyerm.",414 5223,"","Malanea","Aubl.",414 18259,"","Mallostoma","H.Karst.",414 18154,"","Mamboga","Blanco",414 5224,"","Manettia","L.",414 5225,"","Manostachya","Bremek.",414 5226,"","Mantalania","Capuron ex J.-F.Leroy",414 18493,"","Mapouria","Aubl.",414 18529,"","Margaris","Griseb.",414 5227,"","Margaritopsis","Sauvalle",414 18555,"","Marquisia","A.Rich.",414 18335,"","Martha","F.Muell.",414 18289,"","Maschalanthe","Blume",414 5228,"","Maschalocorymbus","Bremek.",414 5229,"","Maschalodesme","K.Schum. & Lauterb.",414 5230,"","Massularia","(K.Schum.) Hoyle",414 5231,"","Mastixiodendron","Melch.",414 18399,"","Matthiola","L.",414 18593,"","Mattuschkaea","Schreb.",414 18594,"","Mattuschkea","Batsch",414 5232,"","Mazaea","Krug & Urb.",414 18371,"","Megacarpha","Hochst.",414 18494,"","Megalopus","K.Schum.",414 18317,"","Megaphyllum","Spruce ex Baill.",414 18595,"","Meionandra","Gauba",414 18524,"","Melachone","Gilli",414 18417,"","Melanea","Pers.",414 18324,"","Melanopsidium","Poit. ex DC.",414 17464,"","Melanopsidium","Colla",414 24594,"","Menestoria","DC.",414 18520,"","Mephitidia","Reinw. ex Blume",414 5233,"","Mericarpaea","Boiss.",414 18542,"","Mericocalyx","Bamps",414 5234,"","Merismostigma","S.Moore",414 5235,"","Merumea","Steyerm.",414 5236,"","Mesoptera","Hook.f.",414 18243,"","Metabolos","Blume",414 5237,"","Metadina","Bakh.f.",414 5238,"","Meyna","Roxb. ex Link",414 23311,"","Meynia","Schult.",414 5239,"","Micrasepalum","Urb.",414 5240,"","Microphysa","Schrenk",414 18407,"","Microsplenium","Hook.f.",414 18528,"","Mirmecodia","Gaudich.",414 5241,"","Mitchella","L.",414 5242,"","Mitracarpus","Zucc.",414 5243,"","Mitragyna","Korth.",414 5244,"","Mitrasacmopsis","Jovet",414 18439,"","Mitrastigma","Harv.",414 16790,"","Mitratheca","K.Schum.",414 23312,"","Mitreola","Boehm.",414 5245,"","Mitriostigma","Hochst.",414 5246,"","Molopanthera","Turcz.",414 16850,"","Monadelphanthus","H.Karst.",414 5247,"","Monosalpinx","N.Halle",414 17477,"","Montamans","Dwyer",414 5248,"","Morelia","A.Rich. ex DC.",414 5249,"","Morierina","Vieill.",414 5250,"","Morinda","L.",414 5251,"","Morindopsis","Hook.f.",414 17553,"","Motleyia","J.T.Johanss.",414 5252,"","Mouretia","Pit.",414 17478,"","Multidentia","Gilli",414 18265,"","Mungos","Adans.",414 5253,"","Mussaenda","L.",414 5254,"","Mussaendopsis","Baill.",414 5255,"","Mycetia","Reinw.",414 5256,"","Myonima","Comm. ex Juss.",414 5257,"","Myrioneuron","R.Br. ex Hook.",414 5258,"","Myrmecodia","Jack",414 23313,"","Myrmecoides","Elmer",414 5259,"","Myrmeconauclea","Merr.",414 5260,"","Myrmedoma","Becc.",414 5261,"","Myrmephytum","Becc.",414 18496,"","Myrstiphylla","Raf.",414 18497,"","Myrstiphyllum","P.Browne",414 18179,"","Nacibaea","Poir.",414 18180,"","Nacibea","Aubl.",414 16791,"","Naletonia","Bremek.",414 18356,"","Narega","Raf.",414 5262,"","Nargedia","Bedd.",414 18383,"","Natalanthe","Sond.",414 5263,"","Nauclea","L.",414 5264,"","Neanotis","W.H.Lewis",414 5265,"","Neblinathamnus","Steyerm.",414 18474,"","Neleixa","Raf.",414 18413,"","Nelitris","Gaertn.",414 5266,"","Nematostylis","Hook.f.",414 18608,"","Nemostylis","Steven",414 5267,"","Nenax","Gaertn.",414 5268,"","Neobaumannia","Hutch. & Dalziel",414 5269,"","Neobertiera","Wernham",414 5270,"","Neoblakea","Standl.",414 5271,"","Neobreonia","Ridsdale",414 5272,"","Neofranciella","Guillaumin",414 5273,"","Neogaillonia","Lincz.",414 5274,"","Neohymenopogon","Bennet",414 15963,"","Neolamarckia","Bosser",414 5275,"","Neolaugeria","Nicolson",414 5276,"","Neoleroya","Cavaco",414 5277,"","Neomazaea","Urb.",414 5278,"","Neonauclea","Merr.",414 5279,"","Neopentanisia","Verdc.",414 16792,"","Neorosea","N.Halle",414 5280,"","Neosabicea","Wernham",414 5281,"","Neoschimpera","Hemsl.",414 5282,"","Nernstia","Urb.",414 5283,"","Nertera","Banks & Sol. ex Gaertn.",414 18454,"","Nescidia","A.Rich.",414 5284,"","Nesohedyotis","(Hook.f.) Bremek.",414 18498,"","Nettlera","Raf.",414 5285,"","Neurocalyx","Hook.",414 18225,"","Neurocarpaea","R.Br.",414 18565,"","Neurocarpaea","K.Schum.",414 5286,"","Nichallea","Bridson",414 18560,"","Nobula","Adans.",414 5287,"","Nodocarpaea","A.Gray",414 16846,"","Nonatelia","Aubl.",414 18521,"","Nonatelia","Kuntze",414 5288,"","Normandia","Hook.f.",414 5289,"","Nostolachma","T.Durand",414 18566,"","Nothocarpus","Post & Kuntze",414 15891,"","Nothophlebia","Standl.",414 18266,"","Notodontia","Pierre ex Pit.",414 16847,"","Notopleura","(Hook.f.) Bremek.",414 18512,"","Novatilia","Wight",414 5290,"","Obbea","Hook.f.",414 5291,"","Ochreinauclea","Ridsdale & Bakh.f.",414 18522,"","Octavia","DC.",414 18581,"","Octodon","Thonn.",414 23314,"","Octomeria","Pfeiff.",414 5292,"","Octotropis","Bedd.",414 18311,"","Ohigginsis","Ruiz & Pav.",414 5293,"","Oldenlandia","L.",414 25532,"","Oldenlandiopsis","Terrell & W.H.Lewis",414 5294,"","Oligocodon","Keay",414 5295,"","Olostyla","DC.",414 18475,"","Omalocaldos","Hook.f.",414 5296,"","Omiltemia","Standl.",414 5297,"","Opercularia","Gaertn.",414 5298,"","Ophiorrhiza","L.",414 5299,"","Ophryococcus","Oerst.",414 5300,"","Oregandra","Standl.",414 18387,"","Oreocaryon","Kuntze ex K.Schum.",414 5301,"","Oreopolus","Schltdl.",414 18513,"","Oribasia","Schreb.",414 18226,"","Orthostemma","Wall. ex Voigt",414 5302,"","Osa","Aiello",414 5303,"","Otiophora","Zucc.",414 5304,"","Otocalyx","Brandegee",414 20350,"","Otocephalus","Chiov.",414 5305,"","Otomeria","Benth.",414 5306,"","Ottoschmidtia","Urb.",414 18161,"","Ourouparia","Aubl.",414 18191,"","Outarda","Dumort.",414 5307,"","Oxyanthus","DC.",414 14294,"","Oxyceros","Lour.",414 18557,"","Oxyspermum","Eckl. & Zeyh.",414 23315,"","Pacheya","Scop.",414 18515,"","Pachysanthus","C.Presl",414 5308,"","Pachystigma","Hochst.",414 16849,"","Pachystylus","K.Schum.",414 5309,"","Paederia","L.",414 5310,"","Paedicalyx","Pierre ex Pit.",414 5311,"","Pagamea","Aubl.",414 5312,"","Pagameopsis","Steyerm.",414 18291,"","Paiva","Vell.",414 5313,"","Palicourea","Aubl.",414 19248,"","Pallasia","Klotzsch",414 5314,"","Pamplethantha","Bremek.",414 18441,"","Pancheria","Montrouz.",414 18443,"","Panchezia","B.D.Jacks.",414 23316,"","Panetos","Raf.",414 16848,"","Paolia","Chiov.",414 18426,"","Pappostyles","Pierre",414 18427,"","Pappostylum","Pierre",414 5315,"","Paracephaelis","Baill.",414 5316,"","Parachimarrhis","Ducke",414 18459,"","Paracoffea","J.-F.Leroy",414 5317,"","Paracorynanthe","Capuron",414 16773,"","Paradina","Pierre ex Pit.",414 5318,"","Paragenipa","Baill.",414 5319,"","Paragophyton","K.Schum.",414 5320,"","Paraknoxia","Bremek.",414 5321,"","Parapentas","Bremek.",414 5322,"","Paratriaina","Bremek.",414 18284,"","Paravinia","Hassk.",414 18444,"","Patabea","Aubl.",414 18292,"","Patima","Aubl.",414 18460,"","Patsjotti","Adans.",414 5323,"","Pauridiantha","Hook.f.",414 5324,"","Pausinystalia","Pierre ex Beille",414 23317,"","Pavate","Adans.",414 5325,"","Pavetta","L.",414 5326,"","Payera","Baill.",414 20352,"","Pecheya","Scop.",414 23318,"","Peckeya","Raf.",414 23319,"","Pegamea","Vitman",414 5327,"","Pelagodendron","Seem.",414 18556,"","Pelaphia","Banks & Sol.",414 18229,"","Peltospermum","Benth.",414 16774,"","Pentacarpaea","Hiern",414 18418,"","Pentacarpus","Post & Kuntze",414 5328,"","Pentagonia","Benth.",414 5329,"","Pentaloncha","Hook.f.",414 5330,"","Pentanisia","Harv.",414 5331,"","Pentanopsis","Rendle",414 5332,"","Pentas","Benth.",414 5333,"","Pentodon","Hochst.",414 5334,"","Peponidium","(Baill.) Arenes",414 5335,"","Perakanthus","Robyns",414 5336,"","Perama","Aubl.",414 5337,"","Peratanthe","Urb.",414 18545,"","Perdicesca","Prov.",414 5338,"","Peripeplus","Pierre",414 5339,"","Pertusadina","Ridsdale",414 16775,"","Petagomoa","Bremek.",414 23320,"","Peteria","Raf.",414 18204,"","Petesia","P.Browne",414 24270,"","Petitiocodon","Robbr.",414 5340,"","Petunga","DC.",414 18440,"","Phallaria","Schumach. & Thonn.",414 5341,"","Phellocalyx","Bridson",414 5342,"","Phialanthus","Griseb.",414 5343,"","Phitopis","Hook.f.",414 18272,"","Phosanthus","Raf.",414 5344,"","Phuopsis","(Griseb.) Hook.f.",414 18376,"","Phylanthera","Noronha",414 23321,"","Phyllacantha","Hook.f.",414 5345,"","Phyllacanthus","Hook.f.",414 5346,"","Phyllis","L.",414 5347,"","Phyllocrater","Wernham",414 5348,"","Phyllomelia","Griseb.",414 17434,"","Phylohydrax","Puff",414 18230,"","Phyteumoides","Smeathman ex DC.",414 5349,"","Picardaea","Urb.",414 5350,"","Pimentelia","Wedd.",414 5351,"","Pinarophyllon","Brandegee",414 5352,"","Pinckneya","Michx.",414 23322,"","Pinknea","Pers.",414 18363,"","Piringa","Juss.",414 16776,"","Pittierothamnus","Steyerm.",414 5353,"","Pittoniotis","Griseb.",414 5354,"","Placocarpa","Hook.f.",414 18540,"","Placodium","Hook.f.",414 18541,"","Placoma","J.F.Gmel.",414 5355,"","Placopoda","Balf.f.",414 18349,"","Plastolaena","Pierre ex Chev.",414 18152,"","Platanocarpum","Korth.",414 16777,"","Platanocephalus","Crantz",414 5356,"","Platycarpum","Bonpl.",414 18377,"","Platymerium","Bartl. ex DC.",414 5357,"","Plectroniella","Robyns",414 23323,"","Pleimeris","Raf.",414 5358,"","Pleiocarpidia","K.Schum.",414 14168,"","Pleiocoryne","Rauschert",414 5359,"","Pleiocraterium","Bremek.",414 18264,"","Pleotheca","Wall.",414 23324,"","Plethyrsis","Raf.",414 18499,"","Pleureia","Raf.",414 17479,"","Pleurocarpus","Klotzsch",414 18455,"","Pleurocoffea","Baill.",414 18286,"","Pliocarpida","Post & Kuntze",414 5360,"","Plocama","Aiton",414 16778,"","Plocaniophyllon","Brandegee",414 5361,"","Poecilocalyx","Bremek.",414 18537,"","Poederiopsis","Rusby",414 18463,"","Pogonanthus","Montrouz.",414 18468,"","Pogonolobus","F.Muell.",414 5362,"","Pogonopus","Klotzsch",414 18255,"","Poiretia","J.F.Gmel.",414 5363,"","Polycoryne","Keay",414 18221,"","Polycycliska","Ridl.",414 18500,"","Polyozus","Lour.",414 18414,"","Polyphragmon","Desf.",414 25460,"","Polysolen","Rauschert",414 18281,"","Polysolenia","Hook.f.",414 5366,"","Polysphaeria","Hook.f.",414 5367,"","Polyura","Hook.f.",414 18224,"","Pomangium","Reinw.",414 18314,"","Pomatium","C.F.Gaertn.",414 5368,"","Pomax","Sol. ex DC.",414 5369,"","Pomazota","Ridl.",414 18415,"","Porocarpus","Gaertn.",414 5370,"","Porterandia","Ridl.",414 5371,"","Portlandia","P.Browne",414 5372,"","Posoqueria","Aubl.",414 18336,"","Posoria","Raf.",414 23325,"","Potima","R.Hedw.",414 5373,"","Pouchetia","A.Rich.",414 5374,"","Praravinia","Korth.",414 5375,"","Pravinaria","Bremek.",414 5376,"","Preussiodora","Keay",414 5377,"","Princea","Dubard & Dop",414 5378,"","Prismatomeris","Thwaites",414 18533,"","Pristidia","Thwaites",414 16852,"","Probletostemon","K.Schum.",414 5379,"","Proscephaleium","Korth.",414 5380,"","Psathura","Comm. ex Juss.",414 17551,"","Pseudaidia","Tirveng.",414 23326,"","Pseudixora","Miq.",414 16779,"","Pseudochimarrhis","Ducke",414 18173,"","Pseudocinchona","A.Chev.",414 14810,"","Pseudogaillonia","Lincz.",414 5381,"","Pseudogardenia","Keay",414 5382,"","Pseudohamelia","Wernham",414 5383,"","Pseudomantalania","J.-F.Leroy",414 5384,"","Pseudomussaenda","Wernham",414 5385,"","Pseudonesohedyotis","Tennant",414 5386,"","Pseudopeponidium","Homolle ex Arenes",414 5387,"","Pseudopyxis","Miq.",414 18260,"","Pseudorachicallis","Post & Kuntze",414 18261,"","Pseudorhachicallis","Hook.f.",414 5388,"","Pseudosabicea","N.Halle",414 18456,"","Psilanthopsis","A.Chev.",414 5389,"","Psilanthus","Hook.f.",414 14167,"","Psilobium","Jack",414 18435,"","Psilostoma","Klotzsch",414 23327,"","Pstathura","Raf.",414 5390,"","Psychotria","L.",414 18501,"","Psychotrophum","P.Browne",414 16234,"","Psydrax","Gaertn.",414 5391,"","Psyllocarpus","Mart. & Zucc.",414 5392,"","Pteridocalyx","Wernham",414 5393,"","Pterogaillonia","Lincz.",414 23328,"","Pterostephus","C.Presl",414 18220,"","Ptychodea","Willd. ex Cham. & Schltdl.",414 18372,"","Ptychostigma","Hochst.",414 18331,"","Pubeta","L.",414 17480,"","Pubistylus","Thoth.",414 5394,"","Putoria","Pers.",414 5395,"","Pygmaeothamnus","Robyns",414 5396,"","Pyragra","Bremek.",414 5397,"","Pyrostria","Comm. ex Juss.",414 18165,"","Quinquina","Boehm.",414 18209,"","Rachicallis","DC.",414 14165,"","Ramosmania","Tirveng. & Verdc.",414 18337,"","Ramspekia","Scop.",414 5398,"","Randia","L.",414 23329,"","Rangia","Griseb.",414 5399,"","Raritebe","Wernham",414 5400,"","Ravnia","Oerst.",414 5401,"","Readea","Gillespie",414 5402,"","Relbunium","(Endl.) Hook.f.",414 5403,"","Remijia","DC.",414 5404,"","Rennellia","Korth.",414 18162,"","Restiaria","Lour.",414 5405,"","Retiniphyllum","Bonpl.",414 18538,"","Reussia","Dennst.",414 18378,"","Rhabdostigma","Hook.f.",414 5406,"","Rhachicallis","DC.",414 5407,"","Rhadinopus","S.Moore",414 5408,"","Rhaphidura","Bremek.",414 5409,"","Rhipidantha","Bremek.",414 18514,"","Rhodostoma","Scheidw.",414 18218,"","Rhombospora","Korth.",414 5410,"","Rhopalobrachium","Schltr. & K.Krause",414 5411,"","Rhyssocarpus","Endl.",414 18404,"","Rhytidotus","Hook.f.",414 23330,"","Ricardia","Adans.",414 5412,"","Richardia","L.",414 18591,"","Richardsonia","Kunth",414 5413,"","Riqueuria","Ruiz & Pav.",414 5414,"","Robynsia","Hutch.",414 18205,"","Rogiera","Planch.",414 14169,"","Roigella","Borhidi & M.Fernandez Zeq.",414 18464,"","Rojoc","Adans.",414 18502,"","Ronabea","Aubl.",414 18503,"","Ronabia","St.-Lag.",414 5415,"","Rondeletia","L.",414 18384,"","Rosea","Klotzsch",414 16780,"","Rosenbergiodendron","Fagerl.",414 18388,"","Rotheria","Meyen",414 5416,"","Rothmannia","Thunb.",414 18610,"","Rubeola","Hill",414 18606,"","Rubeola","Mill.",414 5417,"","Rubia","L.",414 18562,"","Rubioides","Perkins",414 5418,"","Rudgea","Salisb.",414 5419,"","Rustia","Klotzsch",414 5420,"","Rutidea","DC.",414 23331,"","Rytidea","Spreng.",414 18405,"","Rytidotus","Hook.f.",414 5421,"","Rytigynia","Blume",414 5422,"","Sabicea","Aubl.",414 18423,"","Sacconia","Endl.",414 5423,"","Sacosperma","G.Taylor",414 18364,"","Sahlbergia","Neck.",414 18186,"","Saldanha","Vell.",414 5424,"","Saldinia","A.Rich. ex DC.",414 5425,"","Salzmannia","DC.",414 5426,"","Santalina","Baill.",414 18523,"","Santia","Wight & Arn.",414 5427,"","Saprosma","Blume",414 5428,"","Sarcocephalus","Afzel. ex Sabine",414 5429,"","Sarcopygme","Setch. & Christoph.",414 23332,"","Sardinia","Vell.",414 18564,"","Sarissus","Gaertn.",414 18326,"","Scepseothamnus","Cham.",414 5430,"","Schachtia","H.Karst.",414 5431,"","Schenckia","K.Schum.",414 18445,"","Schetti","Adans.",414 18589,"","Schiedea","A.Rich.",414 23333,"","Schiedea","Bartl.",414 5432,"","Schismatoclada","Baker",414 18587,"","Schizangium","Bartl. ex DC.",414 5433,"","Schizenterospermum","Homolle ex Arenes",414 5434,"","Schizocalyx","Wedd.",414 5435,"","Schizocolea","Bremek.",414 16781,"","Schizomussaenda","H.L.Li",414 18428,"","Schizospermum","Boivin ex Baill.",414 5436,"","Schizostigma","Arn. ex Meisn.",414 5437,"","Schmidtottia","Urb.",414 18210,"","Schoenleinia","Klotzsch",414 5438,"","Schradera","Vahl",414 18217,"","Schreibersia","Pohl",414 5439,"","Schumanniophyton","Harms",414 5440,"","Schwendenera","K.Schum.",414 18293,"","Schwenkfelda","Schreb.",414 18294,"","Schwenkfeldia","Willd.",414 18234,"","Sclerococcus","Bartl.",414 18236,"","Scleromitrion","Wight & Arn.",414 5441,"","Scolosanthus","Vahl",414 5442,"","Scyphiphora","C.F.Gaertn.",414 5443,"","Scyphochlamys","Balf.f.",414 5444,"","Scyphostachys","Thwaites",414 18316,"","Seemannia","Hook.",414 5445,"","Sericanthe","Robbr.",414 5446,"","Serissa","Comm. ex Juss.",414 18214,"","Sestinia","Boiss. & Hohen.",414 5447,"","Shaferocharis","Urb.",414 5448,"","Sherardia","L.",414 5449,"","Sherbournia","G.Don",414 18299,"","Sicelium","P.Browne",414 15890,"","Sickingia","Willd.",414 5450,"","Siderobombyx","Bremek.",414 18446,"","Siderodendrum","Schreb.",414 18447,"","Sideroxyloides","Jacq.",414 5451,"","Siemensia","Urb.",414 5452,"","Simira","Aubl.",414 5453,"","Sinoadina","Ridsdale",414 5454,"","Sipanea","Aubl.",414 5455,"","Sipaneopsis","Steyerm.",414 16853,"","Siphomeris","Bojer",414 18422,"","Siphonandra","Turcz.",414 5456,"","Siphonandrium","K.Schum.",414 18215,"","Siphonia","Benth.",414 18338,"","Solena","Willd.",414 16854,"","Solenandra","Hook.f.",414 5457,"","Solenixora","Baill.",414 5458,"","Sommera","Schltdl.",414 18267,"","Spallanzania","DC.",414 5459,"","Spathichlamys","R.Parker",414 5460,"","Spermacoce","L.",414 18582,"","Spermacoceodes","Kuntze",414 23334,"","Spermacon","Raf.",414 14171,"","Spermadictyon","Roxb.",414 18465,"","Sphaerophora","Blume",414 5461,"","Sphinctanthus","Benth.",414 18375,"","Spicillaria","A.Rich.",414 5462,"","Spiradiclis","Blume",414 18168,"","Sprucea","Benth.",414 5463,"","Squamellaria","Becc.",414 5464,"","Stachyarrhena","Hook.f.",414 5465,"","Stachyococcus","Standl.",414 5466,"","Staelia","Cham. & Schltdl.",414 5467,"","Standleya","Brade",414 18339,"","Stannia","H.Karst.",414 18588,"","Staurospermum","Thonn.",414 5468,"","Steenisia","Bakh.f.",414 5469,"","Stelechantha","Bremek.",414 18504,"","Stellix","Noronha",414 18238,"","Stelmanis","Raf.",414 23335,"","Stelmotis","Raf.",414 18256,"","Stenaria","Raf.",414 5470,"","Stenostomum","C.F.Gaertn.",414 18511,"","Stephanium","Schreb.",414 5471,"","Stephanococcus","Bremek.",414 18156,"","Stephegyne","Korth.",414 18192,"","Steudelago","Kuntze",414 5472,"","Stevensia","Poit.",414 5473,"","Steyermarkia","Standl.",414 5474,"","Stichianthus","Valeton",414 18466,"","Stigmanthus","Lour.",414 23336,"","Stigmatanthus","Roem. & Schult.",414 5475,"","Stilpnophyllum","Hook.f.",414 5476,"","Stipularia","P.Beauv.",414 5477,"","Stomandra","Standl.",414 18505,"","Straussia","A.Gray",414 5478,"","Streblosa","Korth.",414 5479,"","Streblosiopsis","Valeton",414 16782,"","Strempelia","A.Rich.",414 5480,"","Striolaria","Ducke",414 5481,"","Strumpfia","Jacq.",414 18402,"","Sturmia","C.F.Gaertn.",414 18352,"","Stylocoryna","Cav.",414 18353,"","Stylocoryne","Wight & Arn.",414 5482,"","Stylosiphonia","Brandegee",414 14170,"","Suberanthus","Borhidi & M.Fernandez Zeq.",414 5483,"","Sukunia","A.C.Sm.",414 18366,"","Sulipa","Blanco",414 5484,"","Sulitia","Merr.",414 18476,"","Sulzeria","Roem. & Schult.",414 16855,"","Suteria","DC.",414 18532,"","Sykesia","Arn.",414 16783,"","Symphyllarion","Gagnep.",414 5485,"","Synaptantha","Hook.f.",414 5486,"","Synisoon","Baill.",414 5487,"","Syringantha","Standl.",414 18373,"","Tamatavia","Hook.f.",414 5488,"","Tamilnadia","Tirveng. & Sastre",414 5489,"","Tammsia","H.Karst.",414 18303,"","Tangaraca","Adans.",414 18304,"","Tapesia","C.F.Gaertn.",414 16785,"","Tapinopentas","Bremek.",414 5490,"","Tapiphyllum","Robyns",414 18506,"","Tapogomea","Aubl.",414 23337,"","Taramea","Raf.",414 18583,"","Tardavel","Adans.",414 5491,"","Tarenna","Gaertn.",414 5492,"","Tarennoidea","Tirveng. & Sastre",414 18198,"","Tatea","Seem.",414 16786,"","Teinosolen","Hook.f.",414 5493,"","Temnocalyx","Robyns",414 5494,"","Temnopteryx","Hook.f.",414 5495,"","Tennantia","Verdc.",414 23338,"","Tepesia","C.F.Gaertn.",414 16787,"","Terebraria","Sesse ex Kunth",414 16856,"","Tertrea","DC.",414 18584,"","Tessiera","DC.",414 5496,"","Tetralopha","Hook.f.",414 18477,"","Tetramerium","C.F.Gaertn.",414 5497,"","Tetraplasia","Rehder",414 18350,"","Tetrastigma","K.Schum.",414 18250,"","Thecagonum","Babu",414 5498,"","Thecorchus","Bremek.",414 18251,"","Theyodis","A.Rich.",414 16788,"","Thieleodoxa","Cham.",414 5499,"","Thiersia","Baill.",414 23339,"","Thiollierea","Montrouz.",414 5500,"","Thogsennia","Aiello",414 5501,"","Thouarsiora","Homolle ex Arenes",414 18367,"","Thunbgeria","Montin",414 5502,"","Thyridocalyx","Bremek.",414 5503,"","Thysanospermum","Champ. ex Benth.",414 5504,"","Timonius","DC.",414 5505,"","Tobagoa","Urb.",414 5506,"","Tocoyena","Aubl.",414 18300,"","Tontanea","Aubl.",414 5507,"","Tortuella","Urb.",414 16789,"","Tournefortiopsis","Rusby",414 5508,"","Trailliaedoxa","W.W.Sm. & Forrest",414 5509,"","Tresanthera","H.Karst.",414 18507,"","Trevirania","Heynh.",414 5510,"","Triainolepis","Hook.f.",414 16857,"","Tribrachya","Korth.",414 5511,"","Tricalysia","A.Rich. ex DC.",414 18602,"","Trichogalium","Fourr.",414 5512,"","Trichostachys","Hook.f.",414 5513,"","Trigonopyren","Bremek.",414 18571,"","Triodon","DC.",414 16858,"","Trisciadia","Hook.f.",414 17481,"","Trukia","Kaneh.",414 17482,"","Tsiangia","But, H.H.Hsue & P.T.Li",414 23340,"","Ucriana","Willd.",414 5515,"","Uncaria","Schreb.",414 18279,"","Uncariopsis","H.Karst.",414 23341,"","Uncinaria","Rchb.",414 18508,"","Uragoga","Baill.",414 18280,"","Urceolaria","Willd. ex Cothen.",414 5516,"","Urophyllum","Wall.",414 18163,"","Uruparia","Raf.",414 16859,"","Vaillantia","Hoffm.",414 5517,"","Valantia","L.",414 18181,"","Vanessa","Raf.",414 5518,"","Vangueria","Comm. ex Juss.",414 16233,"","Vangueriella","Verdc.",414 5519,"","Vangueriopsis","Robyns",414 18368,"","Varnera","L.",414 18436,"","Vavanga","Rohr",414 5520,"","Versteegia","Valeton",414 18450,"","Verulamia","DC. ex Poir.",414 18227,"","Vignaldia","A.Rich.",414 18228,"","Vignaudia","Schweinf.",414 5521,"","Villaria","Rolfe",414 16860,"","Virecta","Afzel. ex Sm.",414 23342,"","Virecta","L.f.",414 5522,"","Virectaria","Bremek.",414 18509,"","Viscoides","Jacq.",414 23343,"","Vissadali","Adans.",414 18320,"","Viviana","Colla",414 18400,"","Viviana","Raf.",414 18211,"","Voigtia","Klotzsch",414 23344,"","Wahlenbergia","Blume",414 18290,"","Wallichia","Reinw. ex Blume",414 5523,"","Warburgina","Eig",414 18369,"","Warneria","Ellis",414 5524,"","Warszewiczia","Klotzsch",414 18318,"","Watsonamra","Kuntze",414 23345,"","Webera","Cramer",414 23346,"","Webera","Schreb.",414 5525,"","Wendlandia","Bartl. ex DC.",414 5526,"","Wernhamia","S.Moore",414 23347,"","Wiasemskya","Klotzsch",414 18240,"","Wiegmannia","Meyen",414 18242,"","Wigmannia","Walp.",414 18206,"","Willdenovia","J.F.Gmel.",414 16861,"","Williamsia","Merr.",414 5527,"","Wittmackanthus","Kuntze",414 23348,"","Wittmannia","Vahl",414 5528,"","Xanthophytopsis","Pit.",414 5529,"","Xanthophytum","Reinw. ex Blume",414 5530,"","Xantonnea","Pierre ex Pit.",414 5531,"","Xantonneopsis","Pit.",414 5532,"","Xerococcus","Oerst.",414 18355,"","Xeromphis","Raf.",414 18370,"","Yangapa","Raf.",414 23349,"","Yutajea","Steyerm.",414 18207,"","Zalmaria","B.D.Jacks.",414 18208,"","Zamaria","Raf.",414 5533,"","Zeuxanthe","Ridl.",414 5534,"","Zuccarinia","Blume",414 18510,"","Zwaardekronia","Korth.",414 16862,"","Zygoon","Hiern",414 11935,"","Danae","Medik.",415 12055,"","Ruscus","L.",415 12064,"","Semele","Kunth",415 25597,"","Achuaria","Gereau",416 1676,"","Acmadenia","Bartl. & H.L.Wendl.",416 1677,"","Acradenia","Kippist",416 1678,"","Acronychia","J.R.Forst. & G.Forst.",416 1679,"","Adenandra","Willd.",416 1680,"","Adiscanthus","Ducke",416 1681,"","Aegle","Correa",416 1682,"","Aeglopsis","Swingle",416 1683,"","Afraegle","(Swingle) Engl.",416 25158,"","Afraurantium","A.Chev.",416 1684,"","Agathosma","Willd.",416 1685,"","Almeidea","A.St.-Hil.",416 1686,"","Amyris","P.Browne",416 1687,"","Angostura","Roem. & Schult.",416 1688,"","Apocaulon","R.S.Cowan",416 1689,"","Araliopsis","Engl.",416 1690,"","Asterolasia","F.Muell.",416 17795,"","Astrophyllum","Torr. & A.Gray",416 1691,"","Atalantia","Correa",416 1692,"","Balfourodendron","Corr.Mello ex Oliv.",416 1693,"","Balsamocitrus","Stapf",416 17794,"","Barosma","Willd.",416 18112,"","Bauerella","Borzi",416 1694,"","Boenninghausenia","Rchb. ex Meisn.",416 1695,"","Boninia","Planch.",416 1696,"","Boronella","Baill.",416 1697,"","Boronia","Sm.",416 1698,"","Bosistoa","F.Muell.",416 1699,"","Bouchardatia","Baill.",416 25159,"","Bouzetia","Montrouz.",416 1700,"","Brombya","F.Muell.",416 1701,"","Burkillanthus","Swingle",416 1702,"","Calodendrum","Thunb.",416 1703,"","Casimiroa","La Llave",416 17798,"","Chalcas","L.",416 1704,"","Chloroxylon","DC.",416 1705,"","Choisya","Kunth",416 1706,"","Chorilaena","Endl.",416 1707,"","Citropsis","(Engl.) Swingle & M.Kellerm.",416 1708,"","Citrus","L.",416 1709,"","Clausena","Burm.f.",416 17797,"","Clausenopsis","(Engl.) Engl.",416 1710,"","Clymenia","Swingle",416 1848,"","Cneoridium","Hook.f.",416 1711,"","Coleonema","Bartl. & H.L.Wendl.",416 1712,"","Comoroa","Oliv.",416 1713,"","Comptonella","Baker f.",416 1714,"","Coombea","P.Royen",416 1715,"","Correa","Andrews",416 1716,"","Crowea","Sm.",416 17793,"","Cusparia","Humb. ex R.Br.",416 1717,"","Cyanothamnus","Lindl.",416 1718,"","Decagonocarpus","Engl.",416 1719,"","Decatropis","Hook.f.",416 1720,"","Decazyx","Pittier & S.F.Blake",416 1721,"","Dendrosma","Pancher & Sebert",416 1722,"","Dictamnus","L.",416 1723,"","Dictyoloma","A.Juss.",416 17800,"","Diomma","Engl. ex Harms",416 1724,"","Diosma","L.",416 1725,"","Diphasia","Pierre",416 1726,"","Diphasiopsis","Mendonca",416 1727,"","Diplolaena","R.Br.",416 1728,"","Drummondita","Harv.",416 1729,"","Dutaillyea","Baill.",416 1730,"","Echinocitrus","Tanaka",416 1731,"","Empleuridium","Sond. & Harv.",416 1732,"","Empleurum","Aiton",416 1733,"","Eremocitrus","Swingle",416 1734,"","Eriostemon","Sm.",416 16400,"","Ertela","Adans.",416 1735,"","Erythrochiton","Nees & Mart.",416 1736,"","Esenbeckia","Kunth",416 1737,"","Euchaetis","Bartl. & H.L.Wendl.",416 1738,"","Euodia","J.R.Forst. & G.Forst.",416 1739,"","Euxylophora","Huber",416 16401,"","Evodia","Lam.",416 1740,"","Evodiella","Linden",416 16402,"","Fagara","L.",416 1741,"","Fagaropsis","Mildbr. ex Siebenl.",416 17799,"","Feronia","Correa",416 1742,"","Feroniella","Swingle",416 1743,"","Flindersia","R.Br.",416 1744,"","Fortunella","Swingle",416 1745,"","Galipea","Aubl.",416 1746,"","Geijera","Schott",416 1747,"","Geleznowia","Turcz.",416 1748,"","Glycosmis","Correa",416 1749,"","Halfordia","F.Muell.",416 1750,"","Haplophyllum","A.Juss.",416 1751,"","Helietta","Tul.",416 16404,"","Hesperethusa","M.Roem.",416 1752,"","Hortia","Vand.",416 16403,"","Humblotiodendron","Engl.",416 1754,"","Ivodea","Capuron",416 25300,"","Kodalyodendron","Borhidi & Acuna",416 1756,"","Leptothyrsa","Hook.f.",416 1757,"","Limnocitrus","Swingle",416 1758,"","Limonia","L.",416 1759,"","Lubaria","Pittier",416 1760,"","Luerssenidendron","Domin",416 1761,"","Lunasia","Blanco",416 1762,"","Luvunga","Buch.-Ham. ex Wight & Arn.",416 14189,"","Maclurodendron","T.G.Hartley",416 1763,"","Macrostylis","Bartl. & H.L.Wendl.",416 1764,"","Medicosma","Hook.f.",416 1765,"","Megastigma","Hook.f.",416 1766,"","Melicope","J.R.Forst. & G.Forst.",416 1767,"","Merope","M.Roem.",416 1768,"","Merrillia","Swingle",416 17736,"","Metrodorea","A.St.-Hil.",416 1769,"","Microcitrus","Swingle",416 1770,"","Microcybe","Turcz.",416 1771,"","Micromelum","Blume",416 1772,"","Monanthocitrus","Tanaka",416 25331,"","Moniera","Loefl.",416 1773,"","Monnieria","Loefl.",416 1774,"","Muiriantha","C.A.Gardner",416 1775,"","Murraya","L.",416 1776,"","Myllanthus","R.S.Cowan",416 1777,"","Myrtopsis","Engl.",416 1778,"","Naringi","Adans.",416 1779,"","Naudinia","Planch. & Linden",416 1780,"","Nematolepis","Turcz.",416 24390,"","Neobyrnesia","J.A.Armstr.",416 25598,"","Neoraputia","Emmerich",416 1781,"","Nycticalanthus","Ducke",416 1782,"","Oricia","Pierre",416 1783,"","Oriciopsis","Engl.",416 1784,"","Orixa","Thunb.",416 1785,"","Oxanthera","Montrouz.",416 16405,"","Pagetia","F.Muell.",416 1786,"","Pamburus","Swingle",416 1787,"","Paramignya","Wight",416 1788,"","Pelea","A.Gray",416 1789,"","Peltostigma","Walp.",416 1790,"","Pentaceras","Hook.f.",416 1791,"","Phebalium","Vent.",416 1792,"","Phellodendron","Rupr.",416 1793,"","Philotheca","Rudge",416 1794,"","Phyllosma","Bolus",416 1795,"","Pilocarpus","Vahl",416 1796,"","Pitavia","Molina",416 1797,"","Platydesma","H.Mann",416 1799,"","Pleiococca","F.Muell.",416 1800,"","Pleiospermium","(Engl.) Swingle",416 1801,"","Plethadenia","Urb.",416 16407,"","Pleurandropsis","Baill.",416 15729,"","Pleurocitrus","Tanaka",416 1803,"","Polyaster","Hook.f.",416 17679,"","Pomphidea","Miers",416 1804,"","Poncirus","Raf.",416 25129,"","Pseudiosma","DC.",416 1805,"","Psilopeganum","Hemsl.",416 1806,"","Ptelea","L.",416 17796,"","Rabelaisia","Planch.",416 1808,"","Raputia","Aubl.",416 25603,"","Raputiarana","Emmerich",416 1809,"","Rauia","Nees & Mart.",416 1810,"","Raulinoa","R.S.Cowan",416 1811,"","Ravenia","Vell.",416 1812,"","Raveniopsis","Gleason",416 1814,"","Rhadinothamnus","Paul G.Wilson",416 1815,"","Ruta","L.",416 25301,"","Rutaneblina","Steyerm. & Luteyn",416 16406,"","Rutosma","A.Gray",416 1816,"","Sarcomelicope","Engl.",416 1817,"","Sargentia","S.Watson",416 1818,"","Severinia","Ten.",416 1819,"","Sheilanthera","I.Williams",416 25599,"","Sigmatanthus","Huber ex Emmerich",416 1820,"","Skimmia","Thunb.",416 1821,"","Spathelia","L.",416 1822,"","Spiranthera","A.St.-Hil.",416 1823,"","Stauranthus","Liebm.",416 1824,"","Swinglea","Merr.",416 1825,"","Teclea","Delile",416 1826,"","Tecleopsis","Hoyle & Leakey",416 1827,"","Terminthodia","Ridl.",416 1828,"","Tetractomia","Hook.f.",416 16742,"","Tetradium","Lour.",416 1829,"","Thamnosma","Torr. & Frem.",416 1830,"","Thoreldora","Pierre",416 1831,"","Ticorea","Aubl.",416 1832,"","Toddalia","Juss.",416 1833,"","Toddaliopsis","Engl.",416 1834,"","Tractocopevodia","Raizada & V.Naray.",416 1835,"","Triphasia","Lour.",416 1836,"","Urocarpus","J.Drumm. ex Harv.",416 1837,"","Vepris","Comm. ex A.Juss.",416 1838,"","Wenzelia","Merr.",416 1839,"","Zanthoxylum","L.",416 1840,"","Zieria","Sm.",416 16408,"","Zieridium","Baill.",416 2411,"","Sabia","Colebr.",417 7908,"","Saccifolium","Maguire & Pires",418 16911,"","Chosenia","Nakai",419 10683,"","Populus","L.",419 10684,"","Salix","L.",419 18026,"","Actegeton","Blume",420 7294,"","Azima","Lam.",420 7295,"","Dobera","Juss.",420 18025,"","Monebia","L'Her.",420 18024,"","Platymitium","Warb.",420 7296,"","Salvadora","L.",420 22196,"","Schizocalyx","Hochst.",420 18023,"","Tomex","Forssk.",420 22037,"","Marsilaea","Neck.",421 13757,"","Salvinia","Seg.",421 10125,"","Acanthosyris","(Eichler) Griseb.",422 10126,"","Amphorogyne","Stauffer & Hurl.",422 10127,"","Anthobolus","R.Br.",422 10128,"","Arjona","Cav.",422 20096,"","Austroamericium","Hendrych",422 10129,"","Buckleya","Torr.",422 10130,"","Cervantesia","Ruiz & Pav.",422 10131,"","Choretrum","R.Br.",422 10132,"","Cladomyza","Danser",422 10133,"","Colpoon","Bergius",422 10134,"","Comandra","Nutt.",422 10135,"","Daenikera","Hurl. & Stauffer",422 16747,"","Darbya","A.Gray",422 10136,"","Dendromyza","Danser",422 10137,"","Dendrotrophe","Miq.",422 10138,"","Dufrenoya","Chatin",422 24323,"","Elaphanthera","N.Halle",422 10139,"","Eucarya","T.L.Mitch.",422 10140,"","Exocarpos","Labill.",422 20098,"","Fusanus","L.",422 23223,"","Fusanus","R.Br.",422 10141,"","Geocaulon","Fernald",422 10142,"","Henslowia","Blume",422 10143,"","Iodina","Hook. & Arn. ex Meisn.",422 10144,"","Kunkeliella","Stearn",422 10145,"","Leptomeria","R.Br.",422 10146,"","Mida","A.Cunn. ex Endl.",422 10147,"","Myoschilos","Ruiz & Pav.",422 10148,"","Nanodea","Banks ex C.F.Gaertn.",422 10149,"","Nestronia","Raf.",422 10150,"","Okoubaka","Pellegr. & Normand",422 10151,"","Omphacomeria","(Endl.) A.DC.",422 10152,"","Osyridicarpos","A.DC.",422 10153,"","Osyris","L.",422 10154,"","Phacellaria","Benth.",422 10155,"","Pyrularia","Michx.",422 10156,"","Quinchamalium","Molina",422 10157,"","Rhoiacarpos","A.DC.",422 10158,"","Santalum","L.",422 20099,"","Scleromelum","K.Schum. & Lauterb.",422 10159,"","Scleropyrum","Arn.",422 10160,"","Spirogardnera","Stauffer",422 10161,"","Thesidium","Sond.",422 10162,"","Thesium","L.",422 2243,"","Alectryon","Gaertn.",423 2244,"","Allophylus","L.",423 2245,"","Allosanthus","Radlk.",423 2246,"","Amesiodendron","Hu",423 17874,"","Anomosanthes","Blume",423 17875,"","Aphania","Blume",423 17876,"","Aphanococcus","Radlk.",423 2247,"","Aporrhiza","Radlk.",423 2248,"","Arfeuillea","Pierre ex Radlk.",423 2249,"","Arytera","Blume",423 2250,"","Atalaya","Blume",423 2251,"","Athyana","(Griseb.) Radlk.",423 2252,"","Averrhoidium","Baill.",423 2253,"","Beguea","Capuron",423 17873,"","Bellingia","Pierre",423 2254,"","Bemarivea","Choux",423 2255,"","Bizonula","Pellegr.",423 2256,"","Blighia","K.D.Koenig",423 2257,"","Blighiopsis","Van der Veken",423 2258,"","Blomia","Miranda",423 2259,"","Boniodendron","Gagnep.",423 2260,"","Bottegoa","Chiov.",423 2261,"","Bridgesia","Bertero ex Cambess.",423 2262,"","Camptolepis","Radlk.",423 2263,"","Cardiophyllarium","Choux",423 2264,"","Cardiospermum","L.",423 2265,"","Castanospora","F.Muell.",423 17883,"","Chiarinia","Chiov.",423 2266,"","Chonopetalum","Radlk.",423 2267,"","Chouxia","Capuron",423 2268,"","Chytranthus","Hook.f.",423 2269,"","Cnemidiscus","Pierre",423 2270,"","Conchopetalum","Radlk.",423 25417,"","Cossignia","Comm. ex Lam.",423 2271,"","Cossinia","Comm. ex Lam.",423 2272,"","Cotylodiscus","Radlk.",423 2273,"","Crossonephelis","Baill.",423 2274,"","Cubilia","Blume",423 2275,"","Cupania","L.",423 2276,"","Cupaniopsis","Radlk.",423 2277,"","Deinbollia","Schumach. & Thonn.",423 2278,"","Delavaya","Franch.",423 2279,"","Delpya","Pierre ex Radlk.",423 2280,"","Diacarpa","Sim",423 2281,"","Diatenopteryx","Radlk.",423 2282,"","Dictyoneura","Blume",423 2283,"","Dilodendron","Radlk.",423 2284,"","Dimocarpus","Lour.",423 2285,"","Diploglottis","Hook.f.",423 2286,"","Diplokeleba","N.E.Br.",423 2287,"","Diplopeltis","Endl.",423 2288,"","Dipterodendron","Radlk.",423 2289,"","Distichostemon","F.Muell.",423 2290,"","Dodonaea","Mill.",423 2291,"","Doratoxylon","Thouars ex Hook.f.",423 2292,"","Elattostachys","Radlk.",423 2293,"","Eriandrostachys","Baill.",423 2294,"","Eriocoelum","Hook.f.",423 17877,"","Erioglossum","Blume",423 2295,"","Erythrophysa","E.Mey. ex Arn.",423 2296,"","Erythrophysopsis","Verdc.",423 2297,"","Euchorium","Ekman & Radlk.",423 17884,"","Euphoria","Comm. ex Juss.",423 2298,"","Euphorianthus","Radlk.",423 2299,"","Eurycorymbus","Hand.-Mazz.",423 2300,"","Exothea","Macfad.",423 2301,"","Filicium","Thwaites ex Benth.",423 2302,"","Ganophyllum","Blume",423 2303,"","Glenniea","Hook.f.",423 2304,"","Gloeocarpus","Radlk.",423 2305,"","Glossolepis","Gilg",423 2306,"","Gongrodiscus","Radlk.",423 2307,"","Gongrospermum","Radlk.",423 24559,"","Guindilia","Gillies ex Hook. & Arn.",423 2308,"","Guioa","Cav.",423 2309,"","Haplocoelum","Radlk.",423 2310,"","Harpullia","Roxb.",423 17878,"","Hebecoccus","Radlk.",423 2311,"","Hedyachras","Radlk.",423 2312,"","Heterodendrum","Desf.",423 2313,"","Hippobromus","Eckl. & Zeyh.",423 2314,"","Hornea","Baker",423 16714,"","Houssayanthus","Hunz.",423 25604,"","Howethoa","Rauschert",423 2315,"","Hypelate","P.Browne",423 2316,"","Hypseloderma","Radlk.",423 2317,"","Jagera","Blume",423 2318,"","Koelreuteria","Laxm.",423 2319,"","Laccodiscus","Radlk.",423 2320,"","Lecaniodiscus","Planch. ex Benth.",423 2321,"","Lepiderema","Radlk.",423 2322,"","Lepidopetalum","Blume",423 2323,"","Lepisanthes","Blume",423 2324,"","Litchi","Sonn.",423 2325,"","Llagunoa","Ruiz & Pav.",423 2326,"","Lophostigma","Radlk.",423 2327,"","Loxodiscus","Hook.f.",423 2328,"","Lychnodiscus","Radlk.",423 2329,"","Macphersonia","Blume",423 2330,"","Magonia","A.St.-Hil.",423 2331,"","Majidea","J.Kirk ex Oliv.",423 17879,"","Manongarivea","Choux",423 2332,"","Matayba","Aubl.",423 2333,"","Melanodiscus","Radlk.",423 2334,"","Melicoccus","P.Browne",423 2335,"","Mischocarpus","Blume",423 2336,"","Mischocodon","Radlk.",423 2337,"","Molinaea","Comm. ex Juss.",423 2338,"","Neotina","Capuron",423 2339,"","Nephelium","L.",423 2340,"","Omalocarpus","Choux",423 2341,"","Otonephelium","Radlk.",423 17880,"","Otophora","Blume",423 14828,"","Palaoea","Kaneh.",423 2342,"","Pancovia","Willd.",423 2343,"","Pappea","Eckl. & Zeyh.",423 2344,"","Paranephelium","Miq.",423 2345,"","Paullinia","L.",423 2346,"","Pavieasia","Pierre",423 2347,"","Pentascyphus","Radlk.",423 17886,"","Phialodiscus","Radlk.",423 2348,"","Phyllotrichum","Thorel ex Lecomte",423 2349,"","Placodiscus","Radlk.",423 2350,"","Plagioscyphus","Radlk.",423 2351,"","Poculodiscus","Danguy & Choux",423 2352,"","Podonephelium","Baill.",423 2353,"","Pometia","J.R.Forst. & G.Forst.",423 2354,"","Porocystis","Radlk.",423 2355,"","Pseudima","Radlk.",423 2356,"","Pseudolitchi","Danguy & Choux",423 17885,"","Pseudonephelium","Radlk.",423 2357,"","Pseudopancovia","Pellegr.",423 2464,"","Pseudoprotorhus","H.Perrier",423 2358,"","Pseudopteris","Baill.",423 2359,"","Radlkofera","Gilg",423 2360,"","Rhysotoechia","Radlk.",423 17881,"","Sapindopsis","F.C.How & C.N.Ho",423 2361,"","Sapindus","L.",423 2362,"","Sarcopteryx","Radlk.",423 2363,"","Sarcotoechia","Radlk.",423 2364,"","Schleichera","Willd.",423 2365,"","Scyphonychium","Radlk.",423 17888,"","Scyphopetalum","Hiern",423 2366,"","Serjania","Mill.",423 2367,"","Sinoradlkofera","F.G.Mey.",423 17887,"","Sisyrolepis","Radlk.",423 2368,"","Smelophyllum","Radlk.",423 2369,"","Stadmannia","Lam.",423 2370,"","Stocksia","Benth.",423 2371,"","Storthocalyx","Radlk.",423 2372,"","Strophiodiscus","Choux",423 2373,"","Synima","Radlk.",423 2374,"","Talisia","Aubl.",423 17889,"","Talisiopsis","Radlk.",423 2375,"","Thinouia","Triana & Planch.",423 2376,"","Thouinia","Poit.",423 2377,"","Thouinidium","Radlk.",423 17882,"","Thraulococcus","Radlk.",423 2378,"","Tikalia","Lundell",423 2379,"","Tina","Schult.",423 14827,"","Tinopsis","Radlk.",423 2380,"","Toechima","Radlk.",423 2381,"","Toulicia","Aubl.",423 2382,"","Trigonachras","Radlk.",423 2383,"","Tripterodendron","Radlk.",423 2384,"","Tristira","Radlk.",423 2385,"","Tristiropsis","Radlk.",423 2386,"","Tsingya","Capuron",423 2387,"","Ungnadia","Endl.",423 2388,"","Urvillea","Kunth",423 2389,"","Valenzuelia","Bertero ex Cambess.",423 2390,"","Vouarana","Aubl.",423 2391,"","Xanthoceras","Bunge",423 2392,"","Xerospermum","Blume",423 2393,"","Zanha","Hiern",423 2394,"","Zollingeria","Kurz",423 23386,"","Abebaia","Baehni",424 23450,"","Achradelpha","O.F.Cook",424 7152,"","Achradotypus","Baill.",424 7153,"","Achras","L.",424 7154,"","Achrouteria","Eyma",424 7155,"","Afrosersalisia","A.Chev.",424 17737,"","Aisandra","Pierre",424 7156,"","Albertisiella","Pierre ex Aubrev.",424 7157,"","Amorphospermum","F.Muell.",424 17738,"","Aningeria","Aubrev. & Pellegr.",424 23482,"","Apoia","Merr.",424 23401,"","Apterygia","Baehni",424 7158,"","Argania","Roem. & Schult.",424 23490,"","Arnanthus","Baehni",424 7160,"","Aubregrinia","Heine",424 7161,"","Aulandra","H.J.Lam",424 23363,"","Austrogambeya","Aubrev. & Pellegr.",424 23493,"","Austromimusops","A.Meeuse",424 7162,"","Autranella","A.Chev.",424 23393,"","Auzuba","Juss.",424 23407,"","Azaola","Blanco",424 7163,"","Baillonella","Pierre",424 7164,"","Bakeriella","Pierre ex Dubard",424 23372,"","Bakerisideroxylon","Engl.",424 7165,"","Barylucuma","Ducke",424 23406,"","Bassia","K.Koenig",424 23424,"","Beauvisagea","Pierre",424 23434,"","Beccariella","Pierre",424 23449,"","Beccarimnia","Pierre ex Koord.",424 7166,"","Bequaertiodendron","De Wild.",424 7167,"","Binectaria","Forssk.",424 23460,"","Blabea","Baehni",424 7168,"","Boerlagella","Pierre ex Cogn.",424 23376,"","Boivinella","Pierre ex Aubrev. & Pellegr.",424 23483,"","Bracea","King",424 7169,"","Breviea","Aubrev. & Pellegr.",424 7170,"","Bumelia","Sw.",424 7171,"","Burckella","Pierre",424 23425,"","Bureavella","Pierre",424 7172,"","Butyrospermum","Kotschy",424 23409,"","Cacosmanthus","de Vriese",424 23355,"","Cainito","Adans.",424 7173,"","Calocarpum","Pierre",424 23431,"","Calospermum","Pierre",424 7174,"","Calvaria","Comm. ex C.F.Gaertn.",424 7175,"","Capurodendron","Aubrev.",424 23451,"","Caramuri","Aubrev. & Pellegr.",424 7176,"","Cassidispermum","Hemsl.",424 23475,"","Ceratephorus","de Vriese",424 23413,"","Chaetocarpus","Schreb.",424 7177,"","Chelonespermum","Hemsl.",424 23388,"","Chiclea","Lundell",424 23362,"","Chloroluma","Baill.",424 23479,"","Chorioluma","Baill.",424 7178,"","Chromolucuma","Ducke",424 7179,"","Chrysophyllum","L.",424 23369,"","Corbassona","Aubrev.",424 7180,"","Cornuella","Pierre",424 23484,"","Crepinodendron","Pierre",424 23404,"","Croixia","Pierre",424 7181,"","Cryptogyne","Hook.f.",424 23365,"","Cynodendron","Baehni",424 23358,"","Dactimala","Raf.",424 23421,"","Daphniluma","Baill.",424 23411,"","Dasillipe","Dubard",424 23410,"","Dasyaulus","Thwaites",424 23396,"","Decateles","Raf.",424 23466,"","Delastrea","A.DC.",424 7182,"","Delpydora","Pierre",424 7183,"","Dichopsis","Thwaites",424 7184,"","Dipholis","A.DC.",424 7185,"","Diploknema","Pierre",424 7186,"","Diploon","Cronquist",424 23443,"","Discoluma","Baill.",424 23446,"","Dithecoluma","Baill.",424 23361,"","Donella","Pierre ex Baill.",424 7188,"","Dumoria","A.Chev.",424 7189,"","Eberhardtia","Lecomte",424 7190,"","Ecclinusa","Mart.",424 23397,"","Edgeworthia","Falc.",424 23453,"","Eglerodendron","Aubrev. & Pellegr.",424 23381,"","Eichleria","Hartog",424 23178,"","Elaeoluma","Baill.",424 23470,"","Elengi","Adans.",424 23353,"","Endotricha","Aubrev. & Pellegr.",424 23438,"","Englerella","Pierre",424 7191,"","Englerophytum","K.Krause",424 7192,"","Epiluma","Baill.",424 23447,"","Eremoluma","Baill.",424 7193,"","Faucherea","Lecomte",424 23370,"","Fibocentrum","Pierre ex Glaz.",424 23437,"","Fontbrunea","Pierre",424 23429,"","Franchetella","Pierre",424 7195,"","Galactoxylon","Pierre",424 23360,"","Gambeya","Pierre",424 23366,"","Gambeyobotrys","Aubrev.",424 7196,"","Ganua","Pierre ex Dubard",424 23430,"","Gayella","Pierre",424 7197,"","Gluema","Aubrev. & Pellegr.",424 7198,"","Glycoxylon","Ducke",424 23441,"","Gomphiluma","Baill.",424 23415,"","Guapeba","Gomes",424 23357,"","Guersentia","Raf.",424 23491,"","Gymnoluma","Baill.",424 24558,"","Handeliodendron","Rehder",424 23476,"","Hapaloceras","Hassk.",424 23468,"","Heteromera","Montrouz. ex Beauvis.",424 23416,"","Hormogyne","A.DC.",424 23458,"","Ichthyophora","Baehni",424 7199,"","Illipe","J.Konig ex Gras",424 7200,"","Imbricaria","Comm. ex Juss.",424 7201,"","Inhambanella","(Engl.) Dubard",424 7202,"","Isonandra","Wight",424 7203,"","Iteiluma","Baill.",424 7204,"","Ituridendron","De Wild.",424 23480,"","Jollya","Pierre",424 23408,"","Kakosmanthus","Hassk.",424 7205,"","Kantou","Aubrev. & Pellegr.",424 23383,"","Kaukenia","Kuntze",424 23474,"","Keratephorus","Hassk.",424 7206,"","Krausella","H.J.Lam",424 7207,"","Krugella","Pierre",424 7208,"","Labatia","Sw.",424 7209,"","Labourdonnaisia","Bojer",424 7210,"","Labramia","A.DC.",424 23489,"","Le-Monniera","Lecomte",424 7211,"","Lecomtedoxa","(Pierre ex Engl.) Dubard",424 23442,"","Leioluma","Baill.",424 7212,"","Leptostylis","Benth.",424 7213,"","Letestua","Lecomte",424 7214,"","Lucuma","Molina",424 23403,"","Lyciodes","Kuntze",424 7215,"","Madhuca","Ham. ex J.F.Gmel.",424 23422,"","Maesoluma","Baill.",424 7216,"","Magodendron","Vink",424 23390,"","Mahea","Pierre",424 7217,"","Malacantha","Pierre",424 7218,"","Manilkara","Adans.",424 16024,"","Manilkariopsis","(Gilly) Lundell",424 7219,"","Martiusella","Pierre",424 16025,"","Mastichodendron","(Engl.) H.J.Lam",424 23572,"","Meioluma","Baill.",424 23444,"","Microluma","Baill.",424 16026,"","Micropholis","(Griseb.) Pierre",424 7220,"","Mimusops","L.",424 23464,"","Mixandra","Pierre",424 17739,"","Monotheca","A.DC.",424 23389,"","Mopania","Lundell",424 23382,"","Muriea","Hartog",424 23385,"","Murieanthe","(Baill.) Aubrev.",424 23423,"","Myrsiniluma","Baill.",424 23440,"","Myrtiluma","Baill.",424 23448,"","Nemaluma","Baill.",424 23375,"","Neoboivinella","Aubrev. & Pellegr.",424 25743,"","Neohemsleya","T.D.Penn.",424 23461,"","Neolabatia","Aubrev.",424 17740,"","Neolemonniera","Heine",424 23478,"","Neopometia","Aubrev.",424 7221,"","Neoxythece","Aubrev. & Pellegr.",424 7222,"","Nesoluma","Baill.",424 7223,"","Niemeyera","F.Muell.",424 23387,"","Nispero","Aubrev.",424 23467,"","Nogo","Baehni",424 7224,"","Northea","Hook.f.",424 23492,"","Northia","Hook.f.",424 7225,"","Northiopsis","Kaneh.",424 23356,"","Nycteristion","Ruiz & Pav.",424 23481,"","Nzidora","A.Chev.",424 23418,"","Ochroluma","Baill.",424 23368,"","Ochrothallus","Pierre ex Baill.",424 7226,"","Omphalocarpum","P.Beauv.",424 23417,"","Oxythece","Miq.",424 7227,"","Pachystela","Pierre ex Engl.",424 7228,"","Palaquium","Blanco",424 23428,"","Paralabatia","Pierre",424 23488,"","Paramicropholis","Aubrev. & Pellegr.",424 23465,"","Passaveria","Mart. & Eichler ex Miq.",424 7229,"","Payena","A.DC.",424 16027,"","Peteniodendron","Lundell",424 23420,"","Peuceluma","Baill.",424 23574,"","Phlebolithis","Gaertn.",424 17742,"","Pichonia","Pierre",424 23469,"","Pierreodendron","A.Chev.",424 23456,"","Piresodendron","Aubrev.",424 17741,"","Planchonella","Pierre",424 23487,"","Platyluma","Baill.",424 23436,"","Pleioluma","Baill.",424 23445,"","Podoluma","Baill.",424 23433,"","Poissonella","Pierre",424 23477,"","Pometia","Vell.",424 7230,"","Pouteria","Aubl.",424 7231,"","Pradosia","Liais",424 23359,"","Prieurella","Pierre",424 23414,"","Prozetia","Neck.",424 23378,"","Pseudoboivinella","Aubrev. & Pellegr.",424 23439,"","Pseudocladia","Pierre",424 23454,"","Pseudolabatia","Aubrev. & Pellegr.",424 7232,"","Pseudopachystela","Aubrev. & Pellegr.",424 23462,"","Pseudoxythece","Aubrev.",424 7233,"","Pycnandra","Benth.",424 23419,"","Pyriluma","Baill.",424 23472,"","Radia","Noronha",424 23427,"","Radlkoferella","Pierre",424 7234,"","Ragala","Pierre",424 7235,"","Reptonia","A.DC.",424 17743,"","Rhamnoluma","Baill.",424 23426,"","Richardella","Pierre",424 23391,"","Robertia","Scop.",424 23392,"","Roemeria","Thunb.",424 23373,"","Rogeonella","Chev.",424 23575,"","Rostellaria","C.F.Gaertn.",424 23455,"","Sandwithiodoxa","Aubrev. & Pellegr.",424 7236,"","Sapota","Mill.",424 7237,"","Sarcaulus","Radlk.",424 23576,"","Sarcorhyna","C.Presl",424 7252,"","Sarcosperma","Hook.f.",424 23354,"","Schefferella","Pierre",424 23402,"","Sclerocladus","Raf.",424 23577,"","Scleroxylon","Bertol.",424 23573,"","Sclerozus","Raf.",424 7238,"","Sebertia","Pierre",424 23471,"","Semicipium","Pierre",424 7239,"","Sersalisia","R.Br.",424 23384,"","Shaferodendron","Gilly",424 23435,"","Siderocarpus","Pierre",424 7240,"","Sideroxylon","L.",424 23400,"","Sinosideroxylon","(Engl.) Aubrev.",424 23399,"","Spiniluma","(Baill.) Aubrev.",424 23394,"","Spondogona","Raf.",424 23485,"","Sprucella","Pierre",424 23486,"","Stephanoluma","Baill.",424 23371,"","Stironeuron","Radlk.",424 23379,"","Stisseria","Scop.",424 23380,"","Synarrhena","Fisch. & C.A.Mey.",424 7241,"","Synsepalum","(A.DC.) Daniell",424 7242,"","Syzygiopsis","Ducke",424 23395,"","Tatina","Raf.",424 7243,"","Tieghemella","Pierre",424 7244,"","Tisserantiodoxa","Aubrev. & Pellegr.",424 23405,"","Treubella","Pierre",424 7245,"","Tridesmostemon","Engl.",424 7246,"","Tropalanthe","S.Moore",424 23367,"","Trouettia","Pierre ex Baill.",424 23179,"","Tsebona","Capuron",424 7247,"","Tulestea","Aubrev. & Pellegr.",424 23432,"","Urbanella","Pierre",424 23457,"","Van-Royena","Aubrev.",424 23473,"","Vanderystia","De Wild.",424 23578,"","Verlangia","Neck. ex Raf.",424 23412,"","Vidoricum","Kuntze",424 23364,"","Villocuspis","(A.DC.) Aubrev. & Pellegr.",424 7248,"","Vincentella","Pierre",424 17744,"","Vitellaria","C.F.Gaertn.",424 7249,"","Vitellariopsis","Baill. ex Dubard",424 7250,"","Walkeria","A.Chev.",424 23377,"","Wildemaniodoxa","Aubrev. & Pellegr.",424 23459,"","Woikoia","Baehni",424 7251,"","Xantolis","Raf.",424 23374,"","Zeyherella","(Pierre ex Engl.) Aubrev.",424 1217,"","Eremolaena","Baill.",425 1218,"","Leptolaena","Thouars",425 1219,"","Mediusella","(Cavaco) Dorr",425 1220,"","Pentachlaena","H.Perrier",425 1221,"","Perrierodendron","Cavaco",425 1222,"","Rhodolaena","Thouars",425 1223,"","Sarcolaena","Thouars",425 1224,"","Schizolaena","Thouars",425 16353,"","Xerochlamys","Baker",425 1225,"","Xyloolaena","Baill.",425 335,"","Sargentodoxa","Rehder & E.H.Wilson",426 18710,"","Chrysamphora","Greene",427 345,"","Darlingtonia","Torr.",427 346,"","Heliamphora","Benth.",427 347,"","Sarracenia","L.",427 9793,"","Anemopsis","Hook. & Arn.",428 9794,"","Circaeocarpus","C.Y.Wu",428 9795,"","Gymnotheca","Decne.",428 9796,"","Houttuynia","Thunb.",428 18006,"","Neobiondia","Pamp.",428 9797,"","Saururus","L.",428 3296,"","Aceriphyllum","Engl.",429 3297,"","Astilbe","Buch.-Ham. ex G.Don",429 3298,"","Astilboides","(Hemsl.) Engl.",429 20204,"","Bensonia","Abrams & Bacig.",429 3299,"","Bensoniella","C.V.Morton",429 3300,"","Bergenia","Moench",429 3301,"","Bolandra","A.Gray",429 3302,"","Boykinia","Nutt.",429 16191,"","Chrysosplenium","L.",429 3304,"","Conimitella","Rydb.",429 3305,"","Darmera","Voss",429 20199,"","Drummondia","DC.",429 3306,"","Elmera","Rydb.",429 3331,"","Francoa","Cav.",429 25423,"","Frankoa","Rchb.",429 20198,"","Hemieva","Raf.",429 3307,"","Heuchera","L.",429 22233,"x","Heucherella","Wehrh.",429 3308,"","Hieronymusia","Engl.",429 20192,"","Hoteia","C.Morren & Decne.",429 3309,"","Jepsonia","Small",429 3310,"","Leptarrhena","R.Br.",429 20205,"","Leptaxis","Raf.",429 3312,"","Lithophragma","(Nutt.) Torr. & A.Gray",429 20194,"","Megasea","Haw.",429 3313,"","Mitella","L.",429 20200,"","Mitellastra","Howell",429 20201,"","Mitellopsis","Meisn.",429 3314,"","Mukdenia","Koidz.",429 3315,"","Oresitrophe","Bunge",429 20202,"","Ozomelis","Raf.",429 20206,"","Panke","Willd.",429 20203,"","Pectiantia","Raf.",429 16460,"","Peltiphyllum","Engl.",429 3316,"","Peltoboykinia","(Engl.) Hara",429 3317,"","Rodgersia","A.Gray",429 3318,"","Saxifraga","L.",429 3319,"","Saxifragella","Engl.",429 3320,"","Saxifragodes","D.M.Moore",429 3321,"","Saxifragopsis","Small",429 3322,"","Suksdorfia","A.Gray",429 3323,"","Sullivantia","Torr. & A.Gray",429 3324,"","Tanakea","Franch. & Sav.",429 20195,"","Telesonix","Raf.",429 3325,"","Tellima","R.Br.",429 3332,"","Tetilla","DC.",429 20196,"","Therofon","Raf.",429 20197,"","Therophon","Rydb.",429 3326,"","Tiarella","L.",429 3327,"","Tolmiea","Torr. & A.Gray",429 20193,"","Zahlbrucknera","Rchb.",429 12567,"","Scheuchzeria","L.",430 101,"","Kadsura","Juss.",431 102,"","Schisandra","Michx.",431 21583,"","Actinostachys","Wall.",432 21586,"","Aneimiaebotrys","Fee",432 13483,"","Anemia","Sw.",432 21587,"","Anemidictyum","J.Sm. ex Hook.",432 21588,"","Anemirhiza","J.Sm.",432 21601,"","Colina","Greene",432 21589,"","Coptophyllum","Gardner",432 21590,"","Cryptophyllum","Schltdl.",432 21584,"","Cteisium","Michx.",432 21585,"","Gisopteris","Bernh.",432 21599,"","Hemianemia","(Prantl) C.F.Reed",432 21592,"","Hugona","Cav. ex Roem.",432 21593,"","Hydroglossum","Willd.",432 21580,"","Lophidium","Rich.",432 21594,"","Lygodictyon","J.Sm. ex Hook.",432 13484,"","Lygodium","Sw.",432 21581,"","Microschizaea","C.F.Reed",432 13485,"","Mohria","Sw.",432 21595,"","Odontopteris","Bernh.",432 21600,"","Ornithopteris","Bernh.",432 21596,"","Ramondia","Mirb.",432 21582,"","Ripidium","Bernh.",432 13486,"","Schizaea","Sm.",432 21591,"","Trochopteris","Gardner",432 21597,"","Ugena","Cav.",432 21598,"","Vallifilix","Thouars",432 8234,"","Acanthorrhinum","Rothm.",433 8235,"","Achetaria","Cham. & Schltdl.",433 8236,"","Adenosma","R.Br.",433 19444,"","Adenostegia","Benth.",433 8470,"","Aeginetia","L.",433 14812,"","Agalinis","Raf.",433 9118,"","Agathelpis","Choisy",433 14205,"","Albraunia","Speta",433 19447,"","Alectorolophus","Zinn",433 8237,"","Alectra","Thunb.",433 19426,"","Allocalyx","Cordem.",433 8238,"","Alonsoa","Ruiz & Pav.",433 8239,"","Amphianthus","Torr.",433 8240,"","Anagosperma","Wettst.",433 8241,"","Anarrhinum","Desf.",433 8242,"","Anastrabe","E.Mey. ex Benth.",433 25303,"","Ancistrostylis","T.Yamaz.",433 8243,"","Angelonia","Bonpl.",433 8244,"","Anisantherina","Pennell",433 19449,"","Anoplanthus","Endl.",433 19450,"","Anoplon","Rchb.",433 8245,"","Antherothamnus","N.E.Br.",433 8246,"","Anticharis","Endl.",433 8247,"","Antirrhinum","L.",433 24783,"","Apentostera","Raf.",433 8471,"","Aphyllon","Mitch.",433 8248,"","Aptosimum","Burch. ex Benth.",433 8249,"","Aragoa","Kunth",433 8250,"","Artanema","D.Don",433 8251,"","Asarina","Mill.",433 25792,"","Aulaya","Harv.",433 14813,"","Aureolaria","Raf.",433 8252,"","Bacopa","Aubl.",433 17765,"","Bampsia","Lisowski & Mielcarek",433 24784,"","Bartramia","Salisb.",433 8253,"","Bartsia","L.",433 8254,"","Basistemon","Turcz.",433 8255,"","Baumia","Engl. & Gilg",433 24785,"","Beccabunga","Hill",433 8256,"","Bellardia","All.",433 25304,"","Benjaminia","Mart. ex Benj.",433 25133,"","Benthamistella","Kuntze",433 19418,"","Berendtia","A.Gray",433 8257,"","Berendtiella","Wettst. & Harms",433 8258,"","Besseya","Rydb.",433 19422,"","Beyrichia","Cham. & Schltdl.",433 19432,"","Bonnaya","Link & Otto",433 25366,"","Bonnayodes","Blatt. & Hallb.",433 19439,"","Bopusia","C.Presl",433 8472,"","Boschniakia","C.A.Mey. ex Bong.",433 8259,"","Botryopleuron","Hemsl.",433 8260,"","Bowkeria","Harv.",433 25134,"","Brachystigma","Pennell",433 19429,"","Brami","Adans.",433 19428,"","Bramia","Lam.",433 8261,"","Brandisia","Hook.f. & Thomson",433 25305,"","Braunblanquetia","Eskuche",433 8262,"","Brookea","Benth.",433 8263,"","Bryodes","Benth.",433 8264,"","Buchnera","L.",433 8265,"","Bungea","C.A.Mey.",433 8266,"","Buttonia","McKen ex Benth.",433 8267,"","Bythophyton","Hook.f.",433 8268,"","Calceolaria","L.",433 19435,"","Callianassa","Webb & Berthel.",433 8269,"","Calorhabdos","Benth.",433 8270,"","Campbellia","Wight",433 8271,"","Camptoloma","Benth.",433 8272,"","Campylanthus","Roth",433 8273,"","Capraria","L.",433 8274,"","Castilleja","Mutis ex L.f.",433 16216,"","Celsia","L.",433 8275,"","Centranthera","R.Br.",433 19445,"","Centrantheropsis","Bonati",433 8276,"","Chaenorhinum","(DC.) Rchb.",433 16218,"","Chaenorrhinum","(DC.) Rchb.",433 19419,"","Chaenostoma","Benth.",433 8857,"","Chamaeacanthus","Chiov.",433 8277,"","Chamaegigas","Dinter ex Heil",433 8513,"","Charadrophila","Marloth",433 8278,"","Chelone","L.",433 25088,"","Chenopodiopsis","Hilliard & B.L.Burtt",433 8279,"","Chionohebe","B.G.Briggs & Ehrend.",433 8280,"","Chionophila","Benth.",433 8473,"","Christisonia","Gardner",433 8474,"","Cistanche","Hoffmanns. & Link",433 8281,"","Clevelandia","Greene",433 24773,"","Cochlidiosperma","(Rchb.) Rchb.",433 8282,"","Collinsia","Nutt.",433 8283,"","Colpias","E.Mey. ex Benth.",433 8284,"","Conobea","Aubl.",433 8475,"","Conopholis","Wallr.",433 8285,"","Cordylanthus","Nutt. ex Benth.",433 8286,"","Craterostigma","Hochst.",433 25595,"","Crepidorhopalon","Eb.Fisch.",433 9119,"","Cromidon","Compton",433 8287,"","Curanga","Juss.",433 8288,"","Cycniopsis","Engl.",433 8289,"","Cycnium","E.Mey. ex Benth.",433 8290,"","Cymbalaria","Hill",433 8291,"","Cymbaria","L.",433 8292,"","Cyphocalyx","Gagnep.",433 8293,"","Cyrtandromoea","Zoll.",433 19442,"","Dasistoma","Raf.",433 19441,"","Dasystoma","Raf.",433 8294,"","Deinostema","T.Yamaz.",433 8295,"","Dermatobotrys","Bolus",433 8296,"","Dermatocalyx","Oerst.",433 24968,"","Derwentia","Raf.",433 8297,"","Desdemona","S.Moore",433 8298,"","Detzneria","Schltr. ex Diels",433 8299,"","Diascia","Link & Otto",433 8300,"","Diclis","Benth.",433 8301,"","Digitalis","L.",433 8302,"","Dintera","Stapf",433 25808,"","Diplacus","Nutt.",433 9120,"","Dischisma","Choisy",433 8303,"","Dizygostemon","(Benth.) Radlk. ex Wettst.",433 8304,"","Dodartia","L.",433 8305,"","Dopatrium","Buch.-Ham.",433 8306,"","Elacholoma","F.Muell. & Tate",433 8307,"","Elatinoides","(Chav.) Wettst.",433 8308,"","Ellisiophyllum","Maxim.",433 8309,"","Encopa","Griseb.",433 25284,"","Encopella","Pennell",433 19425,"","Endopogon","Nees",433 8476,"","Epifagus","Nutt.",433 24139,"","Epixiphium","(A.Gray) Munz",433 17771,"","Eremogeton","Standl. & L.O.Williams",433 8310,"","Erinus","L.",433 8311,"","Escobedia","Ruiz & Pav.",433 8312,"","Esterhazya","J.C.Mikan",433 8313,"","Euphrasia","L.",433 19437,"","Eutheta","Standl.",433 19438,"","Eylesia","S.Moore",433 19436,"","Falconeria","Hook.f.",433 8315,"","Faxonanthus","Greenm.",433 8316,"","Freylinia","Colla",433 8317,"","Galvezia","Dombey ex Juss.",433 24140,"","Gambelia","Nutt.",433 24779,"","Gastromeria","D.Don",433 15201,"","Gentrya","Breedlove & Heckard",433 8318,"","Geochorda","Cham. & Schltdl.",433 8319,"","Geoffraya","Bonati",433 19443,"","Gerardia","Benth.",433 8321,"","Gerardiina","Engl.",433 25135,"","Gerardiopsis","Engl.",433 8322,"","Ghiesbreghtia","A.Gray",433 8323,"","Ghikaea","Volkens & Schweinf.",433 15202,"","Gibsoniothamnus","L.O.Williams",433 8477,"","Gleadovia","Gamble & Prain",433 24242,"","Glekia","Hilliard",433 9122,"","Globulariopsis","Compton",433 8324,"","Glossostigma","Wight & Arn.",433 8325,"","Glumicalyx","Hiern",433 9123,"","Gosela","Choisy",433 8326,"","Graderia","Benth.",433 8327,"","Gratiola","L.",433 8328,"","Halleria","L.",433 8329,"","Harveya","Hook.",433 19417,"","Hassleropsis","Chodat",433 8330,"","Hebe","Comm. ex Juss.",433 24782,"","Hebenstreitia","L.",433 9124,"","Hebenstretia","L.",433 23072,"","Hedbergia","Molau",433 25137,"","Hemianthus","Nutt.",433 8331,"","Hemiarrhena","Benth.",433 8332,"","Hemichaena","Benth.",433 8333,"","Hemimeris","L.f.",433 8334,"","Hemiphragma","Wall.",433 25138,"","Hemisiphonia","Urb.",433 8335,"","Herpestis","Gaertn.",433 8336,"","Heteranthia","Nees & Mart.",433 8337,"","Hiernia","S.Moore",433 17350,"","Holmgrenanthe","Elisens",433 14206,"","Holzneria","Speta",433 24135,"","Howelliella","Rothm.",433 14204,"","Hueblia","Speta",433 8338,"","Hydranthelium","Kunth",433 8339,"","Hydrotriche","Zucc.",433 8341,"","Hyobanche","L.",433 8342,"","Ildefonsia","Gardner",433 23591,"","Ilysanthes","Raf.",433 15969,"","Isoplexis","(Lindl.) Loudon",433 8344,"","Ixianthes","Benth.",433 24788,"","Jamesbrittenia","Kuntze",433 8562,"","Jerdonia","Wight",433 8345,"","Jovellana","Ruiz & Pav.",433 15970,"","Kashmiria","D.Y.Hong",433 24298,"","Keckia","Straw",433 24297,"","Keckiella","Straw",433 8346,"","Kickxia","Dumort.",433 8478,"","Kopsiopsis","(Beck) Beck",433 8347,"","Lafuentea","Lag.",433 16219,"","Lafuentia","Lag.",433 9125,"","Lagotis","Gaertn.",433 8348,"","Lamourouxia","Kunth",433 8349,"","Lancea","Hook.f. & Thomson",433 8479,"","Lathraea","L.",433 24789,"","Leiostemon","Raf.",433 19423,"","Lendneria","Minod",433 23073,"","Leonohebe","Heads",433 8350,"","Leptandra","Nutt.",433 24790,"","Lepteiris","Raf.",433 8351,"","Leptorhabdos","Schrenk",433 25306,"","Lesquereuxia","Boiss. & Reut.",433 8352,"","Leucocarpus","D.Don",433 8353,"","Leucophyllum","Bonpl.",433 8354,"","Leucosalpa","Scott-Elliot",433 19424,"","Leucospora","Nutt.",433 8355,"","Limnophila","R.Br.",433 8356,"","Limosella","L.",433 8357,"","Linaria","Mill.",433 8358,"","Lindenbergia","Lehm.",433 8359,"","Lindernia","All.",433 8360,"","Lophospermum","D.Don",433 24786,"","Lunellia","Nieuwl.",433 24781,"","Lyncea","Cham. & Schltdl.",433 19420,"","Lyperia","Benth.",433 17351,"","Mabrya","Elisens",433 8361,"","Macranthera","Nutt. ex Benth.",433 24791,"","Macrostemon","Boriss.",433 19427,"","Macuillamia","Raf.",433 25591,"","Maeviella","Rossow",433 25307,"","Magdalenaea","Brade",433 19448,"","Manettia","Boehm.",433 8480,"","Mannagettaea","Harry Sm.",433 8362,"","Manulea","L.",433 8363,"","Manuleopsis","Thell. ex Schinz",433 24138,"","Maurandella","(A.Gray) Rothm.",433 8364,"","Maurandya","Ortega",433 8365,"","Mazus","Lour.",433 8366,"","Mecardonia","Ruiz & Pav.",433 8367,"","Melampyrum","L.",433 24243,"","Melanospermum","Hilliard",433 8368,"","Melasma","Bergius",433 8369,"","Melosperma","Benth.",433 8370,"","Micranthemum","Michx.",433 8371,"","Micrargeria","Benth.",433 8372,"","Micrargeriella","R.E.Fr.",433 8373,"","Microcarpaea","R.Br.",433 9126,"","Microdon","Choisy",433 8374,"","Mimetanthe","Greene",433 25592,"","Mimulicalyx","P.C.Tsoong",433 8375,"","Mimulus","L.",433 8376,"","Misopates","Raf.",433 8377,"","Mohavea","A.Gray",433 8378,"","Moniera","P.Browne",433 8379,"","Monocardia","Pennell",433 8380,"","Monochasma","Maxim. ex Franch. & Sav.",433 14853,"","Monopera","Barringer",433 8381,"","Monttea","Gay",433 8382,"","Morgania","R.Br.",433 19434,"","Moseleya","Hemsl.",433 25139,"","Mosheovia","Eig",433 25367,"","Namation","Brand",433 23074,"","Nanorrhinum","Betsche",433 25308,"","Nathaliella","B.Fedtsch.",433 8481,"","Necranthus","Gilli",433 8383,"","Nemesia","Vent.",433 24136,"","Neogaerrhinum","Rothm.",433 15189,"","Neopicrorhiza","D.Y.Hong",433 24780,"","Nigrina","L.",433 24771,"","Nothochelone","(A.Gray) Straw",433 8385,"","Nothochilus","Radlk.",433 24133,"","Nuttallanthus","D.A.Sutton",433 24792,"","Nycterinia","D.Don",433 25412,"","Odicardis","Raf.",433 8386,"","Odontites","Ludw.",433 14163,"","Oftia","Adans.",433 15188,"","Oligospermum","D.Y.Hong",433 8387,"","Omania","S.Moore",433 8388,"","Omphalotrix","Maxim.",433 8389,"","Ophiocephalus","Wiggins",433 8390,"","Oreosolen","Hook.f.",433 8482,"","Orobanche","L.",433 19446,"","Orthantha","(Benth.) Wettst.",433 25481,"","Orthanthella","Rauschert",433 8391,"","Orthocarpus","Nutt.",433 8392,"","Otacanthus","Lindl.",433 8393,"","Ourisia","Comm. ex Juss.",433 25140,"","Ourisianthus","Bonati",433 8394,"","Paederota","L.",433 24793,"","Paederotella","(Wulf) Kem.-Nath.",433 8395,"","Parahebe","W.R.B.Oliv.",433 8396,"","Parastriga","Mildbr.",433 8397,"","Parentucellia","Viv.",433 14160,"","Paulownia","Siebold & Zucc.",433 25594,"","Pediculariopsis","A.Love & D.Love",433 8399,"","Pedicularis","L.",433 8400,"","Peliostomum","Benth.",433 8401,"","Penstemon","Schmidel",433 25830,"","Pentstemon","Aiton",433 8402,"","Peplidium","Delile",433 8403,"","Petitmenginia","Bonati",433 8483,"","Phacellanthus","Siebold & Zucc.",433 16178,"","Phelipaea","Desf.",433 8484,"","Phelypaea","L.",433 8404,"","Phtheirospermum","Bunge ex Fisch. & C.A.Mey.",433 8405,"","Phygelius","E.Mey. ex Benth.",433 8406,"","Phyllopodium","Benth.",433 8407,"","Physocalyx","Pohl",433 25283,"","Picria","Lour.",433 8408,"","Picrorhiza","Royle ex Benth.",433 8409,"","Pierranthus","Bonati",433 8485,"","Platypholis","Maxim.",433 8410,"","Poarium","Desv.",433 23075,"","Pogonorrhinum","Betsche",433 8411,"","Polycarena","Benth.",433 8412,"","Porodittia","G.Don",433 8413,"","Psammetes","Hepper",433 24772,"","Pseudo-Lysimachium","(W.D.J.Koch) Opiz",433 24794,"","Pseudobartsia","D.Y.Hong",433 24795,"","Pseudolysimachion","(W.D.J.Koch) Opiz",433 8414,"","Pseudorobanche","Rouy",433 24137,"","Pseudorontium","(A.Gray) Rothm.",433 8415,"","Pseudosopubia","Engl.",433 8416,"","Pseudostriga","Bonati",433 8417,"","Pterygiella","Oliv.",433 8418,"","Pygmea","Hook.f.",433 8419,"","Radamaea","Benth.",433 24796,"","Ranopisoa","J.-F.Leroy",433 24963,"","Razumovia","Spreng.",433 8615,"","Rehmannia","Libosch. ex Fisch. & C.A.Mey.",433 25141,"","Rhabdotosperma","Hartl",433 8420,"","Rhamphicarpa","Benth.",433 8421,"","Rhaphispermum","Benth.",433 8422,"","Rhinanthus","L.",433 8423,"","Rhodochiton","Zucc. ex Otto & A.Dietr.",433 8424,"","Rhynchocorys","Griseb.",433 8425,"","Russelia","Jacq.",433 24883,"","Saccanthus","Herzog",433 25142,"","Saccularia","Kellogg",433 24134,"","Sairocarpus","D.A.Sutton",433 8426,"","Schistophragma","Benth. ex Endl.",433 25309,"","Schizosepala","G.M.Barroso",433 8427,"","Schizotorenia","T.Yamaz.",433 8760,"","Schlegelia","Miq.",433 8428,"","Schwalbea","L.",433 8429,"","Schweinfurthia","A.Braun",433 25143,"","Scolophyllum","T.Yamaz.",433 8430,"","Scoparia","L.",433 8431,"","Scrofella","Maxim.",433 8432,"","Scrophularia","L.",433 9128,"","Selago","L.",433 8433,"","Seymeria","Pursh",433 23076,"","Seymeriopsis","Tzvelev",433 8434,"","Shiuyinghua","Paclt",433 8435,"","Sibthorpia","L.",433 8436,"","Silvia","Benth.",433 19440,"","Silviella","Pennell",433 23077,"","Sinobacopa","D.Y.Hong",433 8437,"","Siphonidium","J.B.Armstr.",433 8438,"","Siphonostegia","Benth.",433 19430,"","Sophronanthe","Benth.",433 8439,"","Sopubia","Buch.-Ham. ex D.Don",433 19421,"","Sphenandra","Benth.",433 24774,"","Spielmannia","Medik.",433 8440,"","Spirostegia","Ivanina",433 8441,"","Staurophragma","Fisch. & C.A.Mey.",433 8442,"","Stellularia","Benth.",433 8443,"","Stemodia","L.",433 8444,"","Stemodiopsis","Engl.",433 25144,"","Stemotria","Wettst. & Harms ex Engl.",433 8445,"","Striga","Lour.",433 8446,"","Strigina","Engl.",433 8447,"","Strobilopsis","Hilliard & B.L.Burtt",433 8448,"","Sutera","Roth",433 8449,"","Synthyris","Benth.",433 8450,"","Teedia","Rudolphi",433 8451,"","Tetranema","Benth.",433 9129,"","Tetraselago","Junell",433 8452,"","Tetraspidium","Baker",433 8453,"","Tetraulacium","Turcz.",433 8454,"","Thunbergianthus","Engl.",433 8486,"","Tienmuia","Hu",433 8455,"","Tonella","Nutt. ex A.Gray",433 8456,"","Torenia","L.",433 8457,"","Tozzia","L.",433 25145,"","Tragiola","Small & Pennell",433 8458,"","Triaenophora","(Hook.f.) Soler.",433 25724,"","Trianthera","Wettst.",433 24244,"","Trieenea","Hilliard",433 25146,"","Trimerocalyx","(Murb.) Murb.",433 14208,"","Trungboa","Rauschert",433 8459,"","Tuerckheimocharis","Urb.",433 25418,"","Tuyamaea","T.Yamaz.",433 8460,"","Uroskinnera","Lindl.",433 19431,"","Vandellia","P.Browne ex L.",433 8461,"","Vellosiella","Baill.",433 8462,"","Velvitsia","Hiern",433 8463,"","Verbascum","L.",433 8464,"","Veronica","L.",433 8465,"","Veronicastrum","Heist. ex Fabr.",433 9130,"","Walafrida","E.Mey.",433 14161,"","Wightia","Wall.",433 8467,"","Wulfenia","Jacq.",433 17352,"","Wulfeniopsis","D.Y.Hong",433 23078,"","Xizangia","D.Y.Hong",433 8487,"","Xylanche","Beck",433 8468,"","Xylocalyx","Balf.f.",433 8469,"","Zaluzianskya","F.W.Schmidt",433 931,"","Scyphostegia","Stapf",434 1515,"","Brazzeia","Baill.",435 17957,"","Erythropyxis","Engl.",435 17958,"","Erytropyxis","Pierre",435 1516,"","Oubanguia","Baill.",435 1517,"","Pierrina","Engl.",435 17956,"","Pseudobrazzeia","Engl.",435 1518,"","Rhaptopetalum","Oliv.",435 1519,"","Scytopetalum","Pierre ex Engl.",435 21529,"","Didiclis","P.Beauv. ex Mirb.",436 21530,"","Diplostachyum","P.Beauv.",436 21531,"","Gymnogynum","P.Beauv.",436 21532,"","Heterophyllium","Hieron. ex Borner",436 21533,"","Hypopterygiopsis","Sakurai",436 21534,"","Lycopodiodes","Dill. ex Kuntze",436 21535,"","Lycopodioides","Boehm.",436 21536,"","Lycopodion","Adans.",436 21537,"","Mirmau","Adans.",436 21538,"","Polycocca","Hill",436 13458,"","Selaginella","P.Beauv.",436 21539,"","Selaginoides","Seg.",436 21540,"","Selago","P.Browne",436 21541,"","Stachygynandrum","P.Beauv.",436 21542,"","Trispermium","Hill",436 17806,"","Aeschrion","Vell.",437 1841,"","Ailanthus","Desf.",437 1842,"","Alvaradoa","Liebm.",437 1843,"","Amaroria","A.Gray",437 1844,"","Brucea","J.F.Mill.",437 1846,"","Castela","Turpin",437 1847,"","Cedronia","Cuatrec.",437 1849,"","Eurycoma","Jack",437 1851,"","Gymnostemon","Aubrev. & Pellegr.",437 1852,"","Hannoa","Planch.",437 1853,"","Harrisonia","R.Br. ex A.Juss.",437 17804,"","Hebonga","Radlk.",437 16409,"","Holacantha","A.Gray",437 18113,"","Hyptiandra","Hook.f.",437 1854,"","Kirkia","Oliv.",437 23086,"","Laumoniera","Noot.",437 17803,"","Mannia","Hook.f.",437 17801,"","Manungala","Blanco",437 1855,"","Neocastela","Small",437 1856,"","Nothospondias","Engl.",437 1857,"","Odyendea","Pierre ex Engl.",437 1858,"","Perriera","Courchet",437 17807,"","Picraena","Lindl.",437 1859,"","Picramnia","Sw.",437 1860,"","Picrasma","Blume",437 17808,"","Picrocardia","Radlk.",437 1861,"","Picrolemma","Hook.f.",437 1862,"","Pierreodendron","Engl.",437 1863,"","Pleiokirkia","Capuron",437 1864,"","Quassia","L.",437 1865,"","Recchia","Moc. & Sesse ex DC.",437 17805,"","Rigiostachys","Planch.",437 17802,"","Samadera","Gaertn.",437 1866,"","Simaba","Aubl.",437 1867,"","Simarouba","Aubl.",437 1868,"","Soulamea","Lam.",437 20940,"","Brocchia","Mauri ex Ten.",438 10512,"","Simmondsia","Nutt.",438 11981,"","Heterosmilax","Kunth",439 18848,"","Pseudosmilax","Hayata",439 12067,"","Smilax","L.",439 8144,"","Acnistus","Schott",440 19857,"","Alibrexia","Miers",440 19911,"","Alicabon","Raf.",440 19900,"","Alkekengi","Mill.",440 8142,"","Alona","Lindl.",440 19871,"","Amatula","Medik.",440 19966,"","Amphipleis","Raf.",440 19874,"","Androcera","Nutt.",440 8145,"","Anisodus","Link ex Spreng.",440 8146,"","Anthocercis","Labill.",440 8147,"","Anthotroche","Endl.",440 19872,"","Antimion","Raf.",440 19947,"","Apemon","Raf.",440 19858,"","Aplocarya","Lindl.",440 19875,"","Aquartia","Jacq.",440 22320,"","Archiphysalis","Kuang",440 19876,"","Artorhiza","Raf.",440 8148,"","Athenaea","Sendtn.",440 8149,"","Atrichodendron","Gagnep.",440 8150,"","Atropa","L.",440 8151,"","Atropanthe","Pascher",440 19897,"","Aureliana","Sendtn.",440 19859,"","Bargemontia","Gaudich.",440 8152,"","Bassovia","Aubl.",440 19878,"","Battata","Hill",440 19953,"","Belenia","Decne.",440 19944,"","Belladona","Duhamel",440 19903,"","Bellinia","Roem. & Schult.",440 8153,"","Benthamiella","Speg.",440 19967,"","Blenocoes","Raf.",440 16630,"","Bosleria","A.Nelson",440 19982,"","Bouchetia","Dunal",440 8155,"","Brachistus","Miers",440 22323,"","Brachyhelus","(Benth.) Post & Kuntze",440 8156,"","Browallia","L.",440 8157,"","Brugmansia","Pers.",440 8158,"","Brunfelsia","L.",440 16631,"","Brunfelsiopsis","(Urb.) Kuntze",440 8159,"","Cacabus","Bernh.",440 22322,"","Calibrachoa","Cerv.",440 19935,"","Calydermos","Ruiz & Pav.",440 22314,"","Cantalea","Raf.",440 8160,"","Capsicum","L.",440 19879,"","Ceranthera","Raf.",440 19948,"","Ceratocaulos","(Bernh.) Rchb.",440 8161,"","Cestrum","L.",440 19925,"","Chaenesthes","Miers",440 8162,"","Chamaesaracha","(A.Gray) Benth.",440 19926,"","Cleochroma","Miers",440 19877,"","Cliocarpus","Miers",440 19915,"","Codochonia","Dunal",440 8164,"","Combera","Sandwith",440 17342,"","Crenidium","Haegi",440 22286,"","Cuatresia","Hunz.",440 19894,"","Cyathostyles","Schott ex Meisn.",440 19981,"","Cyclostigma","Phil.",440 19990,"","Cyphanthera","Miers",440 8165,"","Cyphomandra","Mart. ex Sendtn.",440 19984,"","Dalea","Mill.",440 8166,"","Datura","L.",440 15906,"","Deprea","Raf.",440 19880,"","Diamonon","Raf.",440 19932,"","Dictyocalyx","Hook.f.",440 19929,"","Dierbachia","Spreng.",440 19927,"","Diplukion","Raf.",440 8167,"","Discopodium","Hochst.",440 19904,"","Diskion","Raf.",440 8168,"","Dittostigma","Phil.",440 19860,"","Dolia","Lindl.",440 19939,"","Dolichosiphon","Phil.",440 19940,"","Dolichostigma","Miers",440 8169,"","Duboisia","R.Br.",440 19881,"","Dulcamara","Moench",440 8170,"","Dunalia","Kunth",440 8171,"","Dyssochroma","Miers",440 19991,"","Eadesia","F.Muell.",440 19954,"","Ectozoma","Miers",440 19950,"","Elisia","Milano",440 19989,"","Entrecasteauxia","Montrouz.",440 19916,"","Ephaiola","Raf.",440 19917,"","Eplateia","Raf.",440 19968,"","Eucapnia","Raf.",440 22315,"","Evoista","Raf.",440 19931,"","Exodeconus","Raf.",440 8173,"","Fabiana","Ruiz & Pav.",440 19938,"","Fontqueriella","Rothm.",440 19986,"","Franciscea","Pohl",440 19959,"","Fregirardia","Dunal ex Delile",440 8175,"","Grabowskia","Schltdl.",440 17348,"","Grammosolen","Haegi",440 19861,"","Gubleria","Gaudich.",440 19960,"","Habrothamnus","Endl.",440 22321,"","Hawkesiophyton","Hunz.",440 8176,"","Hebecladus","Miers",440 19901,"","Herschelia","T.E.Bowdich",440 22313,"","Huanaca","Raf.",440 24944,"","Hunzikeria","D'Arcy",440 8178,"","Hyoscyamus","L.",440 8179,"","Iochroma","Benth.",440 8180,"","Isandra","F.Muell.",440 17349,"","Isandraea","Rauschert",440 8181,"","Jaborosa","Juss.",440 15903,"","Jaltomata","Schltdl.",440 22316,"","Jasminoides","Duhamel",440 8182,"","Juanulloa","Ruiz & Pav.",440 19922,"","Kokabus","Raf.",440 19923,"","Kukolis","Raf.",440 19969,"","Langsdorfia","Raf.",440 19898,"","Latnax","Miers",440 8183,"","Latua","Phil.",440 19955,"","Laureria","Schltdl.",440 19965,"","Lavana","Raf.",440 19970,"","Lehmannia","Spreng.",440 25400,"","Leloutrea","Gaudich.",440 8184,"","Leptofeddea","Diels",440 8185,"","Leptoglossis","Benth.",440 20975,"","Leptophragma","Benth. ex Dunal",440 19983,"","Leucanthea","Scheele",440 22283,"","Leucophysalis","Rydb.",440 19941,"","Lonchestigma","Dunal",440 8186,"","Lycianthes","(Dunal) Hassl.",440 8187,"","Lycium","L.",440 19873,"","Lycomela","Fabr.",440 8188,"","Lycopersicon","Mill.",440 8189,"","Mandragora","L.",440 24115,"","Manoelia","Bowdich",440 8190,"","Margaranthus","Schltdl.",440 8191,"","Markea","Rich.",440 19987,"","Mathaea","Vell.",440 19988,"","Matthissonia","Raddi",440 8192,"","Melananthus","Walp.",440 8193,"","Mellissia","Hook.f.",440 19882,"","Melongena","Mill.",440 8194,"","Merinthopodium","Donn.Sm.",440 8195,"","Methysticodendron","R.E.Schult.",440 8196,"","Metternichia","J.C.Mikan",440 19961,"","Meyenia","Schltdl.",440 19985,"","Microschwenkia","Benth. ex Hemsl.",440 8197,"","Nectouxia","Kunth",440 19863,"","Neudorfia","Adans.",440 8198,"","Nicandra","Adans.",440 8199,"","Nicotiana","L.",440 8200,"","Nierembergia","Ruiz & Pav.",440 8143,"","Nolana","L.f.",440 19883,"","Normania","Lowe",440 8201,"","Nothocestrum","A.Gray",440 19884,"","Nycterium","Vent.",440 22317,"","Oplukion","Raf.",440 19912,"","Opsago","Raf.",440 19899,"","Orinocoa","Raf.",440 8202,"","Oryctes","S.Watson",440 19855,"","Osteocarpus","Phil.",440 22274,"","Otilix","Raf.",440 19885,"","Ovaria","Fabr.",440 19864,"","Pachysolen","Phil.",440 19895,"","Pallavicinia","De Not.",440 8203,"","Pantacantha","Speg.",440 22318,"","Panzeria","J.F.Gmel.",440 8204,"","Parabouchetia","Baill.",440 16632,"","Parascopolia","Baill.",440 19886,"","Parmentiera","Raf.",440 19962,"","Parqui","Adans.",440 8205,"","Pauia","Deb & R.M.Dutta",440 19918,"","Pederlea","Raf.",440 19936,"","Pentagonia","Fabr.",440 19902,"","Pentaphitrum","Rchb.",440 19971,"","Perieteris","Raf.",440 19865,"","Periloba","Raf.",440 19942,"","Perizoma","(Miers) Lindl.",440 19887,"","Petagnia","Raf.",440 8206,"","Petunia","Juss.",440 19888,"","Pheliandra","Werderm.",440 8207,"","Phrodus","Miers",440 22284,"","Physaliastrum","Makino",440 8208,"","Physalis","L.",440 19937,"","Physalodes","Boehm.",440 19913,"","Physaloides","Moench",440 8209,"","Physochlaina","G.Don",440 19896,"","Pionandra","Miers",440 19919,"","Plicula","Raf.",440 24240,"","Plowmania","Hunz. & Subils",440 8210,"","Poecilochroma","Miers",440 19972,"","Polydiclis","(G.Don) Miers",440 19945,"","Poortmannia","Drake",440 19956,"","Portaea","Ten.",440 8211,"","Protoschwenckia","Soler.",440 8212,"","Przewalskia","Maxim.",440 19889,"","Pseudocapsicum","Medik.",440 19951,"","Pseudodatura","Zijp",440 19943,"","Pukanthus","Raf.",440 19914,"","Puneeria","Stocks",440 22285,"","Quincula","Raf.",440 15904,"","Rahowardiana","D'Arcy",440 19856,"","Rayera","Gaudich.",440 7843,"","Reyesia","Gay",440 19930,"","Rhopalostigma","Phil.",440 19964,"","Saccardophytum","Speg.",440 19973,"","Sairanthus","G.Don",440 8214,"","Salpichroa","Miers",440 8215,"","Salpiglossis","Ruiz & Pav.",440 8216,"","Saracha","Ruiz & Pav.",440 19957,"","Sarcophysa","Miers",440 8217,"","Schizanthus","Ruiz & Pav.",440 17545,"","Schultesianthus","Hunz.",440 24945,"","Schwecnkiopsis","Dammer",440 8218,"","Schwenckia","L.",440 8219,"","Sclerophylax","Miers",440 8220,"","Scopolia","Jacq.",440 19890,"","Scubulus","Raf.",440 8221,"","Sessea","Ruiz & Pav.",440 8222,"","Sesseopsis","Hassl.",440 19909,"","Sicklera","Sendtn.",440 19974,"","Siphaulax","Raf.",440 19979,"","Siphonema","Raf.",440 19891,"","Solanastrum","Fabr.",440 8223,"","Solandra","Sw.",440 8224,"","Solanocharis","Bitter",440 19893,"","Solanopsis","Bitter",440 8225,"","Solanum","L.",440 19866,"","Sorema","Lindl.",440 20978,"","Sterrhymenia","Griseb.",440 19980,"","Stimenes","Raf.",440 20976,"","Stimomphis","Raf.",440 20977,"","Stimoryne","Raf.",440 19949,"","Stramonium","Mill.",440 8226,"","Streptosolen","Miers",440 19933,"","Streptostigma","Regel",440 19946,"","Swartsia","J.F.Gmel.",440 14175,"","Symonanthus","Haegi",440 19975,"","Tabacum","Gilib.",440 19976,"","Tabacus","Moench",440 19867,"","Teganium","Schmidel",440 22319,"","Teremis","Raf.",440 19934,"","Thinogeton","Benth.",440 8227,"","Trechonaetes","Miers",440 8228,"","Trianaea","Planch. & Linden",440 8229,"","Triguera","Cav.",440 19920,"","Triliena","Raf.",440 19921,"","Trozelia","Raf.",440 19907,"","Tubocapsicum","Makino",440 25401,"","Tula","Adans.",440 19958,"","Ulloa","Pers.",440 19924,"","Ulticona","Raf.",440 19928,"","Valteta","Raf.",440 8231,"","Vassobia","Rusby",440 19868,"","Velpeaulia","Gaudich.",440 8232,"","Vestia","Willd.",440 19977,"","Waddingtonia","Phil.",440 19963,"","Wadea","Raf.",440 19869,"","Walberia","Mill. ex Ehret",440 8233,"","Withania","Pauquy",440 19908,"","Witheringia","L'Her.",440 19870,"","Zwingera","Hofer",440 1906,"","Dialyceras","Capuron",441 1907,"","Rhopalocarpus","Bojer",441 25413,"","Sphaerosepalum","Baker",441 2081,"","Sphenostemon","Baill.",442 1186,"","Stachyurus","Siebold & Zucc.",443 2170,"","Macgregoria","F.Muell.",444 2171,"","Stackhousia","Sm.",444 2172,"","Tripterococcus","Endl.",444 13447,"","Stangeria","T.Moore",445 2402,"","Euscaphis","Siebold & Zucc.",446 2403,"","Huertea","Ruiz & Pav.",446 1755,"","Jahnia","Pittier & S.F.Blake",446 2404,"","Staphylea","L.",446 2405,"","Tapiscia","Oliv.",446 2406,"","Turpinia","Vent.",446 9668,"","Stegnosperma","Benth.",447 11872,"","Croomia","Torr.",448 14246,"","Pentastemona","Steenis",448 18793,"","Roxburghia","Roxb.",448 11873,"","Stemona","Lour.",448 11874,"","Stichoneuron","Hook.f.",448 1377,"","Abroma","Jacq.",449 1378,"","Acropogon","Schltr.",449 17566,"","Aethiocarpa","Vollesen",449 16375,"","Ambroma","L.f.",449 17939,"","Argyrodendron","F.Muell.",449 1379,"","Astiria","Lindl.",449 1380,"","Ayenia","L.",449 15913,"","Basiloxylon","K.Schum.",449 1381,"","Brachychiton","Schott & Endl.",449 17944,"","Buettneria","Murray",449 1382,"","Byttneria","Loefl.",449 17945,"","Chaetaea","Jacq.",449 1383,"","Cheirolaena","Benth.",449 17941,"","Cheirostemon","Humb. & Bonpl.",449 1384,"","Chiranthodendron","Larreat.",449 16376,"","Chlamydocola","(K.Schum.) Bodard",449 17946,"","Cistanthera","K.Schum.",449 1385,"","Cola","Schott & Endl.",449 1386,"","Commersonia","J.R.Forst. & G.Forst.",449 1387,"","Cotylonychia","Stapf",449 1388,"","Dendroleandria","Arenes",449 1389,"","Dicarpidium","F.Muell.",449 1390,"","Dombeya","Cav.",449 1391,"","Eriolaena","DC.",449 16377,"","Erythropsis","Lindl. ex Schott & Endl.",449 1392,"","Firmiana","Marsili",449 23204,"","Franciscodendron","B.Hyland & Steenis",449 17942,"","Fremontia","Torr.",449 1393,"","Fremontodendron","Coville",449 1394,"","Gilesia","F.Muell.",449 1395,"","Glossostemon","Desf.",449 1396,"","Guazuma","Mill.",449 1397,"","Guichenotia","J.Gay",449 1398,"","Hannafordia","F.Muell.",449 1399,"","Harmsia","K.Schum.",449 1400,"","Helicteres","L.",449 1401,"","Helmiopsiella","Arenes",449 1402,"","Helmiopsis","H.Perrier",449 1403,"","Heritiera","Aiton",449 1404,"","Hermannia","L.",449 1405,"","Herrania","Goudot",449 1406,"","Hildegardia","Schott & Endl.",449 16378,"","Hypophyllanthus","Regel",449 1407,"","Keraudrenia","J.Gay",449 1408,"","Kleinhovia","L.",449 1409,"","Lasiopetalum","Sm.",449 1410,"","Leptonychia","Turcz.",449 1411,"","Leptonychiopsis","Ridl.",449 1412,"","Lysiosepalum","F.Muell.",449 1413,"","Mahernia","L.",449 1414,"","Mansonia","J.R.Drumm. ex Prain",449 1365,"","Maxwellia","Baill.",449 14178,"","Megatritheca","Cristobal",449 1415,"","Melhania","Forssk.",449 1416,"","Melochia","L.",449 1417,"","Neoregnellia","Urb.",449 1418,"","Nephropetalum","B.L.Rob. & Greenm.",449 1419,"","Nesogordonia","Baill.",449 1420,"","Octolobus","Welw.",449 1421,"","Paradombeya","Stapf",449 16380,"","Paragrewia","Gagnep. ex R.S.Rao",449 1422,"","Paramelhania","Arenes",449 1423,"","Pentapetes","L.",449 1424,"","Physodium","C.Presl",449 1425,"","Pimia","Seem.",449 1426,"","Pterocymbium","R.Br.",449 1427,"","Pterospermum","Schreb.",449 1428,"","Pterygota","Schott & Endl.",449 1429,"","Rayleya","Cristobal",449 1430,"","Reevesia","Lindl.",449 1431,"","Ruizia","Cav.",449 1432,"","Rulingia","R.Br.",449 1433,"","Scaphium","Schott & Endl.",449 1434,"","Scaphopetalum","Mast.",449 1435,"","Seringia","J.Gay",449 1327,"","Sideria","Ewart & A.H.K.Petrie",449 16379,"","Sitella","L.H.Bailey",449 1436,"","Sterculia","L.",449 17940,"","Tarrietia","Blume",449 1437,"","Tetradia","R.Br.",449 1438,"","Theobroma","L.",449 1439,"","Thomasia","J.Gay",449 17943,"","Tribroma","O.F.Cook",449 1441,"","Triplochiton","K.Schum.",449 1442,"","Trochetia","DC.",449 1443,"","Trochetiopsis","Marais",449 1444,"","Ungeria","Schott & Endl.",449 1445,"","Veeresia","Monach. & Moldenke",449 1446,"","Waltheria","L.",449 25200,"","Xylosterculia","Kosterm.",449 9202,"","Campylostachys","Kunth",450 9203,"","Eurylobium","Hochst.",450 9204,"","Euthystachys","A.DC.",450 9205,"","Stilbe","Bergius",450 9206,"","Xeroplana","Briq.",450 1196,"","Strasburgeria","Baill.",451 11613,"","Phenakospermum","Endl.",452 11614,"","Ravenala","Adans.",452 11615,"","Strelitzia","Aiton",452 13480,"","Stromatopteris","Mett.",453 6778,"","Donatia","J.R.Forst. & G.Forst.",454 6773,"","Forstera","L.f.",454 6774,"","Levenhookia","R.Br.",454 6775,"","Oreostylidium","Berggr.",454 6776,"","Phyllachne","J.R.Forst. & G.Forst.",454 6777,"","Stylidium","Sw. ex Willd.",454 3292,"","Stylobasium","Desf.",455 7257,"","Alniphyllum","Matsum.",456 18032,"","Anthostyrax","Pierre",456 7258,"","Bruinsmia","Boerl. & Koord.",456 18033,"","Foveolaria","Ruiz & Pav.",456 7259,"","Halesia","Ellis ex L.",456 7260,"","Huodendron","Rehder",456 7261,"","Melliodendron","Hand.-Mazz.",456 7262,"","Pamphilia","Mart. ex A.DC.",456 7263,"","Parastyrax","W.W.Sm.",456 7264,"","Pterostyrax","Siebold & Zucc.",456 7265,"","Rehderodendron","Hu",456 7266,"","Sinojackia","Hu",456 7267,"","Styrax","L.",456 1845,"","Cadellia","F.Muell.",457 1850,"","Guilfoylia","F.Muell.",457 1870,"","Suriana","L.",457 18034,"","Cordyloblaste","Hensch. ex Moritzi",458 7268,"","Symplocos","Jacq.",458 16941,"","Schizocapsa","Hance",459 11863,"","Tacca","J.R.Forst. & G.Forst.",459 1091,"","Hololachna","Ehrenb.",460 1092,"","Myricaria","Desv.",460 20344,"","Myrtama","Ovcz. & Kinzik.",460 1093,"","Reaumuria","L.",460 20345,"","Tamaricaria","Qaiser & Ali",460 1094,"","Tamarix","L.",460 13440,"","Amentotaxus","Pilg.",461 13441,"","Austrotaxus","Compton",461 24227,"","Nothotaxus","Florin",461 13442,"","Pseudotaxus","W.C.Cheng",461 13443,"","Taxus","L.",461 13444,"","Torreya","Arn.",461 13402,"","Athrotaxis","D.Don",462 13403,"","Cryptomeria","D.Don",462 13404,"","Cunninghamia","R.Br.",462 13405,"","Glyptostrobus","Endl.",462 13406,"","Metasequoia","Miki ex Hu & W.C.Cheng",462 13407,"","Sciadopitys","Siebold & Zucc.",462 13408,"","Sequoia","Endl.",462 13409,"","Sequoiadendron","Buchholz",462 13410,"","Taiwania","Hayata",462 13411,"","Taxodium","Rich.",462 18861,"","Androsyne","Salisb.",463 11678,"","Conanthera","Ruiz & Pav.",463 18858,"","Cumingia","Kunth",463 18859,"","Cummingia","D.Don",463 11680,"","Cyanella","Royen ex L.",463 18864,"","Dicolus","Phil.",463 18866,"","Distrepta","Miers",463 18860,"","Odontostemum","Baker",463 11681,"","Odontostomum","Torr.",463 18863,"","Pharetrella","Salisb.",463 18867,"","Phyganthus","Poepp. & Endl.",463 18865,"","Poeppigia","Kunze ex Rchb.",463 11682,"","Tecophilaea","Bertero ex Colla",463 18862,"","Trigella","Salisb.",463 11683,"","Walleria","J.Kirk",463 11684,"","Zephyra","D.Don",463 2408,"","Tepuianthus","Maguire & Steyerm.",464 24585,"","Tupeianthus","Takht.",464 104,"","Tetracentron","Oliv.",465 9410,"","Tetrachondra","Petrie ex Oliv.",466 1193,"","Pentamerista","Maguire",467 1194,"","Tetramerista","Miq.",467 1146,"","Adinandra","Jack",468 17914,"","Adinandrella","Exell",468 24755,"","Amphania","Banks ex DC.",468 1147,"","Anneslea","Wall.",468 25485,"","Apterosperma","H.T.Chang",468 1148,"","Archboldiodendron","Kobuski",468 1149,"","Balthasaria","Verdc.",468 1150,"","Camellia","L.",468 1152,"","Cleyera","Thunb.",468 24754,"","Closaschima","Korth.",468 1153,"","Dankia","Gagnep.",468 7187,"","Dubardella","H.J.Lam",468 24756,"","Dupinia","Scop.",468 24757,"","Erythrochiton","Griff.",468 1154,"","Eurya","Thunb.",468 1155,"","Ficalhoa","Hiern",468 1156,"","Franklinia","W.Bartram ex Marshall",468 1157,"","Freziera","Willd.",468 16347,"","Glyptocarpa","Hu",468 1158,"","Gordonia","Ellis",468 17917,"","Haemocharis","Salisb. ex Mart. & Zucc.",468 17916,"","Hartia","Dunn",468 24758,"","Hoferia","Scop.",468 1161,"","Killipiodendron","Kobuski",468 1162,"","Laplacea","Kunth",468 24753,"","Lindleya","Nees",468 24759,"","Llanosia","Blanco",468 16346,"","Melchiora","Kobuski",468 1165,"","Paranneslea","Gagnep.",468 25416,"","Parapyrenaria","H.T.Chang",468 25204,"","Patascoya","Urb.",468 17918,"","Piquetia","(Pierre) Hallier f.",468 16348,"","Pseudoeurya","Yamam.",468 1166,"","Pyrenaria","Blume",468 24760,"","Reinwardtia","Korth.",468 24751,"","Sakakia","Nakai",468 1167,"","Schima","Reinw. ex Blume",468 1168,"","Sladenia","Kurz",468 17919,"","Stereocarpus","(Pierre) Hallier f.",468 24421,"","Stewartia","L.",468 1169,"","Stuartia","L.",468 1170,"","Symplococarpon","Airy Shaw",468 24761,"","Taonabo","Aubl.",468 1171,"","Ternstroemia","Mutis ex L.f.",468 1172,"","Ternstroemiopsis","Urb.",468 17920,"","Thea","L.",468 17915,"","Tristylium","Turcz.",468 1173,"","Tutcheria","Dunn",468 1174,"","Visnea","L.f.",468 24762,"","Voelckeria","Klotzsch & H.Karst. ex Endl.",468 24752,"","Wikstroemia","Schrad.",468 17921,"","Yunnanea","Hu",468 5536,"","Theligonum","L.",469 21954,"","Abacopteris","Fee",470 13662,"","Amauropelta","Kunze",470 13663,"","Ampelopteris","Kunze",470 13664,"","Amphineuron","Holttum",470 13665,"","Chingia","Holttum",470 16732,"x","Chrismatopteris","Quansah & D.S.Edwards",470 13666,"","Christella","H.Lev.",470 13667,"","Coryphopteris","Holttum",470 13668,"","Cyclogramma","Tagawa",470 13669,"","Cyclosorus","Link",470 21956,"","Dictyocline","T.Moore",470 21955,"","Dimorphopteris","Tagawa & K.Iwats.",470 13670,"","Glaphyropteridopsis","Ching",470 22245,"","Glaphyropteris","(Fee) C.Presl ex Fee",470 13671,"","Goniopteris","C.Presl",470 13672,"","Haplodictyum","C.Presl",470 21951,"","Hemestheum","Newman",470 21953,"","Lastrea","Bory",470 21949,"","Lastrella","(H.Ito) Nakai",470 21957,"","Leptogramma","J.Sm.",470 13673,"","Macrothelypteris","(H.Ito) Ching",470 13674,"","Meniscium","Schreb.",470 13675,"","Menisorus","Alston",470 21958,"","Mesochlaena","R.Br. ex J.Sm.",470 21952,"","Mesoneuron","Ching",470 13676,"","Mesophlebion","Holttum",470 25699,"","Mesopteris","Ching",470 13677,"","Metathelypteris","(H.Ito) Ching",470 13678,"","Nannothelypteris","Holttum",470 21960,"","Oochlamys","Fee",470 13679,"","Oreopteris","Holub",470 13680,"","Parathelypteris","(H.Ito) Ching",470 13681,"","Phegopteris","Fee",470 13682,"","Plesioneuron","(Holttum) Holttum",470 13683,"","Pneumatopteris","Nakai",470 21959,"","Proferea","C.Presl",470 13684,"","Pronephrium","C.Presl",470 13685,"","Pseudocyclosorus","Ching",470 13686,"","Pseudophegopteris","Ching",470 13687,"","Sphaerostephanos","J.Sm.",470 13688,"","Stegnogramma","Blume",470 13689,"","Steiropteris","(C.Chr.) Pic.Serm.",470 13690,"","Thelypteris","Schmidel",470 21950,"","Toppingia","O.Deg., I.Deg. & A.R.Sm.",470 13691,"","Trigonospora","Holttum",470 18090,"","Bonellia","Bertero ex Colla",471 7148,"","Clavija","Ruiz & Pav.",471 7149,"","Deherainia","Decne.",471 18089,"","Horta","Vell.",471 7150,"","Jacquinia","L.",471 16883,"","Neomezia","Votsch",471 7151,"","Theophrasta","L.",471 18116,"","Zacintha","Vell.",471 12204,"","Thurnia","Hook.f.",472 10026,"","Aetoxylon","(Airy Shaw) Airy Shaw",473 10027,"","Amyxa","Tiegh.",473 9974,"","Aquilaria","Lam.",473 17626,"","Arnhemia","Airy Shaw",473 9975,"","Arthrosolen","C.A.Mey.",473 16743,"","Atemnosiphon","Leandri",473 17627,"","Basutica","E.Phillips",473 16744,"","Brachythalamus","Gilg",473 22039,"","Chlamydanthus","C.A.Mey.",473 22045,"","Chymococca","Meisn.",473 9976,"","Craspedostoma","Domke",473 9977,"","Craterosiphon","Engl. & Gilg",473 9978,"","Cryptadenia","Meisn.",473 9979,"","Dais","L.",473 9980,"","Daphne","L.",473 9981,"","Daphnimorpha","Nakai",473 9982,"","Daphnopsis","Mart.",473 9983,"","Deltaria","Steenis",473 9984,"","Dendrostellera","(C.A.Mey.) Tiegh.",473 9985,"","Diarthron","Turcz.",473 9986,"","Dicranolepis","Planch.",473 9987,"","Dirca","L.",473 9988,"","Drapetes","Banks ex Lam.",473 9989,"","Edgeworthia","Meisn.",473 9990,"","Englerodaphne","Gilg",473 9991,"","Enkleia","Griff.",473 9992,"","Eriosolena","Blume",473 22044,"","Farreria","Balf.f. & W.W.Sm.",473 9993,"","Funifera","Leandro ex C.A.Mey.",473 22052,"","Gilgiodaphne","Domke",473 9994,"","Gnidia","L.",473 10028,"","Gonystylus","Teijsm. & Binn.",473 9995,"","Goodallia","Benth.",473 9996,"","Gyrinops","Gaertn.",473 22050,"","Gyrinopsis","Decne.",473 22043,"","Hyptiodaphne","Urb.",473 23213,"","Jedda","J.R.Clarkson",473 22046,"","Kelleria","Endl.",473 22047,"","Kerrdora","Gagnep.",473 9997,"","Lachnaea","L.",473 9998,"","Lagetta","Juss.",473 9999,"","Lasiadenia","Benth.",473 16746,"","Lasiosiphon","Fresen.",473 10000,"","Lethedon","Spreng.",473 22049,"","Leucosmis","Benth.",473 10001,"","Linodendron","Griseb.",473 10002,"","Linostoma","Wall. ex Endl.",473 10003,"","Lophostoma","(Meisn.) Meisn.",473 22040,"","Lygia","Fasano",473 22048,"","Macgregorianthus","Merr.",473 22051,"","Microsemma","Labill.",473 10004,"","Octolepis","Oliv.",473 10005,"","Oreodendron","C.T.White",473 10006,"","Ovidia","Meisn.",473 10007,"","Passerina","L.",473 10008,"","Peddiea","Harv. ex Hook.",473 10009,"","Pentathymelaea","Lecomte",473 10010,"","Phaleria","Jack",473 10011,"","Pimelea","Banks & Sol.",473 22041,"","Piptochlamys","C.A.Mey.",473 10012,"","Pseudais","Decne.",473 16745,"","Pseudognidia","E.Phillips",473 10013,"","Restella","Pobed.",473 10014,"","Rhamnoneuron","Gilg",473 10015,"","Schoenobiblus","Mart.",473 10016,"","Solmsia","Baill.",473 10017,"","Stellera","L.",473 10018,"","Stelleropsis","Pobed.",473 10019,"","Stephanodaphne","Baill.",473 10020,"","Struthiola","L.",473 10021,"","Struthiolopsis","E.Phillips",473 10022,"","Synandrodaphne","Gilg",473 10023,"","Synaptolepis","Oliv.",473 22042,"","Tartonia","Raf.",473 25837,"","Thecanthes","Wikstr.",473 10024,"","Thymelaea","Mill.",473 10025,"","Wikstroemia","Endl.",473 25332,"","Ticodendron","Gomez-Laur. & L.D.Gomez",474 1447,"","Acrosepalum","Pierre",475 16386,"","Althoffia","K.Schum.",475 1448,"","Ancistrocarpus","Oliv.",475 1449,"","Apeiba","Aubl.",475 1450,"","Asterophorum","Sprague",475 1451,"","Belotia","A.Rich.",475 1452,"","Berrya","Roxb.",475 1453,"","Brownlowia","Roxb.",475 1454,"","Burretiodendron","Rehder",475 1455,"","Carpodiptera","Griseb.",475 1456,"","Cephalonema","K.Schum.",475 16382,"","Ceratosepalum","Oliv.",475 1457,"","Christiana","DC.",475 1458,"","Clappertonia","Meisn.",475 1459,"","Colona","Cav.",475 17949,"","Columbia","Pers.",475 1460,"","Corchoropsis","Siebold & Zucc.",475 1461,"","Corchorus","L.",475 1462,"","Craigia","W.W.Sm. & W.E.Evans",475 1463,"","Desplatsia","Bocq.",475 1464,"","Dicraspidia","Standl.",475 17947,"","Diplanthemum","K.Schum.",475 1465,"","Diplodiscus","Turcz.",475 16387,"","Diplophractum","Desf.",475 1466,"","Duboscia","Bocquet",475 1467,"","Eleutherostylis","Burret",475 1469,"","Entelea","R.Br.",475 1470,"","Erinocarpus","Nimmo ex J.Graham",475 16388,"","Erotium","Blanco",475 25459,"","Excentrodendron","H.T.Chang & R.H.Miao",475 1471,"","Glyphaea","Hook.f.",475 1472,"","Goethalsia","Pittier",475 17953,"","Graeffea","Seem.",475 1473,"","Grewia","L.",475 16385,"","Grewiopsis","De Wild. & T.Durand",475 1474,"","Hainania","Merr.",475 17954,"","Halconia","Merr.",475 1475,"","Hasseltia","Kunth",475 1476,"","Hasseltiopsis","Sleumer",475 1477,"","Heliocarpus","L.",475 25722,"","Honckenya","Willd.",475 25721,"","Honkenya","Cothen.",475 1478,"","Hydrogaster","Kuhlm.",475 1479,"","Jarandersonia","Kosterm.",475 16389,"","Ledermannia","Mildbr. & Burret",475 1480,"","Luehea","Willd.",475 1481,"","Lueheopsis","Burret",475 1482,"","Macrohasseltia","L.O.Williams",475 1483,"","Microcos","L.",475 1484,"","Mollia","Mart.",475 1485,"","Mortoniodendron","Standl. & Steyerm.",475 1486,"","Muntingia","L.",475 16390,"","Neosprucea","Sleumer",475 1487,"","Neotessmannia","Burret",475 1488,"","Nettoa","Baill.",475 1489,"","Orthandra","Burret",475 1490,"","Pentace","Hassk.",475 1491,"","Pentaplaris","L.O.Williams & Standl.",475 1492,"","Petenaea","Lundell",475 1493,"","Pityranthe","Thwaites",475 17948,"","Pleianthemum","K.Schum. ex A.Chev.",475 1495,"","Pleuranthodendron","L.O.Williams",475 1496,"","Prockia","P.Browne ex L.",475 1497,"","Pseudocorchorus","Capuron",475 17952,"","Rhizanota","Lour. ex Gomes",475 16383,"","Rumicicarpus","Chiov.",475 1498,"","Schoutenia","Korth.",475 1499,"","Sicrea","(Pierre) Hallier f.",475 25842,"","Sparmannia","L.f.",475 1500,"","Sparrmannia","L.f.",475 17955,"","Spruceanthus","Sleumer",475 25201,"","Tahitia","Burret",475 1501,"","Tetralix","Griseb.",475 1502,"","Tilia","L.",475 1503,"","Trichospermum","Blume",475 1504,"","Triumfetta","L.",475 25458,"","Triumfettoides","Rauschert",475 1505,"","Vasivaea","Baill.",475 16384,"","Vinticena","Steud.",475 17950,"","Vossianthus","Kuntze",475 25341,"","Westphalina","A.Robyns & Bamps",475 4874,"","Toricellia","DC.",476 25426,"","Torricellia","DC.",476 803,"","Tovaria","Ruiz & Pav.",477 3977,"","Trapa","L.",478 945,"","Platytheca","Steetz",479 946,"","Tetratheca","Sm.",479 947,"","Tremandra","R.Br. ex DC.",479 18846,"","Trichopodium","Lindl.",480 11870,"","Trichopus","Gaertn.",480 972,"","Humbertiodendron","Leandri",481 19529,"","Humbertodendron","Leandri",481 973,"","Trigonia","Aubl.",481 974,"","Trigoniastrum","Miq.",481 23201,"","Trigoniodendron","E.F.Guim. & Miguel",481 15958,"","Daiswa","Raf.",482 16226,"","Kinugasa","Tatew. & Suto",482 12038,"","Paris","L.",482 12063,"","Scoliopus","Torr.",482 12088,"","Trillium","L.",482 9858,"","Piptocalyx","Oliv. ex Benth.",483 9859,"","Trimenia","Seem.",483 5561,"","Triplostegia","Wall. ex DC.",484 12542,"","Andruris","Schltr.",485 24667,"","Hexuris","Miers",485 19202,"","Hyalisma","Champ.",485 24317,"","Lacandonia","E.Martinez & Ramos",485 24666,"","Peltophyllum","Gardner",485 12543,"","Sciaphila","Blume",485 12544,"","Seychellaria","Hemsl.",485 12545,"","Soridium","Miers",485 12546,"","Triuris","Miers",485 103,"","Trochodendron","Siebold & Zucc.",486 1657,"","Magallana","Cav.",487 25715,"","Tropaeastrum","Mabb.",487 1658,"","Tropaeolum","L.",487 15850,"","Trophaeastrum","Sparre",487 14198,"","Adenoa","Arbo",488 3994,"","Erblichia","Seem.",488 3995,"","Hyalocalyx","Rolfe",488 3996,"","Loewia","Urb.",488 3997,"","Mathurina","Balf.f.",488 3998,"","Piriqueta","Aubl.",488 3999,"","Stapfiella","Gilg",488 4000,"","Streptopetalum","Hochst.",488 4001,"","Tricliceras","Thonn. ex DC.",488 4002,"","Turnera","L.",488 16521,"","Wormskioldia","Schumach. & Thonn.",488 12428,"","Sparganium","L.",489 12427,"","Typha","L.",489 18973,"","Abelicea","Baill.",490 10569,"","Ampelocera","Klotzsch",490 10570,"","Aphananthe","Planch.",490 10571,"","Celtis","L.",490 10572,"","Chaetachme","Planch.",490 25020,"","Chaetacme","Planch.",490 10573,"","Gironniera","Gaudich.",490 18977,"","Helminthospermum","Thwaites",490 10574,"","Hemiptelea","Planch.",490 10575,"","Holoptelea","Planch.",490 10576,"","Lozanella","Greenm.",490 18975,"","Mirandaceltis","Sharp",490 18976,"","Nematostigma","Planch.",490 10577,"","Parasponia","Miq.",490 10578,"","Phyllostylon","Capan. ex Benth.",490 10579,"","Plagioceltis","Mildbr. ex Baehni",490 10580,"","Planera","J.F.Gmel.",490 10581,"","Pteroceltis","Maxim.",490 17326,"","Sparrea","Hunz. & Dottori",490 18974,"","Sponia","Comm. ex Decne.",490 10582,"","Trema","Lour.",490 10583,"","Ulmus","L.",490 10584,"","Zelkova","Spach",490 4414,"","Aciphylla","J.R.Forst. & G.Forst.",491 4415,"","Acronema","Falc. ex Edgew.",491 4416,"","Actinanthus","Ehrenb.",491 4417,"","Actinolema","Fenzl",491 4418,"","Actinotus","Labill.",491 4419,"","Adenosciadium","H.Wolff",491 25046,"","Aegokeras","Raf.",491 4420,"","Aegopodium","L.",491 4421,"","Aethusa","L.",491 4422,"","Aframmi","C.Norman",491 14219,"","Afrocarum","Rauschert",491 4423,"","Afroligusticum","C.Norman",491 4424,"","Afrosison","H.Wolff",491 4425,"","Agasyllis","Spreng.",491 16522,"","Ageomoron","Raf.",491 4426,"","Agrocharis","Hochst.",491 4427,"","Ainsworthia","Boiss.",491 4428,"","Albertia","Regel & Schmalh.",491 16523,"","Albovia","Schischk.",491 4429,"","Alepidea","F.Delaroche",491 4430,"","Aletes","J.M.Coult. & Rose",491 4431,"","Alococarpum","Riedl & Kuber",491 25514,"","Alposelinum","Pimenov",491 4432,"","Ammi","L.",491 4433,"","Ammiopsis","Boiss.",491 4434,"","Ammodaucus","Coss. & Durieu",491 4435,"","Ammoides","Adans.",491 4436,"","Ammoselinum","Torr. & A.Gray",491 4437,"","Anethum","L.",491 4438,"","Angelica","L.",491 17555,"","Angelocarpa","Rupr.",491 16524,"","Anginon","Raf.",491 4439,"","Angoseseli","Chiov.",491 4440,"","Anisopoda","Baker",491 4441,"","Anisosciadium","DC.",491 4442,"","Anisotome","Hook.f.",491 4443,"","Annesorhiza","Cham. & Schltdl.",491 25048,"x","Anthrichaerophyllum","P.Fourn.",491 4444,"","Anthriscus","Pers.",491 4445,"","Aphanopleura","Boiss.",491 4446,"","Apiastrum","Nutt.",491 4447,"","Apium","L.",491 4448,"","Apleura","Phil.",491 4449,"","Apodicarpum","Makino",491 24271,"","Arafoe","Pimenov & Lavrova",491 4450,"","Arctopus","L.",491 17557,"","Arcuatopterus","Rupr.",491 17605,"","Arpitium","Neck. ex Sweet",491 4451,"","Arracacia","Bancr.",491 4452,"","Artedia","L.",491 4453,"","Asciadium","Griseb.",491 4454,"","Asteriscium","Cham. & Schltdl.",491 4455,"","Astoma","DC.",491 25049,"","Astomaea","Rchb.",491 4456,"","Astomatopsis","Korovin",491 4457,"","Astrantia","L.",491 16192,"","Astrodaucus","Drude",491 4458,"","Astydamia","DC.",491 4459,"","Athamanta","L.",491 4460,"","Aulacospermum","Ledeb.",491 4461,"","Aulospermum","J.M.Coult. & Rose",491 4462,"","Austropeucedanum","Mathias & Constance",491 24589,"","Autumnalia","Pimenov",491 24272,"","Azilia","Hedge & Lamond",491 4463,"","Azorella","Lam.",491 4464,"","Balansaea","Boiss. & Reut.",491 4465,"","Baumiella","H.Wolff",491 4466,"","Berula","Besser & W.D.J.Koch",491 17558,"","Biasolettia","W.D.J.Koch",491 4467,"","Bifora","Hoffm.",491 14838,"","Bilacunaria","Pimenov & V.N.Tikhom.",491 4468,"","Bolax","Comm. ex Juss.",491 4469,"","Bonannia","Guss.",491 4470,"","Bowlesia","Ruiz & Pav.",491 4471,"","Brachyapium","(Baill.) Maire",491 17559,"","Bubon","L.",491 16525,"","Buniella","Schischk.",491 4472,"","Buniotrinia","Stapf & Wettst.",491 4473,"","Bunium","L.",491 4474,"","Bupleurum","L.",491 17562,"","Bustillosia","Clos",491 17561,"","Butinia","Boiss.",491 4475,"","Cachrys","L.",491 17579,"","Caldasia","Lag.",491 17580,"","Callisace","Fisch.",491 4476,"","Calyptrosciadium","Rech.f. & Kuber",491 4477,"","Capnophyllum","Gaertn.",491 4478,"","Carlesia","Dunn",491 14220,"","Caropsis","(Rouy & Camus) Rauschert",491 4479,"","Carum","L.",491 4480,"","Caucaliopsis","H.Wolff",491 4481,"","Caucalis","L.",491 4482,"","Cenolophium","W.D.J.Koch ex DC.",491 4483,"","Centella","L.",491 25050,"","Cephalopodium","Korovin",491 4484,"","Chaerophyllopsis","Boissieu",491 4485,"","Chaerophyllum","L.",491 4486,"","Chaetosciadium","Boiss.",491 4487,"","Chamaele","Miq.",491 4488,"","Chamaesciadium","C.A.Mey.",491 4489,"","Chamaesium","H.Wolff",491 4490,"","Chamarea","Eckl. & Zeyh.",491 25051,"","Changium","H.Wolff",491 4491,"","Chlaenosciadium","C.Norman",491 4492,"","Choritaenia","Benth.",491 16526,"","Chrysophae","Koso-Pol.",491 25052,"","Chuanminshen","M.L.Sheh & R.H.Shan",491 4493,"","Chymsydia","Albov",491 17584,"","Ciclospermum","Lag.",491 4494,"","Cicuta","L.",491 25515,"","Cnidiocarpa","Pimenov",491 4495,"","Cnidium","Cusson ex Juss.",491 4496,"","Coaxana","J.M.Coult. & Rose",491 4497,"","Coelopleurum","Ledeb.",491 17587,"","Cogswellia","Spreng.",491 17585,"","Colladonia","DC.",491 17586,"","Coloptera","J.M.Coult. & Rose",491 4498,"","Conioselinum","Fisch. ex Hoffm.",491 4499,"","Conium","L.",491 4500,"","Conopodium","W.D.J.Koch",491 16527,"","Coriandropsis","H.Wolff",491 4501,"","Coriandrum","L.",491 17588,"","Coriophyllus","Rydb.",491 4502,"","Cortia","DC.",491 4503,"","Cortiella","C.Norman",491 4504,"","Cotopaxia","Mathias & Constance",491 4505,"","Coulterophytum","B.L.Rob.",491 4506,"","Coxella","Cheeseman & Hemsl.",491 17589,"","Crantzia","Nutt.",491 4507,"","Cremastosciadium","Rech.f.",491 17590,"","Crenosciadium","Boiss. & Heldr.",491 4508,"","Crithmum","L.",491 4509,"","Cryptodiscus","Schrenk ex Fisch. & C.A.Mey.",491 4510,"","Cryptotaenia","DC.",491 4511,"","Cryptotaeniopsis","Dunn",491 4512,"","Cuminum","L.",491 4513,"","Cusickia","M.E.Jones",491 4514,"","Cyathoselinum","Benth.",491 25054,"","Cyclorhiza","M.L.Sheh & R.H.Shan",491 25053,"","Cyclospermum","Lag.",491 4515,"","Cymbocarpum","DC. ex C.A.Mey.",491 4516,"","Cymopterus","Raf.",491 17591,"","Cynomarathrum","Nutt.",491 17592,"","Cynorrhiza","Eckl. & Zeyh.",491 4517,"","Cynosciadium","DC.",491 4518,"","Dactylaea","Fedde ex H.Wolff",491 25729,"","Danaa","All.",491 25055,"","Dasispermum","Raf.",491 4519,"","Daucosma","Engelm. & A.Gray",491 4520,"","Daucus","L.",491 17594,"","Deanea","J.M.Coult. & Rose",491 24273,"","Demavendia","Pimenov",491 4521,"","Dethawia","Endl.",491 17595,"","Deverra","DC.",491 17596,"","Deweya","Torr. & A.Gray",491 17597,"","Diaphycarpus","Calest.",491 17598,"","Dichopetalum","F.Muell.",491 4522,"","Dichosciadium","Domin",491 4523,"","Dickinsia","Franch.",491 4524,"","Dicyclophora","Boiss.",491 25056,"","Dimorphosciadium","Pimenov",491 25057,"","Diplaspis","Hook.f.",491 4525,"","Diplolophium","Turcz.",491 4526,"","Diplotaenia","Boiss.",491 4527,"","Diposis","DC.",491 4528,"","Discopleura","DC.",491 25058,"","Distichoselinum","Garcia-Martin & Silvestre",491 4529,"","Domeykoa","Phil.",491 16528,"","Dominia","Fedde",491 17599,"","Dondia","Spreng.",491 4530,"","Donnellsmithia","J.M.Coult. & Rose",491 4531,"","Dorema","D.Don",491 17593,"","Dracosciadium","Hilliard & B.L.Burtt",491 4532,"","Drudeophytum","J.M.Coult. & Rose",491 17600,"","Drusa","DC.",491 4533,"","Ducrosia","Boiss.",491 25059,"","Dystaenia","Kitag.",491 4534,"","Echinophora","L.",491 4535,"","Elaeopleurum","Korovin",491 4536,"","Elaeoselinum","W.D.J.Koch ex DC.",491 17601,"","Elaeosticta","Fenzl",491 4537,"","Eleutherospermum","K.Koch",491 16532,"","Elleimataenia","Koso-Pol.",491 4538,"","Enantiophylla","J.M.Coult. & Rose",491 4539,"","Endressia","J.Gay",491 4540,"","Eremocharis","Phil.",491 4541,"","Eremodaucus","Bunge",491 4542,"","Ergocarpon","C.C.Towns.",491 4543,"","Erigenia","Nutt.",491 4544,"","Eriocycla","Lindl.",491 4545,"","Eriosynaphe","DC.",491 4546,"","Eryngium","L.",491 4547,"","Erythroselinum","Chiov.",491 17602,"","Eulophus","Nutt. ex DC.",491 4548,"","Euryangium","Kauffman",491 4549,"","Eurytaenia","Torr. & A.Gray",491 4550,"","Exoacantha","Labill.",491 4551,"","Falcaria","Fabr.",491 25513,"","Fergania","Pimenov",491 4552,"","Ferula","L.",491 4553,"","Ferulago","W.D.J.Koch",491 25060,"","Ferulopsis","Kitag.",491 4554,"","Foeniculum","Mill.",491 17560,"","Freyera","Rchb.",491 4555,"","Frommia","H.Wolff",491 4556,"","Froriepia","K.Koch",491 4557,"","Fuernrohria","K.Koch",491 17603,"","Galagania","Lipsky",491 17604,"","Gaya","Gaudin",491 4558,"","Geocaryum","Coss.",491 4559,"","Gingidia","J.W.Dawson",491 16533,"","Gingidium","J.R.Forst. & G.Forst.",491 4560,"","Glaucosciadium","B.L.Burtt & P.H.Davis",491 4561,"","Glehnia","F.Schmidt ex Miq.",491 25061,"","Glia","Sond.",491 25508,"","Gliopsis","Rauschert",491 25062,"","Glochidotheca","Fenzl",491 17606,"","Gomphopetalum","Turcz.",491 24274,"","Gongylosciadium","Rech.f.",491 4562,"","Grafia","Rchb.",491 4563,"","Grammosciadium","DC.",491 4564,"","Guillonea","Coss.",491 4565,"","Gymnophyton","Clos",491 4566,"","Gymnosciadium","Hochst.",491 17607,"","Gynophyge","Gilli",491 4567,"","Hacquetia","Neck. ex DC.",491 25063,"","Halosciastrum","Koidz.",491 4568,"","Haplosciadium","Hochst.",491 4569,"","Haploseseli","H.Wolff & Hand.-Mazz.",491 4570,"","Haplosphaera","Hand.-Mazz.",491 4571,"","Harbouria","J.M.Coult. & Rose",491 17608,"","Harperella","Rose",491 17609,"","Harperia","Rose",491 4572,"","Harrysmithia","H.Wolff",491 4573,"","Haussknechtia","Boiss.",491 16534,"","Hellenocarum","H.Wolff",491 17610,"","Helosciadium","W.D.J.Koch",491 4574,"","Heptaptera","Margot & Reut.",491 4575,"","Heracleum","L.",491 4576,"","Hermas","L.",491 17611,"","Hesperogenia","J.M.Coult. & Rose",491 4577,"","Heteromorpha","Cham. & Schltdl.",491 16535,"","Heteroptilis","E.Mey. ex Meisn.",491 16536,"","Heterosciadium","Lange",491 17612,"","Hladnikia","W.D.J.Koch",491 16220,"","Hladnikia","Rchb.",491 4578,"","Hohenackeria","Fisch. & C.A.Mey.",491 4579,"","Homalocarpus","Hook. & Arn.",491 4580,"","Homalosciadium","Domin",491 25064,"","Horstrissea","Greuter, Gerstb. & Egli",491 4581,"","Huanaca","Cav.",491 4582,"","Hyalolaena","Bunge",491 4583,"","Hydrocotyle","L.",491 17647,"","Hymenolaena","DC.",491 4584,"","Hymenolyma","Korovin",491 16193,"","Imperatoria","L.",491 25065,"","Itasina","Raf.",491 4585,"","Johrenia","DC.",491 24275,"","Johreniopsis","Pimenov",491 17614,"","Kadenia","Lavrova & V.N.Tikhom.",491 25066,"","Kafirnigania","Kamelin & Kinzik.",491 17615,"","Kalakia","Alava",491 17616,"","Kandaharia","Alava",491 25067,"","Karatavia","Pimenov & Lavrova",491 17617,"","Karnataka","P.K.Mukh. & Constance",491 23205,"","Kedarnatha","P.K.Mukh. & Constance",491 4586,"","Kenopleurum","Candargy",491 4587,"","Keracia","(Coss.) Calest.",491 17619,"","Keramocarpus","Fenzl",491 17621,"","Keraymonia","Farille",491 25068,"","Kitagawia","Pimenov",491 4588,"","Klotzschia","Cham.",491 16537,"","Koelzella","Hiroe",491 4589,"","Komarovia","Korovin",491 4590,"","Korovinia","Nevski & Vved.",491 4591,"","Korshinskia","Lipsky",491 4592,"","Kosopoljanskia","Korovin",491 25047,"","Kozlovia","Lipsky",491 16538,"","Krasnovia","Popov ex Schischk.",491 17620,"","Krubera","Hoffm.",491 4593,"","Kundmannia","Scop.",491 4594,"","Ladyginia","Lipsky",491 4595,"","Lagoecia","L.",491 14852,"","Lalldhwojia","Farille",491 4596,"","Langlassea","H.Wolff",491 4597,"","Laretia","Gillies & Hook.",491 4598,"","Laser","P.Gaertn., B.Mey. & Scherb.",491 4599,"","Laserpitium","L.",491 4600,"","Lecokia","DC.",491 4601,"","Ledebouriella","H.Wolff",491 4602,"","Lefebvrea","A.Rich.",491 17623,"","Leibergia","J.M.Coult. & Rose",491 17624,"","Leptocaulis","Nutt. ex DC.",491 4603,"","Leptotaenia","Nutt.",491 16221,"","Lereschia","Boiss.",491 17628,"","Leuceres","Calest.",491 24276,"","Leutea","Pimenov",491 4604,"","Levisticum","Hill",491 17629,"","Libanotis","Haller ex Zinn",491 4605,"","Lichtensteinia","Cham. & Schltdl.",491 4606,"","Lignocarpa","J.W.Dawson",491 4607,"","Ligusticella","J.M.Coult. & Rose",491 4608,"","Ligusticopsis","Leute",491 4609,"","Ligusticum","L.",491 4610,"","Lilaeopsis","Greene",491 4611,"","Limnosciadium","Mathias & Constance",491 25069,"","Lipskya","(Koso-Pol.) Nevski",491 4612,"","Lisaea","Boiss.",491 4613,"","Lomatium","Raf.",491 25510,"","Lomatocarpa","Pimenov",491 17630,"","Lomatopodium","Fisch. & C.A.Mey.",491 4614,"","Lophosciadium","DC.",491 4615,"","Macrochlaena","Hand.-Mazz.",491 24328,"","Macrosciadium","V.N.Tikhom. & Lavrova",491 25070,"","Magadania","Pimenov & Lavrova",491 4616,"","Magydaris","W.D.J.Koch ex DC.",491 17631,"","Maidenia","Domin",491 4617,"","Malabaila","Hoffm.",491 25071,"","Mandenovia","Alava",491 25072,"","Margotia","Boiss.",491 4618,"","Marlothiella","H.Wolff",491 4619,"","Mastigosciadium","Rech.f. & Kuber",491 4620,"","Mathiasella","Constance & C.L.Hitchc.",491 4621,"","Mediasia","Pimenov",491 4622,"","Meeboldia","H.Wolff",491 4623,"","Melanosciadium","Boissieu",491 16194,"","Melanoselinum","Hoffm.",491 16539,"","Merinogyne","H.Wolff",491 16540,"","Merwia","B.Fedtsch.",491 25506,"","Merwiopsis","Saphina",491 4624,"","Meum","Mill.",491 4625,"","Micropleura","Lag.",491 17632,"","Microsciadium","Hook.f.",491 4626,"","Microsciadium","Boiss.",491 4627,"","Mogoltavia","Korovin",491 4628,"","Molopospermum","W.D.J.Koch",491 16195,"","Monizia","Lowe",491 4629,"","Mulinum","Pers.",491 4630,"","Muretia","Boiss.",491 4631,"","Museniopsis","(A.Gray) J.M.Coult. & Rose",491 4632,"","Musineon","Raf.",491 4633,"","Myrrhidendron","J.M.Coult. & Rose",491 4634,"","Myrrhis","Mill.",491 4635,"","Myrrhoides","Heist. ex Fabr.",491 17633,"","Narthex","Falc.",491 4636,"","Naufraga","Constance & Cannon",491 4637,"","Nematosciadium","H.Wolff",491 25073,"","Neoconopodium","(Koso-Pol.) Pimenov & Kljuykov",491 24277,"","Neocryptodiscus","Hedge & Lamond",491 4638,"","Neogoezia","Hemsl.",491 4639,"","Neonelsonia","J.M.Coult. & Rose",491 4640,"","Neoparrya","Mathias",491 25507,"","Neopaulia","Pimenov & Kljuykov",491 24327,"","Neoplatytaenia","Geld.",491 4641,"","Neosciadium","Domin",491 25074,"","Neoturczaninovia","Koso-Pol.",491 4642,"","Niphogeton","Schltdl.",491 4643,"","Nirarathamnos","Balf.f.",491 4644,"","Nothosmyrnium","Miq.",491 4645,"","Notiosciadium","Speg.",491 4646,"","Notopterygium","Boissieu",491 25511,"","Ochotia","A.P.Khokhr.",491 4647,"","Oedibasis","Koso-Pol.",491 4648,"","Oenanthe","L.",491 17634,"","Oenosciadium","Pomel",491 4649,"","Oligocladus","Chodat & Wilczek",491 4650,"","Oliveria","Vent.",491 4651,"","Olymposciadium","H.Wolff",491 17635,"","Opoidea","Lindl.",491 4652,"","Opopanax","W.D.J.Koch",491 17636,"","Oreocome","Edgew.",491 4653,"","Oreomyrrhis","Endl.",491 4654,"","Oreonana","Jeps.",491 14221,"","Oreoschimperella","Rauschert",491 17637,"","Oreosciadium","Wedd.",491 4655,"","Oreoxis","Raf.",491 4656,"","Orlaya","Hoffm.",491 4657,"","Ormopterum","Schischk.",491 4658,"","Ormosciadium","Boiss.",491 17638,"","Ormosolenia","Tausch",491 4659,"","Orogenia","S.Watson",491 4660,"","Orumbella","J.M.Coult. & Rose",491 4661,"","Oschatzia","Walp.",491 4662,"","Osmorhiza","Raf.",491 17639,"","Ostericum","Hoffm.",491 4663,"","Ottoa","Kunth",491 4664,"","Oxypolis","Raf.",491 4665,"","Pachyctenium","Maire & Pamp.",491 4666,"","Pachypleurum","Ledeb.",491 4667,"","Palimbia","Besser ex DC.",491 25075,"","Pancicia","Vis. & Schltdl.",491 25076,"","Paraligusticum","V.N.Tikhom.",491 4668,"","Paraselinum","H.Wolff",491 25077,"","Parasilaus","Leute",491 4669,"","Pastinaca","L.",491 4670,"","Pastinacopsis","Golosk.",491 25079,"","Paulia","Korovin",491 25078,"","Paulita","Sojak",491 4671,"","Pedinopetalum","Urb. & H.Wolff",491 16529,"","Pentapeltis","Bunge",491 4672,"","Perideridia","Rchb.",491 4673,"","Perissocoeleum","Mathias & Constance",491 4674,"","Petagnia","Guss.",491 16541,"","Petroedmondia","Tamamsch.",491 17640,"","Petrosciadium","Edgew.",491 4675,"","Petroselinum","Hill",491 4676,"","Peucedanum","L.",491 4677,"","Phellolophium","Baker",491 17641,"","Phellopterus","Benth.",491 4678,"","Phlojodicarpus","Turcz. ex Ledeb.",491 4679,"","Phlyctidocarpa","Cannon & W.L.Theob.",491 16542,"","Physocaulis","(DC.) Tausch",491 16530,"","Physolophium","Turcz.",491 4680,"","Physospermopsis","H.Wolff",491 4681,"","Physospermum","Cusson ex Juss.",491 4682,"","Physotrichia","Hiern",491 16543,"","Pichleria","Stapf & Wettst.",491 4683,"","Pilopleura","Schischk.",491 4684,"","Pimpinella","L.",491 4685,"","Pinacantha","Gilli",491 17642,"","Pinda","P.K.Mukh. & Constance",491 4686,"","Pituranthos","Viv.",491 17643,"","Platyraphe","Miq.",491 4687,"","Platysace","Bunge",491 4688,"","Platytaenia","Nevski & Vved.",491 16544,"","Pleiotaenia","J.M.Coult. & Rose",491 4689,"","Pleurospermopsis","C.Norman",491 4690,"","Pleurospermum","Hoffm.",491 4691,"","Podistera","S.Watson",491 17644,"","Podosciadium","A.Gray",491 4692,"","Polemannia","Eckl. & Zeyh.",491 24278,"","Polemanniopsis","B.L.Burtt",491 4693,"","Polylophium","Boiss.",491 4694,"","Polytaenia","DC.",491 4695,"","Polyzygus","Dalzell",491 17645,"","Pomelia","Durando ex Pomel",491 16545,"","Porphyroscias","Miq.",491 17646,"","Portenschlagia","Vis.",491 4696,"","Portenschlagiella","Tutin",491 25512,"","Postiella","Kljuykov",491 4697,"","Pozoa","Lag.",491 4698,"","Prangos","Lindl.",491 4699,"","Prionosciadium","S.Watson",491 4700,"","Psammogeton","Edgew.",491 16546,"","Pseudammi","H.Wolff",491 4701,"","Pseudocarum","C.Norman",491 4702,"","Pseudocymopterus","J.M.Coult. & Rose",491 4703,"","Pseudorlaya","(Murb.) Murb.",491 4704,"","Pseudoselinum","C.Norman",491 4705,"","Pseudotaenidia","Mack.",491 4706,"","Pternopetalum","Franch.",491 16547,"","Pterocyclus","Klotzsch",491 16548,"","Pterygopleurum","Kitag.",491 4707,"","Pteryxia","(Nutt.) J.M.Coult. & Rose",491 4708,"","Ptilimnium","Raf.",491 4709,"","Ptychotis","W.D.J.Koch",491 4710,"","Pycnocycla","Lindl.",491 4711,"","Pyramidoptera","Boiss.",491 24279,"","Registaniella","Rech.f.",491 17648,"","Renarda","Regel",491 17649,"","Reutera","Boiss.",491 4712,"","Rhabdosciadium","Boiss.",491 4713,"","Rhodosciadium","S.Watson",491 4714,"","Rhopalosciadium","Rech.f.",491 4715,"","Rhysopterus","J.M.Coult. & Rose",491 4716,"","Rhyticarpus","Sond.",491 4717,"","Ridolfia","Moris",491 4718,"","Rouya","Coincy",491 4719,"","Rumia","Hoffm.",491 17650,"","Rupiphila","Pimenov & Lavrova",491 17651,"","Ruthea","Bolle",491 16196,"","Rutheopsis","A.Hansen & Kunkel",491 25080,"","Sajanella","Sojak",491 4720,"","Sajania","Pimenov",491 4721,"","Sanicula","L.",491 4722,"","Saposhnikovia","Schischk.",491 4723,"","Scaligeria","DC.",491 4724,"","Scandia","J.W.Dawson",491 16549,"","Scandicium","Thell.",491 4725,"","Scandix","L.",491 4726,"","Scaphospermum","Korovin",491 17652,"","Schiedophytum","H.Wolff",491 4727,"","Schimperella","H.Wolff",491 4728,"","Schizeilema","(Hook.f.) Domin",491 16550,"","Schlechterosciadium","H.Wolff",491 4729,"","Schoenolaena","Bunge",491 4730,"","Schrenkia","Fisch. & C.A.Mey.",491 4731,"","Schtschurowskia","Regel & Schmalh.",491 4732,"","Schulzia","Spreng.",491 4733,"","Schumannia","Kuntze",491 4734,"","Sclerochorton","Boiss.",491 4735,"","Sclerosciadium","W.D.J.Koch ex DC.",491 4736,"","Sclerotiaria","Korovin",491 17654,"","Scorodosma","Bunge",491 17653,"","Scrithacola","Alava",491 17655,"","Selinopsis","Coss. & Durieu ex Batt. & Trab.",491 4737,"","Selinum","L.",491 4738,"","Semenovia","Regel & Herder",491 4739,"","Seseli","L.",491 4740,"","Seselopsis","Schischk.",491 14218,"","Shoshonea","Evert & Constance",491 4741,"","Silaum","Mill.",491 17656,"","Silaus","Bernh.",491 16551,"","Siler","Mill.",491 17657,"","Similisinocarum","Cauwet & Farille",491 4742,"","Sinocarum","H.Wolff",491 4743,"","Sinodielsia","H.Wolff",491 4744,"","Sinolimprichtia","H.Wolff",491 4745,"","Sison","L.",491 4746,"","Sium","L.",491 4747,"","Smyrniopsis","Boiss.",491 4748,"","Smyrnium","L.",491 4749,"","Sonderina","H.Wolff",491 4750,"","Soranthus","Ledeb.",491 4751,"","Spananthe","Jacq.",491 4752,"","Spermolepis","Raf.",491 4753,"","Sphaenolobium","Pimenov",491 25081,"","Sphaerosciadium","Pimenov & Kljuykov",491 4754,"","Sphallerocarpus","Besser ex DC.",491 4755,"","Sphenocarpus","Korovin",491 4756,"","Sphenosciadium","A.Gray",491 16552,"","Spiroceratium","H.Wolff",491 4757,"","Spongiosyndesmus","Gilli",491 4758,"","Spuriodaucus","C.Norman",491 17658,"","Spuriopimpinella","Kitag.",491 4759,"","Stefanoffia","H.Wolff",491 4760,"","Steganotaenia","Hochst.",491 4761,"","Stenocoelium","Ledeb.",491 16553,"","Stephanorossia","Chiov.",491 4762,"","Stewartiella","Nasir",491 24879,"","Stoibrax","Raf.",491 4763,"","Symphyoloma","C.A.Mey.",491 4764,"","Synelcosciadium","Boiss.",491 4765,"","Szovitsia","Fisch. & C.A.Mey.",491 4766,"","Taenidia","(Torr. & A.Gray) Drude",491 16554,"","Taeniopleurum","J.M.Coult. & Rose",491 4767,"","Talassia","Korovin",491 25082,"","Tamamschjania","Pimenov & Kljuykov",491 4768,"","Tauschia","Schltdl.",491 17659,"","Tetrataenium","(DC.) Manden.",491 25083,"","Thamnosciadium","Hartvig",491 4769,"","Thapsia","L.",491 4770,"","Thaspium","Nutt.",491 4771,"","Thecocarpus","Boiss.",491 4772,"","Thorella","Briq.",491 4773,"","Thunbergiella","H.Wolff",491 17660,"","Tiedemannia","DC.",491 25084,"","Tilingia","Regel",491 4774,"","Tinguarra","Parl.",491 4775,"","Todaroa","Parl.",491 25085,"","Tommasinia","Bertol.",491 4776,"","Tongoloa","H.Wolff",491 25086,"","Tordyliopsis","DC.",491 4777,"","Tordylium","L.",491 4778,"","Torilis","Adans.",491 4779,"","Tornabenea","Parl.",491 4780,"","Trachydium","Lindl.",491 4781,"","Trachymene","Rudge",491 16531,"","Trachysciadium","Eckl. & Zeyh.",491 4782,"","Trachyspermum","Link",491 16555,"","Tragiopsis","Pomel",491 17661,"","Tragium","Spreng.",491 17662,"","Tragoselinum","Mill.",491 25509,"","Transcaucasia","M.Hiroe",491 4783,"","Trepocarpus","Nutt. ex DC.",491 4784,"","Tricholaser","Gilli",491 4785,"","Trigonosciadium","Boiss.",491 4786,"","Trinia","Hoffm.",491 17663,"","Triniella","Calest.",491 16556,"","Triphylleion","Suess.",491 17664,"","Trisanthus","Lour.",491 17665,"","Trisciadium","Phil.",491 4787,"","Trochiscanthes","W.D.J.Koch",491 17666,"","Turczaninoviella","Koso-Pol.",491 4788,"","Turgenia","Hoffm.",491 4789,"","Turgeniopsis","Boiss.",491 4790,"","Uldinia","J.M.Black",491 4791,"","Urbanosciadium","H.Wolff",491 17667,"","Vanasushava","P.K.Mukh. & Constance",491 17668,"","Velaea","D.Dietr.",491 4792,"","Vicatia","DC.",491 16557,"","Volkensiella","H.Wolff",491 16558,"","Vvedenskya","Korovin",491 17670,"","Wallrothia","Spreng.",491 17671,"","Washingtonia","Raf.",491 4793,"","Xanthogalum","Ave-Lall.",491 4794,"","Xanthosia","Rudge",491 4795,"","Xatardia","Meisn. & Zeyh.",491 17669,"","Yabea","Koso-Pol.",491 4796,"","Zeravschania","Korovin",491 4797,"","Zizia","W.D.J.Koch",491 4798,"","Zosima","Hoffm.",491 17378,"","Aboriella","Bennet",492 10521,"","Achudemia","Blume",492 17324,"","Archiboehmeria","C.J.Chen",492 10522,"","Astrothalamus","C.B.Rob.",492 10523,"","Australina","Gaudich.",492 10524,"","Boehmeria","Jacq.",492 10525,"","Chamabainia","Wight",492 10526,"","Cypholophus","Wedd.",492 10527,"","Debregeasia","Gaudich.",492 10528,"","Dendrocnide","Miq.",492 17325,"","Didymodoxa","E.Mey. ex Wedd.",492 10529,"","Discocnide","Chew",492 25402,"","Distemon","Wedd.",492 10530,"","Droguetia","Gaudich.",492 17379,"","Dunniella","Rauschert",492 10531,"","Elatostema","J.R.Forst. & G.Forst.",492 16902,"","Elatostematoides","B.L.Rob.",492 18963,"","Fleurya","Gaudich.",492 10532,"","Forsskaolea","L.",492 10533,"","Gesnouinia","Gaudich.",492 10534,"","Gibbsia","Rendle",492 10535,"","Girardinia","Gaudich.",492 10536,"","Goethartia","Herzog",492 18966,"","Gonostegia","Turcz.",492 10537,"","Gyrotaenia","Griseb.",492 18964,"","Haynea","Schumach. & Thonn.",492 18972,"","Helxine","Bubani",492 10538,"","Hemistylus","Benth.",492 10539,"","Hesperocnide","Torr.",492 10540,"","Hyrtanandra","Miq.",492 10541,"","Laportea","Gaudich.",492 10542,"","Lecanthus","Wedd.",492 10543,"","Leucosyke","Zoll. & Moritzi",492 10544,"","Maoutia","Wedd.",492 18967,"","Memorialis","Buch.-Ham. ex Wedd.",492 10545,"","Meniscogyne","Gagnep.",492 10624,"","Metatrophis","F.Br.",492 18970,"","Misiessya","Wedd.",492 18969,"","Morocarpus","Siebold & Zucc.",492 10546,"","Myriocarpa","Benth.",492 10547,"","Nanocnide","Blume",492 10548,"","Neodistemon","Babu & A.N.Henry",492 10549,"","Neopilea","Leandri",492 10550,"","Neraudia","Gaudich.",492 18971,"","Nesobium","Phil. ex Fuentes",492 10551,"","Nothocnide","Blume ex Chew",492 10552,"","Obetia","Gaudich.",492 10553,"","Oreocnide","Miq.",492 10554,"","Parietaria","L.",492 25185,"","Parsana","Parsa & Maleki",492 18965,"","Pellionia","Gaudich.",492 10555,"","Petelotiella","Gagnep.",492 10556,"","Phenax","Wedd.",492 10557,"","Pilea","Lindl.",492 10558,"","Pipturus","Wedd.",492 10559,"","Pouzolzia","Gaudich.",492 10560,"","Procris","Comm. ex Juss.",492 25404,"","Pseudopipturus","Skottsb.",492 16903,"","Robinsoniodendron","Merr.",492 10561,"","Rousselia","Gaudich.",492 10562,"","Sarcochlamys","Gaudich.",492 10563,"","Sarcopilea","Urb.",492 25403,"","Sceptrocnide","Maxim.",492 10564,"","Smithiella","Dunn",492 10565,"","Soleirolia","Gaudich.",492 18968,"","Sphaerotylos","C.J.Chen",492 10566,"","Touchardia","Gaudich.",492 10567,"","Urera","Gaudich.",492 10568,"","Urtica","L.",492 16904,"","Villebrunea","Gaudich.",492 16461,"","Bistella","Adans.",493 3329,"","Vahlia","Thunb.",493 5537,"","Aligera","Suksd.",494 5538,"","Aretiastrum","(DC.) Spach",494 5539,"","Astrephia","Dufr.",494 5540,"","Belonanthus","Graebn.",494 5541,"","Centranthus","Lam. & DC.",494 5542,"","Fedia","Gaertn.",494 5543,"","Nardostachys","DC.",494 5544,"","Patrinia","Juss.",494 5545,"","Phuodendron","(Graebn.) Dalla Torre & Harms",494 5546,"","Phyllactis","Pers.",494 5547,"","Plectritis","(Lindl.) DC.",494 5548,"","Pseudobetckea","(Hock) Lincz.",494 16863,"","Siphonella","Small",494 5549,"","Stangea","Graebn.",494 5550,"","Valeriana","L.",494 5551,"","Valerianella","Mill.",494 18635,"","Acanthochlamys","P.C.Kao",495 11856,"","Aylthonia","N.L.Menezes",495 11857,"","Barbacenia","Vand.",495 11858,"","Barbaceniopsis","L.B.Sm.",495 25749,"","Burlemarxia","N.L.Menezes & Semir",495 18636,"","Didymocolpus","S.C.Chen",495 25349,"","Nanuza","L.B.Sm. & Ayensu",495 11859,"","Pleurostima","Raf.",495 11860,"","Talbotia","Balf.",495 17768,"","Talbotiopsis","L.B.Sm.",495 11861,"","Vellozia","Vand.",495 11862,"","Xerophyta","Juss.",495 9131,"","Acantholippia","Griseb.",496 9132,"","Adelosa","Blume",496 9133,"","Aegiphila","Jacq.",496 9134,"","Aloysia","Juss.",496 9135,"","Amasonia","L.f.",496 25682,"","Archboldia","E.Beer & H.J.Lam",496 9136,"","Baillonia","Bocq.",496 9137,"","Bouchea","Cham.",496 25683,"","Burroughsia","Moldenke",496 9138,"","Callicarpa","L.",496 19570,"","Cardioteucris","C.Y.Wu",496 9139,"","Caryopteris","Bunge",496 9140,"","Casselia","Nees & Mart.",496 9141,"","Castelia","Cav.",496 9142,"","Chascanum","E.Mey.",496 9207,"","Chloanthes","R.Br.",496 9143,"","Citharexylum","Mill.",496 9144,"","Clerodendrum","L.",496 9145,"","Coelocarpum","Balf.f.",496 9146,"","Congea","Roxb.",496 9147,"","Cornutia","L.",496 9208,"","Cyanostegia","Turcz.",496 9209,"","Denisonia","F.Muell.",496 9210,"","Dicrastylis","J.L.Drumm. ex Harv.",496 9148,"","Dimetra","Kerr",496 9149,"","Diostea","Miers",496 9150,"","Dipyrena","Hook.",496 9151,"","Duranta","L.",496 9152,"","Faradaya","F.Muell.",496 9153,"","Garrettia","H.R.Fletcher",496 16646,"","Geunsia","Blume",496 15909,"","Ghinia","Schreb.",496 9154,"","Glandularia","J.F.Gmel.",496 9155,"","Glossocarya","Wall. ex Griff.",496 9156,"","Gmelina","L.",496 9211,"","Hemiphora","(F.Muell.) F.Muell.",496 17569,"","Hierobotana","Briq.",496 9157,"","Holmskioldia","Retz.",496 25684,"","Hosea","Ridl.",496 9158,"","Hoseanthus","Merr.",496 9159,"","Huxleya","Ewart",496 9160,"","Hymenopyramis","Wall. ex Griff.",496 25685,"","Junellia","Moldenke",496 16647,"","Kalaharia","Baill.",496 22122,"","Karomia","Dop",496 9212,"","Lachnostachys","Hook.",496 9161,"","Lampayo","Phil.",496 9162,"","Lantana","L.",496 9163,"","Lippia","L.",496 8965,"","Macrostegia","Nees",496 9213,"","Mallophora","Endl.",496 9165,"","Monochilus","Fisch. & C.A.Mey.",496 9166,"","Monopyrena","Speg.",496 25686,"","Nashia","Millsp.",496 9167,"","Neorapinia","Moldenke",496 9168,"","Neosparton","Griseb.",496 9214,"","Newcastelia","F.Muell.",496 9169,"","Nyctanthes","L.",496 9170,"","Oncinocalyx","F.Muell.",496 9171,"","Oxera","Labill.",496 9172,"","Paravitex","H.R.Fletcher",496 9173,"","Parodianthus","Tronc.",496 9174,"","Peronema","Jack",496 9175,"","Petitia","Jacq.",496 9176,"","Petraeovitex","Oliv.",496 9177,"","Petrea","L.",496 9178,"","Phyla","Lour.",496 9215,"","Physopsis","Turcz.",496 9179,"","Pitraea","Turcz.",496 9216,"","Pityrodia","R.Br.",496 15960,"","Plexipus","Raf.",496 9180,"","Premna","L.",496 9181,"","Priva","Adans.",496 9182,"","Pseudocarpidium","Millsp.",496 16648,"","Pygmaeopremna","Merr.",496 17984,"","Rapinia","Montrouz.",496 9183,"","Recordia","Moldenke",496 9184,"","Rehdera","Moldenke",496 9185,"","Rhaphithamnus","Miers",496 17986,"","Schizopremna","Baill.",496 25687,"","Schnabelia","Hand.-Mazz.",496 8634,"","Siphoboea","Baill.",496 9217,"","Spartothamnella","Briq.",496 9186,"","Sphenodesme","Jack",496 9187,"","Stachytarpheta","Vahl",496 25689,"","Stylodon","Raf.",496 25501,"","Surfacea","Moldenke",496 9188,"","Svensonia","Moldenke",496 9189,"","Symphorema","Roxb.",496 9190,"","Tamonea","Aubl.",496 17985,"","Tatea","F.Muell.",496 9191,"","Tectona","L.f.",496 9192,"","Teijsmanniodendron","Koord.",496 9193,"","Teucridium","Hook.f.",496 17983,"","Thryothamnus","Phil.",496 9194,"","Tsoongia","Merr.",496 25688,"","Ubochea","Baill.",496 9195,"","Urbania","Phil.",496 9196,"","Verbena","L.",496 9197,"","Verbenoxylum","Tronc.",496 9198,"","Vitex","L.",496 9199,"","Viticipremna","Lam.",496 9200,"","Xeroaloysia","Tronc.",496 16649,"","Xerocarpa","Lam.",496 25690,"","Xolocotzia","Miranda",496 818,"","Acentra","Phil.",497 819,"","Agatea","A.Gray",497 820,"","Agation","Brongn.",497 821,"","Allexis","Pierre",497 17537,"","Alsodeia","Thouars",497 822,"","Amphirrhox","Spreng.",497 823,"","Anchietea","A.St.-Hil.",497 824,"","Clelandia","J.M.Black",497 825,"","Corynostylis","Mart.",497 17538,"","Cubelium","Raf. ex Britton & A.Br.",497 826,"","Decorsella","A.Chev.",497 24700,"","Erpetion","Sweet",497 827,"","Fusispermum","Cuatrec.",497 828,"","Gloeospermum","Triana & Planch.",497 17539,"","Gymnorinorea","Keay",497 829,"","Hybanthus","Jacq.",497 830,"","Hymenanthera","R.Br.",497 17540,"","Ionidium","Vent.",497 831,"","Isodendrion","A.Gray",497 832,"","Leonia","Ruiz & Pav.",497 15912,"","Mayanaea","Lundell",497 833,"","Melicytus","J.R.Forst. & G.Forst.",497 834,"","Noisettia","Kunth",497 15911,"","Orthion","Standl. & Steyerm.",497 835,"","Paypayrola","Aubl.",497 17541,"","Pigea","DC.",497 836,"","Rinorea","Aubl.",497 837,"","Rinoreocarpus","Ducke",497 838,"","Schweiggeria","Spreng.",497 17542,"","Scyphellandra","Thwaites",497 839,"","Viola","L.",497 22139,"","Allobium","Miers",498 10046,"","Arceuthobium","M.Bieb.",498 24216,"","Aspidixia","Tiegh.",498 22138,"","Bifaria","Tiegh.",498 10059,"","Dendrophthora","Eichler",498 24214,"","Distichella","Tiegh.",498 10070,"","Ginalloa","Korth.",498 24215,"","Heterixia","Tiegh.",498 10076,"","Korthalsella","Tiegh.",498 10090,"","Notothixos","Oliv.",498 10099,"","Phoradendron","Nutt.",498 22137,"","Razoumofskia","Hoffm.",498 22140,"","Spiciviscum","Engelm.",498 10124,"","Viscum","L.",498 2229,"","Acareosperma","Gagnep.",499 2230,"","Ampelocissus","Planch.",499 2231,"","Ampelopsis","Michx.",499 2232,"","Cayratia","Juss.",499 2233,"","Cissus","L.",499 2234,"","Clematicissus","Planch.",499 17872,"","Columella","Lour.",499 2235,"","Cyphostemma","(Planch.) Alston",499 17871,"","Landukia","Planch.",499 14297,"","Nothocissus","(Miq.) Latiff",499 2236,"","Parthenocissus","Planch.",499 2237,"","Pterisanthes","Blume",499 2238,"","Pterocissus","Urb. & Ekman",499 2239,"","Rhoicissus","Planch.",499 2240,"","Tetrastigma","(Miq.) Planch.",499 2241,"","Vitis","L.",499 25605,"","Yua","C.L.Li",499 13531,"","Ananthacorus","Underw. & Maxon",500 13532,"","Anetium","Splitg.",500 13533,"","Antrophyum","Kaulf.",500 21676,"","Diclidopteris","Brack.",500 21672,"","Haplopteris","C.Presl",500 13534,"","Hecistopteris","J.Sm.",500 13535,"","Monogramma","Comm. ex Schkuhr",500 21671,"","Oetosis","Neck. ex Greene",500 21675,"","Pleurofossa","Nakai ex H.Ito",500 21668,"","Polytaenium","Desv.",500 21670,"","Pteridanetium","Copel.",500 13524,"","Rheopteris","Alston",500 21669,"","Scoliosorus","T.Moore",500 21673,"","Taeniopsis","J.Sm.",500 21674,"","Taeniopteris","Hook.",500 21677,"","Vaginopteris","Nakai",500 13536,"","Vaginularia","Fee",500 13537,"","Vittaria","Sm.",500 24711,"","Agardhia","Spreng.",501 24712,"","Amphilochia","Mart.",501 964,"","Callisthene","Mart.",501 24714,"","Cucullaria","Schreb.",501 24709,"","Debraea","Roem. & Schult.",501 24710,"","Ditmaria","Spreng.",501 965,"","Erisma","Rudge",501 966,"","Erismadelphus","Mildbr.",501 967,"","Qualea","Aubl.",501 968,"","Ruizterania","Marc.-Berti",501 24715,"","Salmonia","Scop.",501 969,"","Salvertia","A.St.-Hil.",501 24713,"","Schuechia","Endl.",501 24716,"","Strukeria","Vell.",501 24884,"","Vochy","Aubl.",501 970,"","Vochysia","Aubl.",501 13388,"","Welwitschia","Hook.f.",502 91,"","Belliolum","Tiegh.",503 92,"","Bubbia","Tiegh.",503 93,"","Drimys","J.R.Forst. & G.Forst.",503 94,"","Exospermum","Tiegh.",503 95,"","Pseudowintera","Dandy",503 25516,"","Sarcodrimys","(Baill.) Baum.-Bod.",503 24685,"","Takhtajania","Baranova & J.-F.Leroy",503 24682,"","Tasmannia","DC.",503 96,"","Tetrathalamus","Lauterb.",503 24683,"","Wintera","Murray",503 24684,"","Wintera","G.Forst.",503 97,"","Zygogynum","Baill.",503 13572,"","Acystopteris","Nakai",504 13573,"","Adenoderris","J.Sm.",504 21823,"","Allantodia","R.Br.",504 21801,"","Angiopteris","Adans.",504 13575,"","Anisocampium","C.Presl",504 21824,"","Anisogonium","C.Presl",504 21806,"x","Asplenicystopteris","P.Fourn.",504 21816,"","Athyriopsis","Ching",504 13578,"","Athyrium","Roth",504 21829,"","Brachysorus","C.Presl",504 21825,"","Callipteris","Bory",504 21802,"","Calypterium","Bernh.",504 21804,"","Carpogymnia","(H.P.Fuchs ex Janch.) D.Love & A.Love",504 22238,"","Cheilanthopsis","Hieron.",504 21826,"","Cornopteris","Nakai",504 21805,"","Currania","Copel.",504 21807,"","Cyclopteris","Schrad. ex Gray",504 21808,"","Cyste","Dulac",504 21809,"","Cystea","Sm.",504 22239,"","Cystoathyrium","Ching",504 13582,"","Cystopteris","Bernh.",504 21820,"","Deparia","Hook. & Grev.",504 21827,"","Dictyodroma","Ching",504 21830,"","Digrammaria","C.Presl",504 13586,"","Diplaziopsis","C.Chr.",504 13587,"","Diplazium","Sw.",504 21817,"","Dryoathyrium","Ching",504 21810,"","Filicula","Seg.",504 21811,"","Filix","Adans.",504 13591,"","Gymnocarpium","Newman",504 22240,"","Hemidictyum","C.Presl",504 21821,"","Homalosorus","Small ex Pic.Serm.",504 21813,"","Hymenocystis","C.A.Mey.",504 21831,"","Hypochlamys","Fee",504 13594,"","Hypodematium","Kunze",504 13596,"","Kuniwatsukia","Pic.Serm.",504 21832,"","Lotzea","Klotzsch & H.Karst.",504 13601,"","Lunathyrium","Koidz.",504 13602,"","Matteuccia","Tod.",504 21838,"","Microchlaena","Ching",504 21833,"","Microstegia","C.Presl",504 21828,"","Monomelangium","Hayata",504 25701,"","Neoathyrium","Ching & Z.R.Wang",504 21834,"","Ochlogramma","C.Presl",504 13605,"","Onoclea","L.",504 13606,"","Onocleopsis","Ballard",504 21835,"","Oxygonium","C.Presl",504 21818,"","Parathyrium","Holttum",504 21795,"","Pentarhizidium","Hayata",504 21814,"","Physematium","Kaulf.",504 21812,"","Protowoodsia","Ching",504 21822,"","Pseudathyrium","Newman",504 21819,"","Pseudocystopteris","Ching",504 21796,"","Pteretis","Hayata",504 21836,"","Pteriglyphis","Fee",504 21798,"","Pterilis","Raf.",504 21799,"","Pterinodes","Siegesb. ex Kuntze",504 21803,"","Ragiopteris","C.Presl",504 21837,"","Rhachidosorus","Ching",504 23062,"","Rhizomatopteris","Khokhr.",504 21800,"","Riediea","Mirb.",504 21797,"","Struthiopteris","Willd.",504 25708,"","Triblemma","(J.Sm.) Ching",504 21815,"","Trichocyclus","Dulac",504 22237,"","Trichoneuron","Ching",504 13623,"","Woodsia","R.Br.",504 12113,"","Xanthorrhoea","Sm.",505 12127,"","Abolboda","Bonpl.",506 12128,"","Achlyphila","Maguire & Wurdack",506 25336,"","Aratitiyopea","Steyerm.",506 12129,"","Orectanthe","Maguire",506 12130,"","Xyris","L.",506 13449,"","Ceratozamia","Brongn.",507 25296,"","Chigua","D.W.Stev.",507 13450,"","Dioon","Lindl.",507 13451,"","Encephalartos","Lehm.",507 13452,"","Lepidozamia","Regel",507 13453,"","Macrozamia","Miq.",507 13454,"","Microcycas","(Miq.) A.DC.",507 13455,"","Zamia","L.",507 12574,"","Althenia","F.Petit",508 12578,"","Lepilaena","J.L.Drumm. ex Harv.",508 25556,"","Vleisia","Toml. & Posl.",508 12582,"","Zannichellia","L.",508 11527,"","Achasma","Griff.",509 18802,"","Adelmeria","Ridl.",509 11528,"","Aframomum","K.Schum.",509 24393,"","Albina","Giseke",509 11529,"","Alpinia","Roxb.",509 11530,"","Amomum","Roxb.",509 11531,"","Aulotandra","Gagnep.",509 11532,"","Boesenbergia","Kuntze",509 11533,"","Brachychilum","(R.Br. ex Wall.) Petersen",509 24394,"","Buekia","Giseke",509 11534,"","Burbidgea","Hook.f.",509 11535,"","Camptandra","Ridl.",509 11536,"","Carenophila","Ridl.",509 18803,"","Catimbium","Juss.",509 11537,"","Caulokaempferia","K.Larsen",509 11538,"","Cautleya","(Benth.) Hook.f.",509 11539,"","Cenolophon","Blume",509 18798,"","Cienkowskia","Schweinf.",509 18797,"","Cienkowskiella","Y.K.Kam",509 16916,"","Conamomum","Ridl.",509 11540,"","Curcuma","L.",509 11541,"","Curcumorpha","A.S.Rao & D.M.Verma",509 11542,"","Cyphostigma","Benth.",509 11543,"","Elettaria","Maton",509 11544,"","Elettariopsis","Baker",509 18804,"","Elmeria","Ridl.",509 18805,"","Eriolopha","Ridl.",509 16222,"","Etlingera","Giseke",509 11545,"","Gagnepainia","K.Schum.",509 18799,"","Gastrochilus","Wall.",509 11546,"","Geanthus","Reinw.",509 11547,"","Geocharis","(K.Schum.) Ridl.",509 11548,"","Geostachys","(Baker) Ridl.",509 11549,"","Globba","L.",509 18806,"","Guillainia","Ridl.",509 11550,"","Haniffia","Holttum",509 11551,"","Haplochorema","K.Schum.",509 11552,"","Hedychium","J.Konig",509 24397,"","Hellenia","Willd.",509 18807,"","Hellwigia","Warb.",509 11553,"","Hemiorchis","Kurz",509 11554,"","Hitchenia","Wall.",509 18800,"","Hitcheniopsis","(Baker) Ridl.",509 11555,"","Hornstedtia","Retz.",509 11556,"","Kaempferia","L.",509 24396,"","Kolowratia","C.Presl",509 18808,"","Languas","J.Konig ex Small",509 11557,"","Leptosolena","C.Presl",509 11558,"","Mantisia","Sims",509 24395,"","Martensia","Giseke",509 11559,"","Nanochilus","K.Schum.",509 11560,"","Nicolaia","Horan.",509 11561,"","Odontychium","K.Schum.",509 24391,"","Paracautleya","R.M.Sm.",509 11562,"","Parakaempferia","A.S.Rao & D.M.Verma",509 23079,"","Paramomum","S.Q.Tong",509 18801,"","Phaeomeria","Lindl. ex K.Schum.",509 11563,"","Plagiostachys","Ridl.",509 25759,"","Pleuranthodium","(K.Schum.) R.M.Sm.",509 11564,"","Pommereschea","Wittm.",509 18809,"","Psychanthus","(K.Schum.) Ridl.",509 24692,"","Pyrgophyllum","(Gagnep.) T.L.Wu & Z.Y.Chen",509 11565,"","Renealmia","L.f.",509 11566,"","Rhynchanthus","Hook.f.",509 11567,"","Riedelia","Oliv.",509 11568,"","Roscoea","Sm.",509 11569,"","Scaphochlamys","Baker",509 11570,"","Siliquamomum","Baill.",509 11571,"","Siphonochilus","J.M.Wood & Franks",509 24392,"","Stadiochilus","R.M.Sm.",509 11572,"","Stahlianthus","Kuntze",509 24399,"","Strobidia","Miq.",509 11573,"","Thylacophora","Ridl.",509 11574,"","Vanoverberghia","Merr.",509 24398,"","Zerumbet","J.C.Wendl.",509 11575,"","Zingiber","Boehm.",509 12583,"","Heterozostera","(Setch.) Hartog",510 12584,"","Phyllospadix","Hook.",510 12585,"","Zostera","L.",510 1625,"","Augea","Thunb.",511 1626,"","Bulnesia","Gay",511 17791,"","Chitonia","Moc. & Sesse",511 24377,"","Covillea","Vail",511 24374,"","Ehrenbergia","Mart.",511 1627,"","Fagonia","L.",511 18634,"","Gonoptera","Turcz.",511 1628,"","Guaiacum","L.",511 25833,"","Guajacum","L.",511 1629,"","Kallstroemia","Scop.",511 1630,"","Kelleronia","Schinz",511 1631,"","Larrea","Cav.",511 1632,"","Malacocarpus","Fisch. & C.A.Mey.",511 1633,"","Metharme","Phil. ex Engl.",511 1634,"","Miltianthus","Bunge",511 1635,"","Morkillia","Rose & Painter",511 1636,"","Neoluederitzia","Schinz",511 24376,"","Neoschroetera","Briq.",511 1637,"","Nitraria","L.",511 1638,"","Peganum","L.",511 1639,"","Pintoa","Gay",511 1640,"","Plectrocarpa","Gillies ex Hook. & Arn.",511 1641,"","Porlieria","Ruiz & Pav.",511 24379,"","Roepera","A.Juss.",511 1642,"","Sarcozygium","Bunge",511 24375,"","Schroeterella","Briq.",511 1643,"","Seetzenia","R.Br. ex Decne.",511 1644,"","Sericodes","A.Gray",511 1645,"","Sisyndite","E.Mey. ex Sond.",511 1646,"","Tetradiclis","Steven ex M.Bieb.",511 1647,"","Tetraena","Maxim.",511 24378,"","Tribulopis","R.Br.",511 17735,"","Tribulopsis","R.Br.",511 1648,"","Tribulus","L.",511 1649,"","Viscainoa","Greene",511 1650,"","Zygophyllum","L.",511 bauble-0.9.7/bauble/plugins/plants/test.py0000644000175000017500000005631711237043105017560 0ustar brettbrett# -*- coding: utf-8 -*- # # test.py # # Description: test for the Plant plugin # import os import sys import unittest from sqlalchemy import * from sqlalchemy.exc import * from sqlalchemy.orm.exc import * import bauble import bauble.utils as utils from bauble.utils.log import debug from bauble.plugins.plants.species import * from bauble.plugins.plants.family import * from bauble.plugins.plants.genus import * from bauble.plugins.plants.geography import * from bauble.test import BaubleTestCase # # TODO: things to create tests for # # - test schema cascading works for all tables in the plants module # - test unicode is working properly in the relevant fields, especially # in the Species.str function # - test the setting the default vernacular name on a species is working # and that delete vernacular names and default vernacular names does # proper cascading # make sure that deleting either of the species referred to in a synonym # deletes the synonym # TODO: create more species name test cases # TODO: create some scenarios that should fail family_test_data = ({'id': 1, 'family': 'Orchidaceae'}, {'id': 2, 'family': 'Leguminosae'}, {'id': 3, 'family': 'Polypodiaceae'}) genus_test_data = ({'id': 1, 'genus': 'Maxillaria', 'family_id': 1}, {'id': 2, 'genus': 'Encyclia', 'family_id': 1}, {'id': 3, 'genus': 'Abrus', 'family_id': 2}, {'id': 4, 'genus': 'Campyloneurum', 'family_id': 3}, ) species_test_data = ({'id': 1, 'sp': u'variabilis', 'genus_id': 1, 'sp_author': u'Bateman ex Lindl.'}, {'id': 2, 'sp': u'cochleata', 'genus_id': 2, 'sp_author': u'(L.) Lem\xe9e'}, {'id': 3, 'sp': u'precatorius', 'genus_id': 3, 'sp_author': u'L.'}, {'id': 4, 'sp': u'alapense', 'genus_id': 4, 'sp_hybrid': u'x', 'sp_author': u'F\xe9e'}, {'id': 5, 'sp': u'cochleata', 'genus_id': 2, 'sp_author': u'(L.) Lem\xe9e', 'infrasp_rank': u'var.', 'infrasp': u'cochleata'}, {'id': 6, 'sp': u'cochleata', 'genus_id': 2, 'sp_author': u'(L.) Lem\xe9e', 'infrasp_rank': u'cv.', 'infrasp': u'Black Night'}, {'id': 7, 'sp': u'precatorius', 'genus_id': 3, 'sp_author': u'L.', 'cv_group': u'SomethingRidiculous'}, {'id': 8, 'sp': u'precatorius', 'genus_id': 3, 'sp_author': u'L.', 'infrasp_rank': u'cv.', 'infrasp': u'Hot Rio Nights', 'cv_group': u'SomethingRidiculous'}, {'id': 9, 'sp': u'generalis', 'genus_id': 1, 'sp_hybrid': u'x', 'infrasp_rank': u'cv.', 'infrasp': u'Red'}, {'id': 10, 'sp': u'generalis', 'genus_id': 1, 'sp_hybrid': u'x', 'sp_author': u'L.', 'infrasp_rank': u'cv.', 'infrasp': u'Red', 'cv_group': u'SomeGroup'}, ) species_str_map = {\ 1: 'Maxillaria variabilis', 2: 'Encyclia cochleata', 3: 'Abrus precatorius', 4: 'Campyloneurum x alapense', 5: 'Encyclia cochleata var. cochleata', 6: "Encyclia cochleata 'Black Night'", 7: 'Abrus precatorius SomethingRidiculous Group', 8: "Abrus precatorius (SomethingRidiculous Group) 'Hot Rio Nights'", 9: "Maxillaria x generalis 'Red'", 10:"Maxillaria x generalis (SomeGroup Group) 'Red'" } species_markup_map = {\ 1: 'Maxillaria variabilis', 2: 'Encyclia cochleata', 3: 'Abrus precatorius', 4: 'Campyloneurum x alapense', 5: 'Encyclia cochleata var. cochleata', 6: 'Encyclia cochleata \'Black Night\''} species_str_authors_map = {\ 1: 'Maxillaria variabilis Bateman ex Lindl.', 2: u'Encyclia cochleata (L.) Lem\xe9e', 3: 'Abrus precatorius L.', 4: u'Campyloneurum x alapense F\xe9e', 5: u'Encyclia cochleata (L.) Lem\xe9e var. cochleata', 6: u'Encyclia cochleata (L.) Lem\xe9e \'Black Night\''} species_markup_authors_map = {\ 1: 'Maxillaria variabilis Bateman ex Lindl.', 2: u'Encyclia cochleata (L.) Lem\xe9e', 3: 'Abrus precatorius L.', 4: u'Campyloneurum x alapense F\xe9e', 5: u'Encyclia cochleata (L.) Lem\xe9e var. cochleata', 6: u'Encyclia cochleata (L.) Lem\xe9e \'Black Night\''} sp_synonym_test_data = ({'id': 1, 'synonym_id': 1, 'species_id': 2}, ) vn_test_data = ({'id': 1, 'name': u'SomeName', 'language': u'English', 'species_id': 1}, {'id': 2, 'name': u'SomeName 2', 'language': u'English', 'species_id': 1}, ) test_data_table_control = ((Family, family_test_data), (Genus, genus_test_data), (Species, species_test_data), (VernacularName, vn_test_data), (SpeciesSynonym, sp_synonym_test_data)) def setUp_data(): """ bauble.plugins.plants.test.setUp_test_data() if this method is called again before tearDown_test_data is called you will get an error about the test data rows already existing in the database """ for mapper, data in test_data_table_control: table = mapper.__table__ for row in data: table.insert().execute(row).close() for col in table.c: utils.reset_sequence(col) class PlantTestCase(BaubleTestCase): def __init__(self, *args): super(PlantTestCase, self).__init__(*args) def setUp(self): super(PlantTestCase, self).setUp() setUp_data() class FamilyTests(PlantTestCase): """ Test for Family and FamilySynonym """ def test_cascades(self): """ Test that cascading is set up properly """ family = Family(family=u'family') genus = Genus(family=family, genus=u'genus') self.session.add_all([family, genus]) self.session.commit() # test that deleting a family deletes an orphaned genus self.session.delete(family) self.session.commit() query = self.session.query(Genus).filter_by(family_id=family.id) self.assertRaises(NoResultFound, query.one) def test_synonyms(self): """ Test that Family.synonyms works correctly """ family = Family(family=u'family') family2 = Family(family=u'family2') family.synonyms.append(family2) self.session.add_all([family, family2]) self.session.commit() # test that family2 was added as a synonym to family family = self.session.query(Family).filter_by(family=u'family').one() self.assert_(family2 in family.synonyms) # test that the synonyms relation and family backref works self.assert_(family._synonyms[0].family == family) self.assert_(family._synonyms[0].synonym == family2) # test that the synonyms are removed properly family.synonyms.remove(family2) self.session.commit() self.assert_(family2 not in family.synonyms) # test synonyms contraints, e.g that a family cannot have the # same synonym twice family.synonyms.append(family2) self.session.commit() family.synonyms.append(family2) self.assertRaises(IntegrityError, self.session.commit) self.session.rollback() # test that clearing all the synonyms works family.synonyms.clear() self.session.commit() self.assert_(len(family.synonyms) == 0) self.assert_(self.session.query(FamilySynonym).count() == 0) # test that deleting a family that is a synonym of another family # deletes all the dangling object s family.synonyms.append(family2) self.session.commit() self.session.delete(family2) self.session.commit() self.assert_(self.session.query(FamilySynonym).count() == 0) # test that deleting the previous synonyms didn't delete the # family that it refered to self.assert_(self.session.query(Family).get(family.id)) # test that deleting a family that has synonyms deletes all # the synonyms that refer to that family deletes all the family2 = Family(family=u'family2') self.session.add(family2) family.synonyms.append(family2) self.session.commit() self.session.delete(family) self.session.commit() self.assert_(self.session.query(FamilySynonym).count() == 0) def test_constraints(self): """ Test that the family constraints were created correctly """ values = [dict(family=u'family'), dict(family=u'family', qualifier=u's. lat.')] for v in values: self.session.add(Family(**v)) self.session.add(Family(**v)) self.assertRaises(IntegrityError, self.session.commit) self.session.rollback() # test that family cannot be null self.session.add(Family(family=None)) self.assertRaises(IntegrityError, self.session.commit) self.session.rollback() def test_str(self): """ Test that the family str function works as expected """ f = Family() self.assert_(str(f) == repr(f)) f = Family(family=u'fam') self.assert_(str(f) == 'fam') f.qualifier = 's. lat.' self.assert_(str(f) == 'fam s. lat.') def itest_family_editor(self): """ Interactively test the PlantEditor """ #loc = self.create(Family, site=u'some site') fam = Family(family='some family') editor = FamilyEditor(model=fam) editor.start() del editor assert utils.gc_objects_by_type('FamilyEditor') == [], \ 'FamilyEditor not deleted' assert utils.gc_objects_by_type('FamilyEditorPresenter') == [], \ 'FamilyEditorPresenter not deleted' assert utils.gc_objects_by_type('FamilyEditorView') == [], \ 'FamilyEditorView not deleted' class GenusTests(PlantTestCase): def test_synonyms(self): family = Family(family=u'family') genus = Genus(family=family, genus=u'genus') genus2 = Genus(family=family, genus=u'genus2') genus.synonyms.append(genus2) self.session.add_all([genus, genus2]) self.session.commit() # test that genus2 was added as a synonym to genus genus = self.session.query(Genus).filter_by(genus=u'genus').one() self.assert_(genus2 in genus.synonyms) # test that the synonyms relation and genus backref works self.assert_(genus._synonyms[0].genus == genus) self.assert_(genus._synonyms[0].synonym == genus2) # test that the synonyms are removed properly genus.synonyms.remove(genus2) self.session.commit() self.assert_(genus2 not in genus.synonyms) # test synonyms contraints, e.g that a genus cannot have the # same synonym twice genus.synonyms.append(genus2) self.session.commit() genus.synonyms.append(genus2) self.assertRaises(IntegrityError, self.session.commit) self.session.rollback() # test that clearing all the synonyms works genus.synonyms.clear() self.session.commit() self.assert_(len(genus.synonyms) == 0) self.assert_(self.session.query(GenusSynonym).count() == 0) # test that deleting a genus that is a synonym of another genus # deletes all the dangling objects genus.synonyms.append(genus2) self.session.commit() self.session.delete(genus2) self.session.commit() self.assert_(self.session.query(GenusSynonym).count() == 0) # test that deleting the previous synonyms didn't delete the # genus that it refered to self.assert_(self.session.query(Genus).get(genus.id)) # test that deleting a genus that has synonyms deletes all # the synonyms that refer to that genus genus2 = Genus(family=family, genus=u'genus2') self.session.add(genus2) genus.synonyms.append(genus2) self.session.commit() self.session.delete(genus) self.session.commit() self.assert_(self.session.query(GenusSynonym).count() == 0) def test_contraints(self): """ Test that the genus constraints were created correctly """ family = Family(family=u'family') self.session.add(family) # if any of these values are inserted twice they should raise # an IntegrityError because the UniqueConstraint on Genus values = [dict(family=family, genus=u'genus'), dict(family=family, genus=u'genus', author=u'author'), dict(family=family, genus=u'genus', hybrid=u'x'), dict(family=family, genus=u'genus', hybrid=u'x', author=u'author')] for v in values: self.session.add(Genus(**v)) self.session.add(Genus(**v)) self.assertRaises(IntegrityError, self.session.commit) self.session.rollback() def test_str(self): """ Test that the Genus string functions works as expected """ pass def itest_genus_editor(self): """ Interactively test the PlantEditor """ #loc = self.create(Genus, site=u'some site') fam = self.session.query(Family).get(1) gen = Genus(genus='some genus', family=fam) gen2 = Genus(genus='genus2', family=fam) gen.synonyms.append(gen2) editor = GenusEditor(model=gen) editor.start() del editor assert utils.gc_objects_by_type('GenusEditor') == [], \ 'GenusEditor not deleted' assert utils.gc_objects_by_type('GenusEditorPresenter') == [], \ 'GenusEditorPresenter not deleted' assert utils.gc_objects_by_type('GenusEditorView') == [], \ 'GenusEditorView not deleted' class SpeciesTests(PlantTestCase): def setUp(self): super(SpeciesTests, self).setUp() def tearDown(self): super(SpeciesTests, self).tearDown() def itest_species_editor(self): f = Family(family=u'family') g = Genus(genus=u'genus', family=f) self.session.add(g) self.session.commit() sp = Species(genus=g) e = SpeciesEditor(model=sp) e.start() del e assert utils.gc_objects_by_type('SpeciesEditor') == [], \ 'SpeciesEditor not deleted' assert utils.gc_objects_by_type('SpeciesEditorPresenter') == [], \ 'SpeciesEditorPresenter not deleted' assert utils.gc_objects_by_type('SpeciesEditorView') == [], \ 'SpeciesEditorView not deleted' def test_string(self): """ Test the Species.str() method """ def get_sp_str(id, **kwargs): return Species.str(self.session.query(Species).get(id), **kwargs) for id, s in species_str_map.iteritems(): spstr = get_sp_str(id) self.assert_(spstr == s, '"%s" != "%s" ** %s' % (spstr, s, unicode(spstr))) for id, s in species_str_authors_map.iteritems(): spstr = get_sp_str(id, authors=True) self.assert_(spstr == s, '%s != %s ** %s' % (spstr, s, unicode(spstr))) for id, s in species_markup_map.iteritems(): spstr = get_sp_str(id, markup=True) self.assert_(spstr == s, '%s != %s ** %s' % (spstr, s, unicode(spstr))) for id, s in species_markup_authors_map.iteritems(): spstr = get_sp_str(id, markup=True, authors=True) self.assert_(spstr == s, '%s != %s ** %s' % (spstr, s, unicode(spstr))) def test_vernacular_name(self): """ Test the Species.vernacular_name property """ family = Family(family=u'family') genus = Genus(family=family, genus=u'genus') sp = Species(genus=genus, sp=u'sp') self.session.add_all([family, genus, sp]) self.session.commit() # add a name vn = VernacularName(name=u'name') sp.vernacular_names.append(vn) self.session.commit() self.assert_(vn in sp.vernacular_names) # test that removing a name removes deleted orphaned objects sp.vernacular_names.remove(vn) self.session.commit() q = self.session.query(VernacularName).filter_by(species_id=sp.id) self.assertRaises(NoResultFound, q.one) def test_default_vernacular_name(self): """ Test the Species.default_vernacular_name property """ family = Family(family=u'family') genus = Genus(family=family, genus=u'genus') sp = Species(genus=genus, sp=u'sp') vn = VernacularName(name=u'name') sp.vernacular_names.append(vn) self.session.add_all([family, genus, sp, vn]) self.session.commit() # test that setting the default vernacular names default = VernacularName(name=u'default') sp.default_vernacular_name = default self.session.commit() self.assert_(vn in sp.vernacular_names) self.assert_(sp.default_vernacular_name == default) # test that set_attr work on default vernacular name default = VernacularName(name=u'default') setattr(sp, 'default_vernacular_name', default) self.session.commit() self.assert_(vn in sp.vernacular_names) self.assert_(sp.default_vernacular_name == default) # test that if you set the default_vernacular_name on a # species then it automatically adds it to vernacular_names default = VernacularName(name=u'default') sp.default_vernacular_name = default self.session.commit() self.assert_(vn in sp.vernacular_names) self.assert_(sp.default_vernacular_name == default) # test that removing a vernacular name removes it from # default_vernacular_name, this test also effectively tests VNList dvid = sp._default_vernacular_name.id sp.vernacular_names.remove(default) self.session.commit() self.assertEquals(sp.default_vernacular_name, None) q = self.session.query(DefaultVernacularName) self.assertRaises(NoResultFound, q.filter_by(species_id=sp.id).one) self.assertRaises(NoResultFound, q.filter_by(id=dvid).one) # test that setting default_vernacular_name to None # removes the name properly and deletes any orphaned objects sp.vernacular_names.append(vn) sp.default_vernacular_name = vn self.session.commit() dvid = sp._default_vernacular_name.id sp.default_vernacular_name = None self.session.commit() q = self.session.query(DefaultVernacularName) self.assertRaises(NoResultFound, q.filter_by(species_id=sp.id).one) self.assertRaises(NoResultFound, q.filter_by(id=dvid).one) # test that calling __del__ on a default vernacular name removes it sp.default_vernacular_name = vn self.session.commit() dvid = sp._default_vernacular_name.id del sp.default_vernacular_name self.session.commit() self.assertEquals(sp.default_vernacular_name, None) q = self.session.query(DefaultVernacularName) self.assertRaises(NoResultFound, q.filter_by(species_id=sp.id).one) self.assertRaises(NoResultFound, q.filter_by(id=dvid).one) # test for regression in bug Launchpad #123286 vn1 = VernacularName(name=u'vn1') vn2 = VernacularName(name=u'vn2') sp.default_vernacular_name = vn1 sp.default_vernacular_name = vn2 self.session.commit() def test_synonyms(self): """ Test the Species.synonyms property """ load_sp = lambda id: self.session.query(Species).get(id) def syn_str(id1, id2, isit='not'): sp1 = load_sp(id1) sp2 = load_sp(id2) return '%s(%s).synonyms: %s' % \ (sp1, sp1.id, str(map(lambda s: '%s(%s)' % \ (s, s.id), sp1.synonyms))) def synonym_of(id1, id2): sp1 = load_sp(id1) sp2 = load_sp(id2) return sp2 in sp1.synonyms # test that appending a synonym works using species.synonyms sp1 = load_sp(1) sp2 = load_sp(2) sp1.synonyms.append(sp2) self.session.flush() self.assert_(synonym_of(1, 2), syn_str(1, 2)) # test that removing a synonyms works using species.synonyms sp1.synonyms.remove(sp2) self.session.flush() self.failIf(synonym_of(1, 2), syn_str(1, 2)) self.session.expunge_all() # test that appending a synonym works using species._synonyms sp1 = load_sp(1) sp2 = load_sp(2) syn = SpeciesSynonym(sp2) sp1._synonyms.append(syn) self.session.flush() self.assert_(synonym_of(1, 2), syn_str(1, 2)) # test that removing a synonyms works using species._synonyms sp1._synonyms.remove(syn) self.session.flush() self.failIf(synonym_of(1, 2), syn_str(1, 2)) # test adding a species and then immediately remove it self.session.expunge_all() sp1 = load_sp(1) sp2 = load_sp(2) sp1.synonyms.append(sp2) sp1.synonyms.remove(sp2) #self.session.flush() self.session.commit() assert sp2 not in sp1.synonyms # add a species and immediately add the same species sp2 = load_sp(2) sp1.synonyms.append(sp2) sp1.synonyms.remove(sp2) sp1.synonyms.append(sp2) #self.session.flush() # shouldn't raise an error self.session.commit() assert sp2 in sp1.synonyms # test that deleting a species removes it from the synonyms list assert sp2 in sp1.synonyms self.session.delete(sp2) self.session.commit() assert sp2 not in sp1.synonyms self.session.expunge_all() class GeographyTests(PlantTestCase): def test(self): pass # TODO: maybe the following could be in a seperate file called # profile.py or something that would profile everything in the plants # module #def main(): # from optparse import OptionParser # parser = OptionParser() # parser.add_option('-v', '--verbose', dest='verbose', action='store_true', # help='verbose output') # parser.add_option('-p', '--profile', dest='profile', action='store_true', # help='print run times') # options, args = parser.parse_args() # # import profile # import time # if options.profile: # t1 = time.time() # #profile.run('test_speciesStr()') # profile.run('profile()') # t2 = time.time() # print 'time: %s' % (t2-t1) # else: # print 'starting tests...' # test_speciesStr(options.verbose) # print 'done.' # # #if __name__ == '__main__': # main() bauble-0.9.7/bauble/plugins/imex/0000755000175000017500000000000011310570250015652 5ustar brettbrettbauble-0.9.7/bauble/plugins/imex/postgres.py0000755000175000017500000000110611210626427020102 0ustar brettbrett# # postgres.py # # Description: handle importing and exporting data into a postgres database # using Postgres' native import commands # # TODO: get the data from an XML export and use and XSL transform to transform # the data into a format that Postgres understands # TODO: on import we need to determine the type of the data or it need to be # explicitly set so we know if we need to transform the XML, or what the CSV # delimeters are or if its just a straight dump that needs to be imported #COPY command. copy zip_codes from '/path/to/csv/ZIP_CODES.txt' DELIMITERS ',' CSV; bauble-0.9.7/bauble/plugins/imex/csv_.py0000755000175000017500000007401111235053143017167 0ustar brettbrett# # csv import/export # # Description: have to name this module csv_ in order to avoid conflict # with the system csv module # import os import csv import traceback import gtk import gobject from sqlalchemy import * import bauble import bauble.db as db from bauble.error import BaubleError import bauble.utils as utils import bauble.pluginmgr as plugin import bauble.task from bauble.utils.log import log, debug, error from sqlalchemy.sql.util import sort_tables # TODO: i've also had a problem with bad insert statements, e.g. importing a # geography table after creating a new database and it doesn't use the # 'name' column in the insert so there is an error, if you then import the # same table immediately after then everything seems to work fine # TODO: should check that if we're dropping a table because of a # dependency that we expect that data to be imported in this same # task, or at least let the user know that the table is empty # TODO: don't ask if we want to drop empty tables # https://bugs.launchpad.net/bauble/+bug/103923 # TODO: allow the user set the unicode encoding on import, exports should # always us UTF-8, import, exports should always use UTF-8, need to figure # out how to extend the file open dialog, # http://evanjones.ca/python-utf8.html # import codecs # fileObj = codecs.open( "someFile", "r", "utf-8" ) # u = fileObj.read() # Returns a Unicode string from the UTF-8 bytes in # the file # TODO: what happens when you export from one database type and try # and import into a different database, e.g. postgres->sqlite QUOTE_STYLE = csv.QUOTE_MINIMAL QUOTE_CHAR = '"' def pb_set_fraction(fraction): """ provides a safe way to handle the progress bar if the gui isn't started, we use this in the tests where there is not gui """ if bauble.gui is not None and bauble.gui.progressbar is not None: bauble.gui.progressbar.set_fraction(fraction) class UnicodeReader(object): def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): self.reader = csv.DictReader(f, dialect=dialect, **kwds) self.encoding = encoding def next(self): row = self.reader.next() t = {} for k, v in row.iteritems(): if v == '': t[k] = None else: t[k] = utils.to_unicode(v, self.encoding) return t def __iter__(self): return self # TODO: UnicodeWriter needs to be more thoroughly needs to be more # tested, i came across a small problem once when createing a tempory # geography table from _topsort_file and it exported the numbers in # some strange format class UnicodeWriter(object): def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): self.writer = csv.writer(f, dialect=dialect, **kwds) self.encoding = encoding def writerow(self, row): if isinstance(row, dict): row = row.values() t = [] for s in row: if s == None: t.append(None) else: t.append(utils.to_unicode(s, self.encoding)) #debug(t) self.writer.writerow(t) def writerows(self, rows): for row in rows: self.writerow(row) class Importer(object): def start(self, **kwargs): ''' start the import process, this is a non blocking method, queue the process as a bauble task ''' return bauble.task.queue(self.run, self.on_quit, self.on_error, **kwargs) def on_quit(self): pass def on_error(self, exc): pass def run(self, **kwargs): ''' where all the action happens ''' raise NotImplementedError class CSVImporter(Importer): """ The CSVImporter imports comma seperated value files into a Bauble database. The CSVImporter imports the rows of the CSV file in chunks rather than one row at a time. The non-server side column defaults are determined before the INSERT statement is generated instead of getting new defaults for each row. This shouldn't be a problem but it also means that your column default should change depending on the value of previously inserted rows. """ def __init__(self): super(CSVImporter, self).__init__() self.__error = False # flag to indicate error on import self.__cancel = False # flag to cancel importing self.__pause = False # flag to pause importing self.__error_exc = False def on_error(self, exc): debug('CSVImporter.on_error()') # TODO: this won't show the dialog properly since the GUI can't update, # the dialog won't have any decorations utils.message_details_dialog(utils.xml_safe_utf8(exc), traceback.format_exc(), gtk.MESSAGE_ERROR) def start(self, filenames=None, metadata=None, force=False, on_quit=None, on_error=None): ''' start the import process, this is a non blocking method queue the process as a bauble task ''' if metadata is None: metadata = db.metadata # use the default metadata if filenames is None: filenames = self._get_filenames() if filenames is None: return # self.on_quit isn't implemented but we include it here because # the imex tests use it if on_quit is None: on_quit = self.on_quit if on_error is None: on_error = self.on_error bauble.task.queue(self.run, on_quit, on_error, filenames, metadata, force) @staticmethod def _toposort_file(filename, key_pairs): """ filename: the csv file to sort key_pairs: tuples of the form (parent, child) where for each line in the file the line[parent] needs to be sorted before any of the line[child]. parent is usually the name of the foreign_key column and child is usually the column that the foreign key points to, e.g ('parent_id', 'id') """ f = open(filename, 'rb') reader = UnicodeReader(f, quotechar=QUOTE_CHAR, quoting=QUOTE_STYLE) # create a dictionary of the lines mapped to the child field bychild = {} for line in reader: for parent, child in key_pairs: bychild[line[child]] = line f.close() fields = reader.reader.fieldnames del reader # create pairs from the values in the lines where pair[0] # should come before pair[1] when the lines are sorted pairs = [] for line in bychild.values(): for parent, child in key_pairs: if line[parent] and line[child]: pairs.append((line[parent], line[child])) # sort the keys and flatten the lines back into a list sorted_keys = utils.topological_sort(bychild.keys(), pairs) sorted_lines = [] for key in sorted_keys: sorted_lines.append(bychild[key]) # write a temporary file of the sorted lines import tempfile tmppath = tempfile.mkdtemp() head, tail = os.path.split(filename) filename = os.path.join(tmppath, tail) tmpfile = open(filename, 'wb') tmpfile.write('%s\n' % ','.join(fields)) #writer = UnicodeWriter(tmpfile, fields, quotechar=QUOTE_CHAR, writer = csv.DictWriter(tmpfile, fields, quotechar=QUOTE_CHAR, quoting=QUOTE_STYLE) writer.writerows(sorted_lines) tmpfile.flush() tmpfile.close() del writer return filename def run(self, filenames, metadata, force=False): ''' A generator method for importing filenames into the database. This method periodically yields control so that the GUI can update. @params filenames: @param metadata: @param force: default=False ''' transaction = None connection = None self.__error_exc = BaubleError(_('Unknown Error.')) try: # user a contextual connect in case whoever called this # method called it inside a transaction then we can pick # up the parent connection and the transaction connection = metadata.bind.connect() transaction = connection.begin() except Exception, e: msg = _('Error connecting to database.\n\n%s') % \ utils.xml_safe_utf8(e) utils.message_dialog(msg, gtk.MESSAGE_ERROR) return # create a mapping of table names to filenames filename_dict = {} for f in filenames: path, base = os.path.split(f) table_name, ext = os.path.splitext(base) if table_name in filename_dict: safe = utils.xml_safe_utf8 values = dict(table_name=safe(table_name), file_name=safe(filename_dict[table_name]), file_name2=safe(f)) msg = _('More than one file given to import into table '\ '%(table_name)s: %(file_name)s, '\ '(file_name2)s') % values utils.message_dialog(msg, gtk.MESSAGE_ERROR) return filename_dict[table_name] = f # resolve filenames to table names and return them in sorted order sorted_tables = [] for table in metadata.sorted_tables: try: sorted_tables.insert(0, (table, filename_dict.pop(table.name))) except KeyError, e: # table.name not in list of filenames pass if len(filename_dict) > 0: msg = _('Could not match all filenames to table names.\n\n%s') \ % filename_dict utils.message_dialog(msg, gtk.MESSAGE_ERROR) return total_lines = 0 filesizes = {} for filename in filenames: #get the total number of lines for all the files nlines = len(open(filename).readlines()) filesizes[filename] = nlines total_lines += nlines created_tables = [] def create_table(table): table.create(bind=connection) if table.name not in created_tables: created_tables.append(table.name) # created_tables.extend([n for n in names \ # if n not in created_tables]) steps_so_far = 0 cleaned = None insert = None depends = set() # the type will be changed to a [] later try: # get all the dependencies for table, filename in sorted_tables: #debug(table.name) d = utils.find_dependent_tables(table) depends.update(list(d)) # drop all of the dependencies together if len(depends) > 0: if not force: msg = _('In order to import the files the following '\ 'tables will need to be dropped:' \ '\n\n%s\n\n' \ 'Would you like to continue?' \ % ', '.join(sorted([d.name for d in depends]))) response = utils.yes_no_dialog(msg) else: response = True if response and len(depends)>0: # debug('dropping: %s' \ # % ', '.join([d.name for d in depends])) metadata.drop_all(bind=connection, tables=depends) else: # user doesn't want to drop dependencies so we just quit return # commit the dependency drops transaction.commit() transaction = connection.begin() # update_every determines how many rows we will insert at # a time and consequently how often we update the gui update_every = 127 # import the tables one at a time, breaking every so often # so the GUI can update for table, filename in reversed(sorted_tables): if self.__cancel or self.__error: break msg = _('importing %(table)s table from %(filename)s') \ % {'table': table.name, 'filename': filename} #log.info(msg) #debug(msg) bauble.task.set_message(msg) yield # allow progress bar update # don't do anything if the file is empty: if filesizes[filename] <= 1: if not table.exists(): create_table(table) continue # check if the table was in the depends because they # could have been dropped whereas table.exists() can # return true for a dropped table if the transaction # hasn't been committed if table in depends or not table.exists(): #log.info('%s does not exist. creating.' % table.name) #debug('%s does not exist. creating.' % table.name) create_table(table) elif table.name not in created_tables and table not in depends: # we get here if the table wasn't previously # dropped because it was a dependency of another # table if not force: msg = _('The %s table already exists in the '\ 'database and may contain some data. If a '\ 'row the import file has the same id as a ' 'row in the database then the file will not '\ 'import correctly.\n\nWould you like to ' 'drop the table in the database first. You '\ 'will lose the data in your database if you '\ 'do this?') % table.name response = utils.yes_no_dialog(msg) else: response = True if response: #debug('drop %s' % table.name) table.drop(bind=connection) create_table(table) if self.__cancel or self.__error: break # commit the drop of the table we're importing transaction.commit() transaction = connection.begin() # open a temporary reader to get the column keys so we # can later precompile our insert statement f = open(filename, "rb") tmp = UnicodeReader(f, quotechar=QUOTE_CHAR, quoting=QUOTE_STYLE) tmp.next() csv_columns = set(tmp.reader.fieldnames) del tmp f.close() # precompute the defaults...this assumes that the # default function doesn't depend on state after each # row...it shouldn't anyways since we do an insert # many instead of each row at a time defaults = {} for column in table.c: if isinstance(column.default, ColumnDefault): defaults[column.name] = column.default.execute() column_names = table.c.keys() # check if there are any foreign keys to on the table # that refer to itself, if so create a new file with # the lines sorted in order of dependency so that we # don't get errors about imporint values into a # foreign_key that don't reference and existin row self_keys = filter(lambda f: f.column.table==table, \ table.foreign_keys) if self_keys: key_pairs = map(lambda x: (x.parent.name, x.column.name), self_keys) filename = self._toposort_file(filename, key_pairs) # the column keys for the insert are a union of the # columns in the CSV file and the columns with # defaults column_keys = list(csv_columns.union(defaults.keys())) insert = table.insert(bind=connection).\ compile(column_keys=column_keys) values = [] def do_insert(): if values: connection.execute(insert, *values) del values[:] percent = float(steps_so_far)/float(total_lines) if 0 < percent < 1.0: # avoid warning if bauble.gui is not None: pb_set_fraction(percent) isempty = lambda v: v in ('', None) f = open(filename, "rb") reader = UnicodeReader(f, quotechar=QUOTE_CHAR, quoting=QUOTE_STYLE) # NOTE: we shouldn't get this far if the file doesn't # have any rows to import but if so there is a chance # that this loop could cause problems # debug('importing %s' % filename) for line in reader: while self.__pause: yield if self.__cancel or self.__error: break # fill in default values and None for "empty" # columns in line for column in table.c.keys(): if column in defaults \ and (column not in line \ or isempty(line[column])): line[column] = defaults[column] elif column in line and isempty(line[column]): line[column] = None elif column in line and line[column] == 'False' and \ isinstance(table.c[column].type, Boolean): # in SA 0.5.5 and only on an SQLite # database the 'False' will import as True # for some reason whereas True will import # as True automatically line[column] = False values.append(line) steps_so_far += 1 if steps_so_far % update_every == 0: do_insert() yield if self.__error or self.__cancel: break # insert the remainder that were less than update every do_insert() # we have commit after create after each table is imported # or Postgres will complain if two tables that are # being imported have a foreign key relationship transaction.commit() #debug('%s: %s' % (table.name, table.select().alias().count().execute().fetchone()[0])) transaction = connection.begin() #debug('creating: %s' % ', '.join([d.name for d in depends])) # TODO: need to get those tables from depends that need to # be created but weren't created already metadata.create_all(connection, depends, checkfirst=True) except (bauble.task.TaskQuitting, GeneratorExit), e: transaction.rollback() raise except Exception, e: error(e) error(traceback.format_exc()) transaction.rollback() self.__error = True self.__error_exc = e raise else: transaction.commit() # unfortunately inserting an explicit value into a column that # has a sequence doesn't update the sequence, we shortcut this # by setting the sequence manually to the max(column)+1 col = None try: for table, filename in sorted_tables: for col in table.c: utils.reset_sequence(col) except Exception, e: col_name = None try: col_name = col.name except Exception: pass msg = _('Error: Could not set the sequence for column: %s') \ % col_name utils.message_details_dialog(_(utils.xml_safe_utf8(msg)), traceback.format_exc(), type=gtk.MESSAGE_ERROR) # TODO: we don't use the progress dialog any more but we'll leave this # around to remind us when we support cancelling via the progress statusbar # # def _cancel_import(self, *args): # ''' # called by the progress dialog to cancel the current import # ''' # msg = _('Are you sure you want to cancel importing?\n\nAll ' # 'changes so far will be rolled back.') # self.__pause = True # if utils.yes_no_dialog(msg, parent=self.__progress_dialog): # self.__cancel = True ## self.__pause = False def _get_filenames(self): def on_selection_changed(filechooser, data=None): """ only make the ok button sensitive if the selection is a file """ f = filechooser.get_preview_filename() if f is None: return ok = filechooser.action_area.get_children()[1] ok.set_sensitive(os.path.isfile(f)) fc = gtk.FileChooserDialog(_("Choose file(s) to import..."), None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) fc.set_select_multiple(True) fc.connect("selection-changed", on_selection_changed) r = fc.run() if r != gtk.RESPONSE_ACCEPT: fc.destroy() return None filenames = fc.get_filenames() fc.destroy() return filenames def on_response(self, widget, response, data=None): debug('on_response') debug(response) # TODO: add support for exporting only specific tables class CSVExporter(object): def start(self, path=None): if path == None: d = gtk.FileChooserDialog(_("Select a directory"), None, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) response = d.run() path = d.get_filename() d.destroy() if response != gtk.RESPONSE_ACCEPT: return if not os.path.exists(path): raise ValueError(_("CSVExporter: path does not exist.\n%s" % path)) def on_error(exc): """ The default error handler. """ #debug(exc) #debug(type(exc)) error(exc) if not isinstance(exc, (GeneratorExit, bauble.task.TaskQuitting)): utils.message_dialog(utils.xml_safe_utf8(exc), gtk.MESSAGE_ERROR) try: # TODO: should we support exporting other metadata # besides db.metadata bauble.task.queue(self.__export_task, None, on_error, path) except Exception, e: debug(e) def __export_task(self, path): # if not os.path.exists(path): # raise ValueError("CSVExporter: path does not exist.\n" + path) filename_template = os.path.join(path, "%s.txt") # timeout = tasklet.WaitForTimeout(12) steps_so_far = 0 ntables = 0 for table in db.metadata.sorted_tables: ntables += 1 filename = filename_template % table.name if os.path.exists(filename): msg = _('Export file %(filename)s for '\ '%(table)s table already exists.\n\nWould '\ 'you like to continue?') \ % {'filename': filename, 'table': table.name} if utils.yes_no_dialog(msg): return def replace(s): if isinstance(s, (str, unicode)): s.replace('\n', '\\n') return s def write_csv(filename, rows): f = open(filename, 'wb') #writer = csv.writer(f, quotechar=QUOTE_CHAR, quoting=QUOTE_STYLE) writer = UnicodeWriter(f, quotechar=QUOTE_CHAR,quoting=QUOTE_STYLE) writer.writerows(rows) f.close() update_every = 30 for table in db.metadata.sorted_tables: filename = filename_template % table.name steps_so_far+=1 fraction = float(steps_so_far)/float(ntables) pb_set_fraction(fraction) msg = _('exporting %(table)s table to %(filename)s') \ % {'table': table.name, 'filename': filename} bauble.task.set_message(msg) #log.info("exporting %s" % table.name) # get the data results = table.select().execute().fetchall() # create empty files with only the column names if len(results) == 0: write_csv(filename, [table.c.keys()]) yield #yield timeout #tasklet.get_event() continue rows = [] rows.append(table.c.keys()) # append col names ctr = 0 for row in results: values = map(replace, row.values()) rows.append(values) if ctr == update_every: yield #yield timeout #tasklet.get_event() ctr=0 ctr += 1 write_csv(filename, rows) class CSVImportCommandHandler(plugin.CommandHandler): command = 'imcsv' def __call__(self, arg): importer = CSVImporter() importer.start(arg) class CSVExportCommandHandler(plugin.CommandHandler): command = 'excsv' def __call__(self, arg): exporter = CSVExporter() exporter.start(arg) # # plugin classes # class CSVImportTool(plugin.Tool): category = _('Import') label = _('Comma Separated Value') @classmethod def start(cls): msg = _('It is possible that importing data into this database could '\ 'destroy or corrupt your existing data.\n\nWould you '\ 'like to continue?') if utils.yes_no_dialog(msg): c = CSVImporter() c.start() # TODO: need to reset the tags menu after an import to make sure # we pick up any new tags20 class CSVExportTool(plugin.Tool): category = _('Export') label = _('Comma Separated Value') @classmethod def start(cls): c = CSVExporter() c.start() # TODO: importing from the command line isn't finished, i think the only thing # that really need to be done for it to work is to create a gobject.mainloop() # or implement blocking in the importer to have it's own mainloop #def main(): # # should allow you to export or import from a database from the # # command line, you would just have to pass the connection uri # # and the name of the directory to export to # # TODO: allow -i for import, -e for export # # TODO: need to pass in a database connection string # # postgres://bbg:garden@ceiba.test # # # TODO: ****** i think the only reason this isn't working is because of using the # # connection manager so we can either 1. figure out how to use the connection # # manager from a tasklet or 2. don't use the connection manager and get # # connection paramaters from the command line including the passwd # # import sys # from sqlobject import sqlhub, connectionForURI # from bauble.conn_mgr import ConnectionManager#Dialog # from bauble.prefs import prefs # from optparse import OptionParser # parser = OptionParser() # parser.add_option('--force', dest='force', action='store_true', # default=False, help='force import') # parser.add_option('-c', '--connection', dest='conn', # help='named connection from prefs') # options, args = parser.parse_args() # # if len(args) == 0: # print '** Error: need a list of files to import' # return # # prefs.init() # intialize the preferences # # if options.conn is None: # default_conn = prefs[prefs.conn_default_pref] # cm = ConnectionManager(default_conn) # conn_name, uri = cm.start() # if conn_name is None: return # else: # params = prefs[prefs.conn_list_pref][options.conn] # uri = ConnectionManager().parameters_to_uri(params) # # sqlhub.processConnection = connectionForURI(uri) # sqlhub.processConnection.getConnection() # sqlhub.processConnection = sqlhub.processConnection.transaction() # # if not options.force: # msg = 'Importing to this connection (%s) will destroy any existing data '\ # ' in the database. Are you sure this is what you want to do? ' % uri # response = raw_input(msg) # if response not in ('Y', 'y'): # return ## if not utils.yes_no_dialog(msg): ## return # # # check that the database version are the same # from bauble._app import BaubleApp # BaubleApp.open_database(uri) # # bauble.plugins.load() # importer = CSVImporter() # print 'importing....' # importer.start(args, force=options.force) # sqlhub.processConnection.commit() # print '...finished importing' #if __name__ == "__main__": # tasklet.run(main()) # gtk.main() bauble-0.9.7/bauble/plugins/imex/sqlite.py0000755000175000017500000000102711210626427017537 0ustar brettbrett# # sqlite.py # # Description: handle importing and exporting data into a SQLite database using # SQLite native import commands # # TODO: get the data from an XML export and use and XSL transform to transform # the data into a format that SQLite understands # use .separator, .import def import_csv(connection, filename, table, delimiter=','): ''' ''' # CRAP: this isn't supported from 3.0 onward connection.execute('COPY %s FROM %s USING DELIMITERS %s' % \ (table.name, filename, delimiter)) bauble-0.9.7/bauble/plugins/imex/__init__.py0000755000175000017500000000251111210626427017774 0ustar brettbrett# # imex plugin # # Description: plugin to provide importing and exporting # # TODO: would be best to provide some intermediate format so that we could # transform from any format to another import os, csv, traceback import gtk.gdk, gobject from sqlalchemy import * import bauble import bauble.utils as utils import bauble.pluginmgr as pluginmgr import bauble.task from bauble.utils.log import log, debug import Queue from bauble.plugins.imex.csv_ import CSVImportTool, CSVExportTool, \ CSVExportCommandHandler, CSVImportCommandHandler from bauble.plugins.imex.xml import XMLExportTool, XMLExportCommandHandler # TODO: it might be best to do something like the reporter plugin so # that this plugin provides a generic interface for importing and exporting # and let the different tools provide the settings which are then passed to # their start() methods # see http://www.postgresql.org/docs/current/static/sql-copy.html # NOTE: always beware when writing an imex plugin not to used the # table.insert().execute(*list) statement or it will fill in values for # missing columns so that all columns will have some value class ImexPlugin(pluginmgr.Plugin): tools = [CSVImportTool, CSVExportTool, XMLExportTool] commands = [CSVExportCommandHandler, CSVImportCommandHandler, XMLExportCommandHandler] plugin = ImexPlugin bauble-0.9.7/bauble/plugins/imex/test.py0000644000175000017500000003247711235047045017227 0ustar brettbrett# -*- coding: utf-8 -*- # # test imex plugins # import csv import logging import os import shutil import tempfile from sqlalchemy import * import bauble import bauble.db as db from bauble.plugins.plants import Family, Geography import bauble.plugins.garden.test as garden_test import bauble.plugins.plants.test as plants_test from bauble.plugins.imex.csv_ import CSVImporter, CSVExporter, QUOTE_CHAR, \ QUOTE_STYLE, UnicodeReader, UnicodeWriter from bauble.test import BaubleTestCase from bauble.utils.log import debug # TODO: test that when we export data we get what we expect # TODO: test that importing and then exporting gives the same data # TODO: test that exporting and then importing gives the same data # TODO: test XMLExporter # TODO: needs tests for UnicodeWriter and UnicodeReader, i'm pretty # sure they are buggy, see the python csv module for examples of how # they do a non-dict unicode reader/writer csv_test_data = ({}) family_data = [{'id': 1, 'family': u'family1', 'notes': u'Gal\xe1pagos', 'qualifier': None}, {'id': 2, 'family': u'family2'}, {'id': 3, 'family': u'family3', 'notes': u''}, ] class ImexTestCase(BaubleTestCase): def __init__(self, *args): super(ImexTestCase, self).__init__(*args) def setUp(self): super(ImexTestCase, self).setUp() plants_test.setUp_data() garden_test.setUp_data() class TestImporter(CSVImporter): def on_error(self, exc): debug(exc) raise class CSVTests(ImexTestCase): def setUp(self): self.path = tempfile.mkdtemp() super(CSVTests, self).setUp() def tearDown(self): shutil.rmtree(self.path) super(CSVTests, self).tearDown() def _do_import(self, data): """ Write data to family.txt and import into Family """ filename = os.path.join(self.path, 'family.txt') f = open(filename, 'wb') format = {'delimiter': ',', 'quoting': QUOTE_STYLE, 'quotechar': QUOTE_CHAR} fields = data[0].keys() f.write('%s\n' % ','.join(fields)) writer = csv.DictWriter(f, fields, **format) writer.writerows(data) f.flush() f.close() importer = TestImporter() importer.start([filename], force=True) def test_import_self_referential_table(self): """ Test tables that are self-referenial are import in order. """ geo_data = [{'id': 3, 'name': u'3', 'parent_id': 1}, {'id': 1, 'name': u'1', 'parent_id': None}, {'id': 2, 'name': u'2', 'parent_id': 1}, ] filename = os.path.join(self.path, 'geography.txt') f = open(filename, 'wb') format = {'delimiter': ',', 'quoting': QUOTE_STYLE, 'quotechar': QUOTE_CHAR} fields = geo_data[0].keys() f.write('%s\n' % ','.join(fields)) f.flush() writer = csv.DictWriter(f, fields, **format) writer.writerows(geo_data) f.flush() f.close() importer = TestImporter() importer.start([filename], force=True) def test_import_bool_column(self): """ """ class Test(db.Base): __tablename__ = 'test' id = Column(Integer, primary_key=True) col1 = Column(Boolean, default=False) table = Test.__table__ table.create(bind=db.engine) data = [{'id': 1, 'col1': u'True'}, {'id': 2, 'col1': u'False'}, {'id': 3, 'col1': u''}, ] filename = os.path.join(self.path, 'test.txt') f = open(filename, 'wb') format = {'delimiter': ',', 'quoting': QUOTE_STYLE, 'quotechar': QUOTE_CHAR} fields = data[0].keys() f.write('%s\n' % ','.join(fields)) f.flush() writer = csv.DictWriter(f, fields, **format) writer.writerows(data) f.flush() f.close() importer = TestImporter() importer.start([filename], force=True) t = self.session.query(Test).get(1) self.assert_(t.col1==True) t = self.session.query(Test).get(2) self.assert_(t.col1==False) t = self.session.query(Test).get(3) self.assert_(t.col1==False) table.drop(bind=db.engine) def test_with_open_connection(self): """ Test that the import doesn't stall if we have a connection open to Family while importing to the family table """ list(self.session.query(Family)) self._do_import(family_data) list(self.session.query(Family)) def test_import_use_default(self): """ Test that if we import from a csv file that doesn't include a column and that column has a default value then that default value is executed. """ self._do_import(family_data) self.session = db.Session() family = self.session.query(Family).filter_by(id=1).one() self.assert_(family.qualifier == '') def test_import_use_default(self): """ Test that if we import from a csv file that doesn't include a column and that column has a default value then that default value is executed. """ q = self.session.query(Family) ids = [r.id for r in q] del q self.session.expunge_all() #self.session.close() #debug([f.id for f in self.session.query(Family)]) #self.session.clear() self._do_import(family_data) self.session = db.Session() family = self.session.query(Family).filter_by(id=1).one() self.assert_(family.qualifier == '') #raise def test_import_no_default(self): """ Test that if we import from a csv file that doesn't include a column and that column does not have a default value then that value is set to None """ self._do_import(family_data) family = self.session.query(Family).filter_by(id=2).one() self.assert_(family.notes is None) def test_import_empty_is_none(self): """ Test that if we import from a csv file that includes a column but that column is empty and doesn't have a default values then the column is set to None """ self._do_import(family_data) family = self.session.query(Family).filter_by(id=2).one() self.assert_(family.notes is None) def test_import_empty_uses_default(self): """ Test that if we import from a csv file that includes a column but that column is empty and has a default then the default is executed. """ self._do_import(family_data) family = self.session.query(Family).filter_by(id=3).one() self.assert_(family.qualifier == '') def test_sequences(self): """ Test that the sequences are set correctly after an import, bauble.util.test already has a method to test utils.reset_sequence but this test makes sure that its works correctly after an import """ # turn off logger logging.getLogger('bauble.info').setLevel(logging.ERROR) self._do_import(family_data) highest_id = len(family_data) currval = None conn = db.engine.connect() if db.engine.name == 'postgres': stmt = "SELECT currval('family_id_seq');" nextval = conn.execute(stmt).fetchone()[0] elif db.engine.name == 'sqlite': # max(id) isn't really safe in production use but is ok for a test stmt = "SELECT max(id) from family;" nextval = conn.execute(stmt).fetchone()[0] + 1 else: raise "no test for engine type: %s" % db.engine.name #debug(list(conn.execute("SELECT * FROM family").fetchall())) maxid = conn.execute("SELECT max(id) FROM family").fetchone()[0] assert nextval > highest_id, \ "bad sequence: highest_id(%s) > nexval(%s) -- %s" % \ (highest_id, nextval, maxid) def test_import_unicode(self): """ Test importing a unicode string. """ self._do_import(family_data) family = self.session.query(Family).filter_by(id=1).one() self.assert_(family.notes == family_data[0]['notes']) def test_import_no_inherit(self): """ Test importing a row with None doesn't inherit from previous row. """ self._do_import(family_data) query = self.session.query(Family) self.assert_(query[1].notes != query[0].notes, (query[1].notes,query[0].notes)) def test_export_none_is_empty(self): """ Test the exporting a None column exports a '' """ family = Family(family=u'family') from tempfile import mkdtemp temp_path = mkdtemp() exporter = CSVExporter() exporter.start(temp_path) f = open(os.path.join(temp_path, 'family.txt')) reader = csv.DictReader(f, dialect=csv.excel) row = reader.next() self.assert_(row['notes'] == '') # class CSVTests(ImexTestCase): # def test_sequences(self): # """ # Test that the sequences are set correctly after an import, # bauble.util.test already has a method to test # utils.reset_sequence but this test makes sure that its works # correctly after an import # This test requires the PlantPlugin # """ # # turn off logger # logging.getLogger('bauble.info').setLevel(logging.ERROR) # # import the family data # from bauble.plugins.plants.family import Family # from bauble.plugins.plants import PlantsPlugin # filename = os.path.join('bauble', 'plugins', 'plants', 'default', # 'family.txt') # importer = CSVImporter() # importer.start([filename], force=True) # # the highest id number in the family file is assumed to be # # num(lines)-1 since the id numbers are sequential and # # subtract for the file header # highest_id = len(open(filename).readlines())-1 # currval = None # conn = db.engine.contextual_connect() # if db.engine.name == 'postgres': # stmt = "SELECT currval('family_id_seq');" # currval = conn.execute(stmt).fetchone()[0] # elif db.engine.name == 'sqlite': # # max(id) isn't really safe in production use but is ok for a test # stmt = "SELECT max(id) from family;" # nextval = conn.execute(stmt).fetchone()[0] + 1 # else: # raise "no test for engine type: %s" % db.engine.name # #debug(list(conn.execute("SELECT * FROM family").fetchall())) # maxid = conn.execute("SELECT max(id) FROM family").fetchone()[0] # assert nextval > highest_id, \ # "bad sequence: highest_id(%s) > nexval(%s) -- %s" % \ # (highest_id, nextval, maxid) # def test_import(self): # # TODO: create a test to check that we aren't using an insert # # statement for import that assumes a column value from the previous # # insert values, could probably create an insert statement from a # # row in the test data and then create an insert statement from some # # other dummy data that has different columns from the test data and # # see if any of the columns from the second insert statement has values # # from the first statement # # TODO: this test doesn't really test yet that any of the data was # # correctly imported or exported, only that export and importing # # run successfuly # # 1. write the test data to a temporary file or files # # 2. import the data and make sure the objects match field for field # # the exporters and importers show logging information, turn it off # import bauble.utils as utils # logging.getLogger('bauble.info').setLevel(logging.ERROR) # import tempfile # tempdir = tempfile.mkdtemp() # # export all the testdata # exporter = CSVExporter() # exporter.start(tempdir) # # import all the files in the temp directory # filenames = os.listdir(tempdir) # importer = CSVImporter() # # import twice to check for regression Launchpad #??? # importer.start([os.path.join(tempdir, name) for name in filenames], # force=True) # importer.start([os.path.join(tempdir, name) for name in filenames], # force=True) # # utils.log.echo(False) # def test_unicode(self): # from bauble.plugins.plants.geography import Geography # geography_table = Geography.__table__ # # u'Gal\xe1pagos' is the unencoded unicode object, # # calling u.encode('utf-8') will convert the \xe1 to the a # # with an accent # data = {'name': u'Gal\xe1pagos'} # geography_table.insert().execute(data) # query = self.session.query(Geography) # row = query[0] # ## print str(row) # ## print data['name'] # assert row.name == data['name'] # def test_export(self): # # 1. export the test data # # 2. read the exported data into memory and make sure its matches # # the test export string # pass bauble-0.9.7/bauble/plugins/imex/xml.py0000755000175000017500000001076411210626427017046 0ustar brettbrett# # XML import/export plugin # # Description: handle import and exporting from a simple XML format # import os import csv import traceback import gtk.gdk import gobject from sqlalchemy import * import bauble import bauble.db as db import bauble.utils as utils import bauble.pluginmgr as pluginmgr import bauble.task from bauble.utils import xml_safe from bauble.utils.log import log, debug # # # # # ... # # #
# # # TODO: single file or one file per table def ElementFactory(parent, name, **kwargs): try: text = kwargs.pop('text') except KeyError: text = None el = etree.SubElement(parent, name, **kwargs) try: if text is not None: el.text = unicode(text, 'utf8') except (AssertionError, TypeError), e: el.text = unicode(str(text), 'utf8') return el class XMLExporter: def __init__(self): pass def start(self, path=None): d = gtk.Dialog('Bauble - XML Exporter', bauble.gui.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) box = gtk.VBox(spacing=20) d.vbox.pack_start(box, padding=10) file_chooser = gtk.FileChooserButton(_('Select a directory')) file_chooser.set_select_multiple(False) file_chooser.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) box.pack_start(file_chooser) check = gtk.CheckButton(_('Save all data in one file')) check.set_active(True) box.pack_start(check) d.connect('response', self.on_dialog_response, file_chooser.get_filename(), check.get_active()) d.show_all() d.run() d.hide() def on_dialog_response(self, dialog, response, filename, one_file): debug('on_dialog_response(%s, %s)' % (filename, one_file)) if response == gtk.RESPONSE_ACCEPT: self.__export_task(filename, one_file) dialog.destroy() def __export_task(self, path, one_file=True): ntables = len(db.metadata.tables) steps_so_far = 0 if not one_file: tableset_el = etree.Element('tableset') for table_name, table in tables.iteritems(): if one_file: tableset_el = etree.Element('tableset') log.info('exporting %s...' % table_name) table_el = ElementFactory(tableset_el, 'table', attrib={'name': table_name}) results = table.select().execute().fetchall() columns = table.c.keys() try: for row in results: row_el = ElementFactory(table_el, 'row') for col in columns: ElementFactory(row_el, 'column', attrib={'name': col}, text=row[col]) except ValueError, e: utils.message_details_dialog(utils.xml_safe_utf8(e), traceback.format_exc(), gtk.MESSAGE_ERROR) return else: if one_file: tree = etree.ElementTree(tableset_el) filename = os.path.join(path, '%s.xml' % table_name) # TODO: can figure out why this keeps crashing tree.write(filename, encoding='utf8', xml_declaration=True) if not one_file: tree = etree.ElementTree(tableset_el) filename = os.path.join(path, 'bauble.xml') tree.write(filename, encoding='utf8', xml_declaration=True) class XMLExportCommandHandler(pluginmgr.CommandHandler): command = 'exxml' def __call__(self, arg): debug('XMLExportCommandHandler(%s)' % arg) exporter = XMLExporter() debug('starting') exporter.start(arg) debug('started') class XMLExportTool(pluginmgr.Tool): category = "Export" label = "XML" @classmethod def start(cls): c = XMLExporter() c.start() class XMLImexPlugin(pluginmgr.Plugin): tools = [XMLExportTool] commands = [XMLExportCommandHandler] try: import lxml.etree as etree except ImportError: utils.message_dialog('The lxml package is required for the '\ 'XML Import/Exporter plugin') bauble-0.9.7/bauble/plugins/garden/0000755000175000017500000000000011310570250016150 5ustar brettbrettbauble-0.9.7/bauble/plugins/garden/plant_infobox.glade0000644000175000017500000002471111210626427022024 0ustar brettbrett general_window True True True 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 5 -- True False False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 5 -- True False False 1 False False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 -- False False 1 False False 5 True 3 2 15 8 True 0 -- True 1 2 2 3 True 0 -- True 1 2 1 2 True 1 <b>Accession Type:</b> True 2 3 GTK_FILL True 1 <b>Accession Status:</b> True 1 2 GTK_FILL True 1 0 <b>Location:</b> True GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 0 -- True 1 2 GTK_FILL False False 1 window1 True True True True True 5 GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC GTK_SHADOW_IN True True False GTK_WRAP_WORD False bauble-0.9.7/bauble/plugins/garden/donor.py0000755000175000017500000002530011301104270017641 0ustar brettbrett# # donor.py # import os import sys from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.exc import SQLError import bauble import bauble.db as db from bauble.editor import * import bauble.paths as paths from bauble.types import Enum from bauble.plugins.garden.source import Donation def edit_callback(value): e = DonorEditor(model=value) return e.start() != None def remove_callback(value): s = '%s: %s' % (value.__class__.__name__, str(value)) msg = _("Are you sure you want to remove %s?") % utils.xml_safe_utf8(s) if not utils.yes_no_dialog(msg): return try: session = bauble.Session() obj = session.query(Donor).get(value.id) session.delete(obj) session.commit() except Exception, e: msg = _('Could not delete.\n\n%s') % utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), type=gtk.MESSAGE_ERROR) finally: session.close() return True donor_context_menu = [('Edit', edit_callback), ('--', None), ('Remove', remove_callback)] # TODO: make sure that you can't delete the donor if donations exist, this # should have a test # TODO: show list of donations given by donor if searching for the donor name # in the search view # TODO: the donor_type could be either be character codes or possible a foreign # key into another table class Donor(db.Base): __tablename__ = 'donor' __mapper_args__ = {'order_by': 'name'} # columns name = Column(Unicode(72), unique=True, nullable=False) donor_type = Column('donor_type', Enum(values=['Expedition', "Gene bank", "Botanic Garden or Arboretum", "Research/Field Station", "Staff member", "University Department", "Horticultural Association/Garden Club", "Municipal department", "Nursery/Commercial", "Individual", "Other", "Unknown", None]), default=None) address = Column(UnicodeText) email = Column(Unicode(128)) fax = Column(Unicode(64)) tel = Column(Unicode(64)) notes = Column(UnicodeText) # relations: donations = relation(Donation, backref=backref('donor', uselist=False)) def __str__(self): return self.name class DonorEditorView(GenericEditorView): # i think the field names are pretty self explanatory and tooltips # would be pointless _tooltips = {} def __init__(self, parent=None): super(DonorEditorView, self).__init__(os.path.join(paths.lib_dir(), 'plugins', 'garden', 'editors.glade'), parent=parent) self.dialog = self.widgets.donor_dialog self.set_accept_buttons_sensitive(False) self.connect_dialog_close(self.dialog) if sys.platform == 'win32': import pango combo = self.widgets.don_type_combo context = combo.get_pango_context() font_metrics = context.get_metrics(context.get_font_description(), context.get_language()) width = font_metrics.get_approximate_char_width() new_width = pango.PIXELS(width) * 20 combo.set_size_request(new_width, -1) def set_accept_buttons_sensitive(self, sensitive): self.widgets.don_ok_button.set_sensitive(sensitive) self.widgets.don_next_button.set_sensitive(sensitive) def start(self): return self.dialog.run() class DonorEditorPresenter(GenericEditorPresenter): widget_to_field_map = {'don_name_entry': 'name', 'don_type_combo': 'donor_type', 'don_address_textview': 'address', 'don_email_entry': 'email', 'don_tel_entry': 'tel', 'don_fax_entry': 'fax' } def __init__(self, model, view): super(DonorEditorPresenter, self).__init__(model, view) model = gtk.ListStore(str) self.init_enum_combo('don_type_combo', 'donor_type', none_str='') self.refresh_view() validator = UnicodeOrNoneValidator() for widget, field in self.widget_to_field_map.iteritems(): self.assign_simple_handler(widget, field, validator) self.__dirty = False def set_model_attr(self, field, value, validator=None): super(DonorEditorPresenter, self).set_model_attr(field, value, validator) self.__dirty = True self.view.set_accept_buttons_sensitive(True) def dirty(self): return self.__dirty def refresh_view(self): for widget, field in self.widget_to_field_map.iteritems(): # debug('donor refresh(%s, %s=%s)' % (widget, field, # self.model[field])) self.view.set_widget_value(widget, getattr(self.model, field)) def start(self): r = self.view.start() return r # TODO: need to create a widget to edit the notes class DonorEditor(GenericModelViewPresenterEditor): label = 'Donor' mnemonic_label = '_Donor' RESPONSE_NEXT = 11 ok_responses = (RESPONSE_NEXT,) def __init__(self, model=None, parent=None): ''' @param model: Donor instance or None @param values to enter in the model if none are give ''' if model is None: model = Donor() super(DonorEditor, self).__init__(model, parent) self.parent = parent self._committed = [] def handle_response(self, response): ''' handle the response from self.presenter.start() in self.start() ''' not_ok_msg = _('Are you sure you want to lose your changes?') if response == gtk.RESPONSE_OK or response in self.ok_responses: try: if self.presenter.dirty(): self.commit_changes() self._committed.append(self.model) except SQLError, e: msg = _('Error committing changes.\n\n%s' \ % utils.xml_safe_utf8(e.orig)) utils.message_details_dialog(msg, str(e), gtk.MESSAGE_ERROR) return False except Exception, e: msg = _('Unknown error when committing changes. See the '\ 'details for more information.\n\n%s' \ % utils.xml_safe_utf8(e)) utils.message_details_dialog(msg, traceback.format_exc(), gtk.MESSAGE_ERROR) return False elif self.presenter.dirty() and utils.yes_no_dialog(not_ok_msg) \ or not self.presenter.dirty(): self.session.rollback() return True else: return False # respond to responses more_committed = None if response == self.RESPONSE_NEXT: self.presenter.cleanup() e = DonorEditor(parent=self.parent) more_committed = e.start() if more_committed is not None: self._committed.append(more_committed) return True def start(self): self.view = DonorEditorView(parent=self.parent) self.presenter = DonorEditorPresenter(self.model, self.view) # add quick response keys dialog = self.view.dialog self.attach_response(dialog, gtk.RESPONSE_OK, 'Return', gtk.gdk.CONTROL_MASK) self.attach_response(dialog, self.RESPONSE_NEXT, 'n', gtk.gdk.CONTROL_MASK) while True: response = self.presenter.start() self.view.save_state() # should view or presenter save state if self.handle_response(response): break self.session.close() # cleanup session self.presenter.cleanup() return self._committed from bauble.view import InfoBox, InfoExpander class GeneralDonorExpander(InfoExpander): ''' displays name, number of donations, address, email, fax, tel, type of donor ''' def __init__(self, widgets): super(GeneralDonorExpander, self).__init__(_('General'), widgets) gen_box = self.widgets.don_gen_box self.widgets.remove_parent(gen_box) self.vbox.pack_start(gen_box) def update(self, row): from textwrap import TextWrapper wrapper = TextWrapper(width=50, subsequent_indent=' ') self.set_widget_value('don_name_data', '%s' % \ utils.xml_safe(wrapper.fill(str(row.name)))) self.set_widget_value('don_address_data', row.address) self.set_widget_value('don_email_data', row.email) self.set_widget_value('don_tel_data', row.tel) self.set_widget_value('don_fax_data', row.fax) session = bauble.Session() ndons = session.query(Donation).join('donor').\ filter_by(id=row.id).count() self.set_widget_value('don_ndons_data', ndons) class NotesExpander(InfoExpander): """ displays notes about the donor """ def __init__(self, widgets): super(NotesExpander, self).__init__("Notes", widgets) notes_box = self.widgets.don_notes_box self.widgets.remove_parent(notes_box) self.vbox.pack_start(notes_box) def update(self, row): if row.notes is None: self.set_sensitive(False) self.set_expanded(False) else: # TODO: get expanded state from prefs self.set_sensitive(True) self.set_widget_value('don_notes_data', row.notes) class DonorInfoBox(InfoBox): def __init__(self): super(DonorInfoBox, self).__init__() glade_file = os.path.join(paths.lib_dir(), "plugins", "garden", "infoboxes.glade") self.widgets = utils.GladeWidgets(gtk.glade.XML(glade_file)) self.general = GeneralDonorExpander(self.widgets) self.add_expander(self.general) self.notes = NotesExpander(self.widgets) self.add_expander(self.notes) def update(self, row): self.general.update(row) self.notes.update(row) bauble-0.9.7/bauble/plugins/garden/accession.py0000755000175000017500000023652311302533445020515 0ustar brettbrett# -*- coding: utf-8 -*- # # accessions module # import sys import re import os import weakref import traceback from random import random from datetime import datetime import xml.sax.saxutils as saxutils from decimal import Decimal, ROUND_DOWN import gtk import gobject from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.orm.session import object_session from sqlalchemy.exc import SQLError import bauble import bauble.db as db from bauble.error import check import bauble.utils as utils import bauble.paths as paths from bauble.editor import * from bauble.utils.log import debug from bauble.prefs import prefs from bauble.error import CommitException import bauble.types as types from bauble.view import InfoBox, InfoExpander, PropertiesExpander, \ select_in_search_results from bauble.plugins.garden.donor import Donor # TODO: underneath the species entry create a label that shows information # about the family of the genus of the species selected as well as more # info about the genus so we know exactly what plant is being selected # e.g. Malvaceae (sensu lato), Hibiscus (senso stricto) # FIXME: time.mktime can't handle dates before 1970 on win32 # TODO: there is a bug if you edit an existing accession and change the # accession number but change it back to the original then it indicates the # number is invalid b/c it's a duplicate # TODO: make sure an accessions source record is being deleted when the # accession is being deleted, and create a test for the same thing # date regular expression for date entry fields _date_regex = re.compile('(?P\d?\d)/(?P\d?\d)/(?P\d\d\d\d)') def longitude_to_dms(decimal): return decimal_to_dms(decimal, 'long') def latitude_to_dms(decimal): return decimal_to_dms(decimal, 'lat') def decimal_to_dms(decimal, long_or_lat): ''' @param decimal: the value to convert @param long_or_lat: should be either "long" or "lat" @returns dir, degrees, minutes seconds, seconds rounded to two decimal places ''' if long_or_lat == 'long': check(abs(decimal) <= 180) else: check(abs(decimal) <= 90) dir_map = {'long': ['E', 'W'], 'lat': ['N', 'S']} direction = dir_map[long_or_lat][0] if decimal < 0: direction = dir_map[long_or_lat][1] dec = Decimal(str(abs(decimal))) d = Decimal(str(dec)).to_integral(rounding=ROUND_DOWN) m = Decimal(abs((dec-d)*60)).to_integral(rounding=ROUND_DOWN) m2 = Decimal(abs((dec-d)*60)) places = 2 q = Decimal((0, (1,), -places)) s = Decimal(abs((m2-m) * 60)).quantize(q) return direction, d, m, s def dms_to_decimal(dir, deg, min, sec, precision=6): ''' convert degrees, minutes, seconds to decimal return a decimal.Decimal ''' nplaces = Decimal(10) ** -precision if dir in ('E', 'W'): # longitude check(abs(deg) <= 180) else: check(abs(deg) <= 90) check(abs(min) < 60) check(abs(sec) < 60) deg = Decimal(str(abs(deg))) min = Decimal(str(min)) sec = Decimal(str(sec)) dec = abs(sec/Decimal('3600')) + abs(min/Decimal('60.0')) + deg if dir in ('W', 'S'): dec = -dec return dec.quantize(nplaces) def edit_callback(value): e = AccessionEditor(value) return e.start() != None def add_plants_callback(value): e = PlantEditor(model=Plant(accession=value)) return e.start() != None def remove_callback(value): if len(value.plants) > 0: safe = utils.xml_safe_utf8 values = dict(num_plants=len(value.plants), plant_codes = safe(', '.join(value.plants)), acc_code = safe(value)) msg = _('%(num_plants)s plants depend on this accession: ' \ '%(plant_codes)s\n\n'\ 'Are you sure you want to remove accession ' \ '%(acc_code)s?' % values) else: msg = _("Are you sure you want to remove accession %s?") % \ utils.xml_safe_utf8(unicode(value)) if not utils.yes_no_dialog(msg): return try: session = bauble.Session() obj = session.query(Accession).get(value.id) session.delete(obj) session.commit() except Exception, e: msg = _('Could not delete.\n\n%s') % utils.xml_safe_utf8(unicode(e)) utils.message_details_dialog(msg, traceback.format_exc(), type=gtk.MESSAGE_ERROR) finally: session.close() return True acc_context_menu = [('Edit', edit_callback), ('--', None), ('Add plants', add_plants_callback), ('--', None), ('Remove', remove_callback)] def acc_markup_func(acc): """ Returns str(acc), acc.species_str() """ return utils.xml_safe_utf8(unicode(acc)), acc.species_str(markup=True) # TODO: accession should have a one-to-many relationship on verifications #ver_level = StringCol(length=2, default=None) # verification level #ver_name = StringCol(length=50, default=None) # verifier's name #ver_date = DateTimeCol(default=None) # verification date #ver_hist = StringCol(default=None) # verification history #ver_lit = StringCol(default=None) # verification lit #ver_id = IntCol(default=None) # ?? # verifier's ID?? class Verification(db.Base): """Verification table (verification) level: If it is not known whether the name of the record has been verified by an authority, then this field must not be filled. 0: The name of the record has not been checked by any authority 1: The name of the record determined by comparison with other named plants 2: The name of the record determined by a taxonomist or by other competent persons using herbarium and/or library and/or documented living material 3: The name of the plant determined by taxonomist engaged in systematic revision of the group 4: The record is part of type gathering or propagated from type material by asexual methods """ __tablename__ = 'verification' # columns verifier = Column('verifier', Unicode(64)) date = Column(types.Date) literature = Column(UnicodeText) # citation? level = Column(Text)# i don't know what this is..certainty maybe? accession_id = Column(Integer, ForeignKey('accession.id')) class Accession(db.Base): """ :Table name: accession :Columns: *code*: :class:`sqlalchemy.types.Unicode` the accession code *prov_type*: :class:`bauble.types.Enum` the provenance type Possible values: * Wild: * Propagule of cultivated wild plant * Not of wild source * Insufficient Data * Unknown *wild_prov_status*: :class:`bauble.types.Enum` wild provenance status, if prov_type is Wild then this column can be used to give more provenance information Possible values: * Wild native * Cultivated native * Insufficient Data * Unknown *date*: :class:`bauble.types.Date` the date this accession was accessioned *source_type*: :class:`bauble.types.Enum` The type of the source of this accession Possible values: * Collection: indicates that self.source points to a :class:`bauble.plugins.garden.Collection` * Donation: indicates that self.source points to a :class:`bauble.plugins.garden.Donation` *notes*: :class:`sqlalchemy.types.UnicodeText` Notes relating to this accession. *id_qual*: :class:`bauble.types.Enum` The id qualifier is used to indicate uncertainty in the identification of this accession Possible values: * aff. - affinity with * cf. - compare with * forsan - perhaps * near - close to * ? - questionable * incorrect *id_qual_rank*: :class:`sqlalchemy.types.Unicode` The rank of the species that the id_qaul refers to. *private*: :class:`sqlalchemy.types.Boolean` Flag to indicate where this information is sensitive and should be kept private *species_id*: :class:`sqlalchemy.types.ForeignKey` foreign key to the species table :Properties: *species*: the species this accession refers to *_collection*: this relation should never be used directly, use the source property instead *_donation*: this relations should never be used directly, use the source property instead *source*: source cancel either be a Donation, Collection or None depending on the value of the source_type *plants*: a list of plants related to this accession *verifications*: a list of verifications on the identification of this accession :Constraints: """ __tablename__ = 'accession' __mapper_args__ = {'order_by': 'code'} # columns #: the accession code code = Column(Unicode(20), nullable=False, unique=True) prov_type = Column(types.Enum(values=['Wild', 'Propagule of cultivated wild plant', "Not of wild source", "Insufficient Data", "Unknown", None]), default=None) wild_prov_status = Column(types.Enum(values=["Wild native", "Wild non-native", "Cultivated native", "Insufficient Data", "Unknown", None]), default=None) date = Column(types.Date) source_type = Column(types.Enum(values=['Collection', 'Donation', None]), default=None) notes = Column(UnicodeText) # "id_qual" new in 0.7 id_qual = Column(types.Enum(values=['aff.', 'cf.', 'incorrect', 'forsan', 'near', '?', None]), default=None) # new in 0.9, this column should contain the name of the column in # the species table that the id_qual refers to, e.g. genus, sp, etc. id_qual_rank = Column(Unicode(10)) # "private" new in 0.8b2 private = Column(Boolean, default=False) species_id = Column(Integer, ForeignKey('species.id'), nullable=False) # relations species = relation('Species', uselist=False, backref=backref('accessions', cascade='all, delete-orphan')) # TODO: the _accession property on the Collection and Donation # tables, if you try to set the accession for one of these objects # using the _accession property you will have problems using # Accession.source because the Accession.source_type property # won't be set...previously (0.8) the property was _accession, we # should probably change it back and make accession a property # that properly sets the source type or just the source _collection = relation('Collection', cascade='all, delete-orphan', uselist=False, backref=backref('accession', uselist=False)) _donation = relation('Donation', cascade='all, delete-orphan', uselist=False, backref=backref('accession', uselist=False)) plants = relation('Plant', cascade='all, delete-orphan', order_by='Plant.code', backref='accession') verifications = relation('Verification', #order_by='date', cascade='all, delete-orphan', backref='accession') def __init__(self, *args, **kwargs): super(Accession, self).__init__(*args, **kwargs) self.__cached_species_str = {} @reconstructor def init_on_load(self): """ Called instead of __init__() when an Accession is loaded from the database. """ self.__cached_species_str = {} def __str__(self): return self.code def species_str(self, markup=False, authors=False): """ Return the string of the species with the id qualifier(id_qual) injected into the proper place. If the species isn't part of a session of if the species is dirty, i.e. in object_session(species).dirty, then a new string will be built even if the species hasn't been changeq since the last call to this method. """ # TODO: should we be using sesssion.is_modified() here try: cached = self.__cached_species_str[(markup, authors)] except KeyError: self.__cached_species_str[(markup, authors)] = None cached = None session = object_session(self.species) if session: # if not part of a session or if the species is dirty then # build a new string if cached is not None and self.species not in session.dirty: return cached if not self.species: return None # show a warning if the id_qual is aff. or cf. but the # id_qual_rank is None, but only show it once try: self.__warned_about_id_qual except AttributeError: self.__warned_about_id_qual = False if self.id_qual in ('aff.', 'cf.') and not self.id_qual_rank \ and not self.__warned_about_id_qual: msg = _('If the id_qual is aff. or cf. ' 'then id_qual_rank is required. %s ' % self.code) warning(msg) self.__warned_about_id_qual = True # copy the species so we don't affect the original session = bauble.Session() species = session.merge(self.species)#, dont_load=True) # generate the string if self.id_qual in ('aff.', 'cf.'): if species.infrasp_rank == 'cv.' and self.id_qual_rank=='infrasp': species.sp = '%s %s' % (species.sp, self.id_qual) elif self.id_qual_rank: setattr(species, self.id_qual_rank, '%s %s' % (self.id_qual, getattr(species, self.id_qual_rank))) sp_str = Species.str(species, authors, markup) elif self.id_qual: sp_str = '%s(%s)' % (Species.str(species, authors, markup), self.id_qual) else: sp_str = Species.str(species, authors, markup) # clean up and return the string del species session.close() self.__cached_species_str[(markup, authors)] = sp_str return sp_str def _get_source(self): if self.source_type is None: return None elif self.source_type == u'Collection': return self._collection elif self.source_type == u'Donation': return self._donation raise ValueError(_('unknown source_type in accession: %s') % \ self.source_type) def _set_source(self, source): if self.source is not None: obj = self.source obj.accession = None # we don't need to delete the old source since it will be # orphaned and should get automatically deleted #utils.delete_or_expunge(obj) self.source_type = None if source is None: self.source_type = None else: self.source_type = unicode(source.__class__.__name__) source.accession = self def _del_source(self): self.source = None source = property(_get_source, _set_source, _del_source) def markup(self): return '%s (%s)' % (self.code, self.species.markup()) from bauble.plugins.garden.source import Donation, Collection from bauble.plugins.garden.plant import Plant, PlantEditor class AccessionEditorView(GenericEditorView): expanders_pref_map = {'acc_notes_expander': 'editor.accession.notes.expanded', # 'acc_source_expander': # 'editor.accession.source.expanded' } _tooltips = { 'acc_species_entry': _("The species must be selected from the list "\ "of completions. To add a species use the "\ "Species editor."), 'acc_code_entry': _("The accession ID must be a unique code"), 'acc_id_qual_combo': _("The ID Qualifier\n\n" \ "Possible values: %s") \ % utils.enum_values_str('accession.id_qual'), 'acc_date_entry': _('The date this species was accessioned.'), 'acc_prov_combo': _('The origin or source of this accession.\n\n' \ 'Possible values: %s') \ % utils.enum_values_str('accession.prov_type'), 'acc_wild_prov_combo': _('The wild status is used to clarify the ' \ 'provenance\n\nPossible values: %s') \ % utils.enum_values_str('accession.wild_prov_status'), 'acc_source_type_combo': _('The source type is in what way this ' \ 'accession was obtained'), 'acc_notes_textview': _('Miscelleanous notes about this accession.'), 'acc_private_check': _('Indicates whether this accession record ' \ 'should be considered private.') } def __init__(self, parent=None): GenericEditorView.__init__(self, os.path.join(paths.lib_dir(), 'plugins', 'garden', 'editors.glade'), parent=parent) self.dialog = self.widgets.accession_dialog self.dialog.set_transient_for(parent) self.set_accept_buttons_sensitive(False) self.attach_completion('acc_species_entry', cell_data_func=self.species_cell_data_func, match_func=self.species_match_func) self.restore_state() self.connect_dialog_close(self.widgets.accession_dialog) # datum completions completion = self.attach_completion('datum_entry', minimum_key_length=1, match_func=self.datum_match, text_column=0) model = gtk.ListStore(str) for abbr in sorted(datums.keys()): # TODO: should create a marked up string with the datum description model.append([abbr]) completion.set_model(model) def save_state(self): ''' save the current state of the gui to the preferences ''' for expander, pref in self.expanders_pref_map.iteritems(): prefs[pref] = self.widgets[expander].get_expanded() def restore_state(self): ''' restore the state of the gui from the preferences ''' for expander, pref in self.expanders_pref_map.iteritems(): expanded = prefs.get(pref, True) self.widgets[expander].set_expanded(expanded) def set_accept_buttons_sensitive(self, sensitive): ''' set the sensitivity of all the accept/ok buttons for the editor dialog ''' self.widgets.acc_ok_button.set_sensitive(sensitive) self.widgets.acc_ok_and_add_button.set_sensitive(sensitive) self.widgets.acc_next_button.set_sensitive(sensitive) def start(self): return self.widgets.accession_dialog.run() @staticmethod def datum_match(completion, key, iter, data=None): """ This method is static to ensure the AccessionEditorView gets garbage collected. """ datum = completion.get_model()[iter][0] words = datum.split(' ') for w in words: if w.lower().startswith(key.lower()): return True return False @staticmethod def species_match_func(completion, key, iter, data=None): """ This method is static to ensure the AccessionEditorView gets garbage collected. """ species = completion.get_model()[iter][0] if str(species).lower().startswith(key.lower()) \ or str(species.genus.genus).lower().startswith(key.lower()): return True return False @staticmethod def species_cell_data_func(column, renderer, model, iter, data=None): """ This method is static to ensure the AccessionEditorView gets garbage collected. """ v = model[iter][0] renderer.set_property('text', '%s (%s)' % (str(v), v.genus.family)) # TODO: should have a label next to lat/lon entry to show what value will be # stored in the database, might be good to include both DMS and the float # so the user can see both no matter what is in the entry. it could change in # time as the user enters data in the entry # TODO: shouldn't allow entering altitude accuracy without entering altitude, # same for geographic accuracy # TODO: should show an error if something other than a number is entered in # the altitude entry class CollectionPresenter(GenericEditorPresenter): widget_to_field_map = {'collector_entry': 'collector', 'coll_date_entry': 'date', 'collid_entry': 'collectors_code', 'locale_entry': 'locale', 'lat_entry': 'latitude', 'lon_entry': 'longitude', 'geoacc_entry': 'geo_accy', 'alt_entry': 'elevation', 'altacc_entry': 'elevation_accy', 'habitat_textview': 'habitat', 'coll_notes_textview': 'notes', 'datum_entry': 'gps_datum' } # TODO: could make the problems be tuples of an id and description to # be displayed in a dialog or on a label ala eclipse PROBLEM_BAD_LATITUDE = random() PROBLEM_BAD_LONGITUDE = random() PROBLEM_INVALID_DATE = random() PROBLEM_INVALID_LOCALE = random() def __init__(self, parent, model, view, session): GenericEditorPresenter.__init__(self, model, view) self.parent_ref = weakref.ref(parent) self.session = session self.refresh_view() self.assign_simple_handler('collector_entry', 'collector', UnicodeOrNoneValidator()) self.assign_simple_handler('locale_entry', 'locale', UnicodeOrNoneValidator()) self.assign_simple_handler('collid_entry', 'collectors_code', UnicodeOrNoneValidator()) self.assign_simple_handler('geoacc_entry', 'geo_accy', IntOrNoneStringValidator()) self.assign_simple_handler('alt_entry', 'elevation', FloatOrNoneStringValidator()) self.assign_simple_handler('altacc_entry', 'elevation_accy', FloatOrNoneStringValidator()) self.assign_simple_handler('habitat_textview', 'habitat', UnicodeOrNoneValidator()) self.assign_simple_handler('coll_notes_textview', 'notes', UnicodeOrNoneValidator()) # the list of completions are added in AccessionEditorView.__init__ def on_match(completion, model, iter, data=None): value = model[iter][0] validator = UnicodeOrNoneValidator() self.set_model_attr('gps_data', value, validator) completion.get_entry().set_text(value) completion = self.view.widgets.datum_entry.get_completion() self.view.connect(completion, 'match-selected', on_match) self.assign_simple_handler('datum_entry', 'gps_datum', UnicodeOrNoneValidator()) self.view.connect('lat_entry', 'insert-text', self.on_lat_entry_insert) self.view.connect('lat_entry', 'delete-text', self.on_lat_entry_delete) self.view.connect('lon_entry', 'insert-text', self.on_lon_entry_insert) self.view.connect('lon_entry', 'delete-text', self.on_lon_entry_delete) self.view.connect('coll_date_entry', 'insert-text', self.on_date_entry_insert) self.view.connect('coll_date_entry', 'delete-text', self.on_date_entry_delete) utils.setup_date_button(self.view.widgets.coll_date_entry, self.view.widgets.coll_date_button) # don't need to connection to south/west since they are in the same # groups as north/east self.north_toggle_signal_id = \ self.view.connect('north_radio', 'toggled', self.on_north_south_radio_toggled) self.east_toggle_signal_id = \ self.view.connect('east_radio', 'toggled', self.on_east_west_radio_toggled) if self.model.locale is None or self.model.locale in ('', u''): self.add_problem(self.PROBLEM_INVALID_LOCALE) self.__dirty = False def set_model_attr(self, field, value, validator=None): """ Validates the fields when a field changes. """ super(CollectionPresenter, self).set_model_attr(field, value,validator) self.__dirty = True if self.model.locale is None or self.model.locale in ('', u''): self.add_problem(self.PROBLEM_INVALID_LOCALE) else: self.remove_problem(self.PROBLEM_INVALID_LOCALE) if field in ('longitude', 'latitude'): sensitive = self.model.latitude is not None \ and self.model.longitude is not None self.view.widgets.geoacc_entry.set_sensitive(sensitive) self.view.widgets.datum_entry.set_sensitive(sensitive) if field == 'elevation': sensitive = self.model.elevation is not None self.view.widgets.altacc_entry.set_sensitive(sensitive) self.parent_ref().refresh_sensitivity() def start(self): raise Exception('CollectionPresenter cannot be started') def dirty(self): return self.__dirty def refresh_view(self): for widget, field in self.widget_to_field_map.iteritems(): value = getattr(self.model, field) ## debug('%s, %s, %s' % (widget, field, value)) if value is not None and field == 'date': value = '%s/%s/%s' % (value.day, value.month, '%04d' % value.year) self.view.set_widget_value(widget, value) latitude = self.model.latitude if latitude is not None: dms_string ='%s %s\302\260%s\'%s"' % latitude_to_dms(latitude) self.view.widgets.lat_dms_label.set_text(dms_string) if latitude < 0: self.view.widgets.south_radio.set_active(True) else: self.view.widgets.north_radio.set_active(True) longitude = self.model.longitude if longitude is not None: dms_string ='%s %s\302\260%s\'%s"' % longitude_to_dms(longitude) self.view.widgets.lon_dms_label.set_text(dms_string) if longitude < 0: self.view.widgets.west_radio.set_active(True) else: self.view.widgets.east_radio.set_active(True) if self.model.elevation == None: self.view.widgets.altacc_entry.set_sensitive(False) if self.model.latitude is None or self.model.longitude is None: self.view.widgets.geoacc_entry.set_sensitive(False) self.view.widgets.datum_entry.set_sensitive(False) def on_date_entry_insert(self, entry, new_text, new_text_length, position, data=None): entry_text = entry.get_text() cursor = entry.get_position() full_text = entry_text[:cursor] + new_text + entry_text[cursor:] self._set_date_from_text(full_text) def on_date_entry_delete(self, entry, start, end, data=None): text = entry.get_text() full_text = text[:start] + text[end:] self._set_date_from_text(full_text) def _set_date_from_text(self, text): if text == '': self.set_model_attr('date', None) self.remove_problem(self.PROBLEM_INVALID_DATE, self.view.widgets.coll_date_entry) return dt = None # datetime m = _date_regex.match(text) if m is None: self.add_problem(self.PROBLEM_INVALID_DATE, self.view.widgets.coll_date_entry) else: # debug('%s.%s.%s' % (m.group('year'), m.group('month'), \ # m.group('day'))) try: ymd = [int(x) for x in [m.group('year'), m.group('month'), \ m.group('day')]] dt = datetime(*ymd).date() self.remove_problem(self.PROBLEM_INVALID_DATE, self.view.widgets.coll_date_entry) except Exception: self.add_problem(self.PROBLEM_INVALID_DATE, self.view.widgets.coll_date_entry) self.set_model_attr('date', dt) def on_east_west_radio_toggled(self, button, data=None): direction = self._get_lon_direction() entry = self.view.widgets.lon_entry lon_text = entry.get_text() if lon_text == '': return if direction == 'W' and lon_text[0] != '-' and len(lon_text) > 2: entry.set_text('-%s' % lon_text) elif direction == 'E' and lon_text[0] == '-' and len(lon_text) > 2: entry.set_text(lon_text[1:]) def on_north_south_radio_toggled(self, button, data=None): direction = self._get_lat_direction() entry = self.view.widgets.lat_entry lat_text = entry.get_text() if lat_text == '': return if direction == 'S' and lat_text[0] != '-' and len(lat_text) > 2: entry.set_text('-%s' % lat_text) elif direction == 'N' and lat_text[0] == '-' and len(lat_text) > 2: entry.set_text(lat_text[1:]) @staticmethod def _parse_lat_lon(direction, text): ''' parse a latitude or longitude in a variety of formats ''' bits = re.split(':| ', text.strip()) # debug('%s: %s' % (direction, bits)) if len(bits) == 1: dec = abs(float(text)) if dec > 0 and direction in ('W', 'S'): dec = -dec elif len(bits) == 2: deg, tmp = map(float, bits) sec = tmp/60 min = tmp-60 dec = dms_to_decimal(direction, deg, min, sec) elif len(bits) == 3: # debug(bits) dec = dms_to_decimal(direction, *map(float, bits)) else: raise ValueError(_('_parse_lat_lon() -- incorrect format: %s') % \ text) return dec def _get_lat_direction(self): ''' return N or S from the radio ''' if self.view.widgets.north_radio.get_active(): return 'N' elif self.view.widgets.south_radio.get_active(): return 'S' raise ValueError(_('North/South radio buttons in a confused state')) def _get_lon_direction(self): ''' return E or W from the radio ''' if self.view.widgets.east_radio.get_active(): return 'E' elif self.view.widgets.west_radio.get_active(): return 'W' raise ValueError(_('East/West radio buttons in a confused state')) def on_lat_entry_insert(self, entry, new_text, new_text_length, position, data=None): ''' insert handler for lat_entry ''' entry_text = entry.get_text() cursor = entry.get_position() full_text = entry_text[:cursor] + new_text + entry_text[cursor:] self._set_latitude_from_text(full_text) def on_lat_entry_delete(self, entry, start, end, data=None): ''' delete handler for lat_entry ''' text = entry.get_text() full_text = text[:start] + text[end:] self._set_latitude_from_text(full_text) def _set_latitude_from_text(self, text): ''' set the latitude value from text ''' latitude = None dms_string = '' try: if text != '' and text is not None: north_radio = self.view.widgets.north_radio north_radio.handler_block(self.north_toggle_signal_id) if text[0] == '-': self.view.widgets.south_radio.set_active(True) else: north_radio.set_active(True) north_radio.handler_unblock(self.north_toggle_signal_id) direction = self._get_lat_direction() latitude = CollectionPresenter._parse_lat_lon(direction, text) #u"\N{DEGREE SIGN}" dms_string ='%s %s\302\260%s\'%s"' % latitude_to_dms(latitude) except Exception: # debug(traceback.format_exc()) bg_color = gtk.gdk.color_parse("red") self.add_problem(self.PROBLEM_BAD_LATITUDE, self.view.widgets.lat_entry) else: self.remove_problem(self.PROBLEM_BAD_LATITUDE, self.view.widgets.lat_entry) self.set_model_attr('latitude', latitude) self.view.widgets.lat_dms_label.set_text(dms_string) def on_lon_entry_insert(self, entry, new_text, new_text_length, position, data=None): entry_text = entry.get_text() cursor = entry.get_position() full_text = entry_text[:cursor] + new_text + entry_text[cursor:] self._set_longitude_from_text(full_text) def on_lon_entry_delete(self, entry, start, end, data=None): text = entry.get_text() full_text = text[:start] + text[end:] self._set_longitude_from_text(full_text) def _set_longitude_from_text(self, text): longitude = None dms_string = '' try: if text != '' and text is not None: east_radio = self.view.widgets.east_radio east_radio.handler_block(self.east_toggle_signal_id) if text[0] == '-': self.view.widgets.west_radio.set_active(True) else: self.view.widgets.east_radio.set_active(True) east_radio.handler_unblock(self.east_toggle_signal_id) direction = self._get_lon_direction() longitude = CollectionPresenter._parse_lat_lon(direction, text) dms_string='%s %s\302\260%s\'%s"' % longitude_to_dms(longitude) except Exception: # debug(traceback.format_exc()) bg_color = gtk.gdk.color_parse("red") self.add_problem(self.PROBLEM_BAD_LONGITUDE, self.view.widgets.lon_entry) else: self.remove_problem(self.PROBLEM_BAD_LONGITUDE, self.view.widgets.lon_entry) self.set_model_attr('longitude', longitude) self.view.widgets.lon_dms_label.set_text(dms_string) # TODO: make the donor_combo insensitive if the model is empty class DonationPresenter(GenericEditorPresenter): widget_to_field_map = {'donor_combo': 'donor', 'donid_entry': 'donor_acc', 'donnotes_entry': 'notes', 'don_date_entry': 'date'} PROBLEM_INVALID_DATE = random() PROBLEM_INVALID_DONOR = random() def __init__(self, parent, model, view, session): """ @param parent: the parent AccessionEditorPresenter """ GenericEditorPresenter.__init__(self, model, view) self.parent_ref = weakref.ref(parent) self.session = session # set up donor_combo donor_combo = self.view.widgets.donor_combo donor_combo.clear() # avoid gchararry/PyObject warning r = gtk.CellRendererText() donor_combo.pack_start(r) donor_combo.set_cell_data_func(r, self.combo_cell_data_func) self.refresh_view() # assign handlers self.view.connect('donor_combo', 'changed', self.on_donor_combo_changed) self.assign_simple_handler('donid_entry', 'donor_acc', UnicodeOrNoneValidator()) self.assign_simple_handler('donnotes_entry', 'notes', UnicodeOrNoneValidator()) self.view.connect('don_date_entry', 'insert-text', self.on_date_entry_insert) self.view.connect('don_date_entry', 'delete-text', self.on_date_entry_delete) utils.setup_date_button(self.view.widgets.don_date_entry, self.view.widgets.don_date_button) self.view.connect('don_new_button', 'clicked', self.on_don_new_clicked) self.view.connect('don_edit_button', 'clicked', self.on_don_edit_clicked) # if there is only one donor in the donor combo model and if self.model.donor is None and len(donor_combo.get_model()) == 1: donor_combo.set_active(0) if self.model.donor is None: self.add_problem(self.PROBLEM_INVALID_DONOR) self.__dirty = False def set_model_attr(self, field, value, validator=None): # debug('DonationPresenter.set_model_attr(%s, %s)' % (field, value)) super(DonationPresenter, self).set_model_attr(field, value, validator) self.__dirty = True if self.model.donor is None: self.add_problem(self.PROBLEM_INVALID_DONOR) else: self.remove_problem(self.PROBLEM_INVALID_DONOR) self.parent_ref().refresh_sensitivity() def start(self): raise Exception('DonationPresenter cannot be started') def dirty(self): return self.__dirty def on_donor_combo_changed(self, combo, data=None): ''' changed the sensitivity of the don_edit_button if the selected item in the donor_combo is an instance of Donor ''' # debug('on_donor_combo_changed') i = combo.get_active_iter() if i is None: return value = combo.get_model()[i][0] self.set_model_attr('donor', value) if isinstance(value, Donor): self.view.widgets.don_edit_button.set_sensitive(True) else: self.view.widgets.don_edit_button.set_sensitive(False) def on_date_entry_insert(self, entry, new_text, new_text_length, position, data=None): entry_text = entry.get_text() cursor = entry.get_position() full_text = entry_text[:cursor] + new_text + entry_text[cursor:] self._set_date_from_text(full_text) def on_date_entry_delete(self, entry, start, end, data=None): text = entry.get_text() full_text = text[:start] + text[end:] self._set_date_from_text(full_text) def _set_date_from_text(self, text): if text == '': self.set_model_attr('date', None) self.remove_problem(self.PROBLEM_INVALID_DATE, self.view.widgets.don_date_entry) return m = _date_regex.match(text) dt = None # datetime try: ymd = [int(x) for x in [m.group('year'), m.group('month'), \ m.group('day')]] dt = datetime(*ymd).date() self.remove_problem(self.PROBLEM_INVALID_DATE, self.view.widgets.don_date_entry) except Exception: self.add_problem(self.PROBLEM_INVALID_DATE, self.view.widgets.don_date_entry) self.set_model_attr('date', dt) def on_don_new_clicked(self, button, data=None): ''' create a new donor, setting the current donor on donor_combo to the new donor ''' donor = DonorEditor().start() if donor is not None: self.refresh_view() self.view.set_widget_value('donor_combo', donor) def on_don_edit_clicked(self, button, data=None): ''' edit currently selected donor ''' donor_combo = self.view.widgets.donor_combo i = donor_combo.get_active_iter() donor = donor_combo.get_model()[i][0] e = DonorEditor(model=donor, parent=self.view.widgets.accession_dialog) edited = e.start() if edited is not None: self.refresh_view() @staticmethod def combo_cell_data_func(cell, renderer, model, iter): """ This method is static to make sure this object gets garbage collected. """ v = model[iter][0] renderer.set_property('text', str(v)) def refresh_view(self): # debug('DonationPresenter.refresh_view') # populate the donor combo model = gtk.ListStore(object) for value in self.session.query(Donor): # debug(value) model.append([value]) donor_combo = self.view.widgets.donor_combo donor_combo.set_model(model) for widget, field in self.widget_to_field_map.iteritems(): value = getattr(self.model, field) # debug('%s, %s, %s' % (widget, field, value)) if value is not None and field == 'date': value = '%s/%s/%s' % (value.day, value.month, '%04d' % value.year) self.view.set_widget_value(widget, value) if self.model.donor is None: self.view.widgets.don_edit_button.set_sensitive(False) else: self.view.widgets.don_edit_button.set_sensitive(True) def SourcePresenterFactory(parent, model, view, session): if isinstance(model, Collection): return CollectionPresenter(parent, model, view, session) elif isinstance(model, Donation): return DonationPresenter(parent, model, view, session) else: raise ValueError('unknown source type: %s' % type(model)) # TODO: pick one or a combination of the following # 1. the ok, next and whatever buttons shouldn't be made sensitive until # all required field are valid, or all field are valid # 2. implement eclipse style label at the top of the editor that give # information about context, whether a field is invalid or whatever # 3. change color around widget with an invalid value so the user knows there's # a problem # TODO: the accession editor presenter should give an error if no species exist # in fact it should give a message dialog and ask if you would like # to enter some species now, or maybe import some class AccessionEditorPresenter(GenericEditorPresenter): widget_to_field_map = {'acc_code_entry': 'code', 'acc_id_qual_combo': 'id_qual', 'acc_date_entry': 'date', 'acc_prov_combo': 'prov_type', 'acc_wild_prov_combo': 'wild_prov_status', 'acc_species_entry': 'species', 'acc_source_type_combo': 'source_type', 'acc_notes_textview': 'notes', 'acc_private_check': 'private'} PROBLEM_INVALID_DATE = random() PROBLEM_DUPLICATE_ACCESSION = random() PROBLEM_ID_QUAL_RANK_REQUIRED = random() # keep references to donation and collection box so they don't get # destroyed when we reparent them _source_box_map = {} def __init__(self, model, view): ''' @param model: an instance of class Accession @param view: an instance of AccessionEditorView ''' GenericEditorPresenter.__init__(self, model, view) self.session = object_session(model) self._original_source = self.model.source self._original_code = self.model.code self.current_source_box = None self.source_presenter = None self._source_box_map['Donation'] = self.view.widgets.donation_box self._source_box_map['Collection'] = self.view.widgets.collection_box # reset the source_box_parent in case it still has a child # from a previous run of the accession editor kid = self.view.widgets.source_box_parent.get_child() if kid: self.view.widgets.source_box_parent.remove(kid) # set current page so we don't open the last one that was open self.view.widgets.acc_notebook.set_current_page(0) self.init_enum_combo('acc_prov_combo', 'prov_type', none_str='') self.init_enum_combo('acc_wild_prov_combo', 'wild_prov_status', none_str='') self.init_enum_combo('acc_id_qual_combo', 'id_qual', none_str='') # init id_qual_rank utils.setup_text_combobox(self.view.widgets.acc_id_qual_rank_combo) self.refresh_id_qual_rank_combo() def on_changed(combo, *args): it = combo.get_active_iter() if not it: self.model.id_qual_rank = None return text, col = combo.get_model()[it] self.set_model_attr('id_qual_rank', utils.utf8(col)) self.view.connect('acc_id_qual_rank_combo', 'changed', on_changed) self.init_source_tab() self.refresh_view() # put model values in view # connect signals def sp_get_completions(text): query = self.session.query(Species) genus = '' try: genus = text.split(' ')[0] except Exception: pass from utils import ilike if text.startswith('x'): or_cond = or_(ilike(Genus.genus, '%s%%' % text), ilike(Genus.genus, '%s%%' % genus), ilike(Genus.hybrid, utils.utf8(text[0]))) else: or_cond = or_(ilike(Genus.genus, '%s%%' % text), ilike(Genus.genus, '%s%%' % genus)) return query.filter(and_(Species.genus_id == Genus.id, or_cond)) def on_select(value): self.set_model_attr('species', value) self.refresh_id_qual_rank_combo() self.assign_completions_handler('acc_species_entry', sp_get_completions, on_select=on_select) self.view.connect('acc_prov_combo', 'changed', self.on_combo_changed, 'prov_type') self.view.connect('acc_wild_prov_combo', 'changed', self.on_combo_changed, 'wild_prov_status') # TODO: could probably replace this by just passing a valdator # to assign_simple_handler...UPDATE: but can the validator handle # adding a problem to the widget...if we passed it the widget it # could self.view.connect('acc_code_entry', 'insert-text', self.on_acc_code_entry_insert) self.view.connect('acc_code_entry', 'delete-text', self.on_acc_code_entry_delete) self.assign_simple_handler('acc_notes_textview', 'notes', UnicodeOrNoneValidator()) acc_date_entry = self.view.widgets.acc_date_entry self.view.connect('acc_date_entry', 'insert-text', self.on_acc_date_entry_insert) self.view.connect('acc_date_entry', 'delete-text', self.on_acc_date_entry_delete) utils.setup_date_button(acc_date_entry, self.view.widgets.acc_date_button) self.assign_simple_handler('acc_id_qual_combo', 'id_qual', UnicodeOrNoneValidator()) self.assign_simple_handler('acc_private_check', 'private') self.__dirty = False self.refresh_sensitivity() def refresh_id_qual_rank_combo(self): """ Populate the id_qual_rank_combo with the parts of the species string """ combo = self.view.widgets.acc_id_qual_rank_combo utils.clear_model(combo) if not self.model.species: return model = gtk.ListStore(str, str) species = self.model.species it = model.append([str(species.genus), 'genus']) active = None if self.model.id_qual_rank == 'genus': active = it it = model.append([str(species.sp), 'sp']) if self.model.id_qual_rank == 'sp': active = it if species.infrasp: if species.infrasp_rank == 'cv.': s = "'%s'" % str(species.infrasp) else: s = str(species.infrasp) it = model.append([s, 'infrasp']) if self.model.id_qual_rank == 'infrasp': active = it it = model.append(('', None)) if not active: active = it combo.set_model(model) combo.set_active_iter(active) def dirty(self): if self.source_presenter is None: return self.__dirty return self.source_presenter.dirty() or self.__dirty def on_acc_code_entry_insert(self, entry, new_text, new_text_length, position, data=None): """ insert-text callback for acc_code widget """ entry_text = entry.get_text() cursor = entry.get_position() full_text = entry_text[:cursor] + new_text + entry_text[cursor:] self._set_acc_code_from_text(full_text) def on_acc_code_entry_delete(self, entry, start, end, data=None): """ delete-text callback for acc_code widget """ text = entry.get_text() full_text = text[:start] + text[end:] self._set_acc_code_from_text(full_text) def _set_acc_code_from_text(self, text): query = self.session.query(Accession) if text != self._original_code \ and query.filter_by(code=unicode(text)).count()>0: self.add_problem(self.PROBLEM_DUPLICATE_ACCESSION, self.view.widgets.acc_code_entry) self.set_model_attr('code', None) return self.remove_problem(self.PROBLEM_DUPLICATE_ACCESSION, self.view.widgets.acc_code_entry) if text is '': self.set_model_attr('code', None) else: # TODO: even though utf-8 is pretty much standard throughout # Bauble we shouldn't hardcode the encoding here...probably best # to store the default encoding in the bauble.meta self.set_model_attr('code', utils.utf8(text)) def on_acc_date_entry_insert(self, entry, new_text, new_text_length, position, data=None): """ insert-text call back for acc_date widget """ entry_text = entry.get_text() cursor = entry.get_position() full_text = entry_text[:cursor] + new_text + entry_text[cursor:] self._set_acc_date_from_text(full_text) def on_acc_date_entry_delete(self, entry, start, end, data=None): """ delete-text call back for acc_date_widget """ text = entry.get_text() full_text = text[:start] + text[end:] self._set_acc_date_from_text(full_text) def _set_acc_date_from_text(self, text): """ """ if text == '': self.model.date = None self.remove_problem(self.PROBLEM_INVALID_DATE, self.view.widgets.acc_date_entry) return m = _date_regex.match(text) dt = None # datetime try: ymd = [int(x) for x in [m.group('year'), m.group('month'), \ m.group('day')]] dt = datetime(*ymd).date() self.remove_problem(self.PROBLEM_INVALID_DATE, self.view.widgets.acc_date_entry) except Exception: # debug(traceback.format_exc()) self.add_problem(self.PROBLEM_INVALID_DATE, self.view.widgets.acc_date_entry) self.set_model_attr('date', dt) def set_model_attr(self, field, value, validator=None): """ Set attributes on the model and update the GUI as expected. """ #debug('set_model_attr(%s, %s)' % (field, value)) super(AccessionEditorPresenter, self).set_model_attr(field, value, validator) self.__dirty = True # TODO: add a test to make sure that the change notifiers are # called in the expected order prov_sensitive = True wild_prov_combo = self.view.widgets.acc_wild_prov_combo if field == 'prov_type': if self.model.prov_type == 'Wild': self.model.wild_prov_status = wild_prov_combo.get_active_text() else: # remove the value in the model from the wild_prov_combo prov_sensitive = False self.model.wild_prov_status = None wild_prov_combo.set_sensitive(prov_sensitive) self.view.widgets.acc_wild_prov_frame.set_sensitive(prov_sensitive) if field == 'id_qual' and not self.model.id_qual_rank: self.add_problem(self.PROBLEM_ID_QUAL_RANK_REQUIRED, self.view.widgets.acc_id_qual_rank_combo) else: self.remove_problem(self.PROBLEM_ID_QUAL_RANK_REQUIRED) self.refresh_sensitivity() def refresh_sensitivity(self): """ Refresh the sensitivity of the fields and accept buttons according to the current values in the model. """ if self.model.species and self.model.id_qual: self.view.widgets.acc_id_qual_rank_combo.set_sensitive(True) else: self.view.widgets.acc_id_qual_rank_combo.set_sensitive(False) sensitive = self.dirty() # if not source_type is None and self._original_source is None if len(self.problems) != 0: sensitive = False elif self.model.source_type and self.source_presenter \ and len(self.source_presenter.problems) != 0: sensitive = False elif not self.model.code or not self.model.species: sensitive = False self.view.set_accept_buttons_sensitive(sensitive) def on_source_type_combo_changed(self, combo, data=None): ''' Change which one of donation_box/collection_box is packed into source box and setup the appropriate presenter. ''' source_type = combo.get_active_text() source_type_changed = False # if the source type is None then set the model.source as None # and remove the source box if source_type is None: if self.model.source is not None: self.set_model_attr('source', None) if self.current_source_box is not None: self.view.widgets.remove_parent(self.current_source_box) self.current_source_box = None return # FIXME: Donation and Collection shouldn't be hardcoded so that it # can be translated # # TODO: if source_type is set and self.model.source is None then create # a new empty source object and attach it to the model source_class_map = {'Donation': Donation, 'Collection': Collection} # the source_type has changed from what it originally was new_source = None if source_type != self.model.source_type: # debug('source_type != model.source_type') source_type_changed = True try: new_source = source_class_map[source_type]() except KeyError, e: debug('unknown source type: %s' % e) raise if isinstance(new_source, type(self._original_source)): new_source = self._original_source elif source_type is not None and self.model.source is None: # the source type is set but there is no corresponding model.source try: new_source = source_class_map[source_type]() except KeyError, e: debug('Source type is set but the source attribute None: %s' \ % e) raise # replace source box contents with our new box #source_box = self.view.widgets.source_box source_box_parent = self.view.widgets.source_box_parent if self.current_source_box is not None: self.view.widgets.remove_parent(self.current_source_box) if source_type is not None: self.current_source_box = self._source_box_map[source_type] self.view.widgets.remove_parent(self.current_source_box) source_box_parent.add(self.current_source_box) else: self.current_source_box = None if new_source is not None: self.source_presenter = SourcePresenterFactory(self, new_source, self.view, self.session) self.set_model_attr('source', new_source) elif self.model.source is not None: # didn't create a new source but we need to create a # source presenter self.source_presenter = \ SourcePresenterFactory(self, self.model.source, self.view, self.session) def init_source_tab(self): ''' initialized the source expander contents ''' combo = self.view.widgets.acc_source_type_combo model = gtk.ListStore(str) model.append(['Collection']) model.append(['Donation']) model.append([None]) combo.set_model(model) combo.set_active(-1) self.view.connect('acc_source_type_combo', 'changed', self.on_source_type_combo_changed) def on_combo_changed(self, combo, field): value = utils.utf8(combo.get_active_text()) if value == u'': value = None self.set_model_attr(field, value) def refresh_view(self): ''' get the values from the model and put them in the view ''' for widget, field in self.widget_to_field_map.iteritems(): if field == 'species_id': value = self.model.species else: value = getattr(self.model, field) if value is not None and field == 'date': value = '%s/%s/%s' % (value.day, value.month, '%04d' % value.year) self.view.set_widget_value(widget, value) if self.model.private is None: self.view.widgets.acc_private_check.set_inconsistent(False) self.view.widgets.acc_private_check.set_active(False) sensitive = self.model.prov_type == 'Wild' self.view.widgets.acc_wild_prov_combo.set_sensitive(sensitive) self.view.widgets.acc_wild_prov_frame.set_sensitive(sensitive) def start(self): r = self.view.start() return r class AccessionEditor(GenericModelViewPresenterEditor): label = _('Accession') mnemonic_label = _('_Accession') # these have to correspond to the response values in the view RESPONSE_OK_AND_ADD = 11 RESPONSE_NEXT = 22 ok_responses = (RESPONSE_OK_AND_ADD, RESPONSE_NEXT) def __init__(self, model=None, parent=None): ''' @param model: Accession instance or None @param parent: the parent widget ''' # the view and presenter are created in self.start() self.view = None self.presenter = None if model is None: model = Accession() GenericModelViewPresenterEditor.__init__(self, model, parent) if not parent and bauble.gui: parent = bauble.gui.window self.parent = parent self._committed = [] def handle_response(self, response): ''' handle the response from self.presenter.start() in self.start() ''' not_ok_msg = 'Are you sure you want to lose your changes?' if response == gtk.RESPONSE_OK or response in self.ok_responses: try: if self.presenter.dirty(): self.commit_changes() self._committed.append(self.model) except SQLError, e: msg = _('Error committing changes.\n\n%s') % \ utils.xml_safe_utf8(unicode(e.orig)) utils.message_details_dialog(msg, str(e), gtk.MESSAGE_ERROR) return False except Exception, e: msg = _('Unknown error when committing changes. See the '\ 'details for more information.\n\n%s') \ % utils.xml_safe_utf8(e) debug(traceback.format_exc()) utils.message_details_dialog(msg, traceback.format_exc(), gtk.MESSAGE_ERROR) return False elif self.presenter.dirty() and utils.yes_no_dialog(not_ok_msg) \ or not self.presenter.dirty(): self.session.rollback() return True else: return False # respond to responses more_committed = None if response == self.RESPONSE_NEXT: self.presenter.cleanup() e = AccessionEditor(parent=self.parent) more_committed = e.start() elif response == self.RESPONSE_OK_AND_ADD: e = PlantEditor(Plant(accession=self.model), self.parent) more_committed = e.start() if more_committed is not None: if isinstance(more_committed, list): self._committed.extend(more_committed) else: self._committed.append(more_committed) return True def start(self): from bauble.plugins.plants.species_model import Species if self.session.query(Species).count() == 0: msg = _('You must first add or import at least one species into '\ 'the database before you can add accessions.') utils.message_dialog(msg) return self.view = AccessionEditorView(parent=self.parent) self.presenter = AccessionEditorPresenter(self.model, self.view) # add quick response keys dialog = self.view.dialog self.attach_response(dialog, gtk.RESPONSE_OK, 'Return', gtk.gdk.CONTROL_MASK) self.attach_response(dialog, self.RESPONSE_OK_AND_ADD, 'k', gtk.gdk.CONTROL_MASK) self.attach_response(dialog, self.RESPONSE_NEXT, 'n', gtk.gdk.CONTROL_MASK) # set the default focus if self.model.species is None: self.view.widgets.acc_species_entry.grab_focus() else: self.view.widgets.acc_code_entry.grab_focus() while True: response = self.presenter.start() self.view.save_state() # should view or presenter save state if self.handle_response(response): break self.session.close() # cleanup session self.presenter.cleanup() return self._committed @staticmethod def __cleanup_donation_model(model): ''' ''' return model @staticmethod def __cleanup_collection_model(model): ''' ''' # TODO: we should raise something besides commit ValueError # so we can give a meaningful response if model.latitude is not None or model.longitude is not None: if (model.latitude is not None and model.longitude is None) or \ (model.longitude is not None and model.latitude is None): msg = _('model must have both latitude and longitude or '\ 'neither') raise ValueError(msg) elif model.latitude is None and model.longitude is None: model.geo_accy = None # don't save else: model.geo_accy = None # don't save # reset the elevation accuracy if the elevation is None if model.elevation is None: model.elevation_accy = None return model def commit_changes(self): if isinstance(self.model.source, Collection): self.__cleanup_collection_model(self.model.source) elif isinstance(self.model.source, Donation): self.__cleanup_donation_model(self.model.source) if self.model.id_qual is None: self.model.id_qual_rank = None return super(AccessionEditor, self).commit_changes() # import at the bottom to avoid circular dependencies from bauble.plugins.plants.genus import Genus from bauble.plugins.plants.species_model import Species from bauble.plugins.garden.donor import Donor, DonorEditor # # infobox for searchview # # TODO: i don't think this shows all field of an accession, like the # accuracy values class GeneralAccessionExpander(InfoExpander): """ generic information about an accession like number of clones, provenance type, wild provenance type, speciess """ def __init__(self, widgets): ''' ''' InfoExpander.__init__(self, _("General"), widgets) general_box = self.widgets.general_box self.widgets.general_window.remove(general_box) self.vbox.pack_start(general_box) self.current_obj = None self.private_image = self.widgets.acc_private_data def on_species_clicked(*args): select_in_search_results(self.current_obj.species) utils.make_label_clickable(self.widgets.name_data, on_species_clicked) def update(self, row): ''' ''' self.current_obj = row self.set_widget_value('acc_code_data', '%s' % \ utils.xml_safe(unicode(row.code))) # TODO: i don't know why we can't just set the visible # property to False here acc_private = self.widgets.acc_private_data if row.private: if acc_private.parent != self.widgets.acc_code_box: self.widgets.acc_code_box.pack_start(acc_private) else: self.widgets.remove_parent(acc_private) #self.set_widget_value('name_data', '%s %s' % \ # (row.species.markup(True), row.id_qual or '',)) self.set_widget_value('name_data', row.species_str(markup=True)) session = object_session(row) # TODO: it would be nice if we did something like 13 Living, # 2 Dead, 6 Unknown, etc # TODO: could this be sped up, does it matter? nplants = session.query(Plant).filter_by(accession_id=row.id).count() self.set_widget_value('nplants_data', nplants) prov = '' if row.prov_type: prov = row.prov_type self.set_widget_value('prov_data', prov, False) class NotesExpander(InfoExpander): """ the accession's notes """ def __init__(self, widgets): InfoExpander.__init__(self, _("Notes"), widgets) notes_box = self.widgets.notes_box self.widgets.notes_window.remove(notes_box) self.vbox.pack_start(notes_box) def update(self, row): self.set_widget_value('notes_data', row.notes) class SourceExpander(InfoExpander): def __init__(self, widgets): InfoExpander.__init__(self, _('Source'), widgets) self.curr_box = None self.box_map = {Collection: (self.widgets.collections_box, self.update_collections), Donation: (self.widgets.donations_box, self.update_donations)} self.current_obj = None def on_donor_clicked(*args): select_in_search_results(self.current_obj.donor) utils.make_label_clickable(self.widgets.donor_data, on_donor_clicked) def update_collections(self, collection): self.set_widget_value('loc_data', collection.locale) self.set_widget_value('datum_data', collection.gps_datum) geo_accy = collection.geo_accy if not geo_accy: geo_accy = '' else: geo_accy = '(+/- %sm)' % geo_accy if collection.latitude: dir, deg, min, sec = latitude_to_dms(collection.latitude) lat_str = '%.2f (%s %s\302\260%s\'%.2f") %s' % \ (collection.latitude, dir, deg, min, sec, geo_accy) self.set_widget_value('lat_data', lat_str) if collection.longitude: dir, deg, min, sec = longitude_to_dms(collection.longitude) long_str = '%.2f (%s %s\302\260%s\'%.2f") %s' % \ (collection.longitude, dir, deg, min, sec, geo_accy) self.set_widget_value('lon_data', long_str) if collection.elevation: if collection.elevation_accy: elevation = '%sm (+/- %sm)' % (collection.elevation, collection.elevation_accy) self.set_widget_value('elev_data', elevation) else: elevation = '%sm' % (collection.elevation) self.set_widget_value('elev_data', elevation) self.set_widget_value('coll_data', collection.collector) self.set_widget_value('date_data', collection.date) self.set_widget_value('collid_data', collection.collectors_code) self.set_widget_value('habitat_data', collection.habitat) self.set_widget_value('collnotes_data', collection.notes) def update_donations(self, donation): self.current_obj = donation session = object_session(donation) donor = session.query(Donor).get(donation.donor_id) donor_str = utils.xml_safe(utils.utf8(donor)) self.set_widget_value('donor_data', donor_str) self.set_widget_value('donid_data', donation.donor_acc) self.set_widget_value('donnotes_data', donation.notes) def update(self, value): if self.curr_box is not None: parent = self.curr_box.get_parent() if parent: parent.remove(self.curr_box) if value is None: self.set_expanded(False) self.set_sensitive(False) return box, update = self.box_map[value.__class__] self.widgets.remove_parent(box) self.curr_box = box update(value) self.vbox.pack_start(self.curr_box) self.set_expanded(True) self.set_sensitive(True) class AccessionInfoBox(InfoBox): """ - general info - source """ def __init__(self): super(AccessionInfoBox, self).__init__() glade_file = os.path.join(paths.lib_dir(), "plugins", "garden", "acc_infobox.glade") self.widgets = utils.GladeWidgets(gtk.glade.XML(glade_file)) self.general = GeneralAccessionExpander(self.widgets) self.add_expander(self.general) self.source = SourceExpander(self.widgets) self.add_expander(self.source) self.notes = NotesExpander(self.widgets) self.add_expander(self.notes) self.props = PropertiesExpander() self.add_expander(self.props) def update(self, row): self.general.update(row) self.props.update(row) if row.notes is None: self.notes.set_expanded(False) self.notes.set_sensitive(False) else: self.notes.set_expanded(True) self.notes.set_sensitive(True) self.notes.update(row) # TODO: should test if the source should be expanded from the prefs self.source.update(row.source) # it's easier just to put this here instead of playing around with imports class SourceInfoBox(AccessionInfoBox): def update(self, row): super(SourceInfoBox, self).update(row.accession) # # Map Datum List - this list should be available as a list of completions for # the datum text entry....the best way is that is to show the abbreviation # with the long string in parenthesis or with different markup but selecting # the completion will enter the abbreviation....though the entry should be # free text....this list complements of: # http://www8.garmin.com/support/faqs/MapDatumList.pdf # # Abbreviation: Name datums = {"Adindan": "Adindan- Ethiopia, Mali, Senegal, Sudan", "Afgooye": "Afgooye- Somalia", "AIN EL ABD": "'70 AIN EL ANBD 1970- Bahrain Island, Saudi Arabia", "Anna 1 Ast '65": "Anna 1 Astro '65- Cocos I.", "ARC 1950": "ARC 1950- Botswana, Lesotho, Malawi, Swaziland, Zaire, Zambia", "ARC 1960": "Kenya, Tanzania", "Ascnsn Isld '58": "Ascension Island '58- Ascension Island", "Astro Dos 71/4": "Astro Dos 71/4- St. Helena", "Astro B4 Sorol": "Sorol Atoll- Tern Island", "Astro Bcn \"E\"": "Astro Beacon \"E\"- Iwo Jima", "Astr Stn '52": "Astronomic Stn '52- Marcus Island", "Aus Geod '66": "Australian Geod '66- Australia, Tasmania Island", "Aus Geod '84": "Australian Geod '84- Australia, Tasmania Island", "Austria": "Austria", "Bellevue (IGN)": "Efate and Erromango Islands", "Bermuda 1957" : "Bermuda 1957- Bermuda Islands", "Bogota Observ": "Bogata Obsrvatry- Colombia", "Campo Inchspe": "Campo Inchauspe- Argentina", "Canton Ast '66": "Canton Astro 1966- Phoenix Islands", "Cape": "Cape- South Africa", "Cape Canavrl": "Cape Canaveral- Florida, Bahama Islands", "Carthage": "Carthage- Tunisia", "CH-1903": "CH 1903- Switzerland", "Chatham 1971" : "Chatham 1971- Chatham Island (New Zealand)", "Chua Astro": "Chua Astro- Paraguay", "Corrego Alegr" : "Corrego Alegre- Brazil", "Croatia" : "Croatia", "Djakarta" : "Djakarta (Batavia)- Sumatra Island (Indonesia)", "Dos 1968" : "Dos 1968- Gizo Island (New Georgia Islands)", "Dutch" : "Dutch", "Easter Isld 67" : "Easter Island 1967", "European 1950" : "European 1950- Austria, Belgium, Denmark, Finland, France, Germany, Gibraltar, Greece, Italy, Luxembourg, Netherlands, Norway, Portugal, Spain, Sweden, Switzerland", "European 1979": "European 1979- Austria, Finland, Netherlands, Norway, Spain, Sweden, Switzerland", "Finland Hayfrd": "Finland Hayford- Finland", "Gandajika Base": "Gandajika Base- Republic of Maldives", "GDA": "Geocentric Datum of Australia", "Geod Datm '49": "Geodetic Datum '49- New Zealand", "Guam 1963": "Guam 1963- Guam Island", "Gux 1 Astro": "Guadalcanal Island", "Hjorsey 1955": "Hjorsey 1955- Iceland", "Hong Kong '63": "Hong Kong", "Hu-Tzu-Shan": "Taiwan", "Indian Bngldsh" : "Indian- Bangladesh, India, Nepal", "Indian Thailand" : "Indian- Thailand, Vietnam", "Indonesia 74" : "Indonesia 1974- Indonesia", "Ireland 1965" : "Ireland 1965- Ireland", "ISTS 073 Astro": "ISTS 073 ASTRO '69- Diego Garcia", "Johnston Island" : "Johnston Island NAD27 Central", "Kandawala": "Kandawala- Sri Lanka", "Kergueln Islnd": "Kerguelen Island", "Kertau 1948": "West Malaysia, Singapore", "L.C. 5 Astro": "Cayman Brac Island", "Liberia 1964": "Liberia 1964- Liberia", "Luzon Mindanao": "Luzon- Mindanao Island", "Luzon Philippine": "Luzon- Philippines (excluding Mindanao Isl.)", "Mahe 1971": "Mahe 1971- Mahe Island", "Marco Astro": "Marco Astro- Salvage Isl.", "Massawa": "Massawa- Eritrea (Ethiopia)", "Merchich": "Merchich- Morocco", "Midway Ast '61": "Midway Astro '61- Midway", "Minna": "Minna- Nigeria", "NAD27 Alaska": "North American 1927- Alaska", "NAD27 Bahamas": "North American 1927- Bahamas", "NAD27 Canada": "North American 1927- Canada and Newfoundland", "NAD27 Canal Zn": "North American 1927- Canal Zone", "NAD27 Caribbn": "North American 1927- Caribbean (Barbados, Caicos Islands, Cuba, Dominican Repuplic, Grand Cayman, Jamaica, Leeward and Turks Islands)", "NAD27 Central": "North American 1927- Central America (Belize, Costa Rica, El Salvador, Guatemala, Honduras, Nicaragua)", "NAD27 CONUS": "North American 1927- Mean Value (CONUS)", "NAD27 Cuba": "North American 1927- Cuba", "NAD27 Grnland": "North American 1927- Greenland (Hayes Peninsula)", "NAD27 Mexico": "North American 1927- Mexico", "NAD27 San Sal": "North American 1927- San Salvador Island", "NAD83": "North American 1983- Alaska, Canada, Central America, CONUS, Mexico", "Naparima BWI": "Naparima BWI- Trinidad and Tobago", "Nhrwn Masirah": "Nahrwn- Masirah Island (Oman)", "Nhrwn Saudi A": "Nahrwn- Saudi Arabia", "Nhrwn United A": "Nahrwn- United Arab Emirates", "Obsrvtorio '66": "Observatorio 1966- Corvo and Flores Islands (Azores)", "Old Egyptian": "Old Egyptian- Egypt", "Old Hawaiian": "Old Hawaiian- Mean Value", "Oman": "Oman- Oman", "Old Srvy GB": "Old Survey Great Britain- England, Isle of Man, Scotland, Shetland Isl., Wales", "Pico De Las Nv": "Canary Islands", "Potsdam": "Potsdam-Germany", "Prov S Am '56": "Prov Amricn '56- Bolivia, Chile,Colombia, Ecuador, Guyana, Peru, Venezuela", "Prov S Chln '63": "So. Chilean '63- S. Chile", "Ptcairn Ast '67": "Pitcairn Astro '67- Pitcairn", "Puerto Rico": "Puerto Rico & Virgin Isl.", "Qatar National": "Qatar National- Qatar South Greenland", "Qornoq": "Qornoq- South Greenland", "Reunion": "Reunion- Mascarene Island", "Rome 1940": "Rome 1940- Sardinia Isl.", "RT 90": "Sweden", "Santo (Dos)": "Santo (Dos)- Espirito Santo", "Sao Braz": "Sao Braz- Sao Miguel, Santa Maria Islands", "Sapper Hill '43": "Sapper Hill 1943- East Falkland Island", "Schwarzeck": "Schwarzeck- Namibia", "SE Base": "Southeast Base- Porto Santo and Madiera Islands", "South Asia": "South Asia- Singapore", "Sth Amrcn '69": "S. American '69- Argentina, Bolivia, Brazil, Chile, Colombia, Ecuador, Guyana, Paraguay, Peru, Venezuela, Trin/Tobago", "SW Base": "Southwest Base- Faial, Graciosa, Pico, Sao Jorge and Terceira", "Taiwan": "Taiwan", "Timbalai 1948": "Timbalai 1948- Brunei and E. Malaysia (Sarawak and Sabah)", "Tokyo": "Tokyo- Japan, Korea, Okinawa", "Tristan Ast '68": "Tristan Astro 1968- Tristan da Cunha", "Viti Levu 1916": "Viti Levu 1916- Viti Levu/Fiji Islands", "Wake-Eniwetok": "Wake-Eniwetok- Marshall", "WGS 72": "World Geodetic System 72", "WGS 84": "World Geodetic System 84", "Zanderij": "Zanderij- Surinam (excluding San Salvador Island)", "User": "User-defined custom datum"} bauble-0.9.7/bauble/plugins/garden/infoboxes.glade0000644000175000017500000003065711210626427021164 0ustar brettbrett True True 5 True 0 8 -- False True 1 2 15 8 True 1 <b># of Plants:</b> True GTK_FILL GTK_FILL True 0 -- 1 2 GTK_FILL GTK_FILL False 1 True 5 True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True GTK_WRAP_WORD 1 True True 5 True 0 8 -- False True 5 2 15 8 True 0 -- 1 2 4 5 True 0 -- 1 2 3 4 True 0 -- 1 2 2 3 True 0 -- 1 2 1 2 True 1 <b>Fax:</b> True 4 5 GTK_FILL GTK_FILL True 1 <b>Tel:</b> True 3 4 GTK_FILL GTK_FILL True 1 <b># of Donations:</b> True GTK_FILL GTK_FILL True 1 0 <b>Address:</b> True 1 2 GTK_FILL GTK_FILL True 1 <b>Email:</b> True 2 3 GTK_FILL GTK_FILL True 0 -- 1 2 False 1 True 5 True False GTK_WRAP_WORD False 1 bauble-0.9.7/bauble/plugins/garden/institution.py0000755000175000017500000001323011227664625021136 0ustar brettbrett# # institution.py # # Description: edit and store information about the institution in the bauble # meta # import os import bauble import bauble.editor as editor import bauble.meta as meta import bauble.utils as utils import bauble.paths as paths import bauble.pluginmgr as pluginmgr from bauble.utils.log import debug # TODO: the institution editor is a live editor where the database is # updated as the user types. This is a bit slow and maybe we could add # a callback so that the database isn't updated until the user stops # typing # TODO: create a tool so that the institution editor can be accessed # from the menu class Singleton(object): __instance = None def __new__(cls, *args, **kwargs): if Singleton.__instance == None: obj = object.__new__(cls, *args, **kwargs) Singleton.__instance = obj return Singleton.__instance class Institution(Singleton): ''' Institution is a "live" object. When properties are changed the changes are immediately reflected in the database. Institution values are stored in the Bauble meta database and not in its own table ''' __properties = ('name', 'abbreviation', 'code', 'contact', 'technical_contact', 'email', 'tel', 'fax', 'address') __db_tmpl = 'inst_%s' #table = meta.bauble_meta_table # TODO: update this to not use this table directly table = meta.BaubleMeta.__table__ prop = lambda s, p: utils.utf8(s.__db_tmpl % p) def __getattr__(self, prop): if prop not in self.__properties: msg = _('Institution.__getattr__: %s not a property on '\ 'Intitution') % prop raise ValueError(msg) r = self.table.select(self.table.c.name==self.prop(prop)).execute().fetchone() if r is None: return None return r['value'] def __setattr__(self, prop, value): if prop not in self.__properties: msg = _('Institution.__setattr__: %s not a property on '\ 'Intitution') % prop raise ValueError(msg) prop = self.prop(prop) value = utils.utf8(value) s = self.table.select(self.table.c.name == prop).execute() # have to check if the property exists first because sqlite doesn't # raise an error if you try to update a value that doesn't exist and # do an insert and then catching the exception if it exists and then # updating the value is too slow if s.fetchone() is None: ## debug('insert: %s = %s' % (prop, value)) self.table.insert().execute(name=prop, value=value) else: ## debug('update: %s = %s' % (prop, value)) self.table.update(self.table.c.name==prop).execute(value=value) class InstitutionEditorView(editor.GenericEditorView): # i think the institution editor's field are pretty self explanatory _tooltips = {} def __init__(self, parent=None): glade_path = os.path.join(paths.lib_dir(), 'plugins', 'garden', 'editors.glade') super(InstitutionEditorView, self).__init__(glade_path, parent=parent) self.dialog = self.widgets.inst_dialog self.connect_dialog_close(self.dialog) if parent is None: parent = bauble.gui.window self.dialog.set_transient_for(parent) def start(self): return self.dialog.run() class InstitutionEditorPresenter(editor.GenericEditorPresenter): widget_to_field_map = {'inst_name': 'name', 'inst_abbr': 'abbreviation', 'inst_code': 'code', 'inst_contact': 'contact', 'inst_tech': 'technical_contact', 'inst_email': 'email', 'inst_tel': 'tel', 'inst_fax': 'fax', 'inst_addr': 'address' } def __init__(self, model, view): super(InstitutionEditorPresenter, self).__init__(model, view) self.refresh_view() for widget, field in self.widget_to_field_map.iteritems(): self.assign_simple_handler(widget, field) self.__dirty = False def set_model_attr(self, attr, value, validator): super(InstitutionEditorPresenter, self).set_model_attr(attr, value, validator) self.__dirty = True def dirty(self): return self.__dirty def refresh_view(self): for widget, field in self.widget_to_field_map.iteritems(): self.view.set_widget_value(widget, getattr(self.model, field)) def start(self, commit_transaction=True): return self.view.start() class InstitutionEditor(object): def __init__(self, parent=None): self.model = Institution() self.view = InstitutionEditorView(parent=parent) self.presenter = InstitutionEditorPresenter(self.model, self.view) def start(self): self.presenter.start() class InstitutionCommandHandler(pluginmgr.CommandHandler): command = ('inst', 'institution') view = None def __call__(self, arg): e = InstitutionEditor() e.start() pluginmgr.register_command(InstitutionCommandHandler) def test(): ## i = Institution() ## i2 = Institution() ## assert i==i2 ## i.name = 'Belize Botanic Gardens' ## i.code = 'CAYO' print os.path.join(paths.lib_dir(), 'bauble.glade') widgets = utils.GladeWidgets(os.path.join(paths.lib_dir(), 'bauble.glade')) widgets.inst_dialog.show_all() print 'showed' import gtk gtk.main() if __name__ == '__main__': test() bauble-0.9.7/bauble/plugins/garden/source.py0000755000175000017500000001014411210626427020034 0ustar brettbrett# # source.py # from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.orm.session import object_session import bauble import bauble.db as db import bauble.types as types from bauble.plugins.plants.geography import Geography def source_markup_func(source): # TODO: should probably just make the source look and act like an accession # with the same markup and children in the view return source.accession, source class Donation(db.Base): """ :Table name: donation :Columns: *donor_id*: :class:`sqlalchemy.types.Integer(ForeignKey('donor.id'), nullable=False)` *donor_acc*: :class:`sqlalchemy.types.Unicode(32)` *notes*: :class:`sqlalchemy.types.UnicodeText` *date*: :class:`bauble.types..Date` *accession_id*: :class:`sqlalchemy.types.Integer(ForeignKey('accession.id'), nullable=False)` :Properties: donor: created as a backref from the Donor mapper _accession: created as a backref from the Accession mapper _donation property """ __tablename__ = 'donation' donor_id = Column(Integer, ForeignKey('donor.id'), nullable=False) donor_acc = Column(Unicode(32)) # donor's accession id notes = Column(UnicodeText) date = Column(types.Date) accession_id = Column(Integer, ForeignKey('accession.id'), nullable=False) def __str__(self): if self.donor: return 'Donation from %s' % self.donor else: return repr(self) # TODO: is there anyway to get this date format from BaubleMeta, also # i don't know why setting dateFormat here give me an error about getting # the date in unicode instead of a DateTimeCol eventhough i set this # column using a datetime object # TODO: deleting this foreign accession deletes this collection # TODO: collector combined with collectors_code should be a unique key, need to # also indicate this in the UI # TODO: should provide a collection type: alcohol, bark, boxed, cytological, fruit, illustration, image, other, packet, pollen, print, reference, seed, sheet, slide, transparency, vertical, wood.....see HISPID standard, in general need to be more herbarium aware # TODO: create a DMS column type to hold latitude and longitude, # should probably store the DMS data as a string in decimal degrees class Collection(db.Base): """ :Table name: collection :Columns: *collector*: :class:`sqlalchemy.types.Unicode(64)` *collectors_code*: :class:`sqlalchemy.types.Unicode(50)` *date*: :class:`sqlalchemy.types.Date` *locale*: :class:`sqlalchemy.types.UnicodeText(nullable=False)` *latitude*: :class:`sqlalchemy.types.Float` *longitude*: :class:`sqlalchemy.types.Float` *gps_datum*: :class:`sqlalchemy.types.Unicode(32)` *geo_accy*: :class:`sqlalchemy.types.Float` *elevation*: :class:`sqlalchemy.types.Float` *elevation_accy*: :class:`sqlalchemy.types.Float` *habitat*: :class:`sqlalchemy.types.UnicodeText` *geography_id*: :class:`sqlalchemy.types.Integer(ForeignKey('geography.id'))` *notes*: :class:`sqlalchemy.types.UnicodeText` *accession_id*: :class:`sqlalchemy.types.Integer(ForeignKey('accession.id'), nullable=False)` :Properties: Also contains an _accession property that was created as a backref from the Accession mapper :Constraints: """ __tablename__ = 'collection' # columns collector = Column(Unicode(64)) collectors_code = Column(Unicode(50)) date = Column(types.Date) locale = Column(UnicodeText, nullable=False) latitude = Column(Float) longitude = Column(Float) gps_datum = Column(Unicode(32)) geo_accy = Column(Float) elevation = Column(Float) elevation_accy = Column(Float) habitat = Column(UnicodeText) geography_id = Column(Integer, ForeignKey('geography.id')) notes = Column(UnicodeText) accession_id = Column(Integer, ForeignKey('accession.id'), nullable=False) def __str__(self): return 'Collection at %s' % (self.locale or repr(self)) bauble-0.9.7/bauble/plugins/garden/editors.glade0000644000175000017500000053243311266707013020642 0ustar brettbrett Accession Editor False True center-on-parent 320 260 True dialog True True True False True 10 10 True True 8 True 15 True 0 none True 12 True 40 True <b><i>Species</i></b> True label_item 0 True 0 none True 12 True -- True <b>ID Qualifier</b> True label_item False 1 True 0 none True 12 True True <b>Qualifier Rank</b> True label_item 2 False False 0 True 15 True 0 none True 2 12 True 15 True <b><i>Accession ID</i></b> True label_item False False 0 True 0 none True 2 12 True True True 12 False False 0 True True True 1 True 5 dd/mm/yyyy False False 2 True <b>Date</b> True label_item False 1 False False 1 True 15 True 0 none True 2 12 True True <b>Provenance</b> True label_item False 0 True 0 none True 2 12 True False -- True <b>Wild status</b> True label_item False 1 True 50 True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Private</b> True 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-dialog-authentication 1 2 2 False False 0 False 0 True True 0 none True 12 True True automatic automatic in True True word label_item True <b>Notes</b> True label_item 1 True General False tab True True 10 True 15 True <b>Type</b> True False 0 True -- False 1 False 0 True 0 none True 12 label_item 1 0 1 True Source 1 False tab 2 True end gtk-cancel -6 True False False True False False 0 gtk-ok -5 True False False False True False False 1 OK and add plants... 11 True False False False True False False 2 22 True False False False True 0 0 True 2 True gtk-go-forward False False 0 True Next True False False 1 False False 3 False end 0 donation_window 320 230 True 5 True 8 True 3 2 8 8 True 1 <b>Donor</b> True GTK_FILL True 1 <b>Donor's ID</b> True 1 2 GTK_FILL True 1 <b>Date</b> True 2 3 GTK_FILL True True 12 False False 0 1 2 1 2 GTK_FILL GTK_FILL True True True True 12 False False 0 True True True False False 1 True 0 5 dd/mm/yyyy False False 2 1 2 2 3 GTK_FILL GTK_FILL True 10 True 0 True 10 gtk-new True False False True False False 0 gtk-edit True False False False True False False 1 False False 1 1 2 GTK_FILL GTK_FILL False 0 True 0 none True 2 12 True False automatic automatic in True word True <b>Donation Notes</b> True label_item 1 0 Donor Editor True True dialog True True 5 10 True 0 none True 2 12 True True True <b><i>Name</i></b> True label_item False 0 True 0 none True 2 12 True -- True <b>Type</b> True label_item False 1 True 0 none True 2 12 True True automatic automatic in True True True <b>Address</b> True label_item False 2 True 0 none True 2 12 True True True <b>E-mail</b> True label_item False 3 True 0 none True 2 12 True True True <b>Tel #</b> True label_item False 4 True 0 none True 2 12 True True True <b>Fax #</b> True label_item False 5 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True False True True False True False False 1 11 True False True True False True 0 0 True 2 True gtk-go-forward False False 0 True Next True False False 1 False False 2 False end 0 Location Editor False True dialog True True 5 10 True 0 none True 2 12 True True True <b><i>Site</i></b> True label_item False 0 True 0 none True 2 12 True False automatic automatic True True word True <b>Description</b> True label_item 1 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True False True True False True False False 1 Ok and add plants 11 True False True True False True False False 2 22 True False True True False True 0 0 True 2 True gtk-go-forward False False 0 True Next True False False 1 False False 3 False False end 0 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 Institution Editor center-on-parent dialog False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 20 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Institution Name</b> True label_item False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Abbreviation</b> True label_item False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Institutional code</b> True label_item False 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Contact name</b> True label_item False 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Technical contact</b> True label_item False 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Email</b> True label_item False 5 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Telephone</b> True label_item False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Fax</b> True label_item False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Address</b> True label_item 2 1 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-ok True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 1 False end 0 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b><i>Locale</i></b> True label_item False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 30 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 30 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Collector</b> True label_item False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 20 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Collection ID</b> True label_item 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 0 True True True 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 dd/mm/yyyy 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Date</b> True label_item 1 False 1 False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK automatic automatic True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK word True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Collection Notes</b> True label_item 1 False 1 True True True 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True 35 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 15 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 3 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 1 2 GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <b>Latitude</b> True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 13 5 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <b>Longitude</b> True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 13 5 1 1 2 True True 2 +/- False False 0 True 5 False False 1 True 2 m False False 2 2 3 1 2 GTK_FILL 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True North True False False True False False 0 South True False False True north_radio False False 1 2 3 GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 1 2 1 2 GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True East True False False True True False False 0 West True False False True True east_radio False False 1 1 2 2 3 GTK_FILL 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 60 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <b>GPS Datum</b> True 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True 1 False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 2 8 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <b>Altitude/Depth</b> True GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 1 2 GTK_FILL True True 2 +/- False False 0 True 6 False 1 True 2 m False False 2 1 2 1 2 False 1 False 1 False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK automatic automatic True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK word True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Habitat description</b> True label_item 1 True <b>Location Details</b> True label_item 2 500 Plant Editor False center-on-parent 500 True dialog True True 5 10 True True 0 none True 2 12 True True True <b><i>Accession</i></b> True label_item 0 True 0.89999997615814209 5 . False 1 True 0 none True 2 12 True True True <b><i>Plant code</i></b> True label_item 2 0 True 0 none True 2 12 True 6 True True 0 True True False True 0 0 True 2 True gtk-add False False 0 True Add True False False 1 False 1 True True False True 0 0 True 2 True gtk-edit False False 0 True Edit True False False 1 False 2 True <b><i>Location</i></b> True label_item 1 True 30 True 0 none True 2 12 True -- True <b>Accession type</b> True label_item False 0 True 0 none True 2 12 True -- True <b>Status</b> True label_item False 1 2 True False True True True True in True True False 0 True True in True True 1 True <b>History</b> True label_item 3 True True True True 0 none True 12 True True automatic automatic in True True word label_item True <b>Notes</b> True label_item 4 False 2 True end gtk-cancel -6 True False False True False False 0 gtk-ok -5 True False False True False False 1 22 True False False True 0 0 True 2 True gtk-go-forward False False 0 True Next True False False 1 False False 2 False end 0 bauble-0.9.7/bauble/plugins/garden/acc_infobox.glade0000644000175000017500000007422211210626427021436 0ustar brettbrett general True 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 5 <i>--</i> True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 20 gtk-dialog-authentication 1 False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 -- True False 1 False 5 True 3 2 15 8 True 1 <b>Plants/Clones:</b> True GTK_FILL True 0 -- 1 2 True 1 <b>Provenance:</b> True 1 2 GTK_FILL True False 1 <b>Verifier:</b> True 2 3 GTK_FILL True 0 -- 1 2 1 2 True False 0 -- 1 2 2 3 1 collections True True 8 True 8 2 10 8 True 0 -- 1 2 3 4 GTK_FILL True 1 <b>GPS Datum</b> True 3 4 GTK_FILL True 0 -- 1 2 4 5 GTK_FILL True 1 <b>Elevation:</b> True 4 5 GTK_FILL True 0 -- 1 2 5 6 GTK_FILL True 1 <b>Collector:</b> True 5 6 GTK_FILL True 0 -- 1 2 6 7 GTK_FILL True 1 <b>Date collected:</b> True 6 7 GTK_FILL True 0 -- 1 2 7 8 True 1 <b>Collection ID:</b> True 7 8 GTK_FILL True 1 <b>Location:</b> True GTK_FILL True 1 <b>Latitude:</b> True 1 2 GTK_FILL True 1 <b>Longitude:</b> True 2 3 GTK_FILL True 0 -- 1 2 GTK_FILL True 0 -- 1 2 1 2 GTK_FILL True 0 -- 1 2 2 3 GTK_FILL False True 0 GTK_SHADOW_NONE True 12 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN True True False GTK_WRAP_WORD False True <b>Habitat</b> True label_item False 1 True 0 GTK_SHADOW_NONE True 12 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN True True False GTK_WRAP_WORD False True <b>Notes</b> True label_item False 2 donations True 5 True 2 2 8 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 0 -- True 1 2 True 1 0 <b>Donor:</b> True GTK_FILL GTK_FILL True 1 <b>Donor's ID:</b> True 1 2 GTK_FILL True 0 -- 1 2 1 2 GTK_FILL False True 0 GTK_SHADOW_NONE True 12 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN True True False GTK_WRAP_WORD False True <b>Donation Notes</b> True label_item False 1 window1 True True True 5 GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC GTK_SHADOW_IN True True False GTK_WRAP_WORD False bauble-0.9.7/bauble/plugins/garden/__init__.py0000755000175000017500000000707511210626427020304 0ustar brettbrett# # garden plugin # import os, sys import bauble import bauble.utils as utils import bauble.pluginmgr as pluginmgr from bauble.view import SearchView from bauble.plugins.garden.accession import Accession, \ AccessionEditor, AccessionInfoBox, acc_context_menu, acc_markup_func, \ SourceInfoBox from bauble.plugins.garden.location import Location, \ LocationEditor, LocationInfoBox, loc_context_menu, loc_markup_func from bauble.plugins.garden.plant import Plant, \ PlantHistory, PlantEditor, PlantInfoBox, \ plant_context_menu, plant_markup_func, plant_delimiter_key, \ default_plant_delimiter, PlantSearch from bauble.plugins.garden.source import Donation, \ Collection, source_markup_func from bauble.plugins.garden.donor import Donor, DonorEditor, \ DonorInfoBox, donor_context_menu import bauble.plugins.garden.institution from bauble.utils.log import debug # other ideas: # - cultivation table # - conservation table def natsort_kids(kids): return lambda(parent): sorted(getattr(parent, kids),key=utils.natsort_key) class GardenPlugin(pluginmgr.Plugin): depends = ["PlantsPlugin"] @classmethod def install(cls, *args, **kwargs): pass @classmethod def init(cls): from bauble.plugins.plants import Species mapper_search = SearchView.get_search_strategy('MapperSearch') mapper_search.add_meta(('accession', 'acc'), Accession, ['code']) SearchView.view_meta[Accession].set(children=natsort_kids("plants"), infobox=AccessionInfoBox, context_menu=acc_context_menu, markup_func=acc_markup_func) mapper_search.add_meta(('location', 'loc'), Location, ['site']) SearchView.view_meta[Location].set(children=natsort_kids('plants'), infobox=LocationInfoBox, context_menu=loc_context_menu, markup_func=loc_markup_func) mapper_search.add_meta(('plant', 'plants'), Plant, ['code']) SearchView.add_search_strategy(PlantSearch) SearchView.view_meta[Plant].set(infobox=PlantInfoBox, context_menu=plant_context_menu, markup_func=plant_markup_func) mapper_search.add_meta(('donor', 'don'), Donor, ['name']) SearchView.view_meta[Donor].set(children=natsort_kids('donations'), infobox=DonorInfoBox, context_menu=donor_context_menu) SearchView.view_meta[Donation].set(infobox=SourceInfoBox, markup_func=source_markup_func) SearchView.view_meta[Collection].set(infobox=SourceInfoBox, markup_func=source_markup_func) # done here b/c the Species table is not part of this plugin SearchView.view_meta[Species].child = "accessions" if bauble.gui is not None: bauble.gui.add_to_insert_menu(AccessionEditor, _('Accession')) bauble.gui.add_to_insert_menu(PlantEditor, _('Plant')) bauble.gui.add_to_insert_menu(LocationEditor, _('Location')) #bauble.gui.add_to_insert_menu(DonorEditor, _('Donor')) # if the plant delimiter isn't in the bauble meta then add the default import bauble.meta as meta meta.get_default(plant_delimiter_key, default_plant_delimiter) plugin = GardenPlugin bauble-0.9.7/bauble/plugins/garden/location.py0000755000175000017500000002605011267165526020361 0ustar brettbrett# # location.py # import os import traceback from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.orm.session import object_session from sqlalchemy.exc import SQLError import bauble import bauble.db as db from bauble.editor import * import bauble.utils as utils import bauble.paths as paths def edit_callback(value): e = LocationEditor(value) return e.start() != None def add_plant_callback(value): from bauble.plugins.garden.plant import Plant, PlantEditor e = PlantEditor(model=value) return e.start() != None def remove_callback(value): s = '%s: %s' % (value.__class__.__name__, str(value)) msg = _("Are you sure you want to remove %s?") % \ utils.xml_safe_utf8(s) if not utils.yes_no_dialog(msg): return try: session = bauble.Session() obj = session.query(Location).get(value.id) session.delete(obj) session.commit() except Exception, e: msg = _('Could not delete.\n\n%s') % utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), type=gtk.MESSAGE_ERROR) return True loc_context_menu = [('Edit', edit_callback), ('--', None), ('Add plant', add_plant_callback), ('--', None), ('Remove', remove_callback)] def loc_markup_func(location): if location.description is not None: return str(location), str(location.description) else: return str(location) class Location(db.Base): """ :Table name: location :Columns: *site*: *description*: :Relation: *plants*: """ __tablename__ = 'location' __mapper_args__ = {'order_by': 'site'} # columns site = Column(Unicode(64), unique=True, nullable=False) description = Column(UnicodeText) # relations plants = relation('Plant', backref=backref('location', uselist=False)) def __str__(self): return str(self.site) class LocationEditorView(GenericEditorView): #source_expanded_pref = 'editor.accesssion.source.expanded' _tooltips = { 'loc_location_entry': _('The site is the name that you will use '\ 'later to refer to this location.'), 'loc_desc_textview': _('Any information that might be relevant to '\ 'the location such as where it is or what\'s '\ 'it\'s purpose') } def __init__(self, parent=None): GenericEditorView.__init__(self, os.path.join(paths.lib_dir(), 'plugins', 'garden', 'editors.glade'), parent=parent) self.dialog = self.widgets.location_dialog self.dialog.set_transient_for(parent) self.connect_dialog_close(self.widgets.location_dialog) self.use_ok_and_add = True self.set_accept_buttons_sensitive(False) # if the parent isn't the main bauble window then we assume # that the LocationEditor was opened from the PlantEditor and # so we shouldn't enable adding more plants...this is a bit of # a hack but it serves our purposes if bauble.gui and parent != bauble.gui.window: self.use_ok_and_add = False def set_accept_buttons_sensitive(self, sensitive): self.widgets.loc_ok_button.set_sensitive(sensitive) self.widgets.loc_ok_and_add_button.set_sensitive(self.use_ok_and_add \ and sensitive) self.widgets.loc_next_button.set_sensitive(sensitive) def start(self): return self.dialog.run() class LocationEditorPresenter(GenericEditorPresenter): widget_to_field_map = {'loc_location_entry': 'site', 'loc_desc_textview': 'description'} def __init__(self, model, view): ''' model: should be an instance of class Accession view: should be an instance of AccessionEditorView ''' GenericEditorPresenter.__init__(self, model, view) self.session = object_session(model) # initialize widgets self.refresh_view() # put model values in view # connect signals self.assign_simple_handler('loc_location_entry', 'site', UnicodeOrNoneValidator()) self.assign_simple_handler('loc_desc_textview', 'description', UnicodeOrNoneValidator()) self.__dirty = False def set_model_attr(self, model, field, validator=None): super(LocationEditorPresenter, self).set_model_attr(model, field, validator) self.__dirty = True self.view.set_accept_buttons_sensitive(self.model.site != None) def dirty(self): return self.__dirty def refresh_view(self): for widget, field in self.widget_to_field_map.iteritems(): value = getattr(self.model, field) self.view.set_widget_value(widget, value) def start(self): r = self.view.start() return r class LocationEditor(GenericModelViewPresenterEditor): label = 'Location' mnemonic_label = '_Location' # these have to correspond to the response values in the view RESPONSE_OK_AND_ADD = 11 RESPONSE_NEXT = 22 ok_responses = (RESPONSE_OK_AND_ADD, RESPONSE_NEXT) def __init__(self, model=None, parent=None): ''' @param model: Location instance or None @param parent: the parent widget or None ''' # view and presenter are created in self.start() self.view = None self.presenter = None if model is None: model = Location() super(LocationEditor, self).__init__(model, parent) if not parent and bauble.gui: parent = bauble.gui.window self.parent = parent self._committed = [] def handle_response(self, response): ''' handle the response from self.presenter.start() in self.start() ''' not_ok_msg = 'Are you sure you want to lose your changes?' if response == gtk.RESPONSE_OK or response in self.ok_responses: try: if self.presenter.dirty(): self.commit_changes() self._committed.append(self.model) except SQLError, e: msg = _('Error committing changes.\n\n%s') % \ utils.xml_safe_utf8(e.orig) utils.message_details_dialog(msg, str(e), gtk.MESSAGE_ERROR) return False except Exception, e: msg = _('Unknown error when committing changes. See the '\ 'details for more information.\n\n%s') % \ utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), gtk.MESSAGE_ERROR) return False elif self.presenter.dirty() \ and utils.yes_no_dialog(not_ok_msg) \ or not self.presenter.dirty(): self.session.rollback() return True else: return False # respond to responses more_committed = None if response == self.RESPONSE_NEXT: self.presenter.cleanup() e = LocationEditor(parent=self.parent) more_committed = e.start() elif response == self.RESPONSE_OK_AND_ADD: from bauble.plugins.garden.plant import PlantEditor, Plant e = PlantEditor(Plant(location=self.model), self.parent) more_committed = e.start() if more_committed is not None: if isinstance(more_committed, list): self._committed.extend(more_committed) else: self._committed.append(more_committed) return True def start(self): self.view = LocationEditorView(parent=self.parent) self.presenter = LocationEditorPresenter(self.model, self.view) # add quick response keys dialog = self.view.dialog self.attach_response(dialog, gtk.RESPONSE_OK, 'Return', gtk.gdk.CONTROL_MASK) self.attach_response(dialog, self.RESPONSE_OK_AND_ADD, 'k', gtk.gdk.CONTROL_MASK) self.attach_response(dialog, self.RESPONSE_NEXT, 'n', gtk.gdk.CONTROL_MASK) while True: response = self.presenter.start() self.view.save_state() # should view or presenter save state if self.handle_response(response): break self.presenter.cleanup() self.session.close() # cleanup session return self._committed from bauble.view import InfoBox, InfoExpander, PropertiesExpander class GeneralLocationExpander(InfoExpander): """ general expander for the PlantInfoBox """ def __init__(self, widgets): ''' ''' InfoExpander.__init__(self, "General", widgets) general_box = self.widgets.loc_gen_box self.widgets.remove_parent(general_box) self.vbox.pack_start(general_box) def update(self, row): ''' ''' from bauble.plugins.garden.plant import Plant self.set_widget_value('loc_site_data', '%s' % utils.xml_safe(str(row.site))) session = object_session(row) nplants = session.query(Plant).filter_by(location_id=row.id).count() self.set_widget_value('loc_nplants_data', nplants) class DescriptionExpander(InfoExpander): """ the location description """ def __init__(self, widgets): InfoExpander.__init__(self, _("Description"), widgets) descr_box = self.widgets.loc_descr_box self.widgets.remove_parent(descr_box) self.vbox.pack_start(descr_box) def update(self, row): ''' ''' if row.description is None: self.set_expanded(False) self.set_sensitive(False) else: self.set_expanded(True) self.set_sensitive(True) self.set_widget_value('loc_descr_data', str(row.description)) class LocationInfoBox(InfoBox): """ an InfoBox for a Location table row """ def __init__(self): ''' ''' InfoBox.__init__(self) glade_file = os.path.join(paths.lib_dir(), "plugins", "garden", "infoboxes.glade") self.widgets = utils.GladeWidgets(glade_file) self.general = GeneralLocationExpander(self.widgets) self.add_expander(self.general) self.description = DescriptionExpander(self.widgets) self.add_expander(self.description) self.props = PropertiesExpander() self.add_expander(self.props) def update(self, row): ''' ''' self.general.update(row) self.description.update(row) self.props.update(row) bauble-0.9.7/bauble/plugins/garden/plant.py0000755000175000017500000006223611301104076017653 0ustar brettbrett# # plant.py # """ Defines the plant table and handled editing plants """ import os import sys import traceback import gtk import gobject from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.orm.session import object_session from sqlalchemy.exc import SQLError import bauble.db as db from bauble.error import check, CheckConditionError from bauble.editor import * import bauble.utils as utils from bauble.utils.log import debug import bauble.types as types import bauble.meta as meta from bauble.view import SearchStrategy from bauble.plugins.garden.location import Location, LocationEditor # TODO: do a magic attribute on plant_id that checks if a plant id # already exists with the accession number, this probably won't work # though sense the acc_id may not be set when setting the plant_id # TODO: might be worthwhile to have a label or textview next to the # location combo that shows the description of the currently selected # location # TODO: Bulk Editor # # 1. Go into "Bulk" mode when commas are entered into the plant code, # this will change the location, accession type and status of all # plants with code in the list, if any notes are added they will be # appended to any existing notes the plant might already have...or # probably better to just disable editing the notes when we enter bulk # mode # # 2. Should turn any widgets red if they have values that aren't # common to all the plants codes...if the widgets is red then we won't # be saving this field to all the plants...if the user sets that # widget then all the plants will take that value # # 3. Could cause alot of problems if we mix existing plant code and # not existing plant codes because the user might not know if there # are creating new ones or editing existing ones. We could highlight # the ones that are new but all these color codes might be confusing. # plant_delimiter_key = u'plant_delimiter' default_plant_delimiter = u'.' def edit_callback(plant): return PlantEditor(plant).start() != None def remove_callback(plant): s = '%s: %s' % (plant.__class__.__name__, str(plant)) msg = _("Are you sure you want to remove %s?") % utils.xml_safe_utf8(s) if not utils.yes_no_dialog(msg): return try: session = bauble.Session() obj = session.query(Plant).get(plant.id) session.delete(obj) session.commit() except Exception, e: msg = _('Could not delete.\n\n%s') % utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), type=gtk.MESSAGE_ERROR) finally: session.close() return True plant_context_menu = [('Edit', edit_callback), ('--', None), ('Remove', remove_callback)] def plant_markup_func(plant): ''' ''' sp_str = plant.accession.species_str(markup=True) if plant.acc_status == 'Dead': color = '%s' return color % utils.xml_safe_utf8(plant), sp_str else: return utils.xml_safe_utf8(plant), sp_str class PlantSearch(SearchStrategy): def __init__(self): super(PlantSearch, self).__init__() def search(self, text, session=None): if session is None: session = bauble.Session() delimiter = Plant.get_delimiter() if delimiter not in text: return [] acc_code, plant_code = text.rsplit(delimiter, 1) query = session.query(Plant) from bauble.plugins.garden import Accession try: return query.join('accession').\ filter(and_(Accession.code==acc_code, Plant.code==plant_code)) except Exception, e: debug(e) return [] class PlantHistory(db.Base): __tablename__ = 'plant_history' _mapper_args__ = {'order_by': 'date'} date = Column(types.Date) description = Column(UnicodeText) plant_id = Column(Integer, ForeignKey('plant.id'), nullable=False) def __str__(self): return '%s: %s' % (self.date, self.description) class Plant(db.Base): """ :Table name: plant :Columns: *code*: :class:`sqlalchemy.types.Unicode` The plant code *acc_type*: :class:`bauble.types.Enum` The accession type Possible values: * Plant: Whole plant * Seed/Spore: Seed or Spore * Vegetative Part: Vegetative Part * Tissue Culture: Tissue culture * Other: Other, probably see notes for more information * None: no information, unknown *acc_status*: :class:`bauble.types.Enum` The accession status Possible values: * Living accession: Current accession in living collection * Dead: Noncurrent accession due to Death * Transfered: Noncurrent accession due to Transfer Stored in dormant state: Stored in dormant state * Other: Other, possible see notes for more information * None: no information, unknown) *notes*: :class:`sqlalchemy.types.UnicodeText` Notes *accession_id*: :class:`sqlalchemy.types.ForeignKey` Required. *location_id*: :class:`sqlalchemy.types.ForeignKey` Required. :Properties: *accession*: The accession for this plant. *location*: The location for this plant. :Constraints: The combination of code and accession_id must be unique. """ __tablename__ = 'plant' __table_args__ = (UniqueConstraint('code', 'accession_id'), {}) __mapper_args__ = {'order_by': ['accession_id', 'plant.code']} # columns code = Column(Unicode(6), nullable=False) acc_type = Column(types.Enum(values=['Plant', 'Seed/Spore', 'Vegetative Part', 'Tissue Culture', 'Other', None]), default=None) acc_status = Column(types.Enum(values=['Living accession', 'Dead', 'Transferred', 'Stored in dormant state', 'Other', None]), default=None) notes = Column(UnicodeText) accession_id = Column(Integer, ForeignKey('accession.id'), nullable=False) location_id = Column(Integer, ForeignKey('location.id'), nullable=False) # relations history = relation('PlantHistory', backref='plant') _delimiter = None @classmethod def get_delimiter(cls, refresh=False): """ Get the plant delimiter from the BaubleMeta table. The delimiter is cached the first time it is retrieved. To refresh the delimiter from the database call with refresh=True. """ if cls._delimiter is None or refresh: cls._delimiter = meta.get_default(plant_delimiter_key, default_plant_delimiter).value return cls._delimiter def _get_delimiter(self): return Plant.get_delimiter() delimiter = property(lambda self: self._get_delimiter()) def __str__(self): return "%s%s%s" % (self.accession, self.delimiter, self.code) def markup(self): #return "%s.%s" % (self.accession, self.plant_id) # FIXME: this makes expanding accessions look ugly with too many # plant names around but makes expanding the location essential # or you don't know what plants you are looking at return "%s%s%s (%s)" % (self.accession, self.delimiter, self.code, self.accession.species_str(markup=True)) from bauble.plugins.garden.accession import Accession class PlantEditorView(GenericEditorView): #source_expanded_pref = 'editor.accesssion.source.expanded' _tooltips = { 'plant_code_entry': _('The plant code must be a unique code'), 'plant_acc_entry': _('The accession must be selected from the list ' \ 'of completions. To add an accession use the '\ 'Accession editor'), 'plant_loc_entry': _('The location of the plant in your collection.'), 'plant_acc_type_combo': _('The type of the plant material.\n\n' \ 'Possible values: %s') \ % utils.enum_values_str('plant.acc_type'), 'plant_acc_status_combo': _('The status of this plant in the ' \ 'collection.\nPossible values: %s') \ % utils.enum_values_str('plant.acc_status'), 'plant_notes_textview': _('Miscelleanous notes about this plant.'), } def __init__(self, parent=None): GenericEditorView.__init__(self, os.path.join(paths.lib_dir(), 'plugins', 'garden', 'editors.glade'), parent=parent) self.dialog = self.widgets.plant_dialog self.dialog.set_transient_for(parent) self.widgets.plant_ok_button.set_sensitive(False) self.widgets.plant_next_button.set_sensitive(False) self.connect_dialog_close(self.dialog) def acc_cell_data_func(column, renderer, model, iter, data=None): v = model[iter][0] renderer.set_property('text', '%s (%s)' % (str(v), str(v.species))) self.attach_completion('plant_acc_entry', acc_cell_data_func, minimum_key_length=1) def loc_cell_data_func(col, renderer, model, it, data=None): v = model[it][0] renderer.set_property('text', '%s' % utils.utf8(v)) self.attach_completion('plant_loc_entry', loc_cell_data_func, minimum_key_length=1) def __del__(self): #debug('PlantView.__del__()') #GenericEditorView.__del__(self) # if we destroy the dialog from a glade file loaded with # utils.GladeLoader then we won't be able to get it later if # we want to open the editor again #self.dialog.destroy() pass def save_state(self): pass def restore_state(self): pass def start(self): return self.dialog.run() class ObjectIdValidator(object): def to_python(self, value, state): return value.id class PlantEditorPresenter(GenericEditorPresenter): widget_to_field_map = {'plant_code_entry': 'code', 'plant_acc_entry': 'accession', 'plant_loc_entry': 'location', 'plant_acc_type_combo': 'acc_type', 'plant_acc_status_combo': 'acc_status', 'plant_notes_textview': 'notes'} PROBLEM_DUPLICATE_PLANT_CODE = 5 def __init__(self, model, view): ''' @param model: should be an instance of Plant class @param view: should be an instance of PlantEditorView ''' GenericEditorPresenter.__init__(self, model, view) self.session = object_session(model) self._original_accession_id = self.model.accession_id self._original_code = self.model.code self.__dirty = False # initialize widgets self.init_enum_combo('plant_acc_status_combo', 'acc_status',none_str='') self.init_enum_combo('plant_acc_type_combo', 'acc_type', none_str='') # self.init_history_box() # set default values for acc_status and acc_type if self.model.id is None and self.model.acc_type is None: default_acc_type = unicode('Plant') self.model.acc_type = default_acc_type if self.model.id is None and self.model.acc_status is None: default_acc_status = unicode('Living accession') self.model.acc_status = default_acc_status self.refresh_view() # put model values in view # connect signals def acc_get_completions(text): query = self.session.query(Accession) return query.filter(Accession.code.like(unicode('%s%%' % text))) def on_select(value): self.set_model_attr('accession', value) # reset the plant code to check that this is a valid code for the # new accession, fixes bug #103946 if value is not None: self.on_plant_code_entry_changed() self.assign_completions_handler('plant_acc_entry', acc_get_completions, on_select=on_select) self.view.connect('plant_code_entry', 'changed', self.on_plant_code_entry_changed) self.assign_simple_handler('plant_notes_textview', 'notes', UnicodeOrNoneValidator()) def loc_get_completions(text): query = self.session.query(Location) return query.filter(utils.ilike(Location.site, utils.utf8('%s%%' % text))) def on_loc_select(value): self.set_model_attr('location', value) self.assign_completions_handler('plant_loc_entry', loc_get_completions, on_select=on_loc_select) self.assign_simple_handler('plant_acc_status_combo', 'acc_status', UnicodeOrNoneValidator()) self.assign_simple_handler('plant_acc_type_combo', 'acc_type', UnicodeOrNoneValidator()) self.view.connect('plant_loc_add_button', 'clicked', self.on_loc_button_clicked, 'add') self.view.connect('plant_loc_edit_button', 'clicked', self.on_loc_button_clicked, 'edit') def dirty(self): return self.__dirty def on_plant_code_entry_changed(self, *args): """ Validates the accession number and the plant code from the editors. """ text = utils.utf8(self.view.widgets.plant_code_entry.get_text()) if text == u'': self.set_model_attr('code', None) else: self.set_model_attr('code', text) if self.model.accession is None: self.remove_problem(self.PROBLEM_DUPLICATE_PLANT_CODE, self.view.widgets.plant_code_entry) self.refresh_sensitivity() return # reference accesssion.id instead of accession_id since # setting the accession on the model doesn't set the # accession_id until the session is flushed nplants_query = self.session.query(Plant).join('accession').\ filter(and_(Accession.id==self.model.accession.id, Plant.code==text)) # add a problem if the code is not unique but not if its the # same accession and plant code that we started with when the # editor was opened if self.model.code is not None and nplants_query.count() > 0 \ and not (self._original_accession_id==self.model.accession.id \ and self.model.code==self._original_code): self.add_problem(self.PROBLEM_DUPLICATE_PLANT_CODE, self.view.widgets.plant_code_entry) else: self.remove_problem(self.PROBLEM_DUPLICATE_PLANT_CODE, self.view.widgets.plant_code_entry) self.refresh_sensitivity() def refresh_sensitivity(self): #debug('refresh_sensitivity()') sensitive = (self.model.accession is not None and \ self.model.code is not None and \ self.model.location is not None) \ and self.dirty() and len(self.problems)==0 self.view.widgets.plant_ok_button.set_sensitive(sensitive) self.view.widgets.plant_next_button.set_sensitive(sensitive) def set_model_attr(self, field, value, validator=None): #debug('set_model_attr(%s, %s)' % (field, value)) super(PlantEditorPresenter, self)\ .set_model_attr(field, value, validator) self.__dirty = True self.refresh_sensitivity() def on_loc_button_clicked(self, button, cmd=None): location = self.model.location if cmd is 'edit': entry = self.view.widgets.plant_loc_entry LocationEditor(location, parent=self.view.dialog).start() self.session.refresh(location) self.pause_completions_handler(entry, True) entry.set_text(utils.utf8(location)) self.pause_completions_handler(entry, False) else: # TODO: see if the location editor returns the new # location and if so set it directly LocationEditor(parent=self.view.dialog).start() def refresh_view(self): for widget, field in self.widget_to_field_map.iteritems(): value = getattr(self.model, field) self.view.set_widget_value(widget, value) self.refresh_sensitivity() def start(self): r = self.view.start() return r class PlantEditor(GenericModelViewPresenterEditor): label = 'Plant' mnemonic_label = '_Plant' # these have to correspond to the response values in the view RESPONSE_NEXT = 22 ok_responses = (RESPONSE_NEXT,) def __init__(self, model=None, parent=None): ''' @param model: Plant instance or None @param parent: None ''' if model is None: model = Plant() GenericModelViewPresenterEditor.__init__(self, model, parent) if not parent and bauble.gui: parent = bauble.gui.window self.parent = parent self._committed = [] def handle_response(self, response): not_ok_msg = _('Are you sure you want to lose your changes?') if response == gtk.RESPONSE_OK or response in self.ok_responses: # debug('session dirty, committing') try: if self.presenter.dirty(): self.commit_changes() self._committed.append(self.model) except SQLError, e: exc = traceback.format_exc() msg = _('Error committing changes.\n\n%s') % e.orig utils.message_details_dialog(msg, str(e), gtk.MESSAGE_ERROR) return False except Exception, e: msg = _('Unknown error when committing changes. See the '\ 'details for more information.\n\n%s') \ % utils.xml_safe_utf8(e) debug(traceback.format_exc()) utils.message_details_dialog(msg, traceback.format_exc(), gtk.MESSAGE_ERROR) return False elif self.presenter.dirty() and utils.yes_no_dialog(not_ok_msg) \ or not self.presenter.dirty(): self.session.rollback() return True else: return False # # respond to responses more_committed = None if response == self.RESPONSE_NEXT: self.presenter.cleanup() e = PlantEditor(Plant(accession=self.model.accession), parent=self.parent) more_committed = e.start() if more_committed is not None: self._committed = [self._committed] if isinstance(more_committed, list): self._committed.extend(more_committed) else: self._committed.append(more_committed) return True def start(self): from bauble.plugins.garden.accession import Accession # TODO: should really open the accession and location editors here, and # ask 'Would you like to do that now?' if self.session.query(Accession).count() == 0: msg = 'You must first add or import at least one Accession into '\ 'the database before you can add plants.\n\nWould you like '\ 'to open the Accession editor?' if utils.yes_no_dialog(msg): self.presenter.cleanup() from bauble.plugins.garden.accession import AccessionEditor e = AccessionEditor() return e.start() if self.session.query(Location).count() == 0: msg = 'You must first add or import at least one Location into '\ 'the database before you can add species.\n\nWould you '\ 'like to open the Location editor?' if utils.yes_no_dialog(msg): self.presenter.cleanup() e = LocationEditor() return e.start() view = PlantEditorView(parent=self.parent) self.presenter = PlantEditorPresenter(self.model, view) # add quick response keys self.attach_response(view.dialog, gtk.RESPONSE_OK, 'Return', gtk.gdk.CONTROL_MASK) self.attach_response(view.dialog, self.RESPONSE_NEXT, 'n', gtk.gdk.CONTROL_MASK) # set default focus if self.model.accession is None: view.widgets.plant_acc_entry.grab_focus() else: view.widgets.plant_code_entry.grab_focus() while True: response = self.presenter.start() view.save_state() # should view or presenter save state if self.handle_response(response): break self.presenter.cleanup() self.session.close() # cleanup session return self._committed import os import bauble.paths as paths from bauble.view import InfoBox, InfoExpander, PropertiesExpander, \ select_in_search_results class GeneralPlantExpander(InfoExpander): """ general expander for the PlantInfoBox """ def __init__(self, widgets): ''' ''' InfoExpander.__init__(self, "General", widgets) general_box = self.widgets.general_box self.widgets.remove_parent(general_box) self.vbox.pack_start(general_box) self.current_obj = None def on_acc_code_clicked(*args): select_in_search_results(self.current_obj.accession) utils.make_label_clickable(self.widgets.acc_code_data, on_acc_code_clicked) def on_species_clicked(*args): select_in_search_results(self.current_obj.accession.species) utils.make_label_clickable(self.widgets.name_data, on_species_clicked) def on_location_clicked(*args): select_in_search_results(self.current_obj.location) utils.make_label_clickable(self.widgets.location_data, on_location_clicked) def update(self, row): ''' ''' self.current_obj = row acc_code = str(row.accession) plant_code = str(row) head, tail = plant_code[:len(acc_code)], plant_code[len(acc_code):] self.set_widget_value('acc_code_data', '%s' % \ utils.xml_safe(unicode(head))) self.set_widget_value('plant_code_data', '%s' % \ utils.xml_safe(unicode(tail))) self.set_widget_value('name_data', row.accession.species_str(markup=True)) self.set_widget_value('location_data',row.location.site) self.set_widget_value('status_data', row.acc_status, False) self.set_widget_value('type_data', row.acc_type, False) class NotesExpander(InfoExpander): """ the plants notes """ def __init__(self, widgets): ''' ''' InfoExpander.__init__(self, "Notes", widgets) notes_box = self.widgets.notes_box self.widgets.remove_parent(notes_box) self.vbox.pack_start(notes_box) def update(self, row): ''' ''' self.set_widget_value('notes_data', row.notes) class PlantInfoBox(InfoBox): """ an InfoBox for a Plants table row """ def __init__(self): ''' ''' InfoBox.__init__(self) #loc = LocationExpander() #loc.set_expanded(True) glade_file = os.path.join(paths.lib_dir(), "plugins", "garden", "plant_infobox.glade") self.widgets = utils.GladeWidgets(glade_file) self.general = GeneralPlantExpander(self.widgets) self.add_expander(self.general) self.notes = NotesExpander(self.widgets) self.add_expander(self.notes) self.props = PropertiesExpander() self.add_expander(self.props) def update(self, row): ''' ''' # TODO: don't really need a location expander, could just # use a label in the general section #loc = self.get_expander("Location") #loc.update(row.location) self.general.update(row) self.props.update(row) if row.notes is None: self.notes.set_expanded(False) self.notes.set_sensitive(False) else: self.notes.set_expanded(True) self.notes.set_sensitive(True) self.notes.update(row) from bauble.plugins.garden.accession import Accession #from bauble.plugins.garden.location import Location, LocationEditor bauble-0.9.7/bauble/plugins/garden/test.py0000644000175000017500000005365411255224704017526 0ustar brettbrettimport sys import unittest from sqlalchemy import * from sqlalchemy.exc import * from bauble.error import CheckConditionError, check from bauble.test import BaubleTestCase import bauble.utils as utils from bauble.plugins.garden.accession import Accession, AccessionEditor, \ dms_to_decimal, decimal_to_dms, longitude_to_dms, latitude_to_dms from bauble.plugins.garden.donor import Donor, DonorEditor from bauble.plugins.garden.source import Donation, Collection from bauble.plugins.garden.plant import Plant, PlantEditor from bauble.plugins.garden.location import Location, LocationEditor from bauble.plugins.plants.family import Family from bauble.plugins.plants.genus import Genus from bauble.plugins.plants.species_model import Species import bauble.plugins.plants.test as plants_test from bauble.plugins.garden.institution import Institution # TODO: create a test to make sure that if you delete an accession then the # plants that are "children" of this accession are also deleted from datetime import datetime accession_test_data = ({'id':1 , 'code': u'1.1', 'species_id': 1, 'date': datetime.today(), 'source_type': u'Donation'}, {'id':2 , 'code': u'2.2', 'species_id': 2, 'source_type': u'Collection'}, ) plant_test_data = ({'id':1 , 'code': u'1', 'accession_id': 1, 'location_id': 1}, ) location_test_data = ({'id': 1, 'site': u'Somewhere Over The Rainbow'}, ) donor_test_data = ({'id': 1, 'name': u'SomeDonor'}, ) donation_test_data = ({'id': 1, 'accession_id': 1, 'donor_id': 1}, ) collection_test_data = ({'id': 1, 'accession_id': 2, 'locale': u'Somewhere'}, ) test_data_table_control = ((Accession, accession_test_data), (Location, location_test_data), (Plant, plant_test_data), (Donor, donor_test_data), (Donation, donation_test_data), (Collection, collection_test_data)) def setUp_data(): """ create_test_data() #if this method is called again before tearDown_test_data is called you #will get an error about the test data rows already existing in the database """ for cls, data in test_data_table_control: table = cls.__table__ for row in data: table.insert().execute(row).close() for col in table.c: utils.reset_sequence(col) i = Institution() i.name = u'TestInstitution' i.technical_contact = u'TestTechnicalContact Name' i.email = u'contact@test.com' i.contact = u'TestContact Name' i.code = u'TestCode' # TODO: things to create tests for # # - test all cascading works as expected # - need to test that the Donor doesn't get deleted if it is orphaned since # we don't want to ever throw out donor information # TODO: if we ever get a GUI tester then do the following # test all possible combinations of entering data into the accession editor # 1. new accession without source # 2. new accession with source # 3. existing accession without source # 4. existing accession with new source # 5. existing accession with existing source # - create test for parsing latitude/longitude entered into the lat/lon entries class GardenTestCase(BaubleTestCase): def __init__(self, *args): super(GardenTestCase, self).__init__(*args) def setUp(self): super(GardenTestCase, self).setUp() plants_test.setUp_data() #setUp_test_data() self.family = Family(family=u'fam') self.genus = Genus(family=self.family, genus=u'gen') self.species = Species(genus=self.genus, sp=u'sp') self.session.add_all([self.family, self.genus, self.species]) self.session.commit() # def tearDown(self): # print >>sys.stderr, 'GardenTestCase.tearDown()' # super(GardenTestCase, self).tearDown() def create(self, class_, **kwargs): obj = class_(**kwargs) self.session.add(obj) return obj class DonorTests(GardenTestCase): def __init__(self, *args): super(DonorTests, self).__init__(*args) def test_delete(self): acc = self.create(Accession, species=self.species, code=u'1') donor = Donor(name=u'name') donation = Donation() donation.donor = donor acc.source = donation self.session.commit() self.session.close() # test that we can't delete a donor if it has corresponding donations import bauble session = bauble.Session() donor = session.query(Donor).filter_by(name=u'name').one() # shouldn't be allowed to delete donor if it has donations, # what is happening here is that when deleting the donor the # corresponding donations.donor_id's are being be set to null which # isn't allowed by the scheme....is this the best we can do? or can we # get some sort of error when creating a dangling reference session.delete(donor) self.assertRaises(SQLError, session.commit) def itest_donor_editor(self): """ Interactively test the PlantEditor """ loc = self.create(Donor, name=u'some donor') editor = DonorEditor(model=loc) editor.start() del editor assert utils.gc_objects_by_type('DonorEditor') == [], \ 'DonorEditor not deleted' assert utils.gc_objects_by_type('DonorEditorPresenter') == [], \ 'DonorEditorPresenter not deleted' assert utils.gc_objects_by_type('DonorEditorView') == [], \ 'DonorEditorView not deleted' class PlantTests(GardenTestCase): def __init__(self, *args): super(PlantTests, self).__init__(*args) def setUp(self): super(PlantTests, self).setUp() def tearDown(self): super(PlantTests, self).tearDown() def test_constraints(self): acc = self.create(Accession, species=self.species, code=u'1') location = Location(site=u'site') plant = Plant(accession=acc, location=location, code=u'1') self.session.commit() # test that we can't have duplicate codes with the same accession plant2 = Plant(accession=acc, location=location, code=u'1') self.session.add(plant2) self.assertRaises(IntegrityError, self.session.commit) def test_delete(self): """ Test that when a plant is deleted... """ pass def itest_plant_editor(self): """ Interactively test the PlantEditor """ acc = self.create(Accession, species=self.species, code=u'1') location = Location(site=u'site') plant = Plant(accession=acc, location=location, code=u'1') self.session.commit() # create a second uncommited plant so that we can check for # uniqueness with an existing plant, i.e 1.1 plant = Plant(accession=acc, location=location, code=u'2') editor = PlantEditor(model=plant) editor.start() del editor assert utils.gc_objects_by_type('PlantEditor') == [], \ 'PlantEditor not deleted' assert utils.gc_objects_by_type('PlantEditorPresenter') == [], \ 'PlantEditorPresenter not deleted' assert utils.gc_objects_by_type('PlantEditorView') == [], \ 'PlantEditorView not deleted' class AccessionTests(GardenTestCase): def __init__(self, *args): super(AccessionTests, self).__init__(*args) def setUp(self): super(AccessionTests, self).setUp() def tearDown(self): super(AccessionTests, self).tearDown() def test_species_str(self): """ Test Accesion.species_str() """ acc = self.create(Accession, species=self.species, code=u'1') s = 'gen sp' sp_str = acc.species_str() self.assert_(s == sp_str, '%s == %s' % (s, sp_str)) acc.id_qual = '?' s = 'gen sp(?)' sp_str = acc.species_str() self.assert_(s == sp_str, '%s == %s' % (s, sp_str)) acc.id_qual = 'aff.' acc.id_qual_rank = 'sp' s = 'gen aff. sp' sp_str = acc.species_str() self.assert_(s == sp_str, '%s == %s' %(s, sp_str)) # here species.infrasp is None but we still allow the string acc.id_qual = 'cf.' acc.id_qual_rank = 'infrasp' s = 'gen sp cf. None' sp_str = acc.species_str() self.assert_(s == sp_str, '%s == %s' %(s, sp_str)) # species.infrasp is still none but these just get pasted on # the end so it doesn't matter acc.id_qual = 'incorrect' acc.id_qual_rank = 'infrasp' s = 'gen sp(incorrect)' sp_str = acc.species_str() self.assert_(s == sp_str, '%s == %s' %(s, sp_str)) acc.id_qual = 'forsan' acc.id_qual_rank = 'sp' s = 'gen sp(forsan)' sp_str = acc.species_str() self.assert_(s == sp_str, '%s == %s' %(s, sp_str)) acc.species.infrasp_rank = u'cv.' acc.species.infrasp = u'Cultivar' acc.id_qual = u'cf.' acc.id_qual_rank = u'infrasp' s = "gen sp cf. 'Cultivar'" sp_str = acc.species_str() self.assert_(s == sp_str, '%s == %s' %(s, sp_str)) # test that the cached string is returned # have to commit because the cached string won't be returned # on dirty species self.session.commit() s2 = acc.species_str() assert id(sp_str) == id(s2), '%s(%s) == %s(%s)' % (sp_str, id(sp_str), s2, id(s2)) # this used to test that if the id_qual was set but the # id_qual_rank wasn't then we would get an error. now we just # show an warning and put the id_qual on the end of the string # acc.id_qual = 'aff.' # acc.id_qual_rank = None # self.assertRaises(CheckConditionError, acc.species_str) def test_delete(self): """ Test that when an accession is deleted any orphaned rows are cleaned up. """ acc = self.create(Accession, species=self.species, code=u'1') plant = self.create(Plant, accession=acc, location=Location(site=u'site'), code=u'1') self.session.commit() # test that the plant is deleted after being orphaned plant_id = plant.id self.session.delete(acc) self.session.commit() self.assert_(not self.session.query(Plant).get(plant_id)) # test that the donation and collection is deleted after being orphaned #is done in test_source # acc = acc = self.create(Accession, species=self.species, code=u'1') # coll = Collection(locale=u'locale') # acc.source = coll # self.session.add(coll) # self.session.commit() # coll_id = coll.id # self.session.delete(acc) # self.session.commit() # self.assert_(not self.session.query(Plant).get(coll_id)) # test that the collection is orphaned after being deleted def test_constraints(self): """ Test the constraints on the accession table. """ acc = Accession(species=self.species, code=u'1') self.session.add(acc) self.session.commit() # test that accession.code is unique acc = Accession(species=self.species, code=u'1') self.session.add(acc) self.assertRaises(IntegrityError, self.session.commit) def test_set_source(self): #acc = self.session.query(Accession).get(1) #donor = self.session.query(Donor).get(1) acc = Accession(code=u'1', species=self.species) donor = Donor(name=u'me') self.session.add_all([acc, donor]) self.session.commit() # set source on accession as a Donation donation = Donation() donation.donor = donor acc.source = donation self.session.flush() #self.session.expire(acc) self.session.refresh(acc) self.assertEquals(acc.source.id, donation.id) self.assertEquals(acc.source_type, u'Donation') # create a new Donation and set that as the source, this should # delete the old donation object since it's an orphan, old_donation_id = donation.id donation2 = Donation() donation2.donor = donor acc.source = donation2 self.session.flush() self.session.expire(acc) self.assertEquals(acc.source.id, donation2.id) self.assertEquals(acc.source_type, u'Donation') # set the same source twice to make sure the source isn't # deleted before setting it again acc.source = donation2 self.session.commit() self.assert_(acc.source) # delete all the donations # TODO: the donor should never be deleted if a donation is # deleted and a donation should never get deleted if a donor # is deleted, an error should be reaised if you attempt to # delete a donor that has donations but should an error be # raised if you attempt to delete a donation that has a donor, # i don't think so # make sure the old donation gets deleted since it's an orphan print self.session.query(Donation).get(old_donation_id) self.assert_(self.session.query(Donation).get(old_donation_id) == None) # delete the source by setting acc.source=None donation = Donation() donation.donor = donor acc.source = donation acc.source = None self.session.flush() self.session.expire(acc) old_donation_id = donation2.id self.assertEquals(acc.source, None) self.assertEquals(acc.source_type, None) # delete the source 2 donation = Donation() donation.donor = donor acc.source = donation del acc.source self.session.flush() self.session.expire(acc) old_donation_id = donation2.id self.assertEquals(acc.source, None) self.assertEquals(acc.source_type, None) # make sure the orphaned donation get's deleted self.assert_(not self.session.query(Donation).get(old_donation_id)) # set accession.source to a Collection collection = Collection(locale=u'TestAccLocale') acc.source = collection self.session.flush() self.session.expire(acc) self.assertEquals(acc.source.id, collection.id) self.assertEquals(acc.source_type, u'Collection') # changed source from collection to donation old_collection_id = collection.id donation3 = Donation() donation3.donor = donor acc.source = donation3 self.session.flush() self.session.expire(acc) self.assertEquals(acc.source.id, donation3.id) self.assertEquals(acc.source_type, u'Donation') # make sure the orphaned collection get's deleted self.assert_(not self.session.query(Collection).get(old_collection_id)) # change source from donation to collection old_donation_id = donation3.id collection2 = Collection(locale=u'TestAccLocale2') acc.source = collection2 self.session.flush() self.session.expire(acc) self.assertEquals(acc.source.id, collection2.id) self.assertEquals(acc.source_type, u'Collection') # change source without flushing donation4 = Donation() acc.source = donation4 collection3 = Collection(locale=u'TestAccLocale3') acc.source = collection3 self.session.flush() # utils.log.echo(False) # make sure the orphaned donation get's deleted self.assert_(not self.session.query(Donation).get(old_donation_id)) def test_double_commit(self): """ This tests a bug with SQLAlchemy that was tentatively fixed after SQ 0.4.4 was released in r4264. There is a reference to this in the SA mailing list. The bug is here just to check if this ever gets fixed. """ import bauble.utils.log as log sp = self.session.query(Species).get(1) acc = Accession() self.session.add(acc) acc.species = sp acc.code = u"3" # not donor_id, should raise an IntegrityError donation = Donation() acc.source = donation try: self.session.commit() except IntegrityError: self.session.rollback() # before SA 0.4.5 this would give and InvalidRequestError # about not being able to refresh Accession after a rollback try: self.session.commit() except InvalidRequestError, e: # we get here in SA pre-0.4.5, we can't use those # versions for bauble raise except IntegrityError: # it should raise an integrity error because there is # still no donor_id on donation pass def itest_accession_editor(self): """ Interactively test the PlantEditor """ donor = self.create(Donor, name=u'test') self.session.commit() acc = self.create(Accession, species=self.species, code=u'1') acc.id_qual = 'aff.' editor = AccessionEditor(model=acc) #editor = AccessionEditor() editor.start() del editor assert utils.gc_objects_by_type('AccessionEditor') == [], \ 'AccessionEditor not deleted' assert utils.gc_objects_by_type('AccessionEditorPresenter') == [], \ 'AccessionEditorPresenter not deleted' assert utils.gc_objects_by_type('AccessionEditorView') == [], \ 'AccessionEditorView not deleted' class LocationTests(GardenTestCase): def __init__(self, *args): super(LocationTests, self).__init__(*args) def setUp(self): super(LocationTests, self).setUp() def tearDown(self): super(LocationTests, self).tearDown() def itest_location_editor(self): """ Interactively test the PlantEditor """ loc = self.create(Location, site=u'some site') editor = LocationEditor(model=loc) editor.start() del editor assert utils.gc_objects_by_type('LocationEditor') == [], \ 'LocationEditor not deleted' assert utils.gc_objects_by_type('LocationEditorPresenter') == [], \ 'LocationEditorPresenter not deleted' assert utils.gc_objects_by_type('LocationEditorView') == [], \ 'LocationEditorView not deleted' # latitude: deg[0-90], min[0-59], sec[0-59] # longitude: deg[0-180], min[0-59], sec[0-59] ALLOWED_DECIMAL_ERROR = 5 THRESHOLD = .01 DMS = 0 # DMS DEG_MIN_DEC = 1 # Deg with minutes decimal DEG_DEC = 2 # Degrees decimal UTM = 3 # Datum(wgs84/nad83 or nad27), UTM Zone, Easting, Northing # decimal points to accuracy in decimal degrees # 1 +/- 8000m # 2 +/- 800m # 3 +/- 80m # 4 +/- 8m # 5 +/- 0.8m # 6 +/- 0.08m from decimal import Decimal dec = Decimal conversion_test_data = ( ((('N', 17, 21, dec(59)), # dms ('W', 89, 1, 41)), ((dec(17), dec('21.98333333')), # deg min_dec (dec(-89), dec('1.68333333'))), (dec('17.366389'), dec('-89.028056')), # dec deg (('wgs84', 16, 284513, 1921226))), # utm ((('S', 50, 19, dec('32.59')), # dms ('W', 74, 2, dec('11.6'))), ((dec(-50), dec('19.543166')), # deg min_dec (dec(-74), dec('2.193333'))), (dec('-50.325719'), dec('-74.036556')), # dec deg (('wgs84', 18, 568579, 568579)), (('nad27', 18, 568581, 4424928))), ((('N', 9, 0, dec('4.593384')), ('W', 78, 3, dec('28.527984'))), ((9, dec('0.0765564')), (-78, dec('3.4754664'))), (dec('9.00127594'), dec('-78.05792444'))) ) #parse_lat_lon_data = ('17, 21, 59', '17 21 59', '17:21:59', # '17, 21.98333333', '17 21.98333333', # '17.36638889', # '50, 19, 32.59', '50 19 32.59', '50:19:32.59', # '-50 19.543166', '-50, 19.543166', # '-50.325719') parse_lat_lon_data = ('17 21 59', '17 21.98333333', '17.03656', '50 19 32.59', '-50 19.543166', '-50.32572') class DMSConversionTests(unittest.TestCase): # test coordinate conversions def test_dms_to_decimal(self): # test converting DMS to degrees decimal ALLOWED_ERROR = 6 for data_set in conversion_test_data: dms_data = data_set[DMS] dec_data = data_set[DEG_DEC] lat_dec = dms_to_decimal(*dms_data[0]) lon_dec = dms_to_decimal(*dms_data[1]) self.assertAlmostEqual(lat_dec, dec_data[0], ALLOWED_ERROR) self.assertAlmostEqual(lon_dec, dec_data[1], ALLOWED_ERROR) def test_decimal_to_dms(self): # test converting degrees decimal to dms, allow a certain # amount of error in the seconds ALLOWABLE_ERROR = 2 for data_set in conversion_test_data: dms_data = data_set[DMS] dec_data = data_set[DEG_DEC] # convert to DMS lat_dms = latitude_to_dms(dec_data[0]) self.assertEqual(lat_dms[0:2], dms_data[0][0:2]) # test seconds with allowable error self.assertAlmostEqual(lat_dms[3], dms_data[0][3], ALLOWABLE_ERROR) lon_dms = longitude_to_dms(dec_data[1]) self.assertEqual(lon_dms[0:2], dms_data[1][0:2]) # test seconds with allowable error self.assertAlmostEqual(lon_dms[3], dms_data[1][3], ALLOWABLE_ERROR) def test_parse_lat_lon(self): for data in parse_lat_lon_data: pass bauble-0.9.7/bauble/plugins/report/0000755000175000017500000000000011310570250016223 5ustar brettbrettbauble-0.9.7/bauble/plugins/report/template/0000755000175000017500000000000011310570250020036 5ustar brettbrettbauble-0.9.7/bauble/plugins/report/template/gui.glade0000644000175000017500000000766611210626427021646 0ustar brettbrett True 10 15 True 0 GTK_SHADOW_NONE True 5 12 True True <b>Template</b> True label_item False False True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 20 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Include data marked as private</b> True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-dialog-authentication 1 1 bauble-0.9.7/bauble/plugins/report/template/__init__.py0000644000175000017500000000631311240115262022152 0ustar brettbrettimport os import sys import tempfile import gtk from sqlalchemy import * from sqlalchemy.orm import * from mako.template import Template import bauble from bauble.utils.log import debug import bauble.utils as utils import bauble.utils.desktop as desktop import bauble.paths as paths from bauble.plugins.plants.species import Species from bauble.plugins.garden.plant import Plant from bauble.plugins.garden.accession import Accession from bauble.plugins.abcd import create_abcd, ABCDAdapter, ABCDElement from bauble.plugins.report import get_all_plants, get_all_species, \ get_all_accessions, FormatterPlugin, SettingsBox class TemplateFormatterSettingsBox(SettingsBox): def __init__(self, report_dialog=None, *args): super(TemplateFormatterSettingsBox, self).__init__(*args) self.widgets = utils.GladeWidgets(os.path.join(paths.lib_dir(), "plugins", "report", 'template', 'gui.glade')) # keep a refefence to settings box so it doesn't get destroyed in # remove_parent() settings_box = self.widgets.settings_box self.widgets.remove_parent(self.widgets.settings_box) self.pack_start(settings_box) #self.presenter = SettingsBoxPresenter(self.widgets) def get_settings(self): """ """ return {'template': self.widgets.template_chooser.get_filename(), 'private': self.widgets.private_check.get_active()} def update(self, settings): if 'template' in settings and settings['template']: self.widgets.template_chooser.\ set_filename(settings['template']) if 'private' in settings: self.widgets.private_check.set_active(settings['private']) class TemplateFormatterPlugin(FormatterPlugin): """ The TemplateFormatterPlugins passes the values in the search results directly to a Mako template. It is up to the template author to validate the type of the values and act accordingly if not. """ title = _('Template') @staticmethod def get_settings_box(): return TemplateFormatterSettingsBox() @staticmethod def format(objs, **kwargs): template_filename = kwargs['template'] use_private = kwargs.get('private', True) if not template_filename: msg = _('Please selecte a template.') utils.message_dialog(error_msg, gtk.MESSAGE_WARNING) return False template = Template(filename=template_filename) session = bauble.Session() values = map(session.merge, objs) report = template.render(values=values) session.close() # assume the template is the same file type as the output file head, ext = os.path.splitext(template_filename) fd, filename = tempfile.mkstemp(suffix=ext) os.write(fd, report) os.close(fd) try: desktop.open(filename) except OSError: utils.message_dialog(_('Could not open the report with the '\ 'default program. You can open the '\ 'file manually at %s') % filename) return report formatter_plugin = TemplateFormatterPlugin bauble-0.9.7/bauble/plugins/report/template/test.py0000644000175000017500000000613211234144345021400 0ustar brettbrettimport os import sys from sqlalchemy import * from sqlalchemy.exc import * # TURN OFF desktop.open for this module so that the test doesn't open # the report import bauble.utils.desktop as desktop desktop.open = lambda x: x from bauble.test import BaubleTestCase import bauble.utils as utils from bauble.utils.log import debug #import bauble.plugins.report as report_plugin from bauble.plugins.report import get_all_species, get_all_accessions, \ get_all_plants from bauble.plugins.plants import Family, Genus, Species, \ SpeciesDistribution, VernacularName, Geography from bauble.plugins.garden import Accession, Plant, Location from bauble.plugins.tag import tag_objects, Tag from bauble.plugins.report.template import TemplateFormatterPlugin class TemplateFormatterTests(BaubleTestCase): def __init__(self, *args): super(TemplateFormatterTests, self).__init__(*args) def setUp(self, *args): super(TemplateFormatterTests, self).setUp() fctr = gctr = sctr = actr = pctr = 0 for f in xrange(2): fctr+=1 family = Family(id=fctr, family=u'fam%s' % fctr) self.session.add(family) for g in range(2): gctr+=1 genus = Genus(id=gctr, family=family, genus=u'gen%s' % gctr) self.session.add(genus) for s in range(2): sctr+=1 sp = Species(id=sctr, genus=genus, sp=u'sp%s' % sctr) # TODO: why doesn't this geography, species # distribution stuff seem to work geo = Geography(id=sctr, name=u'Mexico%s' % sctr) dist = SpeciesDistribution(geography_id=sctr) sp.distribution.append(dist) vn = VernacularName(id=sctr, species=sp, name=u'name%s' % sctr) self.session.add_all([sp, geo, dist, vn]) for a in range(2): actr+=1 acc = Accession(id=actr, species=sp, code=u'%s' % actr) self.session.add(acc) for p in range(2): pctr+=1 loc = Location(id=pctr, site=u'site%s' % pctr) plant = Plant(id=pctr, accession=acc, location=loc, code=u'%s' % pctr) #debug('fctr: %s, gctr: %s, actr: %s, pctr: %s' \ # % (fctr, gctr, actr, pctr)) self.session.add_all([loc, plant]) self.session.commit() def tearDown(self, *args): super(TemplateFormatterTests, self).tearDown(*args) def test_format(self): plants = self.session.query(Plant).all() filename = os.path.join(os.path.dirname(__file__), 'test.html') report = TemplateFormatterPlugin.format(plants, template=filename) open('/tmp/testlabels.html', 'w').write(report) #print >>sys.stderr, report # TODO: need to make some sort of assertion here bauble-0.9.7/bauble/plugins/report/__init__.py0000755000175000017500000005164211240115025020344 0ustar brettbrett# # __init__.py # # Description : report plugin # import os import sys import traceback import re import gobject import gtk from sqlalchemy import * import bauble import bauble.utils as utils import bauble.paths as paths from bauble.prefs import prefs import bauble.pluginmgr as pluginmgr from bauble.utils.log import log, debug from bauble.plugins.plants import Family, Genus, Species, VernacularName from bauble.plugins.garden import Accession, Plant, Location from bauble.plugins.tag import Tag, TaggedObj from bauble.utils.log import debug, warning # TODO: this module should depend on PlantPlugin, GardenPlugin, # TagPlugin and should also allow other plugins to register between # two type of objects # TODO: should be able to drop a new formatter plugin and have it # automatically detected, right now we to return it in this modules # plugin() function # name: formatter_class, formatter_kwargs config_list_pref = 'report.configs' # the default report generator to select on start default_config_pref = 'report.default' formatter_settings_expanded_pref = 'report.settings.expanded' # _paths = {} # def add_path(parent, descendant, query): # """ # Register a query that will give all of the descendants under parent # e.g. add_path(Family, Species) would register a query to retrieve # all of the Species under a family # """ # if parent not in _paths: # _paths[parent] = {descendent: query} # else descendant not in _paths[parent]: # _paths[parent][descendent] = query def _get_all_objects(cls, get_query_func, objs, session): """ @param cls: @param get_query_func: @param objs: @param session: """ if not isinstance(objs, (tuple, list)): objs = [objs] queries = map(lambda o: get_query_func(o, session), objs) unions = union(*[q.statement for q in queries]) results = session.query(cls).from_statement(unions) # TODO: the following should work but i must be overlooking something #results = session.query(cls).order_by(None).union(*queries) return results def get_plant_query(obj, session): """ """ # as of sqlalchemy 0.5.0 we have to have the order_by(None) here # so that if we want to union() the statements together later it # will work properly q = session.query(Plant).order_by(None) if isinstance(obj, Family): return q.join(['accession', 'species', 'genus', 'family']).\ filter_by(id=obj.id) elif isinstance(obj, Genus): return q.join(['accession', 'species', 'genus']).filter_by(id=obj.id) elif isinstance(obj, Species): return q.join(['accession', 'species']).filter_by(id=obj.id) elif isinstance(obj, VernacularName): return q.join(['accession', 'species', 'vernacular_names']).\ filter_by(id=obj.id) elif isinstance(obj, Plant): return q.filter_by(id=obj.id) elif isinstance(obj, Accession): return q.join('accession').filter_by(id=obj.id) elif isinstance(obj, Location): return q.filter_by(location_id=obj.id) elif isinstance(obj, Tag): plants = get_all_plants(obj.objects, session) return q.filter(Plant.id.in_([p.id for p in plants])) else: raise BaubleError(_("Can't get plants from a %s" % type(cls).__name__)) def get_all_plants(objs, session): """ @param objs: an instance of a mapped object @param session: the session to use for the queries Return all the plants found in objs. """ return _get_all_objects(Plant, get_plant_query, objs, session) def get_accession_query(obj, session): """ """ # as of sqlalchemy 0.5.0 we have to have the order_by(None) here # so that if we want to union() the statements together later it # will work properly q = session.query(Accession).order_by(None) if isinstance(obj, Family): return q.join(['species', 'genus', 'family']).\ filter_by(id=obj.id) elif isinstance(obj, Genus): return q.join(['species', 'genus']).filter_by(id=obj.id) elif isinstance(obj, Species): return q.join(['species']).filter_by(id=obj.id) elif isinstance(obj, VernacularName): return q.join(['species', 'vernacular_names']).\ filter_by(id=obj.id) elif isinstance(obj, Plant): return q.join('plants').filter_by(id=obj.id) elif isinstance(obj, Accession): return q.filter_by(id=obj.id) elif isinstance(obj, Location): return q.join('plants').filter_by(location_id=obj.id) elif isinstance(obj, Tag): acc = get_all_accessions(obj.objects, session) return q.filter(Accession.id.in_([a.id for a in acc])) else: raise BaubleError(_("Can't get accessions from a %s" % \ type(cls).__name__)) def get_all_accessions(objs, session): """ @param objs: an instance of a mapped object @param session: the session to use for the queries Return all the accessions found in objs. """ return _get_all_objects(Accession, get_accession_query, objs, session) def get_species_query(obj, session): """ """ # as of sqlalchemy 0.5.0 we have to have the order_by(None) here # so that if we want to union() the statements together later it # will work properly q = session.query(Species).order_by(None) if isinstance(obj, Family): return q.join(['genus', 'family']).\ filter_by(id=obj.id) elif isinstance(obj, Genus): return q.join(['genus']).filter_by(id=obj.id) elif isinstance(obj, Species): return q.filter_by(id=obj.id) elif isinstance(obj, VernacularName): return q.join(['vernacular_names']).\ filter_by(id=obj.id) elif isinstance(obj, Plant): return q.join(['accessions', 'plants']).filter_by(id=obj.id) elif isinstance(obj, Accession): return q.join('accessions').filter_by(id=obj.id) elif isinstance(obj, Location): return q.join(['accessions', 'plants', 'location']).\ filter_by(id=obj.id) elif isinstance(obj, Tag): acc = get_all_species(obj.objects, session) return q.filter(Species.id.in_([a.id for a in acc])) else: raise BaubleError(_("Can't get species from a %s" % \ type(cls).__name__)) def get_all_species(objs, session): """ @param objs: an instance of a mapped object @param session: the session to use for the queries Return all the species found in objs. """ return _get_all_objects(Species, get_species_query, objs, session) class SettingsBox(gtk.VBox): """ the interface to use for the settings box, formatters should implement this interface and return it from the formatters's get_settings method """ def __init__(self): super(SettingsBox, self).__init__() def get_settings(self): raise NotImplementerError def update(self, settings): raise NotImplementerError class FormatterPlugin(pluginmgr.Plugin): ''' an interface class that a plugin should implement if it wants to generate reports with the ReportToolPlugin NOTE: the title class attribute must be a unique string ''' title = '' @staticmethod def get_settings_box(): ''' return a class the implement gtk.Box that should hold the gui for the formatter ''' raise NotImplementedError @staticmethod def format(selfobjs, **kwargs): ''' called when the use clicks on OK, this is the worker ''' raise NotImplementedError class ReportToolDialogView(object): def __init__(self): self.widgets = utils.GladeWidgets(os.path.join(paths.lib_dir(), "plugins", "report", 'report.glade')) self.dialog = self.widgets.report_dialog self.dialog.set_transient_for(bauble.gui.window) def start(self): return self.dialog.run() class ReportToolDialogPresenter(object): formatter_class_map = {} # title->class map def __init__(self, view): self.view = view self.init_names_combo() self.init_formatter_combo() self.view.widgets.new_button.connect('clicked', self.on_new_button_clicked) self.view.widgets.remove_button.connect('clicked', self.on_remove_button_clicked) self.view.widgets.names_combo.connect('changed', self.on_names_combo_changed) self.view.widgets.formatter_combo.connect('changed', self.on_formatter_combo_changed) self.view.widgets.ok_button.set_sensitive(False) # set the names combo to the default, on_names_combo_changes should # do the rest of the work combo = self.view.widgets.names_combo default = prefs[default_config_pref] try: self.set_names_combo(default) except Exception, e: # debug('init: %s' % e) self.set_names_combo(0) def set_names_combo(self, val): """ set the names combo to val and emit the 'changed' signal, @param val: either an integer index or a string value in the combo if the model on the combo is None then this method will return and not emit the changed signal """ # debug('set_names_combo(%s)' % val) combo = self.view.widgets.names_combo if combo.get_model() is None: # debug('--None') self.view.widgets.details_box.set_sensitive(False) return if isinstance(val, int): combo.set_active(val) else: utils.combo_set_active_text(combo, val) combo.emit('changed') def set_formatter_combo(self, val): """ set the formatter combo to val and emit the 'changed' signal, @param val: either an integer index or a string value in the combo combo = self.view.widgets.formatter_combo """ combo = self.view.widgets.formatter_combo if isinstance(val, int): combo.set_active(val) else: utils.combo_set_active_text(combo, val) combo.emit('changed') def set_prefs_for(self, name, formatter_title, settings): ''' this will overwrite any other report settings with name ''' # debug('set_prefs_for(%s, %s, %s)' % (name, formatter_title, settings)) formatters = prefs[config_list_pref] if formatters is None: formatters = {} formatters[name] = formatter_title, settings prefs[config_list_pref] = formatters # debug(prefs[config_list_pref]) def on_new_button_clicked(self, *args): # TODO: don't set the OK button as sensitive in the name dialog # if the name already exists # TOD0: make "Enter" in the entry fire the default response d = gtk.Dialog('', self.view.dialog, gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) d.vbox.set_spacing(10) label = gtk.Label(_('Enter a name for the new formatter')) label.set_padding(10, 10) d.vbox.pack_start(label) entry = gtk.Entry() d.vbox.pack_start(entry) d.show_all() names_model = self.view.widgets.names_combo.get_model() while True: if d.run() == gtk.RESPONSE_ACCEPT: name = entry.get_text() if name == '': continue elif names_model is not None \ and utils.tree_model_has(names_model, name): utils.message_dialog(_('%s already exists') % name) continue else: self.set_prefs_for(entry.get_text(), None, {}) self.populate_names_combo() utils.combo_set_active_text(self.view.widgets.names_combo, name) break else: break d.destroy() def on_remove_button_clicked(self, *args): formatters = prefs[config_list_pref] names_combo = self.view.widgets.names_combo name = names_combo.get_active_text() formatters.pop(name) prefs[config_list_pref] = formatters self.populate_names_combo() names_combo.set_active(0) def on_names_combo_changed(self, combo, *args): if combo.get_model() is None: self.view.widgets.details_box.set_sensitive(False) return name = combo.get_active_text() formatters = prefs[config_list_pref] self.view.widgets.details_box.set_sensitive(name is not None) prefs[default_config_pref] = name # set the default to the new name try: title, settings = formatters[name] except (KeyError, TypeError), e: # TODO: show a dialog saying that you can't find whatever # you're looking for in the settings debug(e) return try: self.set_formatter_combo(title) except Exception, e: # TODO: show a dialog saying that you can't find whatever # you're looking for in the settings debug(e) self.set_formatter_combo(-1) self.view.widgets.details_box.set_sensitive(True) def on_formatter_combo_changed(self, combo, *args): ''' formatter_combo changed signal handler ''' self.view.widgets.ok_button.set_sensitive(False) gobject.idle_add(self._formatter_combo_changed_idle, combo) def _formatter_combo_changed_idle(self, combo): title = combo.get_active_text() # main loop never has a chance to change sensitivity, maybe we could # do some of this in idle function # name = self.view.widgets.names_combo.get_active_text() try: saved_title, settings = prefs[config_list_pref][name] if saved_title != title: settings = {} # debug('settings: %s' % settings) # # set the new formatter value in the preferences # set_prefs_for(name, self.formatter_class_map[title]) # #prefs[config_list_pref][name] = title, settings except KeyError, e: debug(e) return expander = self.view.widgets.settings_expander child = expander.get_child() if child is not None: expander.remove(child) #self.widgets.ok_button.set_sensitive(title is not None) self.view.widgets.ok_button.set_sensitive(title is not None) if title is None: return try: cls = self.formatter_class_map[title] except KeyError: return box = cls.get_settings_box() if box is not None: box.update(settings) expander.add(box) box.show_all() expander.set_sensitive(box is not None) # TODO: should probably remember expanded state, # see formatter_settings_expander_pref expander.set_expanded(box is not None) title = combo.get_active_text() self.set_prefs_for(name, title, settings) self.view.widgets.ok_button.set_sensitive(True) def init_formatter_combo(self): plugins = [] for p in pluginmgr.plugins.values(): if issubclass(p, FormatterPlugin): plugins.append(p) # we should always have at least the default formatter model = gtk.ListStore(str) #assert len(plugins) is not 0, 'No formatter plugins defined.' if len(plugins) == 0: utils.message_dialog(_('No formatter plugins defined'), gtk.MESSAGE_WARNING) return for item in plugins: title = item.title self.formatter_class_map[title] = item model.append([item.title]) self.view.widgets.formatter_combo.set_model(model) def populate_names_combo(self): ''' populates the combo with the list of configuration names from the prefs ''' configs = prefs[config_list_pref] combo = self.view.widgets.names_combo if configs is None: # debug('configs is None') self.view.widgets.details_box.set_sensitive(False) utils.clear_model(combo) return try: model = gtk.ListStore(str) for cfg in configs.keys(): # debug('cfg: %s' % cfg) model.append([cfg]) combo.set_model(model) except AttributeError, e: # no formatters debug(e) pass def init_names_combo(self): formatters = prefs[config_list_pref] if formatters is None or len(formatters) == 0: msg = _('No formatters found. To create a new formatter click '\ 'the "New" button.') utils.message_dialog(msg, parent=self.view.dialog) ## debug('names_combo.model=None') self.view.widgets.names_combo.set_model(None) self.populate_names_combo() def save_formatter_settings(self): name = self.view.widgets.names_combo.get_active_text() title, dummy = prefs[config_list_pref][name] box = self.view.widgets.settings_expander.get_child() formatters = prefs[config_list_pref] # debug('save_formatter_settings: %s: %s, %s' % (name, title, box.get_settings())) formatters[name] = title, box.get_settings() prefs[config_list_pref] = formatters # debug(prefs[config_list_pref][name]) def start(self): formatter = None settings = None while True: response = self.view.start() if response == gtk.RESPONSE_OK: # get format method # save default prefs[default_config_pref] = \ self.view.widgets.names_combo.get_active_text() self.save_formatter_settings() name = self.view.widgets.names_combo.get_active_text() title, settings = prefs[config_list_pref][name] formatter = self.formatter_class_map[title] break else: break self.view.dialog.destroy() return formatter, settings class ReportToolDialog(object): def __init__(self): self.view = ReportToolDialogView() self.presenter = ReportToolDialogPresenter(self.view) def start(self): return self.presenter.start() class ReportTool(pluginmgr.Tool): label = "Report" @classmethod def start(self): ''' ''' # get the select results from the search view from bauble.view import SearchView view = bauble.gui.get_view() if not isinstance(view, SearchView): utils.message_dialog(_('Search for something first.')) return model = view.results_view.get_model() if model is None: utils.message_dialog(_('Search for something first.')) return bauble.set_busy(True) ok = False try: while True: dialog = ReportToolDialog() formatter, settings = dialog.start() if formatter is None: break ok = formatter.format([row[0] for row in model], **settings) if ok: break except AssertionError, e: debug(e) debug(traceback.format_exc()) parent = None if hasattr(self, 'view') and hasattr(self.view, 'dialog'): parent = self.view.dialog utils.message_details_dialog(str(e), traceback.format_exc(), gtk.MESSAGE_ERROR, parent=parent) except Exception, e: debug(traceback.format_exc()) utils.message_details_dialog(_('Formatting Error\n\n' \ '%(exception)s') % \ {"exception": utils.utf8(e)}, traceback.format_exc(), gtk.MESSAGE_ERROR) bauble.set_busy(False) return class ReportToolPlugin(pluginmgr.Plugin): ''' ''' tools = [ReportTool] try: import lxml.etree as etree import lxml._elementpath # put this here sp py2exe picks it up except ImportError: utils.message_dialog('The lxml package is required for the '\ 'Report plugin') else: def plugin(): from bauble.plugins.report.default import DefaultFormatterPlugin from bauble.plugins.report.template import TemplateFormatterPlugin return [ReportToolPlugin, DefaultFormatterPlugin, TemplateFormatterPlugin] bauble-0.9.7/bauble/plugins/report/default/0000755000175000017500000000000011310570250017647 5ustar brettbrettbauble-0.9.7/bauble/plugins/report/default/basic.xsl0000644000175000017500000000505011210626427021467 0ustar brettbrett Version , Version , Page bauble-0.9.7/bauble/plugins/report/default/plant_list_ex.xsl0000644000175000017500000000531511210626427023257 0ustar brettbrett ID Name Notes of bauble-0.9.7/bauble/plugins/report/default/labels.xsl0000644000175000017500000000670111234413130021643 0ustar brettbrett bauble-0.9.7/bauble/plugins/report/default/gui.glade0000644000175000017500000002717311210626427021452 0ustar brettbrett True 10 15 True 0 GTK_SHADOW_NONE True 5 12 True True <b>Stylesheet</b> True label_item False False True 0 GTK_SHADOW_NONE True 5 12 True -- True <b>Renderer</b> True label_item False False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 GTK_SHADOW_NONE True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Accession Plant/Clone Species True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Source type</b> True label_item 3 True 0 True True <b>Use author names</b> True False False 4 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 20 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Include data marked as private</b> True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-dialog-authentication 1 5 Formatter True GTK_WIN_POS_CENTER_ON_PARENT 640 480 GDK_WINDOW_TYPE_HINT_DIALOG True True True False GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True 5 2 True GTK_BUTTONBOX_END True True True gtk-cancel True -6 True True True gtk-ok True -5 1 False GTK_PACK_END bauble-0.9.7/bauble/plugins/report/default/__init__.py0000755000175000017500000003360111262453405021776 0ustar brettbrett# # default report formatter package # """ The PDF report generator module. This module takes a list of objects, get all the plants from the objects, converts them to the ABCD XML format, transforms the ABCD data to an XSL formatting stylesheet and uses a XSL-PDF renderer to convert the stylesheet to PDF. """ import shutil import sys import os import tempfile import traceback import gtk from sqlalchemy import * from sqlalchemy.orm import * import bauble from bauble.utils.log import debug import bauble.utils as utils import bauble.utils.desktop as desktop import bauble.paths as paths from bauble.plugins.plants.species import Species from bauble.plugins.garden.plant import Plant from bauble.plugins.garden.accession import Accession from bauble.plugins.abcd import create_abcd, ABCDAdapter, ABCDElement from bauble.plugins.report import get_all_plants, get_all_species, \ get_all_accessions, FormatterPlugin, SettingsBox if sys.platform == "win32": fop_cmd = 'fop.bat' else: fop_cmd = 'fop' # Bugs: # https://bugs.launchpad.net/bauble/+bug/104963 (check for PDF renderers on PATH) # # TODO: need to make sure we can't select the OK button if we haven't selected # a value for everything # TODO: use which() to search the path for a known renderer, could do this in # task so that it's non blocking, should cache the values in the prefs and # check that they are still valid when we open the report UI up again #def which(e): # return ([os.path.join(p, e) for p in os.environ['PATH'].split(os.pathsep) if os.path.exists(os.path.join(p, e))] + [None])[0] # TODO: support FOray, see http://www.foray.org/ renderers_map = {'Apache FOP': fop_cmd + \ ' -fo %(fo_filename)s -pdf %(out_filename)s', 'XEP': 'xep -fo %(fo_filename)s -pdf %(out_filename)s', # 'xmlroff': 'xmlroff -o %(out_filename)s %(fo_filename)s', # 'Ibex for Java': 'java -cp /home/brett/bin/ibex-3.9.7.jar \ # ibex.Run -xml %(fo_filename)s -pdf %(out_filename)s' } default_renderer = 'Apache FOP' plant_source_type = _('Plant/Clone') accession_source_type = _('Accession') species_source_type = _('Species') default_source_type = plant_source_type class SpeciesABCDAdapter(ABCDAdapter): """ An adapter to convert a Species to an ABCD Unit, the SpeciesABCDAdapter does not create a valid ABCDUnit since we can't provide the required UnitID """ def __init__(self, species): super(SpeciesABCDAdapter, self).__init__(species) self.species = species def get_UnitID(self): # **** This is makes the ABCD data NOT valid ABCD but it does make # it work for creating reports without including the accession or # plant code return "" def get_family(self): return utils.xml_safe_utf8(self.species.genus.family) def get_FullScientificNameString(self, authors=True): return Species.str(self.species, authors=authors, markup=False) def get_GenusOrMonomial(self): return utils.xml_safe_utf8(str(self.species.genus)) def get_FirstEpithet(self): return utils.xml_safe_utf8(str(self.species.sp)) def get_AuthorTeam(self): author = self.species.sp_author if author is None: return None else: return utils.xml_safe_utf8(author) def get_InformalNameString(self): vernacular_name = self.species.default_vernacular_name if vernacular_name is None: return None else: return utils.xml_safe_utf8(vernacular_name) def extra_elements(self, unit): # distribution isn't in the ABCD namespace so it should create an # invalid XML file etree.SubElement(unit, 'distribution').text=\ self.species.distribution_str() if self.species.notes is not None: ABCDElement(unit, 'Notes', text=utils.xml_safe(unicode(self.species.notes))) class PlantABCDAdapter(SpeciesABCDAdapter): """ An adapter to convert a Plant to an ABCD Unit """ def __init__(self, plant): super(PlantABCDAdapter, self).__init__(plant.accession.species) self.plant = plant def get_UnitID(self): return utils.xml_safe_utf8(str(self.plant)) def get_FullScientificNameString(self, authors=True): return self.plant.accession.species_str(authors=authors, markup=False) def extra_elements(self, unit): bg_unit = ABCDElement(unit, 'BotanicalGardenUnit') ABCDElement(bg_unit, 'LocationInGarden', text=utils.xml_safe_utf8(str(self.plant.location))) if self.plant.notes is not None: ABCDElement(unit, 'Notes', text=utils.xml_safe(unicode(self.plant.notes))) super(PlantABCDAdapter, self).extra_elements(unit) class AccessionABCDAdapter(SpeciesABCDAdapter): """ An adapter to convert a Plant to an ABCD Unit """ def __init__(self, accession): super(AccessionABCDAdapter, self).__init__(accession.species) self.accession = accession def get_UnitID(self): return utils.xml_safe_utf8(str(self.accession)) def get_FullScientificNameString(self, authors=True): return self.accession.species_str(authors=authors, markup=False) # TODO: these values should probably alse be added for the PlantABCDAdapter def donation_extra_elements(self, unit): pass def collection_extra_elements(self, unit): pass def extra_elements(self, unit): if self.accession.notes is not None: ABCDElement(unit, 'Notes', text=utils.xml_safe(unicode(self.accession.notes))) if self.accession.source_type == 'Collection': # see ABCD/Unit/Gathering, CollectorsFieldNumber self.collection_extra_elements(unit) elif self.accession.source_type == 'Donation': # see DonorCategory, DecodedDonorInstitute self.donation_extra_elements(unit) else: # TODO: what should we do here pass super(AccessionABCDAdapter, self).extra_elements(unit) class SettingsBoxPresenter: def __init__(self, widgets): self.widgets = widgets model = gtk.ListStore(str) for name in renderers_map: model.append([name]) self.widgets.renderer_combo.set_model(model) class DefaultFormatterSettingsBox(SettingsBox): def __init__(self, report_dialog=None, *args): super(DefaultFormatterSettingsBox, self).__init__(*args) self.widgets = utils.GladeWidgets(os.path.join(paths.lib_dir(), "plugins", "report", 'default', 'gui.glade')) # keep a refefence to settings box so it doesn't get destroyed in # remove_parent() settings_box = self.widgets.settings_box self.widgets.remove_parent(self.widgets.settings_box) self.pack_start(settings_box) self.presenter = SettingsBoxPresenter(self.widgets) def get_settings(self): ''' return a dict of settings from the settings box gui ''' return {'stylesheet': self.widgets.stylesheet_chooser.get_filename(), 'renderer': self.widgets.renderer_combo.get_active_text(), 'source_type':self.widgets.source_type_combo.get_active_text(), 'authors': self.widgets.author_check.get_active(), 'private': self.widgets.private_check.get_active()} def update(self, settings): if 'stylesheet' in settings and settings['stylesheet'] != None: self.widgets.stylesheet_chooser.\ set_filename(settings['stylesheet']) if 'renderer' not in settings: utils.combo_set_active_text(self.widgets.renderer_combo, default_renderer) else: utils.combo_set_active_text(self.widgets.renderer_combo, settings['renderer']) if 'source_type' not in settings: utils.combo_set_active_text(self.widgets.source_type_combo, default_source_type) else: utils.combo_set_active_text(self.widgets.source_type_combo, settings['source_type']) if 'authors' in settings: self.widgets.author_check.set_active(settings['authors']) if 'private' in settings: self.widgets.private_check.set_active(settings['private']) _settings_box = DefaultFormatterSettingsBox() class DefaultFormatterPlugin(FormatterPlugin): title = _('Default') @classmethod def install(cls, import_defaults=True): # copy default template files to user_dir templates = ['basic.xsl', 'labels.xsl', 'plant_list.xsl', 'plant_list_ex.xsl', 'small_labels.xsl'] base_dir = os.path.join(paths.lib_dir(), "plugins", "report", 'default') for template in templates: f = os.path.join(paths.user_dir(), template) if not os.path.exists(f): shutil.copy(os.path.join(base_dir, template), f) @staticmethod def get_settings_box(): return DefaultFormatterSettingsBox() @staticmethod def format(objs, **kwargs): # debug('format(%s)' % kwargs) stylesheet = kwargs['stylesheet'] authors = kwargs['authors'] renderer = kwargs['renderer'] source_type = kwargs['source_type'] use_private = kwargs['private'] error_msg = None if not stylesheet: error_msg = _('Please select a stylesheet.') elif not renderer: error_msg = _('Please select a a renderer') if error_msg is not None: utils.message_dialog(error_msg, gtk.MESSAGE_WARNING) return False fo_cmd = renderers_map[renderer] session = bauble.Session() # convert objects to ABCDAdapters depending on source type for # passing to create_abcd adapted = [] if source_type == plant_source_type: plants = sorted(get_all_plants(objs, session=session), key=utils.natsort_key) if len(plants) == 0: utils.message_dialog(_('There are no plants in the search ' 'results. Please try another search.')) return False for p in plants: if use_private: adapted.append(PlantABCDAdapter(p)) elif not p.accession.private: adapted.append(PlantABCDAdapter(p)) elif source_type == species_source_type: species = sorted(get_all_species(objs, session=session), key=utils.natsort_key) if len(species) == 0: utils.message_dialog(_('There are no species in the search ' 'results. Please try another search.')) return False for s in species: adapted.append(SpeciesABCDAdapter(s)) elif source_type == accession_source_type: accessions = sorted(get_all_accessions(objs, session=session), key=utils.natsort_key) if len(accessions) == 0: utils.message_dialog(_('There are no accessions in the search ' 'results. Please try another search.')) return False for a in accessions: if use_private: adapted.append(AccessionABCDAdapter(a)) elif not a.private: adapted.append(AccessionABCDAdapter(a)) else: raise NotImplementedError('unknown source type') if len(adapted) == 0: # nothing adapted....possibly everything was private # TODO: if everything was private and that is really why we got # here then it is probably better to show a dialog with a message # and raise and exception which appears as an error raise Exception('No objects could be adapted to ABCD units.') abcd_data = create_abcd(adapted, authors=authors, validate=False) session.close() # debug(etree.dump(abcd_data.getroot())) # create xsl fo file dummy, fo_filename = tempfile.mkstemp() style_etree = etree.parse(stylesheet) transform = etree.XSLT(style_etree) result = transform(abcd_data) fo_outfile = open(fo_filename, 'w') fo_outfile.write(str(result)) fo_outfile.close() dummy, filename = tempfile.mkstemp() filename = '%s.pdf' % filename # TODO: checkout pyexpect for spawning processes # run the report to produce the pdf file, the command has to be # on the path for this to work fo_cmd = fo_cmd % ({'fo_filename': fo_filename, 'out_filename': filename}) # print fo_cmd # debug(fo_cmd) # TODO: use popen to get output os.system(fo_cmd) # print filename if not os.path.exists(filename): utils.message_dialog(_('Error creating the PDF file. Please ' \ 'ensure that your PDF formatter is ' \ 'properly installed.'), gtk.MESSAGE_ERROR) return False else: try: desktop.open(filename) except OSError: utils.message_dialog(_('Could not open the report with the '\ 'default program. You can open the '\ 'file manually at %s') % filename) return True # expose the formatter try: import lxml.etree as etree except ImportError: utils.message_dialog('The lxml package is required for the '\ 'default report plugins') else: formatter_plugin = DefaultFormatterPlugin bauble-0.9.7/bauble/plugins/report/default/small_labels.xsl0000644000175000017500000000560711234666045023056 0ustar brettbrett bauble-0.9.7/bauble/plugins/report/default/plant_list.xsl0000644000175000017500000000443411210626427022564 0ustar brettbrett ID Name of bauble-0.9.7/bauble/plugins/report/report.glade0000644000175000017500000001751711210626427020556 0ustar brettbrett Report Options True GTK_WIN_POS_CENTER_ON_PARENT 320 260 GDK_WINDOW_TYPE_HINT_DIALOG True True True 5 5 True -- True gtk-new True False 1 True gtk-remove True False False 2 False False True 10 15 True 0 GTK_SHADOW_NONE True 12 True True -- True <b>Formatter</b> True label_item False True False True <b>Settings</b> True label_item False False 1 1 2 True GTK_BUTTONBOX_END True True True gtk-cancel True -6 True False gtk-ok True -5 1 False GTK_PACK_END bauble-0.9.7/bauble/plugins/report/test.py0000644000175000017500000002124011234144345017562 0ustar brettbrett import sys import unittest from sqlalchemy import * from sqlalchemy.exc import * from bauble.test import BaubleTestCase import bauble.utils as utils from bauble.utils.log import debug #import bauble.plugins.report as report_plugin from bauble.plugins.report import get_all_species, get_all_accessions, \ get_all_plants from bauble.plugins.plants import Family, Genus, Species, VernacularName from bauble.plugins.garden import Accession, Plant, Location from bauble.plugins.tag import tag_objects, Tag def setUp_test_data(): pass def tearDown_test_data(): pass class ReportTestCase(BaubleTestCase): def __init__(self, *args): super(ReportTestCase, self).__init__(*args) def setUp(self): super(ReportTestCase, self).setUp() def tearDown(self): super(ReportTestCase, self).tearDown() class ReportTests(ReportTestCase): def setUp(self): super(ReportTests, self).setUp() fctr = gctr = sctr = actr = pctr = 0 for f in xrange(2): fctr+=1 family = Family(id=fctr, family=u'fam%s' % fctr) self.session.add(family) for g in range(2): gctr+=1 genus = Genus(id=gctr, family=family, genus=u'gen%s' % gctr) self.session.add(genus) for s in range(2): sctr+=1 sp = Species(id=sctr, genus=genus, sp=u'sp%s' % sctr) vn = VernacularName(id=sctr, species=sp, name=u'name%s' % sctr) self.session.add_all([sp, vn]) for a in range(2): actr+=1 acc = Accession(id=actr, species=sp, code=u'%s' % actr) self.session.add(acc) for p in range(2): pctr+=1 loc = Location(id=pctr, site=u'site%s' % pctr) plant = Plant(id=pctr, accession=acc, location=loc, code=u'%s' % pctr) #debug('fctr: %s, gctr: %s, actr: %s, pctr: %s' \ # % (fctr, gctr, actr, pctr)) self.session.add_all([loc, plant]) self.session.commit() def tearDown(self): super(ReportTests, self).tearDown() def test_get_all_species(self): """ Test getting the species from different types """ get_ids = lambda objs: sorted([o.id for o in objs]) family = self.session.query(Family).get(1) ids = get_ids(get_all_species([family], self.session)) self.assert_(ids == range(1, 5), ids) family = self.session.query(Family).get(1) family2 = self.session.query(Family).get(2) ids = get_ids(get_all_species([family, family2], self.session)) self.assert_(ids == range(1, 9), ids) genus = self.session.query(Genus).get(1) ids = get_ids(get_all_species([genus], self.session)) self.assert_(ids == [1, 2], ids) species = self.session.query(Species).get(1) ids = get_ids(get_all_species([species], self.session)) self.assert_(ids == [1], ids) accession = self.session.query(Accession).get(1) ids = get_ids(get_all_species([accession], self.session)) self.assert_(ids == [1], ids) plant = self.session.query(Plant).get(1) ids = get_ids(get_all_species([plant], self.session)) self.assert_(ids == [1], ids) location = self.session.query(Location).get(1) ids = get_ids(get_all_species([location], self.session)) self.assert_(ids == [1], ids) vn = self.session.query(VernacularName).get(1) ids = get_ids(get_all_species([vn], self.session)) self.assert_(ids == [1], ids) tag_objects('test', [family, genus]) tag = self.session.query(Tag).filter_by(tag=u'test').one() ids = get_ids(get_all_species([tag], self.session)) self.assert_(ids == range(1,5), ids) # now test all the objects ids = get_ids(get_all_species([family, genus, species, accession, plant, location], self.session)) self.assert_(ids == range(1,5), ids) def test_get_all_accessions(self): """ Test getting the accessions from different types """ get_ids = lambda objs: sorted([o.id for o in objs]) family = self.session.query(Family).get(1) ids = get_ids(get_all_accessions([family], self.session)) self.assert_(ids == range(1, 9), ids) family = self.session.query(Family).get(1) family2 = self.session.query(Family).get(1) ids = get_ids(get_all_accessions([family, family2], self.session)) self.assert_(ids == range(1, 9), ids) genus = self.session.query(Genus).get(1) ids = get_ids(get_all_accessions(genus, self.session)) self.assert_(ids == range(1,5), ids) species = self.session.query(Species).get(1) ids = get_ids(get_all_accessions(species, self.session)) self.assert_(ids == [1,2], ids) accession = self.session.query(Accession).get(1) ids = get_ids(get_all_accessions([accession], self.session)) self.assert_(ids == [1], ids) plant = self.session.query(Plant).get(1) ids = get_ids(get_all_accessions([plant], self.session)) self.assert_(ids == [1], ids) location = self.session.query(Location).get(1) ids = get_ids(get_all_accessions([location], self.session)) self.assert_(ids == [1], ids) vn = self.session.query(VernacularName).get(1) ids = get_ids(get_all_accessions([vn], self.session)) self.assert_(ids == [1, 2], ids) tag_objects('test', [family, genus]) tag = self.session.query(Tag).filter_by(tag=u'test').one() ids = get_ids(get_all_accessions([tag], self.session)) self.assert_(ids == range(1,9), ids) # now test all the objects ids = get_ids(get_all_accessions([family, genus, species, accession, plant, location], self.session)) self.assert_(ids == range(1,9), ids) def test_get_all_plants(self): """ Test getting the plants from different types """ get_ids = lambda objs: sorted([o.id for o in objs]) # get plants from one family family = self.session.query(Family).get(1) ids = get_ids(get_all_plants(family, self.session)) self.assert_(ids == range(1, 17), ids) # get plants from multiple families family = self.session.query(Family).get(1) family2 = self.session.query(Family).get(2) ids = get_ids(get_all_plants([family, family2], self.session)) self.assert_(ids == range(1, 33), ids) genus = self.session.query(Genus).get(1) ids = get_ids(get_all_plants(genus, self.session)) self.assert_(ids == range(1, 9), ids) species = self.session.query(Species).get(1) ids = get_ids(get_all_plants(species, self.session)) self.assert_(ids == range(1, 5), ids) accession = self.session.query(Accession).get(1) ids = get_ids(get_all_plants(accession, self.session)) self.assert_(ids == range(1, 3), ids) plant = self.session.query(Plant).get(1) ids = get_ids(get_all_plants(plant, self.session)) self.assert_(ids == [1], ids) location = self.session.query(Location).get(1) plants = get_all_plants([location], self.session) plant_ids = sorted([p.id for p in plants]) self.assert_(plant_ids == [1], plant_ids) vn = self.session.query(VernacularName).get(1) ids = get_ids(get_all_plants(vn, self.session)) self.assert_(ids == range(1, 5), ids) tag_objects('test', [family, genus]) tag = self.session.query(Tag).filter_by(tag=u'test').one() ids = get_ids(get_all_plants(tag, self.session)) self.assert_(ids == range(1, 17), ids) # now test all the objects plants = get_all_plants([family, genus, species, accession, plant, location], self.session) ids = get_ids(plants) self.assert_(ids == range(1, 17), ids) class ReportTestSuite(unittest.TestSuite): def __init__(self): super(ReportTestSuite, self).__init__() self.addTests(map(ReportTests, ('test_get_all_species', 'test_get_all_accessions', 'test_get_all_plants'))) testsuite = ReportTestSuite bauble-0.9.7/bauble/plugins/abcd/0000755000175000017500000000000011310570250015601 5ustar brettbrettbauble-0.9.7/bauble/plugins/abcd/__init__.py0000755000175000017500000003042511234665405017735 0ustar brettbrett# # ABCD import/exporter # import os import csv import gtk from sqlalchemy import * from sqlalchemy.orm import * import bauble from bauble.error import check, CheckConditionError import bauble.paths as paths import bauble.utils as utils from bauble.utils.log import debug import bauble.pluginmgr as pluginmgr from bauble.plugins.plants.species_model import Species from bauble.plugins.garden.plant import Plant from bauble.plugins.garden.accession import Accession # NOTE: see biocase provider software for reading and writing ABCD data # files, already downloaded software to desktop # TODO: should have a command line argument to create labels without starting # the full bauble interface, after creating the labels it should automatically # open the whatever ever view is associated with pdf files # e.g bauble -labels "select string" # bauble -labels "block=4" # bauble -label "acc=1997" # # TODO: create label make in the tools that show a dialog with an entry # the entry is for a search string that then returns a list of all the labels # that'll be made with checkboxess next to them to de/select the ones you # don't want to print, could also have a check box to select species or # accessions so we can print labels for plants that don't have accessions, # though this could be a problem b/c abcd data expects 'unitid' fields but # we could have a special case just for generating labels # def validate(root): ''' validate root against ABCD 2.06 schema @param root: root of an XML tree to validate against @type root: an lxml.etree.Element @returns: True or False depending if root validates correctly ''' schema_file = os.path.join(paths.lib_dir(), 'plugins', 'abcd','abcd_2.06.xsd') xmlschema_doc = etree.parse(schema_file) abcd_schema = etree.XMLSchema(xmlschema_doc) return abcd_schema.validate(root) # TODO: this function needs to be renamed since we now check an object in # the list is an Accession them we use the accession data as the UnitID, else # we treat it as a Plant...using plants is necessary for things like making # labels but most likely accessions are wanted if we're exchanging data, the # only problem is that accessions don't keep status, like dead, etc. def verify_institution(institution): test = lambda x: x != '' and x != None return test(institution.name) and test(institution.technical_contact) and \ test(institution.email) and test(institution.contact) and \ test(institution.code) namespaces = {'abcd': 'http://www.tdwg.org/schemas/abcd/2.06'} def ABCDElement(parent, name, text=None, attrib=None): """ create an ABCDElement, must be a subelement @param parent: an element @param name: a string, the name of the new element @param text: the text attribue to set on the new element @param attrib: any additional attributes for the new element """ if attrib == None: attrib = {} el = SubElement(parent, '{%s}%s' % (namespaces['abcd'], name), nsmap=namespaces, attrib=attrib) el.text = text return el def DataSets(): return Element('{%s}DataSets' % namespaces['abcd'], nsmap=namespaces) class ABCDAdapter(object): # TODO: create a HigherTaxonRank/HigherTaxonName iteratorator for a list # of all the higher taxon # TODO: need to mark those fields that are required and those that # are optional def extra_elements(self, unit): """ add extra non required elements """ pass def __init__(self, obj): self._object = obj self._mapper = object_mapper(self._object) def get_UnitID(self): pass def get_family(self): pass def get_FullScientificNameString(self, authors=True): pass def get_GenusOrMonomial(self): pass def get_FirstEpithet(self): pass def get_AuthorTeam(self): pass def get_InformalNameString(self): pass ## def get_dbURI(self): ## # db://user@host:password/database/table/id ## url = str(self._mapper.local_table.metadata.bind.url) ## # parse out the password ## at_i = url.find('@') ## if at_i != -1: ## col_i = url.find(':') ## i = url.find(':', col_i+1, at_i) ## url = url[:i] + url[at_i:] ## return '%s/%s/%s' % (url, self._mapper.local_table, ## self._object.id) def create_abcd(decorated_objects, authors=True, validate=True): ''' @param objects: a list/tuple of objects that implement the ABCDDecorator interface @param authors: flag to control whether to include the authors in the species name @param validate: whether we should valid the data before returning @returns: a valid ABCD ElementTree ''' import bauble.plugins.garden.institution as institution inst = institution.Institution() if not verify_institution(inst): msg = _('Some or all of the information about your institution or ' \ 'business is not complete. Please make sure that the ' \ 'Name, Technical Contact, Email, Contact and Institution ' 'Code fields are filled in.') utils.message_dialog(msg) institution.InstitutionEditor().start() return create_abcd(decorated_objects, authors, validate) datasets = DataSets() ds = ABCDElement(datasets, 'DataSet') tech_contacts = ABCDElement(ds, 'TechnicalContacts') tech_contact = ABCDElement(tech_contacts, 'TechnicalContact') # TODO: need to include contact information in bauble meta when # creating a new database ABCDElement(tech_contact, 'Name', text=inst.technical_contact) ABCDElement(tech_contact, 'Email', text=inst.email) cont_contacts = ABCDElement(ds, 'ContentContacts') cont_contact = ABCDElement(cont_contacts, 'ContentContact') ABCDElement(cont_contact, 'Name', text=inst.contact) ABCDElement(cont_contact, 'Email', text=inst.email) metadata = ABCDElement(ds, 'Metadata', ) description = ABCDElement(metadata, 'Description') # TODO: need to get the localized language representation = ABCDElement(description, 'Representation', attrib={'language': 'en'}) revision = ABCDElement(metadata, 'RevisionData') ABCDElement(revision, 'DateModified', text='2001-03-01T00:00:00') title = ABCDElement(representation, 'Title', text='TheTitle') units = ABCDElement(ds, 'Units') # build the ABCD unit for obj in decorated_objects: unit = ABCDElement(units, 'Unit') ABCDElement(unit, 'SourceInstitutionID', text=inst.code) # TODO: don't really understand the SourceID element ABCDElement(unit, 'SourceID', text='Bauble') unit_id = ABCDElement(unit, 'UnitID', text=obj.get_UnitID()) # TODO: metadata--2001-03-01T00:00:00 identifications = ABCDElement(unit, 'Identifications') # scientific name identification identification = ABCDElement(identifications, 'Identification') result = ABCDElement(identification, 'Result') taxon_identified = ABCDElement(result, 'TaxonIdentified') higher_taxa = ABCDElement(taxon_identified, 'HigherTaxa') higher_taxon = ABCDElement(higher_taxa, 'HigherTaxon') # TODO: ABCDDecorator should provide an iterator so that we can # have multiple HigherTaxonName's higher_taxon_name = ABCDElement(higher_taxon, 'HigherTaxonName', text=obj.get_family()) higher_taxon_rank = ABCDElement(higher_taxon, 'HigherTaxonRank', text='familia') scientific_name = ABCDElement(taxon_identified, 'ScientificName') ABCDElement(scientific_name, 'FullScientificNameString', text=obj.get_FullScientificNameString(authors)) name_atomised = ABCDElement(scientific_name, 'NameAtomised') botanical = ABCDElement(name_atomised, 'Botanical') ABCDElement(botanical, 'GenusOrMonomial', text=obj.get_GenusOrMonomial()) ABCDElement(botanical, 'FirstEpithet', text=obj.get_FirstEpithet()) author_team = obj.get_AuthorTeam() if author_team is not None: ABCDElement(botanical, 'AuthorTeam', text=author_team) # vernacular name identification # TODO: should we include all the vernacular names or only the default # one vernacular_name = obj.get_InformalNameString() if vernacular_name is not None: identification = ABCDElement(identifications, 'Identification') result = ABCDElement(identification, 'Result') taxon_identified = ABCDElement(result, 'TaxonIdentified') ABCDElement(taxon_identified, 'InformalNameString', text=vernacular_name) ## dburi = obj.get_dbURI() ## if dburi is not None: ## ABCDElement(unit, "Notes", text=dburi) # add all the extra non standard elements obj.extra_elements(unit) # TODO: handle verifiers/identifiers # TODO: RecordBasis # TODO: Gathering, make our collection records fit Gatherings # TODO: see BotanicalGardenUnit if not validate: return ElementTree(datasets) try: check(validate(datasets), 'ABCD data not valid') except CheckConditionError, e: #utils.message_dialog('ABCD data not valid') # utils.message_details_dialog('ABCD data not valid', # etree.tostring(datasets)) debug(etree.tostring(datasets)) raise return ElementTree(datasets) class ABCDExporter(object): def start(self, filename=None, plants=None): if filename == None: # no filename, ask the user d = gtk.FileChooserDialog(_("Choose a file to export to..."), None, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) response = d.run() filename = d.get_filename() d.destroy() if response != gtk.RESPONSE_ACCEPT or filename == None: return self.run(filename, plants) def run(self, filename, plants=None): if filename == None: raise ValueError("filename can not be None") # TODO: check if filename already exists give a message to the user # if plants is None then export all plants, this could be huge # TODO: do something about this, like list the number of plants # to be returned and make sure this is what the user wants if plants == None: plants = bauble.Session().query(Plant) # TODO: move PlantABCDAdapter, AccessionABCDAdapter and # PlantABCDAdapter into the ABCD plugin from bauble.plugins.report.default import PlantABCDAdapter data = create_abcd([PlantABCDAdapter(p) for p in plants]) data.write_c14n(filename) #class ABCDImporter: # # def start(self, filenames=None): # pass # # def run(self, filenames): # pass #class ABCDImportTool(BaubleTool): # category = "Import" # label = "ABCD" # # @classmethod # def start(cls): # ABCDImporter().start() class ABCDExportTool(pluginmgr.Tool): category = _("Export") label = _("ABCD") @classmethod def start(cls): msg = _('DISCLAIMER: The ABCD Exporter is not fully implemented. At ' 'the moment it will export the plants in the database but ' 'will not include source information such as collection and ' 'donation data.') utils.message_dialog(msg, gtk.MESSAGE_WARNING) ABCDExporter().start() class ABCDImexPlugin(pluginmgr.Plugin): tools = [ABCDExportTool] depends = ["PlantsPlugin"] try: import lxml.etree as etree import lxml._elementpath # put this here sp py2exe picks it up from lxml.etree import Element, SubElement, ElementTree except ImportError: utils.message_dialog(_('The lxml package is required for the ' 'ABCD plugin')) else: plugin = ABCDImexPlugin __all__ = [DataSets, ABCDElement, #ElementFactory, ABCDExporter, ABCDExportTool, create_abcd] bauble-0.9.7/bauble/plugins/abcd/test.py0000644000175000017500000000711111210626427017141 0ustar brettbrett# # test.py # # Description: test the ABCD (Access to Biological Collection Data) plugin # import os, unittest, tempfile import lxml.etree as etree from sqlalchemy import * from sqlalchemy.exc import * import bauble import bauble.paths as paths from lxml.etree import Element, SubElement, ElementTree, dump from bauble.test import BaubleTestCase from bauble.plugins.garden.accession import Accession from bauble.plugins.garden.location import Location from bauble.plugins.garden.plant import Plant from bauble.plugins.garden.donor import Donor from bauble.plugins.garden.source import Donation, Collection from bauble.plugins.plants.family import Family from bauble.plugins.plants.genus import Genus from bauble.plugins.plants.species_model import Species from bauble.plugins.abcd import DataSets import bauble.plugins.abcd as abcd import bauble.plugins.plants.test as plants_test import bauble.plugins.garden.test as garden_test # TODO: the ABCD tests need to be completely reworked class ABCDTestCase(BaubleTestCase): def __init__(self, *args): super(ABCDTestCase, self).__init__(*args) def setUp(self): super(ABCDTestCase, self).setUp() plants_test.setUp_data() garden_test.setUp_data() schema_file = os.path.join(paths.lib_dir(), 'plugins', 'abcd','abcd_2.06.xsd') xmlschema_doc = etree.parse(schema_file) self.abcd_schema = etree.XMLSchema(xmlschema_doc) def test_abcd(self): # TODO: this needs to be updated, we don't use the # ElementFactory anymore pass # datasets = DataSets() # ds = ElementFactory(datasets, 'DataSet') # tech_contacts = ElementFactory( ds, 'TechnicalContacts') # tech_contact = ElementFactory(tech_contacts, 'TechnicalContact') # ElementFactory(tech_contact, 'Name', text='Brett') # ElementFactory(tech_contact, 'Email', text='brett@belizebotanic.org') # cont_contacts = ElementFactory(ds, 'ContentContacts') # cont_contact = ElementFactory(cont_contacts, 'ContentContact') # ElementFactory(cont_contact, 'Name', text='Brett') # ElementFactory(cont_contact, 'Email', text='brett@belizebotanic.org') # metadata = ElementFactory(ds, 'Metadata', ) # description = ElementFactory(metadata, 'Description') # representation = ElementFactory(description, 'Representation', # attrib={'language': 'en'}) # revision = ElementFactory(metadata, 'RevisionData') # ElementFactory(revision, 'DateModified', text='2001-03-01T00:00:00') # title = ElementFactory(representation, 'Title', text='TheTitle') # units = ElementFactory(ds, 'Units') # unit = ElementFactory(units, 'Unit') # ElementFactory(unit, 'SourceInstitutionID', text='BBG') # ElementFactory(unit, 'SourceID', text='1111') # unit_id = ElementFactory(unit, 'UnitID', text='2222') # self.assert_(self.validate(datasets), self.abcd_schema.error_log) def test_plants_to_abcd(self): plants = self.session.query(Plant) assert plants.count() > 0 pass # create abcd from plants # data = abcd.plants_to_abcd(plants) # assert validate abcd # self.assert_(self.validate(data), self.abcd_schema.error_log) def validate(self, xml): return self.abcd_schema.validate(xml) class ABCDTestSuite(unittest.TestSuite): def __init__(self): unittest.TestSuite.__init__(self) self.addTests(map(ABCDTestCase, ('test_abcd', 'test_plants_to_abcd'))) testsuite = ABCDTestSuite bauble-0.9.7/bauble/plugins/__init__.py0000755000175000017500000000014111210626427017027 0ustar brettbrett""" This module doesn't do anything other than create a placeholder for other Bauble plugins """ bauble-0.9.7/bauble/plugins/picasa/0000755000175000017500000000000011310570250016150 5ustar brettbrettbauble-0.9.7/bauble/plugins/picasa/gui.glade0000644000175000017500000001564111210626427017750 0ustar brettbrett 5 False True GTK_WIN_POS_CENTER_ON_PARENT GDK_WINDOW_TYPE_HINT_DIALOG False True 2 True True 0 GTK_SHADOW_NONE True 12 True True True 30 True <b>Email</b> True label_item False True 0 GTK_SHADOW_NONE True 12 True True True True <b>Album</b> True label_item False 1 True 0 GTK_SHADOW_NONE True 12 True True False True True <b>Password</b> True label_item False 2 1 True GTK_BUTTONBOX_END True True True True True gtk-ok True -5 1 False GTK_PACK_END bauble-0.9.7/bauble/plugins/picasa/__init__.py0000644000175000017500000004411311234146627020300 0ustar brettbrett# # picasa plugin # # 1. should be able to upload photos, have to use picasa to delete and # do other photo manipulation # # 2. on import should autotag with the plant name # # 3. need to be able to set a max cache size to delete the oldest # files if we go over the cache size # # 4. By default we should only get the files of a certain size that # can be viewed in Bauble but should allow the option to download the # original file # # 5. Should provide a Save As button so the user can save a copy of # the file for later use # # TODO: create a timeout when fetching the feed so the infopage # doesn't just sit there and look busy # TODO: the infobox can get a little confused if you switch between # two species too fast and just get hung on with the progress image # IDEA: we could probably make this module more generic and based on # mixins where we add the functionality for getting the photos by # mixing in different implentations for different services import os, sys import tempfile import urllib from Queue import Queue # this little dummyfile hack fixes an annoying deprecation warning # when importing gdata 1.2.4 class dummyfile(object): def write(*x): pass tmp = sys.stderr sys.stderr = dummyfile() import gdata.photos.service sys.stderr = tmp import gtk import sqlalchemy as sa import sqlalchemy.orm as orm from sqlalchemy.ext.declarative import declarative_base import bauble import bauble.meta as meta import bauble.paths as paths import bauble.pluginmgr as pluginmgr import bauble.utils as utils import bauble.utils.thread as thread import bauble.view as view from bauble.plugins.plants import Species from bauble.utils.log import debug PICASA_TOKEN_KEY = u'picasa_token' # TODO: should we store the email and album in the BaubleMeta...these # should only be changeable by an administrator...should probably only # allow an administrator to even access the PicasaTool PICASA_EMAIL_KEY = u'picasa_email' PICASA_ALBUM_KEY = u'picasa_album' # see http://code.google.com/apis/picasaweb/reference.html#Parameters picasa_imgmax = 'd' # "d" means download the original picasa_thumbsize = '144u' default_path = os.path.join(paths.user_dir(), 'photos') # keep a copy of the feeds that we retrieve by tag __feed_cache = {} def update_meta(email=None, album=None, token=None): """ Update the email, album and authorization token in the bauble meta table. """ # TODO: should we allow setting the values to None session = bauble.Session() if email: email = utils.utf8(email) meta.get_default(PICASA_EMAIL_KEY, email, session).value = email if album: album = utils.utf8(album) meta.get_default(PICASA_ALBUM_KEY, album, session).value = album if token: token = utils.utf8(token) meta.get_default(PICASA_TOKEN_KEY, token, session).value = token session.commit() session.close() __feed_cache.clear() def get_auth_token(email, password): """ Update the Picasa Auth Token using the Google Data ClientClient uri """ gd_client = gdata.photos.service.PhotosService() gd_client.ClientLogin(username=email, password=password) __feed_cache.clear() return gd_client.GetClientLoginToken() def get_photo_feed(gd_client, user=None, album=None, tag=None): """ Get a photo feed with the username and album stored in bauble meta table and with has tag. """ feed = '/data/feed/api/user/%s' % user if album: feed += '/album/%s' % urllib.quote(album) if tag: feed += '?kind=photo&tag=%s' % urllib.quote(tag) else: feed += '?kind=photo' feed += '&thumbsize=%s&imgmax=%s' % (picasa_thumbsize, picasa_imgmax) return gd_client.GetFeed(str(feed)) class PhotoCache(object): """ The PhotoCache allows photos stored on the filesystem to be looked up by an id that is unique to the service the file was downloaded from. """ def __init__(self, path=None, create=False): """ :param path: the path to the sqlite database :param create: create the database if it doesn't exists """ if not path: path = os.path.join(default_path, 'photos.db') uri = 'sqlite:///%s' % path self.engine = sa.create_engine(uri) self.engine.connect() self.metadata = Base.metadata self.metadata.bind = self.engine self.Session = orm.sessionmaker(bind=self.engine, autoflush=False) if create: self.metadata.drop_all(checkfirst=True) self.metadata.create_all() def exists(self, path=None): """ Check if a PhotoCache database exists at path. If path is None then the path defaults to $HOME/photos/photos.db """ if not path: path = os.path.join(default_path, 'photos.db') return self.engine.has_table(Photo.__tablename__) def __getitem__(self, id): """ Get photos from the database by tag """ # select item from database and return a list of matching filenames session = self.Session() photo = session.query(Photo).filter_by(id=utils.utf8(id)).first() session.close() return photo def get(self, id): return self[id] def add(self, id, path): """ Add photos to the cache """ session = self.Session() photo = Photo(id=utils.utf8(id), path=utils.utf8(path)) session.add(photo) session.commit() session.close() def remove(self, id): """ Remove a photo entry from the cache. """ session = self.Session() photo = self[utils.utf8(id)] session.delete(photo) session.commit() session.close() Base = declarative_base() class Photo(Base): """ id: a unique id for the photos, created by using the name of the service and the unique photo id for the service, e.g. picasa:26734123 path: the path of the photo on the filesystem """ __tablename__ = 'photo' id = sa.Column(sa.Unicode(64), primary_key=True, nullable=False) path = sa.Column(sa.UnicodeText, nullable=False) class PicasaSettingsDialog(object): """ A dialog to handle the Picasa settings """ def __init__(self): widget_path = os.path.join(paths.lib_dir(), 'plugins', 'picasa', 'gui.glade') self.widgets = utils.GladeWidgets(widget_path) self.window = self.widgets.settings_dialog if bauble.gui: self.window.set_transient_for(bauble.gui.window) self.widgets.password_entry.connect('changed', self.on_changed) email = meta.get_default(PICASA_EMAIL_KEY, '').value self.widgets.email_entry.set_text(email or '') album = meta.get_default(PICASA_ALBUM_KEY, '').value self.widgets.album_entry.set_text(album or '') auth = meta.get_default(PICASA_TOKEN_KEY, '').value if auth: self.widgets.password_entry.set_text('blahblah') self._changed = False def on_changed(self, *args): self._changed = True def run(self): """ """ response = self.window.run() self.window.hide() if response != gtk.RESPONSE_OK: return stored_email = meta.get_default(PICASA_EMAIL_KEY).value email = self.widgets.email_entry.get_text() album = self.widgets.album_entry.get_text() passwd = self.widgets.password_entry.get_text() if stored_email != email or self._changed: try: token = get_auth_token(email, passwd) except Exception, e: debug(e) token = None if not token: utils.message_dialog(_('Could not authorize Google '\ 'account: %s' % email), gtk.MESSAGE_ERROR) return update_meta(utils.utf8(email), utils.utf8(album), utils.utf8(token)) else: update_meta(album=album) return response # the _exc_queue hold any exceptions that we get in _get_feed_worker _exc_queue = Queue() def _get_feed_worker(worker, gd_client, tag): """ Get the feed and then start new threads to get each one of the images. """ # TODO: we should have to get the feed if its already been fetched # this session, maybe we need some sort of in memory database of # feeds that have been fetched email = meta.get_default(PICASA_EMAIL_KEY).value try: user, domain = email.split('@', 1) except Exception, e: #debug(e) user = email album = meta.get_default(PICASA_ALBUM_KEY).value if tag in __feed_cache: feed = __feed_cache[tag] else: try: feed = get_photo_feed(gd_client, user, album, tag) except Exception, e: worker.canceled = True _exc_queue.put(e) return __feed_cache[tag] = feed path = os.path.join(default_path) if not os.path.exists(path): os.makedirs(path) cache = PhotoCache() for entry in feed.entry: url = entry.media.thumbnail[0].url photo_id = 'picasa:%s' % entry.gphoto_id.text photo = cache[photo_id] def _get(): extension = url[-4:] fd, filename = tempfile.mkstemp(suffix=extension, dir=path) urllib.urlretrieve(url, filename) cache.add(photo_id, filename) if not photo: _get() if not os.path.exists(photo.path): cache.remove(photo_id) _get() # publish the id of the image in the image cache worker.publish(photo_id) # The iconview_worker represents the thread and is global so that we # can check if it is running and cancel it if necessary. iconview_worker = None def _on_get_feed_publish(worker, data, iconview): """ Add the photo the the iconview. """ model = iconview.get_model() cache = PhotoCache() for photo_id in data: filename = cache[photo_id].path pixbuf = gtk.gdk.pixbuf_new_from_file(filename) model.append([pixbuf]) def populate_iconview(gd_client, iconview, tag): """ Get the photos with tag from the PicasaWeb or from the photo cache and populate the iconview. :param gd_client: :param iconview: :param tag: """ global iconview_worker if iconview_worker: iconview_worker.cancel() utils.clear_model(iconview) model = gtk.ListStore(gtk.gdk.Pixbuf) iconview.set_model(model) cache = PhotoCache() if not cache.exists(): PhotoCache(create=True) iconview_worker = thread.GtkWorker(_get_feed_worker, gd_client, tag) iconview_worker.connect('published', _on_get_feed_publish, iconview) iconview_worker.execute() return iconview_worker class StatusBox(gtk.VBox): """ A VBox that makes it easier to control the different states of information and errors in the PicasaInfoPage. """ def __init__(self, button_callback): super(StatusBox, self).__init__() self.label = gtk.Label() self.pack_start(self.label, False, False) loading_image = os.path.join(paths.lib_dir(), 'images', 'loading.gif') animation = gtk.gdk.PixbufAnimation(loading_image) self.progress_image = gtk.Image() self.progress_image.set_from_animation(animation) self.pack_start(self.progress_image, False, False) self.button = gtk.Button(_('Settings')) self.button.connect('clicked', button_callback) self.pack_start(self.button, False, False, padding=10) def set_text(self, text): """ Set the label label text and show the label widget. """ self.label.show() self.label.set_text(text) def set_busy(self, busy=True): """ If False then hide the progress image. If True then hide the button and label widgets and show the progress image. """ if busy: self.button.hide() self.label.hide() self.progress_image.show() else: self.progress_image.hide() def on_error(self, message): """ Hide the progress image and show the label and button. """ self.progress_image.hide_all() self.label.set_text(message) self.label.show() self.button.show_all() class PicasaInfoPage(view.InfoBoxPage): def __init__(self): super(PicasaInfoPage, self).__init__() self.label = _('Images') self._disabled = False self.gd_client = gdata.photos.service.PhotosService() #self.set_policy(gtk.POLICY_ALWAYS, gtk.POLICY_ALWAYS) self.iconview = gtk.IconView() # TODO: we set the columns here because for some reason the # combination of paned windows, notebooks and scrollbars seems # to screw up the icon view automatic row/column handling so # that if you make the infobox larger then the images seem to # move between rows ok but if you make it smaller it doesn't self.iconview.set_columns(1) self.iconview.set_pixbuf_column(0) self.vbox.pack_start(self.iconview) self._current_row = None from Queue import Queue def on_clicked(*args): d = PicasaSettingsDialog() if d.run(): self.update(self._current_row) self.status_box = StatusBox(on_clicked) self.vbox.pack_start(self.status_box) self.show_status_box() def show_status_box(self): """ Show the status box and hide the iconview. """ self.iconview.hide_all() if self.iconview.get_parent(): self.vbox.remove(self.iconview) if not self.status_box.get_parent(): self.vbox.pack_start(self.status_box, True, True) self.status_box.show() def hide_status_box(self): """ Show the iconview and hide the status box. """ self.status_box.hide_all() if self.status_box.get_parent(): self.vbox.remove(self.status_box) if not self.iconview.get_parent(): self.vbox.pack_start(self.iconview) self.iconview.show() def set_busy(self, busy=True): """ Toggle the throbber. """ if busy : self.show_status_box() self.status_box.set_busy() else: self.status_box.set_busy(False) def on_error(self, message, species): self.show_status_box() self.status_box.on_error(message) def update(self, row): """ Update the Picasa info page. :param: a Species instance """ self._current_row = row token_meta = meta.get_default(utils.utf8(PICASA_TOKEN_KEY)) if not token_meta: msg = _('Could not login to PicasaWeb account.') self.on_error(msg, species=row) return token = token_meta.value self.gd_client.SetClientLoginToken(token) tag = Species.str(row, markup=False, authors=False) self.set_busy() worker = populate_iconview(self.gd_client, self.iconview, tag) def on_done(*args): if not _exc_queue.empty(): exc = _exc_queue.get() msg = 'Could not retrieve the photos.\n\n' if isinstance(exc, gdata.photos.service.GooglePhotosException): msg += exc.message else: msg += str(exc) self.on_error(msg, row) return self.set_busy(False) model = self.iconview.get_model() if len(model) == 0: self.status_box.set_text(_('No images')) self.show_status_box() else: self.hide_status_box() worker.connect('done', on_done, False) # def upload(image, species): # """ # Upload an image to the Picasa Web Album # :param image: the image data # :param species: the species name # """ # tag = Species.str(species, markup=False, authors=False) # session = bauble.Session() # #token = self.session.query(meta.BaubleMeta.value).\ # # filter_by(name=picasa.PICASA_TOKEN_KEY).one()[0] # token = meta.get_default(PICASA_TOKEN_KEY) # gd_client = gdata.photos.service.PhotosService() # #gd_client.service = 'lh2' # gd_client.SetClientLoginToken(token) # #gd_client.auth_token = token # album_url = '/data/feed/api/user/%s/album/%s' % (username, # album.gphoto_id.text) # photo = gd_client.InsertPhoto(album_url, new_entry, filename, # content_type='image/jpeg') # class PicasaUploader(object): # def __init__(self): # pass # def build_gui(): # self.assistant = gtk.Assistant() # # page 1 - information # label = gtk.Label('This tool will help you upload photos to your '\ # 'Picasa Web Albums') # self.assistant.append_page() # # page 2 - select the files # vbox = gtk.VBox() # label = gtk.Label('Please select the the images to upload.') # # page 3 - tag the files and upload # vbox = gtk.VBox() # def start(self): # build_gui() # pass # class PicasaUploadTool(pluginmgr.Tool): # """ # Tool for uploading images to the Picasa Web Albums # """ # category = 'Picasa' # label = 'Upload' # @classmethod # def start(cls): # d = PicasaUploader() # d.start() class PicasaSettingsTool(pluginmgr.Tool): """ Tool for changing the Picasa settings and updated the auth token """ category = 'Picasa' label = 'Settings' @classmethod def start(cls): d = PicasaSettingsDialog() d.run() # class PicasaView(pluginmgr.View): # def __init__(self): # super(PicasaView, self).__init__() # def do_something(self, arg): # pass class PicasaPlugin(pluginmgr.Plugin): #tools = [PicasaUploadTool, PicasaSettingsTool] tools = [PicasaSettingsTool] #view = PicasaView #commands = [PicasaCommandHandler] plugin = PicasaPlugin bauble-0.9.7/bauble/plugins/picasa/test.py0000644000175000017500000000757311210626427017524 0ustar brettbrettfrom nose import * import gtk import bauble.meta as meta import bauble.plugins.picasa as picasa from bauble.test import BaubleTestCase import bauble.utils as utils from bauble.utils.log import debug class PicasaTests(BaubleTestCase): def __init__(self, *args): super(PicasaTests, self).__init__(*args) def test_photo_cache(self): """ Test bauble.plugins.picasa.PhotoCache """ import tempfile fd, filename = tempfile.mkstemp() cache = picasa.PhotoCache(path=filename, create=True) photoid = u'testid' cache.add(photoid, u'testpath') self.assert_(cache[photoid].id == photoid) cache.remove(photoid) self.assert_(not cache[photoid]) # def test_populate_iconview(self): # import gdata.photos.service # user = u'' # passwd = u'' # token = picasa.get_auth_token(user, passwd) # picasa.update_meta(user, u'Plants', token) # gd_client = gdata.photos.service.PhotosService() # gd_client.SetClientLoginToken(token) # picasa.populate_iconview(gd_client, iconview=None, # tag='Maxillaria elatior') def test_get_auth_token(self): """ Test retrieving auth token from Google """ # TODO: will probably have to skip this test since requires a # password raise SkipTest user = '' passwd = '' token = picasa.get_auth_token(user, passwd) self.assert_(token) def test_update_meta(self): """ Test bauble.plugins.picasa.update_meta() function. """ email = u'email' album = u'album' token = u'token' picasa.update_meta(email=u'email', album=u'album', token=u'token') self.assert_(email==meta.get_default(picasa.PICASA_EMAIL_KEY).value) self.assert_(album==meta.get_default(picasa.PICASA_ALBUM_KEY).value) self.assert_(token==meta.get_default(picasa.PICASA_TOKEN_KEY).value) album2 = u'album2' picasa.update_meta(album=album2) self.assert_(album2==meta.get_default(picasa.PICASA_ALBUM_KEY).value) def _get_settings(self): """ Get the Picasa connection settings """ d = picasa.PicasaSettingsDialog() return d.run() def itest_infopage(self): from bauble.plugins.plants import Family, Genus, Species email = '' passwd = '' album='Plants' if email: token = picasa.get_auth_token(email, passwd) picasa.update_meta(email=email, album=album, token=token) f = Family(family=u'Orchidaceae') g = Genus(family=f, genus=u'Maxillaria') sp = Species(genus=g, sp=u'elatior') self.session.add_all([f, g, sp]) self.session.commit() self.dialog = gtk.Dialog() self.dialog.set_size_request(250, 700) page = picasa.PicasaInfoPage() page.update(sp) self.dialog.vbox.pack_start(page) self.dialog.show_all() self.dialog.run() def itest_get_photo_feed(self): """ Interactively test picasa.get_photo_feed() """ if self._get_settings() != gtk.RESPONSE_OK: return email = meta.get_default(picasa.PICASA_EMAIL_KEY).value try: user, domain = email.split('@', 1) except Exception: user = email album = meta.get_default(picasa.PICASA_ALBUM_KEY).value token = meta.get_default(picasa.PICASA_TOKEN_KEY).value picasa.update_meta(email, album, utils.utf8(token)) import gdata.photos.service gd_client = gdata.photos.service.PhotosService() gd_client.SetClientLoginToken(token) # this tag is specific to the Plant album on brettatoms account tag = 'Maxillaria elatior' feed = picasa.get_photo_feed(gd_client, user, album, tag) self.assert_(len(feed.entry) > 0) bauble-0.9.7/bauble/plugins/tag/0000755000175000017500000000000011310570250015463 5ustar brettbrettbauble-0.9.7/bauble/plugins/tag/__init__.py0000755000175000017500000004261511310026733017611 0ustar brettbrett# # __init__.py -- tag plugin # # Description: # import os import traceback import gtk from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.exc import SQLError, InvalidRequestError import bauble import bauble.db as db import bauble.editor as editor import bauble.pluginmgr as pluginmgr import bauble.paths as paths import bauble.utils as utils from bauble.utils.log import debug, warning, sa_echo, echo from bauble.view import SearchView, MapperSearch # TODO: is it possible to add to a context menu for any object that shows a # submenu of all the tags on an object # TODO: the unicode usage here needs to be reviewed # def edit_callback(value): # session = bauble.Session() # e = TagEditor(model_or_defaults=session.merge(value)) # return e.start() != None def remove_callback(value): s = '%s: %s' % (value.__class__.__name__, utils.xml_safe_utf8(value)) msg = _("Are you sure you want to remove %s?") % s if not utils.yes_no_dialog(msg): return session = bauble.Session() try: obj = session.query(Tag).get(value.id) session.delete(obj) session.commit() except Exception, e: msg = _('Could not delete.\n\n%s') % utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), type=gtk.MESSAGE_ERROR) finally: session.close() # reinitialize the tag menu _reset_tags_menu() return True tag_context_menu = [#('Edit', edit_callback), #('--', None), ('Remove', remove_callback)] class TagItemGUI(editor.GenericEditorView): ''' interface for tagging individual items in the results of the SearchView ''' def __init__(self, values): glade_file = os.path.join(paths.lib_dir(), 'plugins', 'tag', 'tag.glade') super(TagItemGUI, self).__init__(glade_file, parent=bauble.gui.window) self.dialog = self.glade_xml.get_widget('tag_item_dialog') self.dialog.set_transient_for(bauble.gui.window) self.item_data_label = self.glade_xml.get_widget('items_data') self.values = values self.item_data_label.set_text(', '.join([str(s) for s in self.values])) button = self.glade_xml.get_widget('new_button') self.connect(button, 'clicked', self.on_new_button_clicked) def on_new_button_clicked(self, *args): ''' create a new tag name ''' d = gtk.Dialog(_("Enter a tag name"), None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) d.set_default_response(gtk.RESPONSE_ACCEPT) d.set_default_size(250,-1) entry = gtk.Entry() entry.connect("activate", lambda entry: d.response(gtk.RESPONSE_ACCEPT)) d.vbox.pack_start(entry) d.show_all() d.run() name = unicode(entry.get_text(), encoding='utf-8') d.destroy() #stmt = tag_table.select(tag_table.c.tag==name).alias('_dummy').count() session = bauble.Session() ntags = session.query(Tag).filter_by(tag=name).count() if name not in ('', u'') and ntags == 0: session.add(Tag(tag=name)) session.commit() model = self.tag_tree.get_model() model.append([False, name]) _reset_tags_menu() session.close() def on_toggled(self, renderer, path, data=None): ''' tag or untag the objs in self.values ''' active = not renderer.get_active() model = self.tag_tree.get_model() iter = model.get_iter(path) model[iter][0] = active name = model[iter][1] if active: tag_objects(name, self.values) else: untag_objects(name, self.values) def build_tag_tree_columns(self): """ Build the tag tree columns. """ renderer = gtk.CellRendererToggle() self.connect(renderer, 'toggled', self.on_toggled) renderer.set_property('activatable', True) toggle_column = gtk.TreeViewColumn(None, renderer) toggle_column.add_attribute(renderer, "active", 0) renderer = gtk.CellRendererText() tag_column = gtk.TreeViewColumn(None, renderer, text=1) return [toggle_column, tag_column] def on_key_released(self, widget, event): ''' if the user hits the delete key on a selected tag in the tag editor then delete the tag ''' keyname = gtk.gdk.keyval_name(event.keyval) if keyname != "Delete": return model, row_iter = self.tag_tree.get_selection().get_selected() tag_name = model[row_iter][1] msg = _('Are you sure you want to delete the tag "%s"?') % tag_name if not utils.yes_no_dialog(msg): return session = bauble.Session() try: query = session.query(Tag) tag = query.filter_by(tag=unicode(tag_name)).one() session.delete(tag) session.commit() model.remove(row_iter) _reset_tags_menu() view = bauble.gui.get_view() if isinstance(view, SearchView): view.reset_view() except Exception, e: utils.message_details_dialog(utils.xml_safe(str(e)), traceback.format_exc(), gtk.MESSAGE_ERROR) finally: session.close() def start(self): # we keep restarting the dialog here since the gui was created with # glade then the 'new tag' button emits a response we want to ignore self.tag_tree = self.glade_xml.get_widget('tag_tree') # TODO: remove any old columns that might be on the tree since # we are going to be reusing the tag_tree that might have been # built up from previous runs of the tag editor...this is a # bit of a hack for 0.9 and hopefully in 1.0 we'll rework the # tag editor for col in self.tag_tree.get_columns(): self.tag_tree.remove_column(col) # make the new columns if they don't already exist if not self.tag_tree.get_columns(): columns = self.build_tag_tree_columns() for col in columns: self.tag_tree.append_column(col) # create the model model = gtk.ListStore(bool, str) item_tags = get_tag_ids(self.values) has_tag = False tag_query = bauble.Session().query(Tag) for tag in tag_query: if tag.id in item_tags: has_tag = True model.append([has_tag, tag.tag]) has_tag = False self.tag_tree.set_model(model) self.tag_tree.add_events(gtk.gdk.KEY_RELEASE_MASK) self.connect(self.tag_tree, "key-release-event", self.on_key_released) response = self.dialog.run() while response != gtk.RESPONSE_OK \ and response != gtk.RESPONSE_DELETE_EVENT: response = self.dialog.run() self.dialog.hide() self.disconnect_all() class Tag(db.Base): __tablename__ = 'tag' __mapper_args__ = {'order_by': 'tag'} # columns tag = Column(Unicode(64), unique=True, nullable=False) description = Column(Unicode) # relations _objects = relation('TaggedObj', cascade='all, delete-orphan', backref='tag') def __str__(self): return str(self.tag) def markup(self): return '%s Tag' % self.tag def _get_objects(self): return get_tagged_objects(self) objects = property(_get_objects) class TaggedObj(db.Base): __tablename__ = 'tagged_obj' # columns obj_id = Column(Integer, autoincrement=False) obj_class = Column(String(128)) # # TODO: can class names be unicode, i.e. should obj_class be unicode tag_id = Column(Integer, ForeignKey('tag.id')) def __str__(self): return '%s: %s' % (self.obj_class, self.obj_id) # TODO: maybe we shouldn't remove the obj from the tag if we can't # find it, it doesn't really hurt to have it there and in case the # table isn't available at the moment doesn't mean it won't be there # later, e.g. if some object is tagged but then that plugin gets # disabled by a user then the tag could still exist for that object to # other users who have that plugin enabled. # TODO: provide another function that returns (table, id) pairs that # this function can use so that we can expose that functionality def _get_tagged_object_pairs(tag): """ @param tag: a Tag instance """ from bauble.view import SearchView kids = [] for obj in tag._objects: try: # __import__ "from_list" parameters has to be a list of strings module_name, part, cls_name = str(obj.obj_class).rpartition('.') module = __import__(module_name, globals(), locals(), module_name.split('.')[1:]) cls = getattr(module, cls_name) kids.append((cls, obj.obj_id)) except KeyError, e: warning('KeyError -- tag.get_tagged_objects(%s): %s' % (tag, e)) continue except SQLError, e: warning('SQLError -- tag.get_tagged_objects(%s): %s' % (tag, e)) continue except AttributeError, e: warning('AttributeError -- tag.get_tagged_objects(%s): %s' \ % (tag, e)) warning('Could not get the object for %s.%s(%s)' % \ (module_name, cls_name, obj.obj_id)) continue return kids def get_tagged_objects(tag, session=None): """ Return all object tagged with tag. """ close_session = False if not isinstance(tag, Tag): if not session: session = bauble.Session() tag = session.query(Tag).filter_by(tag=utils.utf8(tag)).first() elif not session: session = object_session(tag) # filter out any None values from the query which can happen if # you tag something and then delete it from the datebase # TODO: the missing tagged objects should probably be removed from # the database r = [session.query(mapper).filter_by(id=obj_id).first() \ for mapper, obj_id in _get_tagged_object_pairs(tag)] r = filter(lambda x: x != None, r) if close_session: session.close() return r def untag_objects(name, objs): """ @param name: @param objs: untag objs """ # TODO: should we loop through objects in a tag to delete # the TaggedObject or should we delete tags is they match # the tag in TaggedObj.selectBy(obj_class=classname, obj_id=obj.id) session = bauble.Session() try: #tag = session.query(Tag).filter(tag_table.c.tag==unicode(name)).one() tag = session.query(Tag).filter_by(tag=utils.utf8(name)).one() except Exception, e: debug(traceback.format_exc()) return same = lambda x, y: x.obj_class==_classname(y) and x.obj_id==y.id for obj in objs: for kid in tag._objects: # x = kid # y = obj if same(kid, obj): #o = session.load(type(kid), kid.id) o = session.query(type(kid)).filter_by(id=kid.id).one() #debug('delete: %s' % o) session.delete(o) session.commit() session.close() # create the classname stored in the tagged_obj table _classname = lambda x: unicode('%s.%s', 'utf-8') % (type(x).__module__, type(x).__name__) def tag_objects(name, objs): ''' @param name: The tag name, if its a str object then it will be converted to unicode() using the default encoding. If a tag with this name doesn't exist it will be created @type name: string @param obj: The object to tag. @type obj: a list of mapper objects ''' session = bauble.Session() name = utils.utf8(name) try: tag = session.query(Tag).filter_by(tag=name).one() except InvalidRequestError, e: tag = Tag(tag=name) session.add(tag) for obj in objs: cls = and_(TaggedObj.obj_class==_classname(obj), TaggedObj.obj_id==obj.id, TaggedObj.tag_id==tag.id) ntagged = session.query(TaggedObj).filter(cls).count() if ntagged == 0: tagged_obj = TaggedObj(obj_class=_classname(obj), obj_id=obj.id, tag=tag) session.add(tagged_obj) # if a new tag is created with the name parameter it is always saved # regardless of whether the objects are tagged session.commit() session.close() def get_tag_ids(objs): """ @param objs: a list or tuple of objects Return a list of tag id's for tags associated with obj, only returns those tag ids that are common between all the objs """ # TODO: this function does intersection in the most # straightforward way and could probably do with some optimization #clause = lambda x: and_(TaggedObj.obj_class==_classname(x), # TaggedObj.obj_id==x.id) #ors = or_(*map(clause, objs)) session = bauble.Session() s = set() tag_id_query = session.query(Tag.id).join('_objects') for obj in objs: clause = and_(TaggedObj.obj_class==_classname(obj), TaggedObj.obj_id==obj.id) tags = [r[0] for r in tag_id_query.filter(clause)] if len(s) == 0: s.update(tags) else: s.intersection_update(tags) session.close() return list(s) def _on_add_tag_activated(*args): # get the selection from the search view # TODO: would be better if we could set the sensitivity of the menu # item depending on if something was selected in the search view, this # means we need to add more hooks to the search view or include the # tag plugin into the search view view = bauble.gui.get_view() if isinstance(view, SearchView): values = view.get_selected_values() if len(values) == 0: msg = _('Nothing selected') utils.message_dialog(msg) return # right now we can only tag a single item at a time, if we did # the f-spot style quick tagging then it would be easier to handle # multiple tags at a time, we could do it we would just have to find # the common tags for each of the selected items and then select them # but grey them out so you can see that some of the items have that # tag but not all of them tagitem = TagItemGUI(values) tagitem.start() #lse: #ig = 'Not a SearchView' #tils.message_dialog(msg) def _tag_menu_item_activated(widget, tag_name): bauble.gui.send_command('tag="%s"' % tag_name) from bauble.view import SearchView view = bauble.gui.get_view() if isinstance(view, SearchView): view.results_view.expand_to_path('0') _tags_menu_item = None def _reset_tags_menu(): tags_menu = gtk.Menu() add_tag_menu_item = gtk.MenuItem(_('Tag Selection')) add_tag_menu_item.connect('activate', _on_add_tag_activated) accel_group = gtk.AccelGroup() bauble.gui.window.add_accel_group(accel_group) add_tag_menu_item.add_accelerator('activate', accel_group, ord('T'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) tags_menu.append(add_tag_menu_item) #manage_tag_item = gtk.MenuItem('Manage Tags') #tags_menu.append(manage_tag_item) tags_menu.append(gtk.SeparatorMenuItem()) session = bauble.Session() query = session.query(Tag) try: for tag in query: item = gtk.MenuItem(tag.tag, use_underline=False) item.connect("activate", _tag_menu_item_activated, tag.tag) tags_menu.append(item) except Exception: debug(traceback.format_exc()) msg = _('Could not create the tags menus') utils.message_details_dialog(msg, traceback.format_exc(), gtk.MESSAGE_ERROR) # raise #debug('** maybe the tags table hasn\'t been created yet') global _tags_menu_item if _tags_menu_item is None: _tags_menu_item = bauble.gui.add_menu(_("Tags"), tags_menu) else: _tags_menu_item.remove_submenu() _tags_menu_item.set_submenu(tags_menu) _tags_menu_item.show_all() session.close() def natsort_kids(kids): """ """ return lambda(parent): sorted(getattr(parent, kids),key=utils.natsort_key) class TagPlugin(pluginmgr.Plugin): @classmethod def init(cls): from bauble.view import SearchView mapper_search = SearchView.get_search_strategy('MapperSearch') mapper_search.add_meta(('tag', 'tags'), Tag, ['tag']) SearchView.view_meta[Tag].set(children=natsort_kids('objects'), context_menu=tag_context_menu) if bauble.gui is not None: _reset_tags_menu() #class TagEditorView(GenericEditorView): # pass # #class TagEditorPresenter(GenericEditorPresenter): # pass # #class TagEditor(GenericModelViewPresenterEditor): # # # TODO: the tag editor allows tags to be added or removed from # # a single object # def __init__(self, model=None, parent=None): # ''' # @param model: Accession instance or None # @param parent: the parent widget # ''' # if model is None: # model = Tag() # GenericModelViewPresenterEditor.__init__(self, model, parent) plugin = TagPlugin bauble-0.9.7/bauble/plugins/tag/tag.glade0000644000175000017500000001777411210626427017263 0ustar brettbrett Tags False True 250 300 GDK_WINDOW_TYPE_HINT_DIALOG True True 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 GTK_SHADOW_NONE True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True -- True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Item(s)</b> True label_item False False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 GTK_SHADOW_NONE True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Tags</b> True label_item 1 2 True GTK_BUTTONBOX_EDGE True True True GTK_RELIEF_NONE True 0 0 True 2 True gtk-new False False True New Tag True False False 1 True True True gtk-ok True -5 1 False GTK_PACK_END bauble-0.9.7/bauble/plugins/tag/test.py0000644000175000017500000000714111234143260017021 0ustar brettbrettfrom sqlalchemy import * from sqlalchemy.exc import * import bauble.plugins.tag as tag_plugin from bauble.plugins.plants import Family from bauble.plugins.tag import Tag from bauble.test import BaubleTestCase class TagTests(BaubleTestCase): family_ids = [1, 2] def setUp(self): super(TagTests, self).setUp() self.family = Family(family=u'family') self.session.add(self.family) self.session.commit() #for f in self.family_ids: # family_table.insert({'id': f, 'family': unicode(f)}).execute() #for col in family_table.c: # utils.reset_sequence(col) def tearDown(self): super(TagTests, self).tearDown() #self.session.bind.execute(family_table.delete()) ## def test_get_tagged_objects(self): ## pass def test_str(self): """ Test Tag.__str__ method """ name = u'test' tag = Tag(tag=name) self.assert_(str(tag) == name) def test_tag_objects(self): family2 = Family(family=u'family2') self.session.add(family2) self.session.commit() tag_plugin.tag_objects('test', [self.family, family2]) # get object by string tagged_objs = tag_plugin.get_tagged_objects('test') sorted_pairs= sorted([(type(o), o.id) for o in tagged_objs], cmp=lambda x, y: cmp(x[0], y[0])) self.assert_(sorted_pairs == [(Family, 1), (Family, 2)], sorted_pairs) # get object by tag tag = self.session.query(Tag).filter_by(tag=u'test').one() tagged_objs = tag_plugin.get_tagged_objects(tag) sorted_pairs= sorted([(type(o), o.id) for o in tagged_objs], cmp=lambda x, y: cmp(x[0], y[0])) self.assert_(sorted_pairs == [(Family, 1), (Family, 2)], sorted_pairs) tag_plugin.tag_objects('test', [self.family, family2]) # # now untag everything # tag_plugin.untag_objects('test', [self.family, family2]) # get object by string tagged_objs = tag_plugin.get_tagged_objects('test') pairs = [(type(o), o.id) for o in tagged_objs] self.assert_(pairs == [], pairs) # get object by tag tag = self.session.query(Tag).filter_by(tag=u'test').one() tagged_objs = tag_plugin.get_tagged_objects(tag) def test_get_tag_ids(self): family2 = Family(family=u'family2') self.session.add(family2) self.session.commit() tag_plugin.tag_objects('test', [self.family, family2]) tag_plugin.tag_objects('test2', [self.family]) # test we only return the ids the objects have in common #sel = select([tag_table.c.id], tag_table.c.tag==u'test') results = self.session.query(Tag.id).filter_by(tag=u'test') test_id = [r[0] for r in results] # should only return id for "test" ids = tag_plugin.get_tag_ids([self.family, family2]) self.assert_(ids==test_id, '%s==%s' % (ids, test_id)) # test that we return multiple tag ids if the objs share tags tag_plugin.tag_objects('test2', [family2]) #sel = select([tag_table.c.id], or_(tag_table.c.tag==u'test', # tag_table.c.tag==u'test2')) results = self.session.query(Tag.id).filter(or_(Tag.tag==u'test', Tag.tag==u'test2')) test_id = [r[0] for r in results] # should return ids for both test and test2 ids = tag_plugin.get_tag_ids([self.family, family2]) self.assert_(ids==test_id, '%s == %s' % (ids, test_id)) bauble-0.9.7/bauble/paths.py0000755000175000017500000000736111210626427014741 0ustar brettbrett# # provide paths that bauble will need # """ Access to standard paths used by Bauble. """ import os import sys # TODO: we could just have setup or whatever create a file in the lib # directory that tells us where all the other directories are but how do we # know where the lib directory is def main_is_frozen(): """ Returns True/False if Bauble is being run from a py2exe executable. This method duplicates bauble.main_is_frozen in order to make paths.py not depend on any other Bauble modules. """ import imp return (hasattr(sys, "frozen") or # new py2exe hasattr(sys, "importers") or # old py2exe imp.is_frozen("__main__")) # tools/freeze def main_dir(): """ Returns the path of the bauble executable. """ if main_is_frozen(): d = os.path.dirname(sys.executable) else: d = os.path.dirname(sys.argv[0]) if d == "": d = os.curdir return os.path.abspath(d) def lib_dir(): """ Returns the path of the bauble module. """ if main_is_frozen(): d = os.path.join(main_dir(), 'bauble') else: d = os.path.dirname(__file__) return os.path.abspath(d) # def data_dir(): # """ # Return the data directory. The data directory should contain any # files required by Bauble or its plugins but aren't code. # e.g. image, pixmaps # Windows = main_dir() # Linux = /usr/share/bauble # images = data_dir()/images # glade = data_dir()/glade # """ # if sys.platform == 'linux2': # base = os.path.dirname(os.path.dirname(main_dir())) # return os.path.join(base, 'share', 'bauble') # elif sys.platform == 'win32': # return os.path.join(main_dir(), 'share') # else: # raise NotImplementedError('Unknown platform: %s' % sys.platform) def locale_dir(): """ Returns the root path of the locale files """ if sys.platform == 'linux2': # TODO: how do we get the locale directory for linux? d = os.path.join('/usr', 'share', 'locale') elif sys.platform == 'win32': d = os.path.join(main_dir(), 'share', 'locale') else: raise NotImplementedError('This platform does not support '\ 'translations: %s' % sys.platform) return os.path.abspath(d) def user_dir(): """ Returns the path to where Bauble settings should be saved. """ if sys.platform == "win32": if 'APPDATA' in os.environ: d = os.path.join(os.environ["APPDATA"], "Bauble") elif 'USERPROFILE' in os.environ: d = os.path.join(os.environ['USERPROFILE'], 'Application Data', 'Bauble') else: raise Exception(_('Could not get path for user settings: no ' \ 'APPDATA or USERPROFILE variable')) elif sys.platform == "linux2": # using os.expanduser is more reliable than os.environ['HOME'] # because if the user runs bauble with sudo then it will # return the path of the user that used sudo instead of ~root try: d = os.path.join(os.path.expanduser('~%s' % os.environ['USER']), '.bauble') except Exception: raise Exception(_('Could not get path for user settings: '\ 'could not expand $HOME for user %(username)s' %\ dict(username=os.environ['USER']))) else: raise Exception(_('Could not get path for user settings: '\ 'unsupported platform')) return os.path.abspath(d) if __name__ == '__main__': print 'main: %s' % main_dir() print 'lib: %s' % lib_dir() print 'locale: %s' % locale_dir() print 'user: %s' % user_dir() bauble-0.9.7/bauble/db.py0000644000175000017500000002543311234145344014204 0ustar brettbrett# Copyright (c) 2005,2006,2007,2008 Brett Adams # This is free software, see GNU General Public License v2 for details. import traceback import bauble.error as error SQLALCHEMY_DEBUG = False try: import sqlalchemy as sa parts = sa.__version__.split('.') if int(parts[1]) < 5: msg = _('This version of Bauble requires SQLAlchemy 0.5.0 or greater.'\ 'Please download and install a newer version of SQLAlchemy ' \ 'from http://www.sqlalchemy.org or contact your system ' 'administrator.') raise error.SQLAlchemyVersionError(msg) except ImportError: msg = _('SQLAlchemy not installed. Please install SQLAlchemy from ' \ 'http://www.sqlalchemy.org') raise import gtk from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta from bauble.types import DateTime, Date import bauble.utils as utils from bauble.utils.log import debug, warning if SQLALCHEMY_DEBUG: import logging global engine logging.basicConfig() logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) logging.getLogger('sqlalchemy.orm.unitofwork').setLevel(logging.DEBUG) class MapperBase(DeclarativeMeta): """ MapperBase adds the id, _created and _last_updated columns to all tables. """ def __init__(cls, classname, bases, dict_): #print >>sys.stderr, dict_ if '__tablename__' in dict_: seqname = '%s_id_seq' % dict_['__tablename__'] dict_['id'] = sa.Column('id', sa.Integer, sa.Sequence(seqname), primary_key=True) dict_['_created'] = sa.Column('_created', DateTime(True), default=sa.func.now()) dict_['_last_updated'] = sa.Column('_last_updated', DateTime(True), default=sa.func.now(), onupdate=sa.func.now()) super(MapperBase, cls).__init__(classname, bases, dict_) engine = None Base = declarative_base(metaclass=MapperBase) metadata = Base.metadata Session = None def open(uri, verify=True, show_error_dialogs=False): """ Open a database connection. This function sets bauble.db.engine to the opened engined. Return bauble.db.engine if successful else returns None and bauble.db.engine remains unchanged. :param uri: The URI of the database to open. :type uri: str :param verify: Where the database we connect to should be verified as one created by Bauble. This flag is used mostly for testing. :type verify: bool :param show_error_dialogs: A flag to indicate whether the error dialogs should be displayed. This is used mostly for testing. :type show_error_dialogs: bool """ # ** WARNING: this can print your passwd ## debug('db.open(%s)' % uri) from sqlalchemy.orm import sessionmaker import bauble global engine new_engine = None # use the SingletonThreadPool so that we always use the same # connection in a thread, not sure how this is different than # the threadlocal strategy but it doesn't cause as many lockups import sqlalchemy.pool as pool new_engine = sa.create_engine(uri, echo=SQLALCHEMY_DEBUG, poolclass=pool.SingletonThreadPool) new_engine.connect().close() # make sure we can connect def _bind(): """bind metadata to engine and create sessionmaker """ global Session, engine engine = new_engine metadata.bind = engine # make engine implicit for metadata Session = sessionmaker(bind=engine, autoflush=False) bauble.Session = sessionmaker(bind=engine, autoflush=False) if new_engine is not None and not verify: _bind() return engine elif new_engine is None: return None _verify_connection(new_engine, show_error_dialogs) _bind() return engine def create(import_defaults=True): """ Create new Bauble database at the current connection :param import_defaults: A flag that is passed to each plugins install() method to indicate where it should import its default data. This is mainly used for testing. The default value is True :type import_defaults: bool """ # TODO: when creating a database there shouldn't be any errors # on import since we are importing from the default values, we should # just force the import and send everything in the database at once # instead of using slices, this would make it alot faster but it may # make it more difficult to make the interface more responsive, # maybe we can use a dialog without the progress bar to show the status, # should probably work on the status bar to display this # TODO: we create a transaction here and the csv import creates another # nested transaction, we need to verify that if we rollback here then all # of the changes made by csv import are rolled back as well ## debug('entered db.create()') import bauble import bauble.meta as meta import bauble.pluginmgr as pluginmgr from bauble.task import TaskQuitting import datetime connection = engine.connect() transaction = connection.begin() try: # TODO: here we are dropping/creating all the tables in the # metadata whether they are in the registry or not, we should # really only be creating those tables from registered # plugins, maybe with an uninstall() method on Plugin #debug('drop all') metadata.drop_all(bind=connection, checkfirst=True) metadata.create_all(bind=connection) # fill in the bauble meta table and install all the plugins meta_table = meta.BaubleMeta.__table__ meta_table.insert(bind=connection).\ execute(name=meta.VERSION_KEY, value=unicode(bauble.version)).close() meta_table.insert(bind=connection).\ execute(name=meta.CREATED_KEY, value=unicode(datetime.datetime.now())).close() except (GeneratorExit, TaskQuitting), e: # this is here in case the main windows is closed in the middle # of a task warning('bauble.db.create(): %s' % utils.utf8(e)) transaction.rollback() raise except Exception, e: warning('bauble.db.create(): %s' % utils.utf8(e)) transaction.rollback() raise else: transaction.commit() finally: connection.close() connection = engine.connect() transaction = connection.begin() try: pluginmgr.install('all', import_defaults, force=True) except (GeneratorExit, TaskQuitting), e: # this is here in case the main windows is closed in the middle # of a task warning('bauble.db.create(): %s' % utils.utf8(e)) transaction.rollback() raise except Exception, e: warning('bauble.db.create(): %s' % utils.utf8(e)) transaction.rollback() raise else: transaction.commit() finally: connection.close() def _verify_connection(engine, show_error_dialogs=False): """ Test whether a connection to an engine is a valid Bauble database. This method will raise an error for the first problem it finds with the database. :param engine: the engine to test :type engine: :class:`sqlalchemy.engine.Engine` :param show_error_dialogs: flag for whether or not to show message dialogs detailing the error, default=False :type show_error_dialogs: bool """ ## debug('entered _verify_connection(%s)' % show_error_dialogs) import bauble import bauble.pluginmgr as pluginmgr if show_error_dialogs: try: return _verify_connection(engine, False) except error.EmptyDatabaseError: msg = _('The database you have connected to is empty.') utils.message_dialog(msg, gtk.MESSAGE_ERROR) raise except error.MetaTableError: msg = _('The database you have connected to does not have the ' 'bauble meta table. This usually means that the database ' 'is either corrupt or it was created with an old version ' 'of Bauble') utils.message_dialog(msg, gtk.MESSAGE_ERROR) raise except error.TimestampError: msg = _('The database you have connected to does not have a '\ 'timestamp for when it was created. This usually means '\ 'that there was a problem when you created the '\ 'database or the database you connected to wasn\'t '\ 'created with Bauble.') utils.message_dialog(msg, gtk.MESSAGE_ERROR) raise except error.VersionError, e: msg = _('You are using Bauble version %(version)s while the '\ 'database you have connected to was created with '\ 'version %(db_version)s\n\nSome things might not work as '\ 'or some of your data may become unexpectedly '\ 'corrupted.') % \ {'version': bauble.version, 'db_version':'%s' % e.version} utils.message_dialog(msg, gtk.MESSAGE_ERROR) raise # check if the database has any tables if len(engine.table_names()) == 0: raise error.EmptyDatabaseError() import bauble.meta as meta # check that the database we connected to has the bauble meta table if not engine.has_table(meta.BaubleMeta.__tablename__): raise error.MetaTableError() from sqlalchemy.orm import sessionmaker # if we don't close this session before raising an exception then we # will probably get deadlocks....i'm not really sure why session = sessionmaker(bind=engine)() query = session.query#(meta.BaubleMeta) # check that the database we connected to has a "created" timestamp # in the bauble meta table result = query(meta.BaubleMeta).filter_by(name = meta.CREATED_KEY).first() if not result: session.close() raise error.TimestampError() # check that the database we connected to has a "version" in the bauble # meta table and the the major and minor version are the same result = query(meta.BaubleMeta).filter_by(name = meta.VERSION_KEY).first() if not result: session.close() raise error.VersionError(None) try: major, minor, revision = result.value.split('.') except Exception: session.close() raise error.VersionError(result.value) if major != bauble.version_tuple[0] or minor != bauble.version_tuple[1]: session.close() raise error.VersionError(result.value) session.close() return True bauble-0.9.7/bauble/bauble.ui0000644000175000017500000000136311210626427015032 0ustar brettbrett bauble-0.9.7/bauble/pluginmgr.py0000755000175000017500000004342211234224422015617 0ustar brettbrett# # pluginmgr.py # """ Manage plugin registry, loading, initialization and installation. The plugin manager should be started in the following order: 1. load the plugins: search the plugin directory for plugins, populates the plugins dict (happens in load()) 2. install the plugins if not in the registry, add properly installed plugins in to the registry (happens in load()) 3. initialize the plugins (happens in init()) """ import logging import inspect import os import re import sys import traceback import gobject import gtk from sqlalchemy import * from sqlalchemy.orm import * import sqlalchemy.orm.exc as orm_exc import bauble import bauble.db as db from bauble.error import check, CheckConditionError, BaubleError import bauble.paths as paths import bauble.utils as utils import bauble.utils.log as logger from bauble.utils.log import log, debug, warning, error # TODO: should make plugins and ordered dict that is sorted by # dependency, maybe use odict from # http://www.voidspace.org.uk/python/odict.html plugins = {} commands = {} def register_command(handler): """ Register command handlers. If a command is a duplicate then it will overwrite the old command of the same name. """ global commands if isinstance(handler.command, str): #if handler.command in commands: # raise ValueError(_('%s already registered' % handler.command)) commands[handler.command] = handler else: for cmd in handler.command: #if cmd in commands: # raise ValueError(_('%s already registered' % cmd)) commands[cmd] = handler def _check_dependencies(plugin): ''' Check the dependencies of plugin ''' def _create_dependency_pairs(plugs): """ Returns a tuple. The first item in the tuple is the dependency pairs that can be passed to topological sort. The second item is a dictionary whose keys are plugin names and value are a list of unmet dependencies. """ depends = [] unmet = {} for p in plugs: for dep in p.depends: try: depends.append((plugins[dep], p)) except KeyError: debug('no dependency %s for %s' % (dep, p.__name__)) u = unmet.setdefault(p.__name__, []) u.append(dep) return depends, unmet def load(path=None): """ Search the plugin path for modules that provide a plugin. If path is a directory then search the directory for plugins. If path is None then use the default plugins path, bauble.plugins. This method populates the pluginmgr.plugins dict and imports the plugins but doesn't do any plugin initialization. :param path: the path where to look for the plugins :type path: str """ if path is None: if bauble.main_is_frozen(): #path = os.path.join(paths.lib_dir(), 'library.zip') path = os.path.join(paths.main_dir(), 'library.zip') else: path = os.path.join(paths.lib_dir(), 'plugins') found, errors = _find_plugins(path) # show error dialog for plugins that couldn't be loaded...we only # give details for the first error and assume the others are the # same...and if not then it doesn't really help anyways if errors: name = ', '.join(sorted(errors.keys())) exc_info = errors.values()[0] exc_str = utils.xml_safe_utf8(exc_info[1]) tb_str = ''.join(traceback.format_tb(exc_info[2])) utils.message_details_dialog('Could not load plugin: ' '\n\n%s\n\n%s' \ % (name, exc_str), tb_str, type=gtk.MESSAGE_ERROR) if len(found) == 0: debug('No plugins found at path: %s' % path) for plugin in found: # TODO: should we include the module name of the plugin to allow # for plugin namespaces or just assume that the plugin class # name is unique plugins[plugin.__name__] = plugin def init(force=False): """ Initialize the plugin manager. 1. Check for and install any plugins in the plugins dict that aren't in the registry. 2. Call each init() for each plugin the registry in order of dependency 3. Register the command handlers in the plugin's commands[] NOTE: This should be called after after Bauble has established a connection to a database with db.open() """ #debug('bauble.pluginmgr.init()') # ****** # NOTE: Be careful not to keep any references to # PluginRegistry open here as it will cause a deadlock if you try # to create a new database. For example, don't query the # PluginRegistry with a session without closing the session. # ****** # search for plugins that are in the plugins dict but not in the registry registered = plugins.values() try: # try to access the plugin registry, if the tables does not # exists then it might mean that we are opening a pre 0.9 # database, in this case we just assume all the plugins have # been installed and registered, this might be the right thing # to do but it least it allows you to connect to a pre bauble 0.9 # database and use it to upgrade to a >=0.9 database registered_names = PluginRegistry.names() not_installed = [p for n,p in plugins.iteritems() \ if n not in registered_names] if len(not_installed) > 0: msg = _('The following plugins were not found in the plugin '\ 'registry:\n\n%s\n\n'\ 'Would you like to install them now?' \ % ', '.join([p.__name__ for p in not_installed])) if force or utils.yes_no_dialog(msg): install([p for p in not_installed]) # sort plugins in the registry by their dependencies not_registered = [] for name in PluginRegistry.names(): try: registered.append(plugins[name]) except KeyError, e: not_registered.append(utils.utf8(name)) if not_registered: msg = _('The following plugins are in the registry but ' 'could not be loaded:\n\n%(plugins)s' % \ {'plugins': utils.utf8(', '.join(sorted(not_registered)))}) utils.message_dialog(msg, type=gtk.MESSAGE_WARNING) except Exception, e: raise if not registered: # no plugins to initialize return deps, unmet = _create_dependency_pairs(registered) ordered = utils.topological_sort(registered, deps) if not ordered: raise BaubleError(_('The plugins contain a dependency loop. This '\ 'can happen if two plugins directly or '\ 'indirectly rely on each other')) # call init() for each ofthe plugins for plugin in ordered: #debug('init: %s' % plugin) try: plugin.init() except KeyError, e: # don't remove the plugin from the registry because if we # find it again the user might decide to reinstall it # which could overwrite data ordered.remove(plugin) msg = _("The %(plugin_name)s plugin is listed in the registry "\ "but isn't wasn't found in the plugin directory") \ % dict(plugin_name=plugin.__name__) warning(msg) except Exception, e: #error(e) ordered.remove(plugin) error(traceback.print_exc()) safe = utils.xml_safe_utf8 values = dict(entry_name=plugin.__name__, exception=safe(e)) utils.message_details_dialog(_("Error: Couldn't initialize "\ "%(entry_name)s\n\n" \ "%(exception)s." % values), traceback.format_exc(), gtk.MESSAGE_ERROR) # register the plugin commands seperately from the plugin initialization for plugin in ordered: if plugin.commands in (None, []): continue for cmd in plugin.commands: try: register_command(cmd) except Exception, e: msg = 'Error: Could not register command handler.\n\n%s' % \ utils.xml_safe(str(e)) utils.message_dialog(msg, gtk.MESSAGE_ERROR) def install(plugins_to_install, import_defaults=True, force=False): """ :param plugins_to_install: A list of plugins to install. If the string "all" is passed then install all plugins listed in the bauble.pluginmgr.plugins dict that aren't already listed in the plugin registry. :param import_defaults: Flag passed to the plugin's install() method to indicate whether it should import its default data. :type import_defaults: bool :param force: Force, don't ask questions. :type force: book """ #debug('pluginmgr.install(%s)' % plugins_to_install) if plugins_to_install is 'all': to_install = plugins.values() else: to_install = plugins_to_install if len(to_install) == 0: # no plugins to install return # sort the plugins by their dependency depends, unmet = _create_dependency_pairs(to_install) if unmet != {}: debug(unmet) raise BaubleError('unmet dependencies') to_install = utils.topological_sort(to_install, depends) if not to_install: raise BaubleError(_('The plugins contain a dependency loop. This '\ 'can happend if two plugins directly or '\ 'indirectly rely on each other')) # msg = _('The %(plugin)s plugin depends on the %(other_plugin)s '\ # 'plugin but the %(other_plugin)s plugin wasn\'t found.') \ # % {'plugin': e.plugin.__name__, 'other_plugin': e.not_found} # utils.message_dialog(msg, gtk.MESSAGE_WARNING) # to_install = topological_sort(to_install, depends) # except DependencyError, e: # msg = _('The %(plugin)s plugin depends on the %(other_plugin)s '\ # 'plugin but the %(other_plugin)s plugin wasn\'t found.') \ # % {'plugin': e.plugin.__name__, 'other_plugin': e.not_found} # utils.message_dialog(msg, gtk.MESSAGE_WARNING) # raise # except DependencyError, e: # error(utils.utf8(e)) try: for p in to_install: #debug('install: %s' % p.__name__) p.install(import_defaults=import_defaults) # TODO: here we make sure we don't add the plugin to the # registry twice but we should really update the version # number in the future when we accept versioned plugins # (if ever) if not PluginRegistry.exists(p): PluginRegistry.add(p) #session.commit() except Exception, e: warning('bauble.pluginmgr.install(): %s' % utils.utf8(e)) raise # msg = _('Error installing plugins: %s' % p) # debug(e) # #safe = utils.xml_safe_utf8 # #utils.message_details_dialog(safe(msg), # # safe(traceback.format_exc()), # # gtk.MESSAGE_ERROR) # debug(traceback.format_exc()) class PluginRegistry(db.Base): """ The PluginRegistry contains a list of plugins that have been installed in a particular instance of a Bauble database. At the momeny it only includes the name and version of the plugin but this is likely to change in future versions. """ __tablename__ = 'plugin' name = Column(Unicode(64), unique=True) version = Column(Unicode(12)) @staticmethod def add(plugin): """ Add a plugin to the registry. Warning: Adding a plugin to the registry does not install it. It should be installed before adding. """ p = PluginRegistry(name=utils.utf8(plugin.__name__), version=utils.utf8(plugin.version)) session = bauble.Session() session.add(p) session.commit() session.close() @staticmethod def remove(plugin): """ Remove a plugin from the registry by name. """ #debug('PluginRegistry.remove()') session = bauble.Session() p = session.query(PluginRegistry).\ filter_by(name=utils.utf8(plugin.__name__)).one() session.delete(p) session.commit() session.close() @staticmethod def all(session): close_session = False if not session: close_session = True session = bauble.Session() q = session.query(PluginRegistry) results = list(q) if close_session: session.close() return results @staticmethod def names(bind=None): t = PluginRegistry.__table__ results = select([t.c.name], bind=bind).execute(bind=bind) names = [n[0] for n in results] results.close() return names @staticmethod def exists(plugin): """ Check if plugin exists in the plugin registry. """ if isinstance(plugin, basestring): name = plugin version = None else: name = plugin.__name__ version = plugin.version session = bauble.Session() try: session.query(PluginRegistry).\ filter_by(name=utils.utf8(name)).one() return True except orm_exc.NoResultFound, e: return False finally: session.close() class Plugin(object): """ tools: a list of BaubleTool classes that this plugin provides, the tools' category and label will be used in Bauble's "Tool" menu depends: a list of names classes that inherit from BaublePlugin that this plugin depends on cmds: a map of commands this plugin handled with callbacks, e.g dict('cmd', lambda x: handler) description: a short description of the plugin """ commands = [] tools = [] depends = [] description = '' version = '0.0' @classmethod def __init__(cls): pass @classmethod def init(cls): ''' init() is run when Bauble is first started ''' pass @classmethod def install(cls, import_defaults=True): ''' install() is run when a new plugin is installed, it is usually only run once for the lifetime of the plugin ''' pass class EditorPlugin(Plugin): ''' a plugin that provides one or more editors, the editors should implement the Editor interface ''' editors = [] class Tool(object): category = None label = None enabled = True @classmethod def start(cls): pass class View(gtk.VBox): def __init__(self, *args, **kwargs): """ if a class extends this View and provides it's own __init__ it *must* call it's parent (this) __init__ """ super(View, self).__init__(*args, **kwargs) class CommandHandler(object): command = None def get_view(self): ''' return the view for this command handler ''' return None def __call__(self, arg): ''' do what this command handler does :param arg: ''' raise NotImplementedError def _find_module_names(path): ''' :param path: where to look for modules ''' modules = [] if path.find("library.zip") != -1: # using py2exe from zipfile import ZipFile z = ZipFile(path) filenames = z.namelist() rx = re.compile('(.+)\\__init__.py[oc]') for f in filenames: m = rx.match(f) if m is not None: modules.append(m.group(1).replace('/', '.')[:-1]) z.close() else: for dir, subdir, files in os.walk(path): if dir != path and '__init__.py' in files: modules.append(dir[len(path)+1:].replace(os.sep,'.')) return modules def _find_plugins(path): """ Return the plugins at path. """ plugins = [] import bauble.plugins plugin_module = bauble.plugins errors = {} if path.find('library.zip') != -1: plugin_names = [m for m in _find_module_names(path) \ if m.startswith('bauble.plugins')] else: plugin_names =['bauble.plugins.%s'%m for m in _find_module_names(path)] for name in plugin_names: mod = None # Fast path: see if the module has already been imported. if name in sys.modules: mod = sys.modules[name] else: try: mod = __import__(name, globals(), locals(), [name], -1) except Exception, e: msg = _('Could not import the %(module)s module.\n\n'\ '%(error)s' % {'module': name, 'error': e}) debug(msg) errors[name] = sys.exc_info() if not hasattr(mod, "plugin"): continue # if mod.plugin is a function it should return a plugin or list of # plugins if inspect.isfunction(mod.plugin): mod_plugin = mod.plugin() else: mod_plugin = mod.plugin is_plugin = lambda p: inspect.isclass(p) and issubclass(p, Plugin) if isinstance(mod_plugin, (list, tuple)): for p in mod_plugin: if is_plugin(p): plugins.append(p) elif is_plugin(mod_plugin): plugins.append(mod_plugin) else: warning(_('%s.plugin is not an instance of pluginmgr.Plugin'\ % mod.__name__)) return plugins, errors bauble-0.9.7/bauble/i18n.py0000755000175000017500000000312311210626427014371 0ustar brettbrett# # i18n.py # # internationalization support # """ The i18n module defines the _() function for creating translatable strings. """ import sys import os import locale import gettext import bauble.paths as paths __all__ = ["_"] APP_NAME = 'bauble' # # most of the following code was adapted from: # http://www.learningpython.com/2006/12/03/translating-your-pythonpygtk-application/ langs = [] #Check the default locale lc, encoding = locale.getdefaultlocale() if (lc): # If we have a default, it's the first in the list langs = [lc] # Now lets get all of the supported languages on the system language = os.environ.get('LANGUAGE', None) if (language): # langage comes back something like en_CA:en_US:en_GB:en on linuxy # systems, on Win32 it's nothing, so we need to split it up into a # list langs += language.split(":") # add on to the back of the list the translations that we know that we # have, our defaults""" langs += ["en"] # langs is a list of all of the languages that we are going to try to # use. First we check the default, then what the system told us, and # finally the 'known' list gettext.bindtextdomain(APP_NAME, paths.locale_dir()) gettext.textdomain(APP_NAME) # Get the language to use lang = gettext.translation(APP_NAME, paths.locale_dir(), languages=langs, fallback=True) # install the language, map _() (which we marked our strings to # translate with) to self.lang.gettext() which will translate them. _ = lang.gettext # register the gettext function for the whole interpreter as "_" import __builtin__ __builtin__._ = gettext.gettext bauble-0.9.7/bauble/utils/0000755000175000017500000000000011310570250014367 5ustar brettbrettbauble-0.9.7/bauble/utils/desktop.py0000755000175000017500000002172311210626427016431 0ustar brettbrett#!/usr/bin/env python """ Simple desktop integration for Python. This module provides desktop environment detection and resource opening support for a selection of common and standardised desktop environments. Copyright (C) 2005, 2006, 2007 Paul Boddie This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA -------- Desktop Detection ----------------- To detect a specific desktop environment, use the get_desktop function. To detect whether the desktop environment is standardised (according to the proposed DESKTOP_LAUNCH standard), use the is_standard function. Opening URLs ------------ To open a URL in the current desktop environment, relying on the automatic detection of that environment, use the desktop.open function as follows: desktop.open("http://www.python.org") To override the detected desktop, specify the desktop parameter to the open function as follows: desktop.open("http://www.python.org", "KDE") # Insists on KDE desktop.open("http://www.python.org", "GNOME") # Insists on GNOME Without overriding using the desktop parameter, the open function will attempt to use the "standard" desktop opening mechanism which is controlled by the DESKTOP_LAUNCH environment variable as described below. The DESKTOP_LAUNCH Environment Variable --------------------------------------- The DESKTOP_LAUNCH environment variable must be shell-quoted where appropriate, as shown in some of the following examples: DESKTOP_LAUNCH="kdialog --msgbox" Should present any opened URLs in their entirety in a KDE message box. (Command "kdialog" plus parameter.) DESKTOP_LAUNCH="my\ opener" Should run the "my opener" program to open URLs. (Command "my opener", no parameters.) DESKTOP_LAUNCH="my\ opener --url" Should run the "my opener" program to open URLs. (Command "my opener" plus parameter.) Details of the DESKTOP_LAUNCH environment variable convention can be found here: http://lists.freedesktop.org/archives/xdg/2004-August/004489.html """ __version__ = "0.2.4" import os import sys # Provide suitable process creation functions. try: import subprocess def _run(cmd, shell, wait): opener = subprocess.Popen(cmd, shell=shell) if wait: opener.wait() return opener.pid def _readfrom(cmd, shell): opener = subprocess.Popen(cmd, shell=shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE) opener.stdin.close() return opener.stdout.read() def _status(cmd, shell): opener = subprocess.Popen(cmd, shell=shell) opener.wait() return opener.returncode == 0 except ImportError: import popen2 def _run(cmd, shell, wait): opener = popen2.Popen3(cmd) if wait: opener.wait() return opener.pid def _readfrom(cmd, shell): opener = popen2.Popen3(cmd) opener.tochild.close() opener.childerr.close() return opener.fromchild.read() def _status(cmd, shell): opener = popen2.Popen3(cmd) opener.wait() return opener.poll() == 0 import commands # Private functions. def _is_xfce(): "Return whether XFCE is in use." # XFCE detection involves testing the output of a program. try: if not os.environ.get("DISPLAY", "").strip(): vars = "DISPLAY=:0.0 " else: vars = "" return _readfrom(vars + "xprop -root _DT_SAVE_MODE", shell=1).strip().endswith(' = "xfce4"') except OSError: return 0 # Introspection functions. def get_desktop(): """ Detect the current desktop environment, returning the name of the environment. If no environment could be detected, None is returned. """ if os.environ.has_key("KDE_FULL_SESSION") or \ os.environ.has_key("KDE_MULTIHEAD"): return "KDE" elif os.environ.has_key("GNOME_DESKTOP_SESSION_ID") or \ os.environ.has_key("GNOME_KEYRING_SOCKET"): return "GNOME" elif sys.platform == "darwin": return "Mac OS X" elif hasattr(os, "startfile"): return "Windows" elif _is_xfce(): return "XFCE" # XFCE runs on X11, so we have to test for X11 last. if os.environ.has_key("DISPLAY"): return "X11" else: return None def use_desktop(desktop): """ Decide which desktop should be used, based on the detected desktop and a supplied 'desktop' argument (which may be None). Return an identifier indicating the desktop type as being either "standard" or one of the results from the 'get_desktop' function. """ # Attempt to detect a desktop environment. detected = get_desktop() # Start with desktops whose existence can be easily tested. if (desktop is None or desktop == "standard") and is_standard(): return "standard" elif (desktop is None or desktop == "Windows") and detected == "Windows": return "Windows" # Test for desktops where the overriding is not verified. elif (desktop or detected) == "KDE": return "KDE" elif (desktop or detected) == "GNOME": return "GNOME" elif (desktop or detected) == "XFCE": return "XFCE" elif (desktop or detected) == "Mac OS X": return "Mac OS X" elif (desktop or detected) == "X11": return "X11" else: return None def is_standard(): """ Return whether the current desktop supports standardised application launching. """ return os.environ.has_key("DESKTOP_LAUNCH") # Activity functions. def open(url, desktop=None, wait=0, dialog_on_error=False): """ Open the 'url' in the current desktop's preferred file browser. If the optional 'desktop' parameter is specified then attempt to use that particular desktop environment's mechanisms to open the 'url' instead of guessing or detecting which environment is being used. Suggested values for 'desktop' are "standard", "KDE", "GNOME", "XFCE", "Mac OS X", "Windows" where "standard" employs a DESKTOP_LAUNCH environment variable to open the specified 'url'. DESKTOP_LAUNCH should be a command, possibly followed by arguments, and must have any special characters shell-escaped. The process identifier of the "opener" (ie. viewer, editor, browser or program) associated with the 'url' is returned by this function. If the process identifier cannot be determined, None is returned. An optional 'wait' parameter is also available for advanced usage and, if 'wait' is set to a true value, this function will wait for the launching mechanism to complete before returning (as opposed to immediately returning as is the default behaviour). """ # Decide on the desktop environment in use. import bauble.utils as utils desktop_in_use = use_desktop(desktop) cmd = None if desktop_in_use == "standard": arg = "".join([os.environ["DESKTOP_LAUNCH"], commands.mkarg(url)]) return _run(arg, 1, wait) elif desktop_in_use == "Windows": # NOTE: This returns None in current implementations. return os.startfile(url) elif desktop_in_use == "KDE": cmd = ["kfmclient", "exec", url] elif desktop_in_use == "GNOME": cmd = ["gnome-open", url] elif desktop_in_use == "XFCE": cmd = ["exo-open", url] elif desktop_in_use == "Mac OS X": cmd = ["open", url] elif desktop_in_use == "X11" and os.environ.has_key("BROWSER"): cmd = [os.environ["BROWSER"], url] if not cmd: # if can't detect the desktop environment then see if xdg-open # is available exe = utils.which('xdg-open') if exe: cmd = [exe, url] # Finish with an error where no suitable desktop was # identified. try: if not cmd: # TODO: maybe we should tell the user to define DESKTOP_LAUNCH raise OSError, _("Could not open %s\n\n" \ "Unknown desktop environment: %s\n\n" \ % (url, desktop_in_use)) except Exception, e: if dialog_on_error: utils.message_dialog(utils.utf8(e)) else: raise return _run(cmd, 0, wait) # vim: tabstop=4 expandtab shiftwidth=4 bauble-0.9.7/bauble/utils/sql.py0000755000175000017500000000103011210626427015544 0ustar brettbrett# util.sql # # Description: sql utility functions from sqlalchemy import * raise DeprecatedError # def count_distinct_whereclause(table_column, whereclause): # return select([table_column], whereclause, distinct=True).alias('__dummy').count().scalar() # def count(table, where_clause=None): # s = select([func.count('*')], from_obj=[table]) # if where_clause is not None: # s.append_whereclause(where_clause) # return s.scalar() # def count_select(sel): # return sel.alias('__dummy').count().scalar() bauble-0.9.7/bauble/utils/pyparsing.py0000755000175000017500000044672111210626427017005 0ustar brettbrett# module pyparsing.py # # Copyright (c) 2003-2008 Paul T. McGuire # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # #from __future__ import generators __doc__ = \ """ pyparsing module - Classes and methods to define and execute parsing grammars The pyparsing module is an alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you don't need to learn a new syntax for defining grammars or matching expressions - the parsing module provides a library of classes that you use to construct the grammar directly in Python. Here is a program to parse "Hello, World!" (or any greeting of the form ", !"):: from pyparsing import Word, alphas # define grammar of a greeting greet = Word( alphas ) + "," + Word( alphas ) + "!" hello = "Hello, World!" print hello, "->", greet.parseString( hello ) The program outputs the following:: Hello, World! -> ['Hello', ',', 'World', '!'] The Python representation of the grammar is quite readable, owing to the self-explanatory class names, and the use of '+', '|' and '^' operators. The parsed results returned from parseString() can be accessed as a nested list, a dictionary, or an object with named attributes. The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - quoted strings - embedded comments """ __version__ = "1.5.1" __versionTime__ = "2 October 2008 00:44" __author__ = "Paul McGuire " import string from weakref import ref as wkref import copy import sys import warnings import re import sre_constants #~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) __all__ = [ 'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', 'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', 'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', 'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', 'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 'Upcase', 'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', 'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', 'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'getTokensEndLoc', 'hexnums', 'htmlComment', 'javaStyleComment', 'keepOriginalText', 'line', 'lineEnd', 'lineStart', 'lineno', 'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', 'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', 'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', 'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', 'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', 'indentedBlock', 'originalTextFor', ] """ Detect if we are running version 3.X and make appropriate changes Robert A. Clark """ if sys.version_info[0] > 2: _PY3K = True _MAX_INT = sys.maxsize basestring = str else: _PY3K = False _MAX_INT = sys.maxint if not _PY3K: def _ustr(obj): """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It then < returns the unicode object | encodes it with the default encoding | ... >. """ try: # If this works, then _ustr(obj) has the same behaviour as str(obj), so # it won't break any existing code. return str(obj) except UnicodeEncodeError: # The Python docs (http://docs.python.org/ref/customization.html#l2h-182) # state that "The return value must be a string object". However, does a # unicode object (being a subclass of basestring) count as a "string # object"? # If so, then return a unicode object: return unicode(obj) # Else encode it... but how? There are many choices... :) # Replace unprintables with escape codes? #return unicode(obj).encode(sys.getdefaultencoding(), 'backslashreplace_errors') # Replace unprintables with question marks? #return unicode(obj).encode(sys.getdefaultencoding(), 'replace') # ... else: _ustr = str unichr = chr def _str2dict(strg): return dict( [(c,0) for c in strg] ) #~ return set( [c for c in strg] ) def _xml_escape(data): """Escape &, <, >, ", ', etc. in a string of data.""" # ampersand must be replaced first from_symbols = '&><"\'' to_symbols = ['&'+s+';' for s in "amp gt lt quot apos".split()] for from_,to_ in zip(from_symbols, to_symbols): data = data.replace(from_, to_) return data class _Constants(object): pass if not _PY3K: alphas = string.lowercase + string.uppercase else: alphas = string.ascii_lowercase + string.ascii_uppercase nums = string.digits hexnums = nums + "ABCDEFabcdef" alphanums = alphas + nums _bslash = chr(92) printables = "".join( [ c for c in string.printable if c not in string.whitespace ] ) class ParseBaseException(Exception): """base exception class for all parsing runtime exceptions""" __slots__ = ( "loc","msg","pstr","parserElement" ) # Performance tuning: we construct a *lot* of these, so keep this # constructor as small and fast as possible def __init__( self, pstr, loc=0, msg=None, elem=None ): self.loc = loc if msg is None: self.msg = pstr self.pstr = "" else: self.msg = msg self.pstr = pstr self.parserElement = elem def __getattr__( self, aname ): """supported attributes by name are: - lineno - returns the line number of the exception text - col - returns the column number of the exception text - line - returns the line containing the exception text """ if( aname == "lineno" ): return lineno( self.loc, self.pstr ) elif( aname in ("col", "column") ): return col( self.loc, self.pstr ) elif( aname == "line" ): return line( self.loc, self.pstr ) else: raise AttributeError(aname) def __str__( self ): return "%s (at char %d), (line:%d, col:%d)" % \ ( self.msg, self.loc, self.lineno, self.column ) def __repr__( self ): return _ustr(self) def markInputline( self, markerString = ">!<" ): """Extracts the exception line from the input string, and marks the location of the exception with a special symbol. """ line_str = self.line line_column = self.column - 1 if markerString: line_str = "".join( [line_str[:line_column], markerString, line_str[line_column:]]) return line_str.strip() def __dir__(self): return "loc msg pstr parserElement lineno col line " \ "markInputLine __str__ __repr__".split() class ParseException(ParseBaseException): """exception thrown when parse expressions don't match class; supported attributes by name are: - lineno - returns the line number of the exception text - col - returns the column number of the exception text - line - returns the line containing the exception text """ pass class ParseFatalException(ParseBaseException): """user-throwable exception thrown when inconsistent parse content is found; stops all parsing immediately""" pass class ParseSyntaxException(ParseFatalException): """just like ParseFatalException, but thrown internally when an ErrorStop indicates that parsing is to stop immediately because an unbacktrackable syntax error has been found""" def __init__(self, pe): super(ParseSyntaxException, self).__init__( pe.pstr, pe.loc, pe.msg, pe.parserElement) #~ class ReparseException(ParseBaseException): #~ """Experimental class - parse actions can raise this exception to cause #~ pyparsing to reparse the input string: #~ - with a modified input string, and/or #~ - with a modified start location #~ Set the values of the ReparseException in the constructor, and raise the #~ exception in a parse action to cause pyparsing to use the new string/location. #~ Setting the values as None causes no change to be made. #~ """ #~ def __init_( self, newstring, restartLoc ): #~ self.newParseText = newstring #~ self.reparseLoc = restartLoc class RecursiveGrammarException(Exception): """exception thrown by validate() if the grammar could be improperly recursive""" def __init__( self, parseElementList ): self.parseElementTrace = parseElementList def __str__( self ): return "RecursiveGrammarException: %s" % self.parseElementTrace class _ParseResultsWithOffset(object): def __init__(self,p1,p2): self.tup = (p1,p2) def __getitem__(self,i): return self.tup[i] def __repr__(self): return repr(self.tup) def setOffset(self,i): self.tup = (self.tup[0],i) class ParseResults(object): """Structured parse results, to provide multiple means of access to the parsed data: - as a list (len(results)) - by list index (results[0], results[1], etc.) - by attribute (results.) """ __slots__ = ( "__toklist", "__tokdict", "__doinit", "__name", "__parent", "__accumNames", "__weakref__" ) def __new__(cls, toklist, name=None, asList=True, modal=True ): if isinstance(toklist, cls): return toklist retobj = object.__new__(cls) retobj.__doinit = True return retobj # Performance tuning: we construct a *lot* of these, so keep this # constructor as small and fast as possible def __init__( self, toklist, name=None, asList=True, modal=True ): if self.__doinit: self.__doinit = False self.__name = None self.__parent = None self.__accumNames = {} if isinstance(toklist, list): self.__toklist = toklist[:] else: self.__toklist = [toklist] self.__tokdict = dict() if name: if not modal: self.__accumNames[name] = 0 if isinstance(name,int): name = _ustr(name) # will always return a str, but use _ustr for consistency self.__name = name if not toklist in (None,'',[]): if isinstance(toklist,basestring): toklist = [ toklist ] if asList: if isinstance(toklist,ParseResults): self[name] = _ParseResultsWithOffset(toklist.copy(),0) else: self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) self[name].__name = name else: try: self[name] = toklist[0] except (KeyError,TypeError): self[name] = toklist def __getitem__( self, i ): if isinstance( i, (int,slice) ): return self.__toklist[i] else: if i not in self.__accumNames: return self.__tokdict[i][-1][0] else: return ParseResults([ v[0] for v in self.__tokdict[i] ]) def __setitem__( self, k, v ): if isinstance(v,_ParseResultsWithOffset): self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] sub = v[0] elif isinstance(k,int): self.__toklist[k] = v sub = v else: self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] sub = v if isinstance(sub,ParseResults): sub.__parent = wkref(self) def __delitem__( self, i ): if isinstance(i,(int,slice)): mylen = len( self.__toklist ) del self.__toklist[i] # convert int to slice if isinstance(i, int): if i < 0: i += mylen i = slice(i, i+1) # get removed indices removed = list(range(*i.indices(mylen))) removed.reverse() # fixup indices in token dictionary for name in self.__tokdict: occurrences = self.__tokdict[name] for j in removed: for k, (value, position) in enumerate(occurrences): occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) else: del self.__tokdict[i] def __contains__( self, k ): return k in self.__tokdict def __len__( self ): return len( self.__toklist ) def __bool__(self): return len( self.__toklist ) > 0 __nonzero__ = __bool__ def __iter__( self ): return iter( self.__toklist ) def __reversed__( self ): return iter( reversed(self.__toklist) ) def keys( self ): """Returns all named result keys.""" return self.__tokdict.keys() def pop( self, index=-1 ): """Removes and returns item at specified index (default=last). Will work with either numeric indices or dict-key indicies.""" ret = self[index] del self[index] return ret def get(self, key, defaultValue=None): """Returns named result matching the given key, or if there is no such name, then returns the given defaultValue or None if no defaultValue is specified.""" if key in self: return self[key] else: return defaultValue def insert( self, index, insStr ): self.__toklist.insert(index, insStr) # fixup indices in token dictionary for name in self.__tokdict: occurrences = self.__tokdict[name] for k, (value, position) in enumerate(occurrences): occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) def items( self ): """Returns all named result keys and values as a list of tuples.""" return [(k,self[k]) for k in self.__tokdict] def values( self ): """Returns all named result values.""" return [ v[-1][0] for v in self.__tokdict.values() ] def __getattr__( self, name ): if name not in self.__slots__: if name in self.__tokdict: if name not in self.__accumNames: return self.__tokdict[name][-1][0] else: return ParseResults([ v[0] for v in self.__tokdict[name] ]) else: return "" return None def __add__( self, other ): ret = self.copy() ret += other return ret def __iadd__( self, other ): if other.__tokdict: offset = len(self.__toklist) addoffset = ( lambda a: (a<0 and offset) or (a+offset) ) otheritems = other.__tokdict.items() otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) for (k,vlist) in otheritems for v in vlist] for k,v in otherdictitems: self[k] = v if isinstance(v[0],ParseResults): v[0].__parent = wkref(self) self.__toklist += other.__toklist self.__accumNames.update( other.__accumNames ) del other return self def __repr__( self ): return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) def __str__( self ): out = "[" sep = "" for i in self.__toklist: if isinstance(i, ParseResults): out += sep + _ustr(i) else: out += sep + repr(i) sep = ", " out += "]" return out def _asStringList( self, sep='' ): out = [] for item in self.__toklist: if out and sep: out.append(sep) if isinstance( item, ParseResults ): out += item._asStringList() else: out.append( _ustr(item) ) return out def asList( self ): """Returns the parse results as a nested list of matching tokens, all converted to strings.""" out = [] for res in self.__toklist: if isinstance(res,ParseResults): out.append( res.asList() ) else: out.append( res ) return out def asDict( self ): """Returns the named parse results as dictionary.""" return dict( self.items() ) def copy( self ): """Returns a new copy of a ParseResults object.""" ret = ParseResults( self.__toklist ) ret.__tokdict = self.__tokdict.copy() ret.__parent = self.__parent ret.__accumNames.update( self.__accumNames ) ret.__name = self.__name return ret def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): """Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.""" nl = "\n" out = [] namedItems = dict( [ (v[1],k) for (k,vlist) in self.__tokdict.items() for v in vlist ] ) nextLevelIndent = indent + " " # collapse out indents if formatting is not desired if not formatted: indent = "" nextLevelIndent = "" nl = "" selfTag = None if doctag is not None: selfTag = doctag else: if self.__name: selfTag = self.__name if not selfTag: if namedItemsOnly: return "" else: selfTag = "ITEM" out += [ nl, indent, "<", selfTag, ">" ] worklist = self.__toklist for i,res in enumerate(worklist): if isinstance(res,ParseResults): if i in namedItems: out += [ res.asXML(namedItems[i], namedItemsOnly and doctag is None, nextLevelIndent, formatted)] else: out += [ res.asXML(None, namedItemsOnly and doctag is None, nextLevelIndent, formatted)] else: # individual token, see if there is a name for it resTag = None if i in namedItems: resTag = namedItems[i] if not resTag: if namedItemsOnly: continue else: resTag = "ITEM" xmlBodyText = _xml_escape(_ustr(res)) out += [ nl, nextLevelIndent, "<", resTag, ">", xmlBodyText, "" ] out += [ nl, indent, "" ] return "".join(out) def __lookup(self,sub): for k,vlist in self.__tokdict.items(): for v,loc in vlist: if sub is v: return k return None def getName(self): """Returns the results name for this token expression.""" if self.__name: return self.__name elif self.__parent: par = self.__parent() if par: return par.__lookup(self) else: return None elif (len(self) == 1 and len(self.__tokdict) == 1 and self.__tokdict.values()[0][0][1] in (0,-1)): return self.__tokdict.keys()[0] else: return None def dump(self,indent='',depth=0): """Diagnostic method for listing out the contents of a ParseResults. Accepts an optional indent argument so that this string can be embedded in a nested display of other data.""" out = [] out.append( indent+_ustr(self.asList()) ) keys = self.items() keys.sort() for k,v in keys: if out: out.append('\n') out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) if isinstance(v,ParseResults): if v.keys(): #~ out.append('\n') out.append( v.dump(indent,depth+1) ) #~ out.append('\n') else: out.append(_ustr(v)) else: out.append(_ustr(v)) #~ out.append('\n') return "".join(out) # add support for pickle protocol def __getstate__(self): return ( self.__toklist, ( self.__tokdict.copy(), self.__parent is not None and self.__parent() or None, self.__accumNames, self.__name ) ) def __setstate__(self,state): self.__toklist = state[0] self.__tokdict, \ par, \ inAccumNames, \ self.__name = state[1] self.__accumNames = {} self.__accumNames.update(inAccumNames) if par is not None: self.__parent = wkref(par) else: self.__parent = None def __dir__(self): return dir(super(ParseResults,self)) + self.keys() def col (loc,strg): """Returns current column within a string, counting newlines as line separators. The first column is number 1. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{ParserElement.parseString}} for more information on parsing strings containing s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. """ return (loc} for more information on parsing strings containing s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. """ return strg.count("\n",0,loc) + 1 def line( loc, strg ): """Returns the line of text containing loc within a string, counting newlines as line separators. """ lastCR = strg.rfind("\n", 0, loc) nextCR = strg.find("\n", loc) if nextCR > 0: return strg[lastCR+1:nextCR] else: return strg[lastCR+1:] def _defaultStartDebugAction( instring, loc, expr ): print ("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) def _defaultExceptionDebugAction( instring, loc, expr, exc ): print ("Exception raised:" + _ustr(exc)) def nullDebugAction(*args): """'Do-nothing' debug action, to suppress debugging output during parsing.""" pass class ParserElement(object): """Abstract base level parser element class.""" DEFAULT_WHITE_CHARS = " \n\t\r" def setDefaultWhitespaceChars( chars ): """Overrides the default whitespace chars """ ParserElement.DEFAULT_WHITE_CHARS = chars setDefaultWhitespaceChars = staticmethod(setDefaultWhitespaceChars) def __init__( self, savelist=False ): self.parseAction = list() self.failAction = None #~ self.name = "" # don't define self.name, let subclasses try/except upcall self.strRepr = None self.resultsName = None self.saveAsList = savelist self.skipWhitespace = True self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS self.copyDefaultWhiteChars = True self.mayReturnEmpty = False # used when checking for left-recursion self.keepTabs = False self.ignoreExprs = list() self.debug = False self.streamlined = False self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index self.errmsg = "" self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) self.debugActions = ( None, None, None ) #custom debug actions self.re = None self.callPreparse = True # used to avoid redundant calls to preParse self.callDuringTry = False def copy( self ): """Make a copy of this ParserElement. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element.""" cpy = copy.copy( self ) cpy.parseAction = self.parseAction[:] cpy.ignoreExprs = self.ignoreExprs[:] if self.copyDefaultWhiteChars: cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS return cpy def setName( self, name ): """Define name for this expression, for use in debugging.""" self.name = name self.errmsg = "Expected " + self.name if hasattr(self,"exception"): self.exception.msg = self.errmsg return self def setResultsName( self, name, listAllMatches=False ): """Define name for referencing matching tokens as a nested attribute of the returned parse results. NOTE: this returns a *copy* of the original ParserElement object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names. """ newself = self.copy() newself.resultsName = name newself.modalResults = not listAllMatches return newself def setBreak(self,breakFlag = True): """Method to invoke the Python pdb debugger when this element is about to be parsed. Set breakFlag to True to enable, False to disable. """ if breakFlag: _parseMethod = self._parse def breaker(instring, loc, doActions=True, callPreParse=True): import pdb pdb.set_trace() return _parseMethod( instring, loc, doActions, callPreParse ) breaker._originalParseMethod = _parseMethod self._parse = breaker else: if hasattr(self._parse,"_originalParseMethod"): self._parse = self._parse._originalParseMethod return self def _normalizeParseActionArgs( f ): """Internal method used to decorate parse actions that take fewer than 3 arguments, so that all parse actions can be called as f(s,l,t).""" STAR_ARGS = 4 try: restore = None if isinstance(f,type): restore = f f = f.__init__ if not _PY3K: codeObj = f.func_code else: codeObj = f.code if codeObj.co_flags & STAR_ARGS: return f numargs = codeObj.co_argcount if not _PY3K: if hasattr(f,"im_self"): numargs -= 1 else: if hasattr(f,"__self__"): numargs -= 1 if restore: f = restore except AttributeError: try: if not _PY3K: call_im_func_code = f.__call__.im_func.func_code else: call_im_func_code = f.__code__ # not a function, must be a callable object, get info from the # im_func binding of its bound __call__ method if call_im_func_code.co_flags & STAR_ARGS: return f numargs = call_im_func_code.co_argcount if not _PY3K: if hasattr(f.__call__,"im_self"): numargs -= 1 else: if hasattr(f.__call__,"__self__"): numargs -= 0 except AttributeError: if not _PY3K: call_func_code = f.__call__.func_code else: call_func_code = f.__call__.__code__ # not a bound method, get info directly from __call__ method if call_func_code.co_flags & STAR_ARGS: return f numargs = call_func_code.co_argcount if not _PY3K: if hasattr(f.__call__,"im_self"): numargs -= 1 else: if hasattr(f.__call__,"__self__"): numargs -= 1 #~ print ("adding function %s with %d args" % (f.func_name,numargs)) if numargs == 3: return f else: if numargs > 3: def tmp(s,l,t): return f(f.__call__.__self__, s,l,t) if numargs == 2: def tmp(s,l,t): return f(l,t) elif numargs == 1: def tmp(s,l,t): return f(t) else: #~ numargs == 0: def tmp(s,l,t): return f() try: tmp.__name__ = f.__name__ except (AttributeError,TypeError): # no need for special handling if attribute doesnt exist pass try: tmp.__doc__ = f.__doc__ except (AttributeError,TypeError): # no need for special handling if attribute doesnt exist pass try: tmp.__dict__.update(f.__dict__) except (AttributeError,TypeError): # no need for special handling if attribute doesnt exist pass return tmp _normalizeParseActionArgs = staticmethod(_normalizeParseActionArgs) def setParseAction( self, *fns, **kwargs ): """Define action to perform when successfully matching parse element definition. Parse action fn is a callable method with 0-3 arguments, called as fn(s,loc,toks), fn(loc,toks), fn(toks), or just fn(), where: - s = the original string being parsed (see note below) - loc = the location of the matching substring - toks = a list of the matched tokens, packaged as a ParseResults object If the functions in fns modify the tokens, they can return them as the return value from fn, and the modified list of tokens will replace the original. Otherwise, fn does not need to return any value. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{parseString}} for more information on parsing strings containing s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. """ self.parseAction = list(map(self._normalizeParseActionArgs, list(fns))) self.callDuringTry = ("callDuringTry" in kwargs and kwargs["callDuringTry"]) return self def addParseAction( self, *fns, **kwargs ): """Add parse action to expression's list of parse actions. See L{I{setParseAction}}.""" self.parseAction += list(map(self._normalizeParseActionArgs, list(fns))) self.callDuringTry = self.callDuringTry or ("callDuringTry" in kwargs and kwargs["callDuringTry"]) return self def setFailAction( self, fn ): """Define action to perform if parsing fails at this expression. Fail acton fn is a callable function that takes the arguments fn(s,loc,expr,err) where: - s = string being parsed - loc = location where expression match was attempted and failed - expr = the parse expression that failed - err = the exception thrown The function returns no value. It may throw ParseFatalException if it is desired to stop parsing immediately.""" self.failAction = fn return self def _skipIgnorables( self, instring, loc ): exprsFound = True while exprsFound: exprsFound = False for e in self.ignoreExprs: try: while 1: loc,dummy = e._parse( instring, loc ) exprsFound = True except ParseException: pass return loc def preParse( self, instring, loc ): if self.ignoreExprs: loc = self._skipIgnorables( instring, loc ) if self.skipWhitespace: wt = self.whiteChars instrlen = len(instring) while loc < instrlen and instring[loc] in wt: loc += 1 return loc def parseImpl( self, instring, loc, doActions=True ): return loc, [] def postParse( self, instring, loc, tokenlist ): return tokenlist #~ @profile def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): debugging = ( self.debug ) #and doActions ) if debugging or self.failAction: #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) if (self.debugActions[0] ): self.debugActions[0]( instring, loc, self ) if callPreParse and self.callPreparse: preloc = self.preParse( instring, loc ) else: preloc = loc tokensStart = loc try: try: loc,tokens = self.parseImpl( instring, preloc, doActions ) except IndexError: raise ParseException( instring, len(instring), self.errmsg, self ) except ParseBaseException, err: #~ print ("Exception raised:", err) if self.debugActions[2]: self.debugActions[2]( instring, tokensStart, self, err ) if self.failAction: self.failAction( instring, tokensStart, self, err ) raise else: if callPreParse and self.callPreparse: preloc = self.preParse( instring, loc ) else: preloc = loc tokensStart = loc if self.mayIndexError or loc >= len(instring): try: loc,tokens = self.parseImpl( instring, preloc, doActions ) except IndexError: raise ParseException( instring, len(instring), self.errmsg, self ) else: loc,tokens = self.parseImpl( instring, preloc, doActions ) tokens = self.postParse( instring, loc, tokens ) retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) if self.parseAction and (doActions or self.callDuringTry): if debugging: try: for fn in self.parseAction: tokens = fn( instring, tokensStart, retTokens ) if tokens is not None: retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), modal=self.modalResults ) except ParseBaseException, err: #~ print "Exception raised in user parse action:", err if (self.debugActions[2] ): self.debugActions[2]( instring, tokensStart, self, err ) raise else: for fn in self.parseAction: tokens = fn( instring, tokensStart, retTokens ) if tokens is not None: retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), modal=self.modalResults ) if debugging: #~ print ("Matched",self,"->",retTokens.asList()) if (self.debugActions[1] ): self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) return loc, retTokens def tryParse( self, instring, loc ): try: return self._parse( instring, loc, doActions=False )[0] except ParseFatalException: raise ParseException( instring, loc, self.errmsg, self) # this method gets repeatedly called during backtracking with the same arguments - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): lookup = (self,instring,loc,callPreParse,doActions) if lookup in ParserElement._exprArgCache: value = ParserElement._exprArgCache[ lookup ] if isinstance(value,Exception): raise value return value else: try: value = self._parseNoCache( instring, loc, doActions, callPreParse ) ParserElement._exprArgCache[ lookup ] = (value[0],value[1].copy()) return value except ParseBaseException, pe: ParserElement._exprArgCache[ lookup ] = pe raise _parse = _parseNoCache # argument cache for optimizing repeated calls when backtracking through recursive expressions _exprArgCache = {} def resetCache(): ParserElement._exprArgCache.clear() resetCache = staticmethod(resetCache) _packratEnabled = False def enablePackrat(): """Enables "packrat" parsing, which adds memoizing to the parsing logic. Repeated parse attempts at the same string location (which happens often in many complex grammars) can immediately return a cached value, instead of re-executing parsing/validating code. Memoizing is done of both valid results and parsing exceptions. This speedup may break existing programs that use parse actions that have side-effects. For this reason, packrat parsing is disabled when you first import pyparsing. To activate the packrat feature, your program must call the class method ParserElement.enablePackrat(). If your program uses psyco to "compile as you go", you must call enablePackrat before calling psyco.full(). If you do not do this, Python will crash. For best results, call enablePackrat() immediately after importing pyparsing. """ if not ParserElement._packratEnabled: ParserElement._packratEnabled = True ParserElement._parse = ParserElement._parseCache enablePackrat = staticmethod(enablePackrat) def parseString( self, instring, parseAll=False ): """Execute the parse expression with the given string. This is the main interface to the client code, once the complete expression has been built. If you want the grammar to require that the entire input string be successfully parsed, then set parseAll to True (equivalent to ending the grammar with StringEnd()). Note: parseString implicitly calls expandtabs() on the input string, in order to report proper column numbers in parse actions. If the input string contains tabs and the grammar uses parse actions that use the loc argument to index into the string being parsed, you can ensure you have a consistent view of the input string by: - calling parseWithTabs on your grammar before calling parseString (see L{I{parseWithTabs}}) - define your parse action using the full (s,loc,toks) signature, and reference the input string using the parse action's s argument - explictly expand the tabs in your input string before calling parseString """ ParserElement.resetCache() if not self.streamlined: self.streamline() #~ self.saveAsList = True for e in self.ignoreExprs: e.streamline() if not self.keepTabs: instring = instring.expandtabs() loc, tokens = self._parse( instring, 0 ) if parseAll: loc = self.preParse( instring, loc ) StringEnd()._parse( instring, loc ) return tokens def scanString( self, instring, maxMatches=_MAX_INT ): """Scan the input string for expression matches. Each match will return the matching tokens, start location, and end location. May be called with optional maxMatches argument, to clip scanning after 'n' matches are found. Note that the start and end locations are reported relative to the string being parsed. See L{I{parseString}} for more information on parsing strings with embedded tabs.""" if not self.streamlined: self.streamline() for e in self.ignoreExprs: e.streamline() if not self.keepTabs: instring = _ustr(instring).expandtabs() instrlen = len(instring) loc = 0 preparseFn = self.preParse parseFn = self._parse ParserElement.resetCache() matches = 0 while loc <= instrlen and matches < maxMatches: try: preloc = preparseFn( instring, loc ) nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) except ParseException: loc = preloc+1 else: matches += 1 yield tokens, preloc, nextLoc loc = nextLoc def transformString( self, instring ): """Extension to scanString, to modify matching text with modified tokens that may be returned from a parse action. To use transformString, define a grammar and attach a parse action to it that modifies the returned token list. Invoking transformString() on a target string will then scan for matches, and replace the matched text patterns according to the logic in the parse action. transformString() returns the resulting transformed string.""" out = [] lastE = 0 # force preservation of s, to minimize unwanted transformation of string, and to # keep string locs straight between transformString and scanString self.keepTabs = True for t,s,e in self.scanString( instring ): out.append( instring[lastE:s] ) if t: if isinstance(t,ParseResults): out += t.asList() elif isinstance(t,list): out += t else: out.append(t) lastE = e out.append(instring[lastE:]) return "".join(map(_ustr,out)) def searchString( self, instring, maxMatches=_MAX_INT ): """Another extension to scanString, simplifying the access to the tokens found to match the given parse expression. May be called with optional maxMatches argument, to clip searching after 'n' matches are found. """ return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) def __add__(self, other ): """Implementation of + operator - returns And""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return And( [ self, other ] ) def __radd__(self, other ): """Implementation of + operator when left operand is not a ParserElement""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other + self def __sub__(self, other): """Implementation of - operator, returns And with error stop""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return And( [ self, And._ErrorStop(), other ] ) def __rsub__(self, other ): """Implementation of - operator when left operand is not a ParserElement""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other - self def __mul__(self,other): if isinstance(other,int): minElements, optElements = other,0 elif isinstance(other,tuple): other = (other + (None, None))[:2] if other[0] is None: other = (0, other[1]) if isinstance(other[0],int) and other[1] is None: if other[0] == 0: return ZeroOrMore(self) if other[0] == 1: return OneOrMore(self) else: return self*other[0] + ZeroOrMore(self) elif isinstance(other[0],int) and isinstance(other[1],int): minElements, optElements = other optElements -= minElements else: raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) else: raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) if minElements < 0: raise ValueError("cannot multiply ParserElement by negative value") if optElements < 0: raise ValueError("second tuple value must be greater or equal to first tuple value") if minElements == optElements == 0: raise ValueError("cannot multiply ParserElement by 0 or (0,0)") if (optElements): def makeOptionalList(n): if n>1: return Optional(self + makeOptionalList(n-1)) else: return Optional(self) if minElements: if minElements == 1: ret = self + makeOptionalList(optElements) else: ret = And([self]*minElements) + makeOptionalList(optElements) else: ret = makeOptionalList(optElements) else: if minElements == 1: ret = self else: ret = And([self]*minElements) return ret def __rmul__(self, other): return self.__mul__(other) def __or__(self, other ): """Implementation of | operator - returns MatchFirst""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return MatchFirst( [ self, other ] ) def __ror__(self, other ): """Implementation of | operator when left operand is not a ParserElement""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other | self def __xor__(self, other ): """Implementation of ^ operator - returns Or""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return Or( [ self, other ] ) def __rxor__(self, other ): """Implementation of ^ operator when left operand is not a ParserElement""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other ^ self def __and__(self, other ): """Implementation of & operator - returns Each""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return Each( [ self, other ] ) def __rand__(self, other ): """Implementation of & operator when left operand is not a ParserElement""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other & self def __invert__( self ): """Implementation of ~ operator - returns NotAny""" return NotAny( self ) def __call__(self, name): """Shortcut for setResultsName, with listAllMatches=default:: userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") could be written as:: userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") """ return self.setResultsName(name) def suppress( self ): """Suppresses the output of this ParserElement; useful to keep punctuation from cluttering up returned output. """ return Suppress( self ) def leaveWhitespace( self ): """Disables the skipping of whitespace before matching the characters in the ParserElement's defined pattern. This is normally only used internally by the pyparsing module, but may be needed in some whitespace-sensitive grammars. """ self.skipWhitespace = False return self def setWhitespaceChars( self, chars ): """Overrides the default whitespace chars """ self.skipWhitespace = True self.whiteChars = chars self.copyDefaultWhiteChars = False return self def parseWithTabs( self ): """Overrides default behavior to expand s to spaces before parsing the input string. Must be called before parseString when the input grammar contains elements that match characters.""" self.keepTabs = True return self def ignore( self, other ): """Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns. """ if isinstance( other, Suppress ): if other not in self.ignoreExprs: self.ignoreExprs.append( other ) else: self.ignoreExprs.append( Suppress( other ) ) return self def setDebugActions( self, startAction, successAction, exceptionAction ): """Enable display of debugging messages while doing pattern matching.""" self.debugActions = (startAction or _defaultStartDebugAction, successAction or _defaultSuccessDebugAction, exceptionAction or _defaultExceptionDebugAction) self.debug = True return self def setDebug( self, flag=True ): """Enable display of debugging messages while doing pattern matching. Set flag to True to enable, False to disable.""" if flag: self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) else: self.debug = False return self def __str__( self ): return self.name def __repr__( self ): return _ustr(self) def streamline( self ): self.streamlined = True self.strRepr = None return self def checkRecursion( self, parseElementList ): pass def validate( self, validateTrace=[] ): """Check defined expressions for valid structure, check for infinite recursive definitions.""" self.checkRecursion( [] ) def parseFile( self, file_or_filename, parseAll=False ): """Execute the parse expression on the given file or filename. If a filename is specified (instead of a file object), the entire file is opened, read, and closed before parsing. """ try: file_contents = file_or_filename.read() except AttributeError: f = open(file_or_filename, "rb") file_contents = f.read() f.close() return self.parseString(file_contents, parseAll) def getException(self): return ParseException("",0,self.errmsg,self) def __getattr__(self,aname): if aname == "myException": self.myException = ret = self.getException(); return ret; else: raise AttributeError("no such attribute " + aname) def __eq__(self,other): if isinstance(other, basestring): try: (self + StringEnd()).parseString(_ustr(other)) return True except ParseBaseException: return False else: return super(ParserElement,self)==other def __ne__(self,other): return not (self == other) def __hash__(self): return hash(id(self)) def __req__(self,other): return self == other def __rne__(self,other): return not (self == other) class Token(ParserElement): """Abstract ParserElement subclass, for defining atomic matching patterns.""" def __init__( self ): super(Token,self).__init__( savelist=False ) #self.myException = ParseException("",0,"",self) def setName(self, name): s = super(Token,self).setName(name) self.errmsg = "Expected " + self.name #s.myException.msg = self.errmsg return s class Empty(Token): """An empty token, will always match.""" def __init__( self ): super(Empty,self).__init__() self.name = "Empty" self.mayReturnEmpty = True self.mayIndexError = False class NoMatch(Token): """A token that will never match.""" def __init__( self ): super(NoMatch,self).__init__() self.name = "NoMatch" self.mayReturnEmpty = True self.mayIndexError = False self.errmsg = "Unmatchable token" #self.myException.msg = self.errmsg def parseImpl( self, instring, loc, doActions=True ): exc = self.myException exc.loc = loc exc.pstr = instring raise exc class Literal(Token): """Token to exactly match a specified string.""" def __init__( self, matchString ): super(Literal,self).__init__() self.match = matchString self.matchLen = len(matchString) try: self.firstMatchChar = matchString[0] except IndexError: warnings.warn("null string passed to Literal; use Empty() instead", SyntaxWarning, stacklevel=2) self.__class__ = Empty self.name = '"%s"' % _ustr(self.match) self.errmsg = "Expected " + self.name self.mayReturnEmpty = False #self.myException.msg = self.errmsg self.mayIndexError = False # Performance tuning: this routine gets called a *lot* # if this is a single character match string and the first character matches, # short-circuit as quickly as possible, and avoid calling startswith #~ @profile def parseImpl( self, instring, loc, doActions=True ): if (instring[loc] == self.firstMatchChar and (self.matchLen==1 or instring.startswith(self.match,loc)) ): return loc+self.matchLen, self.match #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc _L = Literal class Keyword(Token): """Token to exactly match a specified string as a keyword, that is, it must be immediately followed by a non-keyword character. Compare with Literal:: Literal("if") will match the leading 'if' in 'ifAndOnlyIf'. Keyword("if") will not; it will only match the leading 'if in 'if x=1', or 'if(y==2)' Accepts two optional constructor arguments in addition to the keyword string: identChars is a string of characters that would be valid identifier characters, defaulting to all alphanumerics + "_" and "$"; caseless allows case-insensitive matching, default is False. """ DEFAULT_KEYWORD_CHARS = alphanums+"_$" def __init__( self, matchString, identChars=DEFAULT_KEYWORD_CHARS, caseless=False ): super(Keyword,self).__init__() self.match = matchString self.matchLen = len(matchString) try: self.firstMatchChar = matchString[0] except IndexError: warnings.warn("null string passed to Keyword; use Empty() instead", SyntaxWarning, stacklevel=2) self.name = '"%s"' % self.match self.errmsg = "Expected " + self.name self.mayReturnEmpty = False #self.myException.msg = self.errmsg self.mayIndexError = False self.caseless = caseless if caseless: self.caselessmatch = matchString.upper() identChars = identChars.upper() self.identChars = _str2dict(identChars) def parseImpl( self, instring, loc, doActions=True ): if self.caseless: if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and (loc == 0 or instring[loc-1].upper() not in self.identChars) ): return loc+self.matchLen, self.match else: if (instring[loc] == self.firstMatchChar and (self.matchLen==1 or instring.startswith(self.match,loc)) and (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and (loc == 0 or instring[loc-1] not in self.identChars) ): return loc+self.matchLen, self.match #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc def copy(self): c = super(Keyword,self).copy() c.identChars = Keyword.DEFAULT_KEYWORD_CHARS return c def setDefaultKeywordChars( chars ): """Overrides the default Keyword chars """ Keyword.DEFAULT_KEYWORD_CHARS = chars setDefaultKeywordChars = staticmethod(setDefaultKeywordChars) class CaselessLiteral(Literal): """Token to match a specified string, ignoring case of letters. Note: the matched results will always be in the case of the given match string, NOT the case of the input text. """ def __init__( self, matchString ): super(CaselessLiteral,self).__init__( matchString.upper() ) # Preserve the defining literal. self.returnString = matchString self.name = "'%s'" % self.returnString self.errmsg = "Expected " + self.name #self.myException.msg = self.errmsg def parseImpl( self, instring, loc, doActions=True ): if instring[ loc:loc+self.matchLen ].upper() == self.match: return loc+self.matchLen, self.returnString #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc class CaselessKeyword(Keyword): def __init__( self, matchString, identChars=Keyword.DEFAULT_KEYWORD_CHARS ): super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) def parseImpl( self, instring, loc, doActions=True ): if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): return loc+self.matchLen, self.match #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc class Word(Token): """Token for matching words composed of allowed character sets. Defined with string containing all allowed initial characters, an optional string containing allowed body characters (if omitted, defaults to the initial character set), and an optional minimum, maximum, and/or exact length. The default value for min is 1 (a minimum value < 1 is not valid); the default values for max and exact are 0, meaning no maximum or exact length restriction. """ def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False ): super(Word,self).__init__() self.initCharsOrig = initChars self.initChars = _str2dict(initChars) if bodyChars : self.bodyCharsOrig = bodyChars self.bodyChars = _str2dict(bodyChars) else: self.bodyCharsOrig = initChars self.bodyChars = _str2dict(initChars) self.maxSpecified = max > 0 if min < 1: raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") self.minLen = min if max > 0: self.maxLen = max else: self.maxLen = _MAX_INT if exact > 0: self.maxLen = exact self.minLen = exact self.name = _ustr(self) self.errmsg = "Expected " + self.name #self.myException.msg = self.errmsg self.mayIndexError = False self.asKeyword = asKeyword if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): if self.bodyCharsOrig == self.initCharsOrig: self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) elif len(self.bodyCharsOrig) == 1: self.reString = "%s[%s]*" % \ (re.escape(self.initCharsOrig), _escapeRegexRangeChars(self.bodyCharsOrig),) else: self.reString = "[%s][%s]*" % \ (_escapeRegexRangeChars(self.initCharsOrig), _escapeRegexRangeChars(self.bodyCharsOrig),) if self.asKeyword: self.reString = r"\b"+self.reString+r"\b" try: self.re = re.compile( self.reString ) except: self.re = None def parseImpl( self, instring, loc, doActions=True ): if self.re: result = self.re.match(instring,loc) if not result: exc = self.myException exc.loc = loc exc.pstr = instring raise exc loc = result.end() return loc,result.group() if not(instring[ loc ] in self.initChars): #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc start = loc loc += 1 instrlen = len(instring) bodychars = self.bodyChars maxloc = start + self.maxLen maxloc = min( maxloc, instrlen ) while loc < maxloc and instring[loc] in bodychars: loc += 1 throwException = False if loc - start < self.minLen: throwException = True if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: throwException = True if self.asKeyword: if (start>0 and instring[start-1] in bodychars) or (loc4: return s[:4]+"..." else: return s if ( self.initCharsOrig != self.bodyCharsOrig ): self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) else: self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) return self.strRepr class Regex(Token): """Token for matching strings that match a given regular expression. Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. """ def __init__( self, pattern, flags=0): """The parameters pattern and flags are passed to the re.compile() function as-is. See the Python re module for an explanation of the acceptable patterns and flags.""" super(Regex,self).__init__() if len(pattern) == 0: warnings.warn("null string passed to Regex; use Empty() instead", SyntaxWarning, stacklevel=2) self.pattern = pattern self.flags = flags try: self.re = re.compile(self.pattern, self.flags) self.reString = self.pattern except sre_constants.error: warnings.warn("invalid pattern (%s) passed to Regex" % pattern, SyntaxWarning, stacklevel=2) raise self.name = _ustr(self) self.errmsg = "Expected " + self.name #self.myException.msg = self.errmsg self.mayIndexError = False self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): result = self.re.match(instring,loc) if not result: exc = self.myException exc.loc = loc exc.pstr = instring raise exc loc = result.end() d = result.groupdict() ret = ParseResults(result.group()) if d: for k in d: ret[k] = d[k] return loc,ret def __str__( self ): try: return super(Regex,self).__str__() except: pass if self.strRepr is None: self.strRepr = "Re:(%s)" % repr(self.pattern) return self.strRepr class QuotedString(Token): """Token for matching strings that are delimited by quoting characters. """ def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None): """ Defined with the following parameters: - quoteChar - string of one or more characters defining the quote delimiting string - escChar - character to escape quotes, typically backslash (default=None) - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=None) - multiline - boolean indicating whether quotes can span multiple lines (default=False) - unquoteResults - boolean indicating whether the matched text should be unquoted (default=True) - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=None => same as quoteChar) """ super(QuotedString,self).__init__() # remove white space from quote chars - wont work anyway quoteChar = quoteChar.strip() if len(quoteChar) == 0: warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) raise SyntaxError() if endQuoteChar is None: endQuoteChar = quoteChar else: endQuoteChar = endQuoteChar.strip() if len(endQuoteChar) == 0: warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) raise SyntaxError() self.quoteChar = quoteChar self.quoteCharLen = len(quoteChar) self.firstQuoteChar = quoteChar[0] self.endQuoteChar = endQuoteChar self.endQuoteCharLen = len(endQuoteChar) self.escChar = escChar self.escQuote = escQuote self.unquoteResults = unquoteResults if multiline: self.flags = re.MULTILINE | re.DOTALL self.pattern = r'%s(?:[^%s%s]' % \ ( re.escape(self.quoteChar), _escapeRegexRangeChars(self.endQuoteChar[0]), (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) else: self.flags = 0 self.pattern = r'%s(?:[^%s\n\r%s]' % \ ( re.escape(self.quoteChar), _escapeRegexRangeChars(self.endQuoteChar[0]), (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) if len(self.endQuoteChar) > 1: self.pattern += ( '|(?:' + ')|(?:'.join(["%s[^%s]" % (re.escape(self.endQuoteChar[:i]), _escapeRegexRangeChars(self.endQuoteChar[i])) for i in range(len(self.endQuoteChar)-1,0,-1)]) + ')' ) if escQuote: self.pattern += (r'|(?:%s)' % re.escape(escQuote)) if escChar: self.pattern += (r'|(?:%s.)' % re.escape(escChar)) self.escCharReplacePattern = re.escape(self.escChar)+"(.)" self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) try: self.re = re.compile(self.pattern, self.flags) self.reString = self.pattern except sre_constants.error: warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, SyntaxWarning, stacklevel=2) raise self.name = _ustr(self) self.errmsg = "Expected " + self.name #self.myException.msg = self.errmsg self.mayIndexError = False self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None if not result: exc = self.myException exc.loc = loc exc.pstr = instring raise exc loc = result.end() ret = result.group() if self.unquoteResults: # strip off quotes ret = ret[self.quoteCharLen:-self.endQuoteCharLen] if isinstance(ret,basestring): # replace escaped characters if self.escChar: ret = re.sub(self.escCharReplacePattern,"\g<1>",ret) # replace escaped quotes if self.escQuote: ret = ret.replace(self.escQuote, self.endQuoteChar) return loc, ret def __str__( self ): try: return super(QuotedString,self).__str__() except: pass if self.strRepr is None: self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) return self.strRepr class CharsNotIn(Token): """Token for matching words composed of characters *not* in a given set. Defined with string containing all disallowed characters, and an optional minimum, maximum, and/or exact length. The default value for min is 1 (a minimum value < 1 is not valid); the default values for max and exact are 0, meaning no maximum or exact length restriction. """ def __init__( self, notChars, min=1, max=0, exact=0 ): super(CharsNotIn,self).__init__() self.skipWhitespace = False self.notChars = notChars if min < 1: raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") self.minLen = min if max > 0: self.maxLen = max else: self.maxLen = _MAX_INT if exact > 0: self.maxLen = exact self.minLen = exact self.name = _ustr(self) self.errmsg = "Expected " + self.name self.mayReturnEmpty = ( self.minLen == 0 ) #self.myException.msg = self.errmsg self.mayIndexError = False def parseImpl( self, instring, loc, doActions=True ): if instring[loc] in self.notChars: #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc start = loc loc += 1 notchars = self.notChars maxlen = min( start+self.maxLen, len(instring) ) while loc < maxlen and \ (instring[loc] not in notchars): loc += 1 if loc - start < self.minLen: #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc return loc, instring[start:loc] def __str__( self ): try: return super(CharsNotIn, self).__str__() except: pass if self.strRepr is None: if len(self.notChars) > 4: self.strRepr = "!W:(%s...)" % self.notChars[:4] else: self.strRepr = "!W:(%s)" % self.notChars return self.strRepr class White(Token): """Special matching class for matching whitespace. Normally, whitespace is ignored by pyparsing grammars. This class is included when some whitespace structures are significant. Define with a string containing the whitespace characters to be matched; default is " \\t\\n". Also takes optional min, max, and exact arguments, as defined for the Word class.""" whiteStrs = { " " : "", "\t": "", "\n": "", "\r": "", "\f": "", } def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): super(White,self).__init__() self.matchWhite = ws self.setWhitespaceChars( "".join([c for c in self.whiteChars if c not in self.matchWhite]) ) #~ self.leaveWhitespace() self.name = ("".join([White.whiteStrs[c] for c in self.matchWhite])) self.mayReturnEmpty = True self.errmsg = "Expected " + self.name #self.myException.msg = self.errmsg self.minLen = min if max > 0: self.maxLen = max else: self.maxLen = _MAX_INT if exact > 0: self.maxLen = exact self.minLen = exact def parseImpl( self, instring, loc, doActions=True ): if not(instring[ loc ] in self.matchWhite): #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc start = loc loc += 1 maxloc = start + self.maxLen maxloc = min( maxloc, len(instring) ) while loc < maxloc and instring[loc] in self.matchWhite: loc += 1 if loc - start < self.minLen: #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc return loc, instring[start:loc] class _PositionToken(Token): def __init__( self ): super(_PositionToken,self).__init__() self.name=self.__class__.__name__ self.mayReturnEmpty = True self.mayIndexError = False class GoToColumn(_PositionToken): """Token to advance to a specific column of input text; useful for tabular report scraping.""" def __init__( self, colno ): super(GoToColumn,self).__init__() self.col = colno def preParse( self, instring, loc ): if col(loc,instring) != self.col: instrlen = len(instring) if self.ignoreExprs: loc = self._skipIgnorables( instring, loc ) while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : loc += 1 return loc def parseImpl( self, instring, loc, doActions=True ): thiscol = col( loc, instring ) if thiscol > self.col: raise ParseException( instring, loc, "Text not in expected column", self ) newloc = loc + self.col - thiscol ret = instring[ loc: newloc ] return newloc, ret class LineStart(_PositionToken): """Matches if current position is at the beginning of a line within the parse string""" def __init__( self ): super(LineStart,self).__init__() self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) self.errmsg = "Expected start of line" #self.myException.msg = self.errmsg def preParse( self, instring, loc ): preloc = super(LineStart,self).preParse(instring,loc) if instring[preloc] == "\n": loc += 1 return loc def parseImpl( self, instring, loc, doActions=True ): if not( loc==0 or (loc == self.preParse( instring, 0 )) or (instring[loc-1] == "\n") ): #col(loc, instring) != 1: #~ raise ParseException( instring, loc, "Expected start of line" ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc return loc, [] class LineEnd(_PositionToken): """Matches if current position is at the end of a line within the parse string""" def __init__( self ): super(LineEnd,self).__init__() self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) self.errmsg = "Expected end of line" #self.myException.msg = self.errmsg def parseImpl( self, instring, loc, doActions=True ): if loc len(instring): return loc, [] else: exc = self.myException exc.loc = loc exc.pstr = instring raise exc class WordStart(_PositionToken): """Matches if the current position is at the beginning of a Word, and is not preceded by any character in a given set of wordChars (default=printables). To emulate the \b behavior of regular expressions, use WordStart(alphanums). WordStart will also match at the beginning of the string being parsed, or at the beginning of a line. """ def __init__(self, wordChars = printables): super(WordStart,self).__init__() self.wordChars = _str2dict(wordChars) self.errmsg = "Not at the start of a word" def parseImpl(self, instring, loc, doActions=True ): if loc != 0: if (instring[loc-1] in self.wordChars or instring[loc] not in self.wordChars): exc = self.myException exc.loc = loc exc.pstr = instring raise exc return loc, [] class WordEnd(_PositionToken): """Matches if the current position is at the end of a Word, and is not followed by any character in a given set of wordChars (default=printables). To emulate the \b behavior of regular expressions, use WordEnd(alphanums). WordEnd will also match at the end of the string being parsed, or at the end of a line. """ def __init__(self, wordChars = printables): super(WordEnd,self).__init__() self.wordChars = _str2dict(wordChars) self.skipWhitespace = False self.errmsg = "Not at the end of a word" def parseImpl(self, instring, loc, doActions=True ): instrlen = len(instring) if instrlen>0 and loc maxExcLoc: maxException = err maxExcLoc = err.loc except IndexError: if len(instring) > maxExcLoc: maxException = ParseException(instring,len(instring),e.errmsg,self) maxExcLoc = len(instring) else: if loc2 > maxMatchLoc: maxMatchLoc = loc2 maxMatchExp = e if maxMatchLoc < 0: if maxException is not None: raise maxException else: raise ParseException(instring, loc, "no defined alternatives to match", self) return maxMatchExp._parse( instring, loc, doActions ) def __ixor__(self, other ): if isinstance( other, basestring ): other = Literal( other ) return self.append( other ) #Or( [ self, other ] ) def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + " ^ ".join( [ _ustr(e) for e in self.exprs ] ) + "}" return self.strRepr def checkRecursion( self, parseElementList ): subRecCheckList = parseElementList[:] + [ self ] for e in self.exprs: e.checkRecursion( subRecCheckList ) class MatchFirst(ParseExpression): """Requires that at least one ParseExpression is found. If two expressions match, the first one listed is the one that will match. May be constructed using the '|' operator. """ def __init__( self, exprs, savelist = False ): super(MatchFirst,self).__init__(exprs, savelist) if exprs: self.mayReturnEmpty = False for e in self.exprs: if e.mayReturnEmpty: self.mayReturnEmpty = True break else: self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): maxExcLoc = -1 maxException = None for e in self.exprs: try: ret = e._parse( instring, loc, doActions ) return ret except ParseException, err: if err.loc > maxExcLoc: maxException = err maxExcLoc = err.loc except IndexError: if len(instring) > maxExcLoc: maxException = ParseException(instring,len(instring),e.errmsg,self) maxExcLoc = len(instring) # only got here if no expression matched, raise exception for match that made it the furthest else: if maxException is not None: raise maxException else: raise ParseException(instring, loc, "no defined alternatives to match", self) def __ior__(self, other ): if isinstance( other, basestring ): other = Literal( other ) return self.append( other ) #MatchFirst( [ self, other ] ) def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + " | ".join( [ _ustr(e) for e in self.exprs ] ) + "}" return self.strRepr def checkRecursion( self, parseElementList ): subRecCheckList = parseElementList[:] + [ self ] for e in self.exprs: e.checkRecursion( subRecCheckList ) class Each(ParseExpression): """Requires all given ParseExpressions to be found, but in any order. Expressions may be separated by whitespace. May be constructed using the '&' operator. """ def __init__( self, exprs, savelist = True ): super(Each,self).__init__(exprs, savelist) self.mayReturnEmpty = True for e in self.exprs: if not e.mayReturnEmpty: self.mayReturnEmpty = False break self.skipWhitespace = True self.initExprGroups = True def parseImpl( self, instring, loc, doActions=True ): if self.initExprGroups: self.optionals = [ e.expr for e in self.exprs if isinstance(e,Optional) ] self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] self.required += self.multirequired self.initExprGroups = False tmpLoc = loc tmpReqd = self.required[:] tmpOpt = self.optionals[:] matchOrder = [] keepMatching = True while keepMatching: tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired failed = [] for e in tmpExprs: try: tmpLoc = e.tryParse( instring, tmpLoc ) except ParseException: failed.append(e) else: matchOrder.append(e) if e in tmpReqd: tmpReqd.remove(e) elif e in tmpOpt: tmpOpt.remove(e) if len(failed) == len(tmpExprs): keepMatching = False if tmpReqd: missing = ", ".join( [ _ustr(e) for e in tmpReqd ] ) raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) # add any unmatched Optionals, in case they have default values defined matchOrder += [ e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt ] resultlist = [] for e in matchOrder: loc,results = e._parse(instring,loc,doActions) resultlist.append(results) finalResults = ParseResults([]) for r in resultlist: dups = {} for k in r.keys(): if k in finalResults.keys(): tmp = ParseResults(finalResults[k]) tmp += ParseResults(r[k]) dups[k] = tmp finalResults += ParseResults(r) for k,v in dups.items(): finalResults[k] = v return loc, finalResults def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + " & ".join( [ _ustr(e) for e in self.exprs ] ) + "}" return self.strRepr def checkRecursion( self, parseElementList ): subRecCheckList = parseElementList[:] + [ self ] for e in self.exprs: e.checkRecursion( subRecCheckList ) class ParseElementEnhance(ParserElement): """Abstract subclass of ParserElement, for combining and post-processing parsed tokens.""" def __init__( self, expr, savelist=False ): super(ParseElementEnhance,self).__init__(savelist) if isinstance( expr, basestring ): expr = Literal(expr) self.expr = expr self.strRepr = None if expr is not None: self.mayIndexError = expr.mayIndexError self.mayReturnEmpty = expr.mayReturnEmpty self.setWhitespaceChars( expr.whiteChars ) self.skipWhitespace = expr.skipWhitespace self.saveAsList = expr.saveAsList self.callPreparse = expr.callPreparse self.ignoreExprs.extend(expr.ignoreExprs) def parseImpl( self, instring, loc, doActions=True ): if self.expr is not None: return self.expr._parse( instring, loc, doActions, callPreParse=False ) else: raise ParseException("",loc,self.errmsg,self) def leaveWhitespace( self ): self.skipWhitespace = False self.expr = self.expr.copy() if self.expr is not None: self.expr.leaveWhitespace() return self def ignore( self, other ): if isinstance( other, Suppress ): if other not in self.ignoreExprs: super( ParseElementEnhance, self).ignore( other ) if self.expr is not None: self.expr.ignore( self.ignoreExprs[-1] ) else: super( ParseElementEnhance, self).ignore( other ) if self.expr is not None: self.expr.ignore( self.ignoreExprs[-1] ) return self def streamline( self ): super(ParseElementEnhance,self).streamline() if self.expr is not None: self.expr.streamline() return self def checkRecursion( self, parseElementList ): if self in parseElementList: raise RecursiveGrammarException( parseElementList+[self] ) subRecCheckList = parseElementList[:] + [ self ] if self.expr is not None: self.expr.checkRecursion( subRecCheckList ) def validate( self, validateTrace=[] ): tmp = validateTrace[:]+[self] if self.expr is not None: self.expr.validate(tmp) self.checkRecursion( [] ) def __str__( self ): try: return super(ParseElementEnhance,self).__str__() except: pass if self.strRepr is None and self.expr is not None: self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) return self.strRepr class FollowedBy(ParseElementEnhance): """Lookahead matching of the given parse expression. FollowedBy does *not* advance the parsing position within the input string, it only verifies that the specified parse expression matches at the current position. FollowedBy always returns a null token list.""" def __init__( self, expr ): super(FollowedBy,self).__init__(expr) self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): self.expr.tryParse( instring, loc ) return loc, [] class NotAny(ParseElementEnhance): """Lookahead to disallow matching with the given parse expression. NotAny does *not* advance the parsing position within the input string, it only verifies that the specified parse expression does *not* match at the current position. Also, NotAny does *not* skip over leading whitespace. NotAny always returns a null token list. May be constructed using the '~' operator.""" def __init__( self, expr ): super(NotAny,self).__init__(expr) #~ self.leaveWhitespace() self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs self.mayReturnEmpty = True self.errmsg = "Found unwanted token, "+_ustr(self.expr) #self.myException = ParseException("",0,self.errmsg,self) def parseImpl( self, instring, loc, doActions=True ): try: self.expr.tryParse( instring, loc ) except (ParseException,IndexError): pass else: #~ raise ParseException(instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc return loc, [] def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "~{" + _ustr(self.expr) + "}" return self.strRepr class ZeroOrMore(ParseElementEnhance): """Optional repetition of zero or more of the given expression.""" def __init__( self, expr ): super(ZeroOrMore,self).__init__(expr) self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): tokens = [] try: loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) hasIgnoreExprs = ( len(self.ignoreExprs) > 0 ) while 1: if hasIgnoreExprs: preloc = self._skipIgnorables( instring, loc ) else: preloc = loc loc, tmptokens = self.expr._parse( instring, preloc, doActions ) if tmptokens or tmptokens.keys(): tokens += tmptokens except (ParseException,IndexError): pass return loc, tokens def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "[" + _ustr(self.expr) + "]..." return self.strRepr def setResultsName( self, name, listAllMatches=False ): ret = super(ZeroOrMore,self).setResultsName(name,listAllMatches) ret.saveAsList = True return ret class OneOrMore(ParseElementEnhance): """Repetition of one or more of the given expression.""" def parseImpl( self, instring, loc, doActions=True ): # must be at least one loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) try: hasIgnoreExprs = ( len(self.ignoreExprs) > 0 ) while 1: if hasIgnoreExprs: preloc = self._skipIgnorables( instring, loc ) else: preloc = loc loc, tmptokens = self.expr._parse( instring, preloc, doActions ) if tmptokens or tmptokens.keys(): tokens += tmptokens except (ParseException,IndexError): pass return loc, tokens def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + _ustr(self.expr) + "}..." return self.strRepr def setResultsName( self, name, listAllMatches=False ): ret = super(OneOrMore,self).setResultsName(name,listAllMatches) ret.saveAsList = True return ret class _NullToken(object): def __bool__(self): return False __nonzero__ = __bool__ def __str__(self): return "" _optionalNotMatched = _NullToken() class Optional(ParseElementEnhance): """Optional matching of the given expression. A default return string can also be specified, if the optional expression is not found. """ def __init__( self, exprs, default=_optionalNotMatched ): super(Optional,self).__init__( exprs, savelist=False ) self.defaultValue = default self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): try: loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) except (ParseException,IndexError): if self.defaultValue is not _optionalNotMatched: if self.expr.resultsName: tokens = ParseResults([ self.defaultValue ]) tokens[self.expr.resultsName] = self.defaultValue else: tokens = [ self.defaultValue ] else: tokens = [] return loc, tokens def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "[" + _ustr(self.expr) + "]" return self.strRepr class SkipTo(ParseElementEnhance): """Token for skipping over all undefined text until the matched expression is found. If include is set to true, the matched expression is also consumed. The ignore argument is used to define grammars (typically quoted strings and comments) that might contain false matches. """ def __init__( self, other, include=False, ignore=None, failOn=None ): super( SkipTo, self ).__init__( other ) if ignore is not None: self.expr = self.expr.copy() self.expr.ignore(ignore) self.mayReturnEmpty = True self.mayIndexError = False self.includeMatch = include self.asList = False if failOn is not None and isinstance(failOn, basestring): self.failOn = Literal(failOn) else: self.failOn = failOn self.errmsg = "No match found for "+_ustr(self.expr) #self.myException = ParseException("",0,self.errmsg,self) def parseImpl( self, instring, loc, doActions=True ): startLoc = loc instrlen = len(instring) expr = self.expr failParse = False while loc <= instrlen: try: if self.failOn: failParse = True self.failOn.tryParse(instring, loc) failParse = False loc = expr._skipIgnorables( instring, loc ) expr._parse( instring, loc, doActions=False, callPreParse=False ) skipText = instring[startLoc:loc] if self.includeMatch: loc,mat = expr._parse(instring,loc,doActions,callPreParse=False) if mat: skipRes = ParseResults( skipText ) skipRes += mat return loc, [ skipRes ] else: return loc, [ skipText ] else: return loc, [ skipText ] except (ParseException,IndexError): if failParse: raise else: loc += 1 exc = self.myException exc.loc = loc exc.pstr = instring raise exc class Forward(ParseElementEnhance): """Forward declaration of an expression to be defined later - used for recursive grammars, such as algebraic infix notation. When the expression is known, it is assigned to the Forward variable using the '<<' operator. Note: take care when assigning to Forward not to overlook precedence of operators. Specifically, '|' has a lower precedence than '<<', so that:: fwdExpr << a | b | c will actually be evaluated as:: (fwdExpr << a) | b | c thereby leaving b and c out as parseable alternatives. It is recommended that you explicitly group the values inserted into the Forward:: fwdExpr << (a | b | c) """ def __init__( self, other=None ): super(Forward,self).__init__( other, savelist=False ) def __lshift__( self, other ): if isinstance( other, basestring ): other = Literal(other) self.expr = other self.mayReturnEmpty = other.mayReturnEmpty self.strRepr = None self.mayIndexError = self.expr.mayIndexError self.mayReturnEmpty = self.expr.mayReturnEmpty self.setWhitespaceChars( self.expr.whiteChars ) self.skipWhitespace = self.expr.skipWhitespace self.saveAsList = self.expr.saveAsList self.ignoreExprs.extend(self.expr.ignoreExprs) return None def leaveWhitespace( self ): self.skipWhitespace = False return self def streamline( self ): if not self.streamlined: self.streamlined = True if self.expr is not None: self.expr.streamline() return self def validate( self, validateTrace=[] ): if self not in validateTrace: tmp = validateTrace[:]+[self] if self.expr is not None: self.expr.validate(tmp) self.checkRecursion([]) def __str__( self ): if hasattr(self,"name"): return self.name self._revertClass = self.__class__ self.__class__ = _ForwardNoRecurse try: if self.expr is not None: retString = _ustr(self.expr) else: retString = "None" finally: self.__class__ = self._revertClass return self.__class__.__name__ + ": " + retString def copy(self): if self.expr is not None: return super(Forward,self).copy() else: ret = Forward() ret << self return ret class _ForwardNoRecurse(Forward): def __str__( self ): return "..." class TokenConverter(ParseElementEnhance): """Abstract subclass of ParseExpression, for converting parsed results.""" def __init__( self, expr, savelist=False ): super(TokenConverter,self).__init__( expr )#, savelist ) self.saveAsList = False class Upcase(TokenConverter): """Converter to upper case all matching tokens.""" def __init__(self, *args): super(Upcase,self).__init__(*args) warnings.warn("Upcase class is deprecated, use upcaseTokens parse action instead", DeprecationWarning,stacklevel=2) def postParse( self, instring, loc, tokenlist ): return list(map( string.upper, tokenlist )) class Combine(TokenConverter): """Converter to concatenate all matching tokens to a single string. By default, the matching patterns must also be contiguous in the input string; this can be disabled by specifying 'adjacent=False' in the constructor. """ def __init__( self, expr, joinString="", adjacent=True ): super(Combine,self).__init__( expr ) # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself if adjacent: self.leaveWhitespace() self.adjacent = adjacent self.skipWhitespace = True self.joinString = joinString def ignore( self, other ): if self.adjacent: ParserElement.ignore(self, other) else: super( Combine, self).ignore( other ) return self def postParse( self, instring, loc, tokenlist ): retToks = tokenlist.copy() del retToks[:] retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) if self.resultsName and len(retToks.keys())>0: return [ retToks ] else: return retToks class Group(TokenConverter): """Converter to return the matched tokens as a list - useful for returning tokens of ZeroOrMore and OneOrMore expressions.""" def __init__( self, expr ): super(Group,self).__init__( expr ) self.saveAsList = True def postParse( self, instring, loc, tokenlist ): return [ tokenlist ] class Dict(TokenConverter): """Converter to return a repetitive expression as a list, but also as a dictionary. Each element can also be referenced using the first token in the expression as its key. Useful for tabular report scraping when the first column can be used as a item key. """ def __init__( self, exprs ): super(Dict,self).__init__( exprs ) self.saveAsList = True def postParse( self, instring, loc, tokenlist ): for i,tok in enumerate(tokenlist): if len(tok) == 0: continue ikey = tok[0] if isinstance(ikey,int): ikey = _ustr(tok[0]).strip() if len(tok)==1: tokenlist[ikey] = _ParseResultsWithOffset("",i) elif len(tok)==2 and not isinstance(tok[1],ParseResults): tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) else: dictvalue = tok.copy() #ParseResults(i) del dictvalue[0] if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.keys()): tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) else: tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) if self.resultsName: return [ tokenlist ] else: return tokenlist class Suppress(TokenConverter): """Converter for ignoring the results of a parsed expression.""" def postParse( self, instring, loc, tokenlist ): return [] def suppress( self ): return self class OnlyOnce(object): """Wrapper for parse actions, to ensure they are only called once.""" def __init__(self, methodCall): self.callable = ParserElement._normalizeParseActionArgs(methodCall) self.called = False def __call__(self,s,l,t): if not self.called: results = self.callable(s,l,t) self.called = True return results raise ParseException(s,l,"") def reset(self): self.called = False def traceParseAction(f): """Decorator for debugging parse actions.""" f = ParserElement._normalizeParseActionArgs(f) def z(*paArgs): thisFunc = f.func_name s,l,t = paArgs[-3:] if len(paArgs)>3: thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc sys.stderr.write( ">>entering %s(line: '%s', %d, %s)\n" % (thisFunc,line(l,s),l,t) ) try: ret = f(*paArgs) except Exception, exc: sys.stderr.write( "<", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) try: if len(symbols)==len("".join(symbols)): return Regex( "[%s]" % "".join( [ _escapeRegexRangeChars(sym) for sym in symbols] ) ) else: return Regex( "|".join( [ re.escape(sym) for sym in symbols] ) ) except: warnings.warn("Exception creating Regex for oneOf, building MatchFirst", SyntaxWarning, stacklevel=2) # last resort, just use MatchFirst return MatchFirst( [ parseElementClass(sym) for sym in symbols ] ) def dictOf( key, value ): """Helper to easily and clearly define a dictionary by specifying the respective patterns for the key and value. Takes care of defining the Dict, ZeroOrMore, and Group tokens in the proper order. The key pattern can include delimiting markers or punctuation, as long as they are suppressed, thereby leaving the significant key text. The value pattern can include named results, so that the Dict results can include named token fields. """ return Dict( ZeroOrMore( Group ( key + value ) ) ) def originalTextFor(expr, asString=True): """Helper to return the original, untokenized text for a given expression. Useful to restore the parsed fields of an HTML start tag into the raw tag text itself, or to revert separate tokens with intervening whitespace back to the original matching input text. Simpler to use than the parse action keepOriginalText, and does not require the inspect module to chase up the call stack. By default, returns a string containing the original parsed text. If the optional asString argument is passed as False, then the return value is a ParseResults containing any results names that were originally matched, and a single token containing the original matched text from the input string. So if the expression passed to originalTextFor contains expressions with defined results names, you must set asString to False if you want to preserve those results name values.""" locMarker = Empty().setParseAction(lambda s,loc,t: loc) matchExpr = locMarker("_original_start") + expr + locMarker("_original_end") if asString: extractText = lambda s,l,t: s[t._original_start:t._original_end] else: def extractText(s,l,t): del t[:] t.insert(0, s[t._original_start:t._original_end]) del t["_original_start"] del t["_original_end"] matchExpr.setParseAction(extractText) return matchExpr # convenience constants for positional expressions empty = Empty().setName("empty") lineStart = LineStart().setName("lineStart") lineEnd = LineEnd().setName("lineEnd") stringStart = StringStart().setName("stringStart") stringEnd = StringEnd().setName("stringEnd") _escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) _printables_less_backslash = "".join([ c for c in printables if c not in r"\]" ]) _escapedHexChar = Combine( Suppress(_bslash + "0x") + Word(hexnums) ).setParseAction(lambda s,l,t:unichr(int(t[0],16))) _escapedOctChar = Combine( Suppress(_bslash) + Word("0","01234567") ).setParseAction(lambda s,l,t:unichr(int(t[0],8))) _singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(_printables_less_backslash,exact=1) _charRange = Group(_singleChar + Suppress("-") + _singleChar) _reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" _expanded = lambda p: (isinstance(p,ParseResults) and ''.join([ unichr(c) for c in range(ord(p[0]),ord(p[1])+1) ]) or p) def srange(s): r"""Helper to easily define string ranges for use in Word construction. Borrows syntax from regexp '[]' string range definitions:: srange("[0-9]") -> "0123456789" srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" The input string must be enclosed in []'s, and the returned string is the expanded character set joined into a single string. The values enclosed in the []'s may be:: a single character an escaped character with a leading backslash (such as \- or \]) an escaped hex character with a leading '\0x' (\0x21, which is a '!' character) an escaped octal character with a leading '\0' (\041, which is a '!' character) a range of any of the above, separated by a dash ('a-z', etc.) any combination of the above ('aeiouy', 'a-zA-Z0-9_$', etc.) """ try: return "".join([_expanded(part) for part in _reBracketExpr.parseString(s).body]) except: return "" def matchOnlyAtCol(n): """Helper method for defining parse actions that require matching at a specific column in the input text. """ def verifyCol(strg,locn,toks): if col(locn,strg) != n: raise ParseException(strg,locn,"matched token not at column %d" % n) return verifyCol def replaceWith(replStr): """Helper method for common parse actions that simply return a literal value. Especially useful when used with transformString(). """ def _replFunc(*args): return [replStr] return _replFunc def removeQuotes(s,l,t): """Helper parse action for removing quotation marks from parsed quoted strings. To use, add this parse action to quoted string using:: quotedString.setParseAction( removeQuotes ) """ return t[0][1:-1] def upcaseTokens(s,l,t): """Helper parse action to convert tokens to upper case.""" return [ tt.upper() for tt in map(_ustr,t) ] def downcaseTokens(s,l,t): """Helper parse action to convert tokens to lower case.""" return [ tt.lower() for tt in map(_ustr,t) ] def keepOriginalText(s,startLoc,t): """Helper parse action to preserve original parsed text, overriding any nested parse actions.""" try: endloc = getTokensEndLoc() except ParseException: raise ParseFatalException("incorrect usage of keepOriginalText - may only be called as a parse action") del t[:] t += ParseResults(s[startLoc:endloc]) return t def getTokensEndLoc(): """Method to be called from within a parse action to determine the end location of the parsed tokens.""" import inspect fstack = inspect.stack() try: # search up the stack (through intervening argument normalizers) for correct calling routine for f in fstack[2:]: if f[3] == "_parseNoCache": endloc = f[0].f_locals["loc"] return endloc else: raise ParseFatalException("incorrect usage of getTokensEndLoc - may only be called from within a parse action") finally: del fstack def _makeTags(tagStr, xml): """Internal helper to construct opening and closing tag expressions, given a tag name""" if isinstance(tagStr,basestring): resname = tagStr tagStr = Keyword(tagStr, caseless=not xml) else: resname = tagStr.name tagAttrName = Word(alphas,alphanums+"_-:") if (xml): tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) openTag = Suppress("<") + tagStr + \ Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") else: printablesLessRAbrack = "".join( [ c for c in printables if c not in ">" ] ) tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) openTag = Suppress("<") + tagStr + \ Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ Optional( Suppress("=") + tagAttrValue ) ))) + \ Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") closeTag = Combine(_L("") openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % tagStr) closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("" % tagStr) return openTag, closeTag def makeHTMLTags(tagStr): """Helper to construct opening and closing tag expressions for HTML, given a tag name""" return _makeTags( tagStr, False ) def makeXMLTags(tagStr): """Helper to construct opening and closing tag expressions for XML, given a tag name""" return _makeTags( tagStr, True ) def withAttribute(*args,**attrDict): """Helper to create a validating parse action to be used with start tags created with makeXMLTags or makeHTMLTags. Use withAttribute to qualify a starting tag with a required attribute value, to avoid false matches on common tags such as
or
. Call withAttribute with a series of attribute names and values. Specify the list of filter attributes names and values as: - keyword arguments, as in (class="Customer",align="right"), or - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) For attribute names with a namespace prefix, you must use the second form. Attribute names are matched insensitive to upper/lower case. To verify that the attribute exists, but without specifying a value, pass withAttribute.ANY_VALUE as the value. """ if args: attrs = args[:] else: attrs = attrDict.items() attrs = [(k,v) for k,v in attrs] def pa(s,l,tokens): for attrName,attrValue in attrs: if attrName not in tokens: raise ParseException(s,l,"no matching attribute " + attrName) if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % (attrName, tokens[attrName], attrValue)) return pa withAttribute.ANY_VALUE = object() opAssoc = _Constants() opAssoc.LEFT = object() opAssoc.RIGHT = object() def operatorPrecedence( baseExpr, opList ): """Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy. Operators may be unary or binary, left- or right-associative. Parse actions can also be attached to operator expressions. Parameters: - baseExpr - expression representing the most basic element for the nested - opList - list of tuples, one for each operator precedence level in the expression grammar; each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where: - opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if numTerms is 3, opExpr is a tuple of two expressions, for the two operators separating the 3 terms - numTerms is the number of terms for this operator (must be 1, 2, or 3) - rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants opAssoc.RIGHT and opAssoc.LEFT. - parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted) """ ret = Forward() lastExpr = baseExpr | ( Suppress('(') + ret + Suppress(')') ) for i,operDef in enumerate(opList): opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] if arity == 3: if opExpr is None or len(opExpr) != 2: raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") opExpr1, opExpr2 = opExpr thisExpr = Forward()#.setName("expr%d" % i) if rightLeftAssoc == opAssoc.LEFT: if arity == 1: matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) elif arity == 2: if opExpr is not None: matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) else: matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) elif arity == 3: matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) else: raise ValueError("operator must be unary (1), binary (2), or ternary (3)") elif rightLeftAssoc == opAssoc.RIGHT: if arity == 1: # try to avoid LR with this extra test if not isinstance(opExpr, Optional): opExpr = Optional(opExpr) matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) elif arity == 2: if opExpr is not None: matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) else: matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) elif arity == 3: matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) else: raise ValueError("operator must be unary (1), binary (2), or ternary (3)") else: raise ValueError("operator must indicate right or left associativity") if pa: matchExpr.setParseAction( pa ) thisExpr << ( matchExpr | lastExpr ) lastExpr = thisExpr ret << lastExpr return ret dblQuotedString = Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*"').setName("string enclosed in double quotes") sglQuotedString = Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*'").setName("string enclosed in single quotes") quotedString = Regex(r'''(?:"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*")|(?:'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*')''').setName("quotedString using single or double quotes") unicodeString = Combine(_L('u') + quotedString.copy()) def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString): """Helper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default). Parameters: - opener - opening character for a nested list (default="("); can also be a pyparsing expression - closer - closing character for a nested list (default=")"); can also be a pyparsing expression - content - expression for items within the nested lists (default=None) - ignoreExpr - expression for ignoring opening and closing delimiters (default=quotedString) If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values. Use the ignoreExpr argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an Or or MatchFirst. The default is quotedString, but if no expressions are to be ignored, then pass None for this argument. """ if opener == closer: raise ValueError("opening and closing strings cannot be the same") if content is None: if isinstance(opener,basestring) and isinstance(closer,basestring): if len(opener) == 1 and len(closer)==1: if ignoreExpr is not None: content = (Combine(OneOrMore(~ignoreExpr + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: content = (empty+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS ).setParseAction(lambda t:t[0].strip())) else: if ignoreExpr is not None: content = (Combine(OneOrMore(~ignoreExpr + ~Literal(opener) + ~Literal(closer) + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: raise ValueError("opening and closing arguments must be strings if no content expression is given") ret = Forward() if ignoreExpr is not None: ret << Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) else: ret << Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) return ret def indentedBlock(blockStatementExpr, indentStack, indent=True): """Helper method for defining space-delimited indentation blocks, such as those used to define block statements in Python source code. Parameters: - blockStatementExpr - expression defining syntax of statement that is repeated within the indented block - indentStack - list created by caller to manage indentation stack (multiple statementWithIndentedBlock expressions within a single grammar should share a common indentStack) - indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements (default=True) A valid block must contain at least one blockStatement. """ def checkPeerIndent(s,l,t): if l >= len(s): return curCol = col(l,s) if curCol != indentStack[-1]: if curCol > indentStack[-1]: raise ParseFatalException(s,l,"illegal nesting") raise ParseException(s,l,"not a peer entry") def checkSubIndent(s,l,t): curCol = col(l,s) if curCol > indentStack[-1]: indentStack.append( curCol ) else: raise ParseException(s,l,"not a subentry") def checkUnindent(s,l,t): if l >= len(s): return curCol = col(l,s) if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): raise ParseException(s,l,"not an unindent") indentStack.pop() NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) INDENT = Empty() + Empty().setParseAction(checkSubIndent) PEER = Empty().setParseAction(checkPeerIndent) UNDENT = Empty().setParseAction(checkUnindent) if indent: smExpr = Group( Optional(NL) + FollowedBy(blockStatementExpr) + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) else: smExpr = Group( Optional(NL) + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) blockStatementExpr.ignore(_bslash + LineEnd()) return smExpr alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:")) commonHTMLEntity = Combine(_L("&") + oneOf("gt lt amp nbsp quot").setResultsName("entity") +";") _htmlEntityMap = dict(zip("gt lt amp nbsp quot".split(),'><& "')) replaceHTMLEntity = lambda t : t.entity in _htmlEntityMap and _htmlEntityMap[t.entity] or None # it's easy to get these comment structures wrong - they're very common, so may as well make them available cStyleComment = Regex(r"/\*(?:[^*]*\*+)+?/").setName("C style comment") htmlComment = Regex(r"") restOfLine = Regex(r".*").leaveWhitespace() dblSlashComment = Regex(r"\/\/(\\\n|.)*").setName("// comment") cppStyleComment = Regex(r"/(?:\*(?:[^*]*\*+)+?/|/[^\n]*(?:\n[^\n]*)*?(?:(?" + str(tokenlist)) print ("tokens = " + str(tokens)) print ("tokens.columns = " + str(tokens.columns)) print ("tokens.tables = " + str(tokens.tables)) print (tokens.asXML("SQL",True)) except ParseBaseException,err: print (teststring + "->") print (err.line) print (" "*(err.column-1) + "^") print (err) print() selectToken = CaselessLiteral( "select" ) fromToken = CaselessLiteral( "from" ) ident = Word( alphas, alphanums + "_$" ) columnName = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens ) columnNameList = Group( delimitedList( columnName ) )#.setName("columns") tableName = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens ) tableNameList = Group( delimitedList( tableName ) )#.setName("tables") simpleSQL = ( selectToken + \ ( '*' | columnNameList ).setResultsName( "columns" ) + \ fromToken + \ tableNameList.setResultsName( "tables" ) ) test( "SELECT * from XYZZY, ABC" ) test( "select * from SYS.XYZZY" ) test( "Select A from Sys.dual" ) test( "Select AA,BB,CC from Sys.dual" ) test( "Select A, B, C from Sys.dual" ) test( "Select A, B, C from Sys.dual" ) test( "Xelect A, B, C from Sys.dual" ) test( "Select A, B, C frox Sys.dual" ) test( "Select" ) test( "Select ^^^ frox Sys.dual" ) test( "Select A, B, C from Sys.dual, Table2 " ) bauble-0.9.7/bauble/utils/thread.py0000644000175000017500000002572411232137571016232 0ustar brettbrettfrom threading import Lock, RLock, Thread, _MainThread, currentThread import Queue from gtk.gdk import threads_enter, threads_leave from gobject import GObject, SIGNAL_RUN_FIRST # This code originally from: # http://code.activestate.com/recipes/521881/ class GtkWorker (GObject, Thread): __gsignals__ = { "progressed": (SIGNAL_RUN_FIRST, None, (float,)), "published": (SIGNAL_RUN_FIRST, None, (object,)), "done": (SIGNAL_RUN_FIRST, None, ()) } def __init__ (self, func, *func_args, **func_kwargs): """ Initialize a new GtkWorker around a specific function """ # WARNING: This deadlocks if calling code already has the gdk lock and # is not the MainThread if type(currentThread()) != _MainThread: threads_enter() GObject.__init__(self) if type(currentThread()) != _MainThread: threads_leave() Thread.__init__(self, args=func_args, kwargs=func_kwargs) self.func_args = func_args self.func_kwargs = func_kwargs self.setDaemon(True) # By some reason we cannot access __gsignals__, so we have to do a # little double work here self.connections = {"progressed": 0, "published": 0, "done": 0} self.handler_ids = {} self.func = func self.cancelled = False self.done = False self.progress = 0 ####################################################################### # Publish and progress queues # ####################################################################### class Publisher (Thread): SEND_LIST, SEND_LAST = range(2) def __init__ (self, parrent, queue, signal, sendPolicy): Thread.__init__(self) self.setDaemon(True) self.parrent = parrent self.queue = queue self.signal = signal self.sendPolicy = sendPolicy def run (self): while True: v = self.queue.get() if v == None: break threads_enter() l = [v] while True: try: v = self.queue.get_nowait() except Queue.Empty: break else: l.append(v) try: if self.sendPolicy == self.SEND_LIST: self.parrent.emit(self.signal, l) elif self.sendPolicy == self.SEND_LAST: self.parrent.emit(self.signal, l[-1]) finally: threads_leave() self.publishQueue = Queue.Queue() self.publisher = Publisher ( self, self.publishQueue, "published", Publisher.SEND_LIST) self.publisher.start() self.progressQueue = Queue.Queue() self.progressor = Publisher ( self, self.progressQueue, "progressed", Publisher.SEND_LAST) self.progressor.start() ########################################################################### # We override the connect/disconnect methods in order to count the number # # of clients connected to each signal. # # This is done for performance reasons, as some work can be skipped, if # # no clients are connected anyways # ########################################################################### def _mul_connect (self, method, signal, handler, *args): self.connections[signal] += 1 handler_id = method (self, signal, handler, *args) self.handler_ids[handler_id] = signal return handler_id def connect (self, detailed_signal, handler, *args): return self._mul_connect (GObject.connect, detailed_signal, handler, *args) def connect_after (self, detailed_signal, handler, *args): return self._mul_connect (GObject.connect_after, detailed_signal, handler, *args) def connect_object (self, detailed_signal, handler, gobject, *args): return self._mul_connect (GObject.connect_object, detailed_signal, handler, gobject, *args) def connect_object_after (self, detailed_signal, handler, gobject, *args): return self._mul_connect (GObject.connect, detailed_signal, handler, gobject, *args) def disconnect (self, handler_id): self.connections[self.handler_ids[handler_id]] -= 1 del self.handler_ids[handler_id] return GObject.disconnect(self, handler_id) handler_disconnect = disconnect ########################################################################### # The following methods (besides run()) are used to interact with the # # worker # ########################################################################### def get (self, timeout=None): """ 'get' will block until the processed function returns, timeout happens, or the work is cancelled. You can test if you were cancelled by the isCancelled() method, and you can test if you reached the timeout by the isAlive() method. Notice, cancelling will not make 'get' unblock, besides if you build 'isCancelled' calls into your function. Warning: the get function assumes that if you are the MainThread you have the gdklock and if you are not the MainThread you don't have the gdklock. If this is not true, and the work is not done, calling get will result in a deadlock. If you haven't used the gtk.gdk.threads_enter nor gtk.gdk.threads_leave function, everything should be fine.""" if not self.isDone(): if type(currentThread()) == _MainThread: threads_leave() self.join(timeout) if type(currentThread()) == _MainThread: threads_enter() if self.isAlive(): return None self.done = True return self.result def execute (self): """ Start the worker """ if not self.isDone(): self.start() def run (self): #print self.func_args #print self.func_kwargs self.result = self.func(self, *self.func_args, **self.func_kwargs) self.done = True if self.connections["done"] >= 1: threads_enter() # In python 2.5 we can use self.publishQueue.join() to wait for all # publish items to have been processed. self.emit("done") threads_leave() def cancel (self): """ Cancel work. As python has no way of trying to interupt a thread, we don't try to do so. The cancelled attribute is simply set to true, which means that no more signals are emitted. You can build 'isCancelled' calls into your function, to help it exit when it doesn't need to run anymore. while not worker.isCancelled(): ... """ self.cancelled = True self.done = True ########################################################################### # Get stuff # ########################################################################### def isCancelled (self): return self.cancelled def isDone (self): return self.done def getProgress (self): return self.progress ########################################################################### # These methods are used by the function to indicate progress and publish # # process # ########################################################################### def setProgress (self, progress): """ setProgress should be called from inside the processed function. When the gdklock gets ready, it will emit the "progressed" signal, with the value of the latest setProgress call """ if self.isCancelled(): return if self.progress != progress: self.progress = progress self.progressQueue.put(progress) def publish (self, val): """ Publish should be called from inside the processed function. It will queue up the latest results, and when we get access to the gdklock, it will emit the "published" signal. """ if self.connections["published"] < 1 or self.isCancelled(): return self.publishQueue.put(val) ########################################################################### # Other # ########################################################################### def __del__ (self): self.cancel() ############################################################################### # Demo usage # ############################################################################### if __name__ == "__main__": def findPrimes (worker): from math import sqrt limit = 10**4. primes = [] for n in xrange(2, int(limit)+1): for p in primes: if worker.isCancelled(): return primes if p > n**2: break if n % p == 0: break else: primes.append(n) worker.publish(n) worker.setProgress(n/limit) return primes import gtk w = gtk.Window() vbox = gtk.VBox() w.add(vbox) worker = GtkWorker(findPrimes) sbut = gtk.Button("Start") def callback (button, *args): sbut.set_sensitive(False) worker.execute() sbut.connect("clicked", callback) vbox.add(sbut) cbut = gtk.Button("Cancel") def callback (button, *args): cbut.set_sensitive(False) worker.cancel() cbut.connect("clicked", callback) vbox.add(cbut) gbut = gtk.Button("Get") def callback (button, *args): gbut.set_sensitive(False) print "Found:", worker.get() gbut.connect("clicked", callback) vbox.add(gbut) prog = gtk.ProgressBar() def callback (worker, progress): prog.set_fraction(progress) worker.connect("progressed", callback) vbox.add(prog) field = gtk.Entry() def process (worker, primes): field.set_text(str(primes[-1])) worker.connect("published", process) vbox.add(field) def done (worker): print "Finished, Cancelled:", worker.isCancelled() worker.connect("done", done) w.connect("destroy", gtk.main_quit) w.show_all() gtk.gdk.threads_init() gtk.main() bauble-0.9.7/bauble/utils/__init__.py0000755000175000017500000007070311271423044016516 0ustar brettbrett# # utils module # """ A common set of utility functions used throughout Bauble. """ import imp import os import sys import re import xml.sax.saxutils as saxutils import gtk import gtk.glade import bauble from bauble.error import check, CheckConditionError import bauble.paths as paths from bauble.utils.log import debug, warning from bauble.utils.pyparsing import * def find_dependent_tables(table, metadata=None): ''' Return an iterator with all tables that depend on table. The tables are returned in the order that they depend on each other. For example you know that table[0] does not depend on tables[1]. :param table: The tables who dependencies we want to find :param metadata: The :class:`sqlalchemy.engine.Metadata` object that holds the tables to search through. If None then use bauble.db.metadata ''' # NOTE: we can't use bauble.metadata.sorted_tables here because it # returns all the tables in the metadata even if they aren't # dependent on table at all from sqlalchemy.sql.util import sort_tables if metadata is None: import bauble.db as db metadata = db.metadata tables = [] def _impl(t2): for tbl in metadata.sorted_tables: for fk in tbl.foreign_keys: if fk.column.table == t2 and tbl not in tables \ and tbl is not table: tables.append(tbl) _impl(tbl) _impl(table) return sort_tables(tables=tables) class GladeLoader(object): """ This class caches the gtk.glade.XML objects so that loading the same file with the same name returns the same gtk.glade.XML. It might seem crazy to keep them around instead of deleting them and freeing the memory but in reality the memory is never returned to the system. By using this class you can keep the size of the application from growing if the same UI decription is loaded several times. e.g. everytime you open an editor or infobox """ # NOTE: this builder loader is really only used because of a bug # in PyGTK where a gtk.glade.XML doesn't free some memory so we use # this to keep the memory from growing out of control. if the # gtk/pygtk people fix that bug we should be able to get rid of # this class # http://bugzilla.gnome.org/show_bug.cgi?id=589057,560822 cache = {} @classmethod def load(cls, filename): """ """ import gtk.glade if filename in cls.cache.keys(): return cls.cache[filename] cls.cache[filename] = gtk.glade.XML(filename) return cls.cache[filename] class GladeWidgets(dict): """ Provides dictionary and attribute access for a :class:`gtk.glade.XML` object. """ def __init__(self, glade_xml): ''' @params glade_xml: a gtk.glade.XML object ''' if isinstance(glade_xml, str): self.glade_xml = gtk.glade.XML(glade_xml) else: self.glade_xml = glade_xml def __getitem__(self, name): ''' @param name: ''' w = self.glade_xml.get_widget(name) if not w: raise KeyError(_('%s not in glade file' % name)) return w def __getattr__(self, name): ''' @param name: ''' return self.glade_xml.get_widget(name) def remove_parent(self, widget): """ Remove widgets from its parent. """ # if parent is the last reference to widget then widget may be # automatically destroyed if isinstance(widget, str): w = self[widget] else: w = widget parent = w.get_parent() if parent is not None: parent.remove(w) def signal_autoconnect(self, handlers): """ Connect handlers to their widgets. See gtk.glade.XML.signal_autoconnect for more information. """ self.glade_xml.signal_autoconnect(handlers) def tree_model_has(tree, value): """ Return True or False if value is in the tree. """ return len(search_tree_model(tree, value)) > 0 def search_tree_model(parent, data, cmp=lambda row, data: row[0] == data): """ Return a iterable of gtk.TreeIter instances to all occurences of data in model :parent: a gtk.TreeModel or a gtk.TreeModelRow instance :data: the data to look for :cmp: the function to call on each row to check if it matches data, default is C{lambda row, data: row[0] == data} """ if isinstance(parent, gtk.TreeModel): if not parent.get_iter_root(): # model empty return [] return search_tree_model(parent[parent.get_iter_root()], data, cmp) results = set() def func(model, path, iter, dummy=None): if cmp(model[iter], data): #debug('add: %s' % model[iter]) results.add(iter) return False parent.model.foreach(func) return tuple(results) def clear_model(obj_with_model): """ :param obj_with_model: a gtk Widget that has a gtk.TreeModel that can be retrieved with obj_with_mode.get_model Remove the model from the object, deletes all the items in the model, clear the model and then delete the model and set the model on the object to None """ model = obj_with_model.get_model() if model is None: return ncols = model.get_n_columns() def del_cb(model, path, iter, data=None): for c in xrange(0, ncols): v = model.get_value(iter, c) del v del iter model.foreach(del_cb) model.clear() del model model = None obj_with_model.set_model(None) def combo_set_active_text(combo, value): ''' does the same thing as set_combo_from_value but this looks more like a GTK+ method ''' set_combo_from_value(combo, value) def set_combo_from_value(combo, value, cmp=lambda row, value: row[0] == value): ''' find value in combo model and set it as active, else raise ValueError cmp(row, value) is the a function to use for comparison .. note:: if more than one value is found in the combo then the first one in the list is set ''' model = combo.get_model() matches = search_tree_model(model, value, cmp) if len(matches) == 0: raise ValueError('set_combo_from_value() - could not find value in '\ 'combo: %s' % value) combo.set_active_iter(matches[0]) def combo_get_value_iter(combo, value, cmp=lambda row, value: row[0] == value): ''' Returns a gtk.TreeIter that points to value. :param combo: the combo where we should search :param value: the value to search for :param cmp: the method to use to compare rows in the combo model and value, the default is C{lambda row, value: row[0] == value} .. note:: if more than one value is found in the combo then the first one in the list is returned ''' model = combo.get_model() matches = search_tree_model(model, value, cmp) if len(matches) == 0: return None return matches[0] def set_widget_value(glade_xml, widget_name, value, markup=True, default=None): ''' :param glade_xml: the glade_file to get the widget from :param widget_name: the name of the widget :param value: the value to put in the widget :param markup: whether or not :param default: the default value to put in the widget if the value is None .. note:: any values passed in for widgets that expect a string will call the values __str__ method ''' import gtk w = glade_xml.get_widget(widget_name) if value is None: # set the value from the default if isinstance(w,(gtk.Label, gtk.TextView, gtk.Entry)) \ and default is None: value = '' else: value = default if isinstance(w, gtk.Label): #w.set_text(str(value)) # FIXME: some of the enum values that have as a values # will give errors here, but we can't escape the string because # if someone does pass something that needs to be marked up # then it won't display as intended, maybe BaubleTable.markup() # should be responsible for returning a properly escaped values # or we should just catch the error(is there an error) and call # set_text if set_markup fails if markup: w.set_markup(str(value)) else: w.set_text(str(value)) elif isinstance(w, gtk.TextView): w.get_buffer().set_text(str(value)) elif isinstance(w, gtk.Entry): w.set_text(str(value)) elif isinstance(w, gtk.ComboBox): # TODO: what about comboentry # TODO: what if None is in the model treeiter = combo_get_value_iter(w, value) if treeiter: w.set_active_iter(treeiter) elif w.get_model() is not None: w.set_active(-1) elif isinstance(w, (gtk.ToggleButton, gtk.CheckButton, gtk.RadioButton)): if value is True: w.set_inconsistent(False) w.set_active(True) elif value is False: # how come i have to unset inconsistent for False? w.set_inconsistent(False) w.set_active(False) else: w.set_inconsistent(True) else: raise TypeError('utils.set_widget_value(): Don\'t know how to handle ' 'the widget type %s with name %s' % \ (type(w), widget_name)) def create_message_dialog(msg, type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_OK, parent=None): ''' Create a message dialog. :param msg: The markup to use for the message. The value should be escaped in case it contains any HTML entities. :param type: A GTK message type constant. The default is gtk.MESSAGE_INFO. :param buttons: A GTK buttons type constant. The default is gtk.BUTTONS_OK. :param parent: The parent window for the dialog Returns a :class:`gtk.MessageDialog` ''' if parent is None: try: # this might get called before bauble has started parent = bauble.gui.window except Exception: parent = None d =gtk.MessageDialog(flags=gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, parent=parent, type=type, buttons=buttons) d.set_title('Bauble') d.set_markup(msg) if d.get_icon() is None: try: pixbuf = gtk.gdk.pixbuf_new_from_file(bauble.default_icon) d.set_icon(pixbuf) except Exception: pass d.set_property('skip-taskbar-hint', False) d.show_all() return d def message_dialog(msg, type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_OK, parent=None): ''' Create a message dialog with :func:`bauble.utils.create_message_dialog` and run and destroy it. Returns the dialog's response. ''' d = create_message_dialog(msg, type, buttons, parent) r = d.run() d.destroy() return r def create_yes_no_dialog(msg, parent=None): """ Create a dialog with yes/no buttons. """ if parent is None: try: # this might get called before bauble has started parent = bauble.gui.window except Exception: parent = None d =gtk.MessageDialog(flags=gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, parent=parent, type=gtk.MESSAGE_QUESTION, buttons = gtk.BUTTONS_YES_NO) d.set_title('Bauble') d.set_markup(msg) if d.get_icon() is None: try: pixbuf = gtk.gdk.pixbuf_new_from_file(bauble.default_icon) d.set_icon(pixbuf) except Exception: pass d.set_property('skip-taskbar-hint', False) d.show_all() return d # TODO: it would be nice to implement a yes_or_no method that asks from the # console if there is no gui. is it possible to know if we have a terminal # to write to? def yes_no_dialog(msg, parent=None, yes_delay=-1): """ Create and run a yes/no dialog. Return True if the dialog response equals gtk.RESPONSE_YES :param msg: the message to display in the dialog :param parent: the dialog's parent :param yes_delay: the number of seconds before the yes button should become sensitive """ d = create_yes_no_dialog(msg, parent) if yes_delay > 0: d.set_response_sensitive(gtk.RESPONSE_YES, False) def on_timeout(): if d.get_property('visible'): # conditional avoids GTK+ warning d.set_response_sensitive(gtk.RESPONSE_YES, True) return False import gobject gobject.timeout_add(yes_delay*1000, on_timeout) r = d.run() d.destroy() return r == gtk.RESPONSE_YES def create_message_details_dialog(msg, details, type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_OK, parent=None): ''' Create a message dialog with a details expander. ''' if parent is None: try: # this might get called before bauble has started parent = bauble.gui.window except Exception: parent = None d =gtk.MessageDialog(flags=gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, parent=parent,type=type, buttons=buttons) d.set_title('Bauble') d.set_markup(msg) expand = gtk.Expander("Details") text_view = gtk.TextView() text_view.set_editable(False) text_view.set_wrap_mode(gtk.WRAP_WORD) tb = gtk.TextBuffer() tb.set_text(details) text_view.set_buffer(tb) sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) sw.add(text_view) expand.add(sw) d.vbox.pack_start(expand) # make "OK" the default response d.set_default_response(gtk.RESPONSE_OK) if d.get_icon() is None: try: pixbuf = gtk.gdk.pixbuf_new_from_file(bauble.default_icon) d.set_icon(pixbuf) except Exception: pass d.set_property('skip-taskbar-hint', False) d.show_all() return d def message_details_dialog(msg, details, type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_OK, parent=None): ''' Create and run a message dialog with a details expander. ''' d = create_message_details_dialog(msg, details, type, buttons, parent) r = d.run() d.destroy() return r def setup_text_combobox(combo, values=[], cell_data_func=None): """ Configure a gtk.ComboBox as a text combobox """ combo.clear() model = gtk.ListStore(str) for v in values: model.append([v]) combo.set_model(model) renderer = gtk.CellRendererText() combo.pack_start(renderer, True) combo.add_attribute(renderer, 'text', 0) if cell_data_func: combo.set_cell_data_func(renderer, cell_data_func) def setup_date_button(entry, button, date_func=None): """ :param entry: the entry that the data goes into :param button: the button that enters the data in entry :param date_func: the function that returns a string represention of the date """ # TODO: connect Ctrl-T on the entry to enter signal clicked on the button icon = os.path.join(paths.lib_dir(), 'images', 'calendar.png') image = gtk.Image() image.set_from_file(icon) button.set_tooltip_text(_("Today's date")) button.set_image(image) def on_clicked(b): s = '' if not date_func: import datetime today = datetime.date.today() s = '%s/%s/%s' % (today.day, today.month, today.year) else: s = date_func() entry.set_text(s) button.connect('clicked', on_clicked) def to_unicode(obj, encoding='utf-8'): """ Return obj converted to unicode. If obj is already a unicode object it will not try to decode it to converted it to but will just return the original obj """ if isinstance(obj, basestring): if not isinstance(obj, unicode): obj = unicode(obj, encoding) else: try: obj = unicode(obj, encoding) except Exception: obj = unicode(str(obj), encoding) return obj def utf8(obj): """ This function is an alias for to_unicode(obj, 'utf-8') """ return to_unicode(obj, 'utf-8') def xml_safe(obj, encoding='utf-8'): ''' Return a string with character entities escaped safe for xml, if the str parameter is a string a string is returned, if str is a unicode object then a unicode object is returned ''' obj = to_unicode(obj, encoding) return saxutils.escape(obj) def xml_safe_utf8(obj): """ This method is deprecated and just returns xml_safe(obj) """ return xml_safe(obj) __natsort_rx = re.compile('(\d+(?:\.\d+)?)') def natsort_key(obj): """ a key getter for sort and sorted function the sorting is done on return value of obj.__str__() so we can sort objects as well, i don't know if this will cause problems with unicode use like: sorted(some_list, key=utils.natsort_key) """ # TODO: what happens with natsort and unicode characters item = str(obj) chunks = __natsort_rx.split(item) for ii in range(len(chunks)): if chunks[ii] and chunks[ii][0] in '0123456789': if '.' in chunks[ii]: numtype = float else: numtype = int # wrap in tuple with '0' to explicitly specify numbers come first chunks[ii] = (0, numtype(chunks[ii])) else: chunks[ii] = (1, chunks[ii]) return (chunks, item) def delete_or_expunge(obj): """ If the object is in object_session(obj).new then expunge it from the session. If not then session.delete it. """ from sqlalchemy.orm import object_session session = object_session(obj) if session is None: return if obj in session.new: # debug('expunge obj: %s -- %s' % (obj, repr(obj))) session.expunge(obj) del obj else: # debug('delete obj: %s -- %s' % (obj, repr(obj))) session.delete(obj) def reset_sequence(column): """ If column.sequence is not None or the column is an Integer and column.autoincrement is true then reset the sequence for the next available value for the column...if the column doesn't have a sequence then do nothing and return The SQL statements are executed directly from db.engine """ import bauble import bauble.db as db from sqlalchemy.types import Integer from sqlalchemy import schema if db.engine.name in ('sqlite', 'mysql'): pass # sqlite and mysql increment automatically elif db.engine.name == 'postgres': sequence_name = None # this crazy elif conditional is from # sqlalchemy.database.postgres.PGDefaultRunner if hasattr(column, "sequence") and column.sequence is not None: sequence_name = column.sequence.name elif (isinstance(column.type, Integer) and column.autoincrement) and (column.default is None or (isinstance(column.default, schema.Sequence) and column.default.optional)) and len(column.foreign_keys)==0: sequence_name = '%s_%s_seq' %(column.table.name, column.name) else: return conn = db.engine.connect() trans = conn.begin() try: # the FOR UPDATE locks the table for the transaction stmt = "SELECT %s from %s FOR UPDATE;" % \ (column.name, column.table.name) result = conn.execute(stmt) maxid = None vals = list(result) if vals: maxid = max(vals, key=lambda x: x[0])[0] result.close() if maxid == None: # set the sequence to nextval() stmt = "SELECT nextval('%s');" % (sequence_name) else: stmt = "SELECT setval('%s', max(%s)+1) from %s;" \ % (sequence_name, column.name, column.table.name) conn.execute(stmt) except Exception, e: warning('bauble.utils.reset_sequence(): %s' % utf8(e)) debug(e) trans.rollback() else: trans.commit() finally: conn.close() else: raise NotImplementedError(_('Error: using sequences hasn\'t been '\ 'tested on this database type: %s' % \ db.engine.name)) # TODO: always req month and year, day can be optional, what about a # flag to make the day optional, like? def date_to_str(date, format): """ :param data: a datetime object :param format: the format of the string to return, uses: yyyy,yy,d,dd,m,mm We don't do any validation that the format is correct or invalid """ import re s = format.replace('yyyy', str(date.year)) month = date.month if month < 10: month = '0%s' % month s = s.replace('mm', str(month)) s = s.replace('m', str(date.month)) day = date.day if day < 10: day = '0%s' % day s = s.replace('dd', str(day)) s = s.replace('d', str(date.day)) return s def make_label_clickable(label, on_clicked, *args): """ :param label: must have an eventbox as its parent :param on_clicked: callback to be called when the label is clicked on_clicked(label, event, data) """ eventbox = label.parent check(eventbox != None and isinstance(eventbox, gtk.EventBox), 'label must have an gtk.EventBox as it\'s parent') label.__pressed = False def on_enter_notify(*args): label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("blue")) def on_leave_notify(*args): label.modify_fg(gtk.STATE_NORMAL, None) label.__pressed = False def on_press(*args): label.__pressed = True def on_release(widget, event, *args): if label.__pressed: label.__pressed = False label.modify_fg(gtk.STATE_NORMAL, None) on_clicked(label, event, *args) eventbox.connect('enter_notify_event', on_enter_notify) eventbox.connect('leave_notify_event', on_leave_notify) eventbox.connect('button_press_event', on_press) eventbox.connect('button_release_event', on_release, *args) def enum_values_str(col): """ :param col: a string if table.col where col is an enum type return a string with of the values on an enum type join by a comma """ import bauble.db as db table_name, col_name = col.split('.') #debug('%s.%s' % (table_name, col_name)) values = db.metadata.tables[table_name].c[col_name].type.values[:] if None in values: values[values.index(None)] = '<None>' return ', '.join(values) class MessageBox(gtk.EventBox): # TODO: instead of passing colors to show we should just pass a # state variable so that the colors will be consistent across the # app...error=red, notifcation=blue, info=white # TODO: how do we reset the colors? what is normal? error_colors = [('bg', gtk.STATE_NORMAL, '#FF9999'), ('bg', gtk.STATE_PRELIGHT, '#FFAAAA')] info_colors = [] @staticmethod def add_to(parent, close_button=True): # TODO: should we allow an "ordering" to be passed in so its not # always packed into the top check(isinstance(parent, gtk.VBox), 'widget must be a gtk.VBox') box = MessageBox() parent.pack_start(box, expand=False, fill=True) parent.reorder_child(box, 0) return box def __init__(self, close_button=False): super(MessageBox, self).__init__() self.vbox = gtk.VBox() self.add(self.vbox) self.label = gtk.Label() self.label.set_alignment(.05, .5) self.close_button = None hbox = gtk.HBox() self.vbox.pack_start(hbox) if not close_button: hbox.pack_start(self.label) else: hbox.pack_start(self.label, expand=True, fill=True) img = gtk.Image() img.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_SMALL_TOOLBAR) self.close_button = gtk.Button() self.close_button.set_label('') self.close_button.set_image(img) self.close_button.set_relief(gtk.RELIEF_NONE) hbox.pack_start(self.close_button, expand=False, fill=False) def show(self, show=True, colors=[], animate=False): if not show: self.hide_all() return self.show_all() colormap = self.get_colormap() style = self.get_style().copy() for attr, state, color in colors: c = colormap.alloc_color(color) getattr(style, attr)[state] = c self.set_style(style) def which(filename, path=None): """ Search for filename on system path """ if not path: path = os.environ['PATH'].split(os.pathsep) for dirname in path: candidate = os.path.join(dirname, filename) if os.path.isfile(candidate): return candidate return None def ilike(col, val, engine=None): """ Return a cross platform ilike function. """ from sqlalchemy import func if not engine: engine = bauble.db.engine if engine.name == 'postgres': return col.op('ILIKE')(val) else: return func.lower(col).like(func.lower(val)) def gc_objects_by_type(typename): # This code from objgraph # Copyright (c) 2008 Marius Gedminas # Released under the MIT licence. import gc return [o for o in gc.get_objects() if type(o).__name__ == typename] # # This implementation of topological sort was taken directly from... # http://www.bitformation.com/art/python_toposort.html # def topological_sort(items, partial_order): """ Perform topological sort. :param items: a list of items to be sorted. :param partial_order: a list of pairs. If pair (a,b) is in it, it means that item a should appear before item b. Returns a list of the items in one of the possible orders, or None if partial_order contains a loop. """ def add_node(graph, node): """Add a node to the graph if not already exists.""" if not graph.has_key(node): graph[node] = [0] # 0 = number of arcs coming into this node. def add_arc(graph, fromnode, tonode): """ Add an arc to a graph. Can create multiple arcs. The end nodes must already exist. """ graph[fromnode].append(tonode) # Update the count of incoming arcs in tonode. graph[tonode][0] = graph[tonode][0] + 1 # step 1 - create a directed graph with an arc a->b for each input # pair (a,b). # The graph is represented by a dictionary. The dictionary contains # a pair item:list for each node in the graph. /item/ is the value # of the node. /list/'s 1st item is the count of incoming arcs, and # the rest are the destinations of the outgoing arcs. For example: # {'a':[0,'b','c'], 'b':[1], 'c':[1]} # represents the graph: c <-- a --> b # The graph may contain loops and multiple arcs. # Note that our representation does not contain reference loops to # cause GC problems even when the represented graph contains loops, # because we keep the node names rather than references to the nodes. graph = {} for v in items: add_node(graph, v) for a,b in partial_order: add_arc(graph, a, b) # Step 2 - find all roots (nodes with zero incoming arcs). roots = [node for (node,nodeinfo) in graph.items() if nodeinfo[0] == 0] # step 3 - repeatedly emit a root and remove it from the graph. Removing # a node may convert some of the node's direct children into roots. # Whenever that happens, we append the new roots to the list of # current roots. sorted = [] while len(roots) != 0: # If len(roots) is always 1 when we get here, it means that # the input describes a complete ordering and there is only # one possible output. # When len(roots) > 1, we can choose any root to send to the # output; this freedom represents the multiple complete orderings # that satisfy the input restrictions. We arbitrarily take one of # the roots using pop(). Note that for the algorithm to be efficient, # this operation must be done in O(1) time. root = roots.pop() sorted.append(root) for child in graph[root][1:]: graph[child][0] = graph[child][0] - 1 if graph[child][0] == 0: roots.append(child) del graph[root] if len(graph.items()) != 0: # There is a loop in the input. return None return sorted bauble-0.9.7/bauble/utils/test.py0000644000175000017500000002002211234225775015732 0ustar brettbrett# # test.py # # Description: test for bauble.utils import sys import unittest from sqlalchemy import * import bauble import bauble.db as db import bauble.utils as utils from bauble.utils.log import debug from bauble.test import BaubleTestCase class UtilsGTKTests(unittest.TestCase): def itest_create_message_details_dialog(self): """ Interactive test for bauble.utils.create_message_details_dialog() """ d = utils.create_message_details_dialog('msg', 'details') d.run() def test_search_tree_model(self): """ Test bauble.utils.search_tree_model """ import gtk model = gtk.TreeStore(str) # the rows that should be found to_find = [] row = model.append(None, ['1']) model.append(row, ['1.1']) to_find.append(model.append(row, ['something'])) model.append(row, ['1.3']) row = model.append(None, ['2']) to_find.append(model.append(row, ['something'])) model.append(row, ['2.1']) to_find.append(model.append(None, ['something'])) root = model.get_iter_root() results = utils.search_tree_model(model[root], 'something') self.assert_(sorted([model.get_path(r) for r in results]), sorted(to_find)) class UtilsTests(unittest.TestCase): def test_xml_safe(self): """ Test bauble.utils.xml_safe """ class test(object): def __str__(self): return repr(self) def __unicode__(self): return repr(self) import re assert re.match('<.*?>', utils.xml_safe(str(test()))) assert re.match('<.*?>', utils.xml_safe(unicode(test()))) assert utils.xml_safe('test string') == 'test string' assert utils.xml_safe(u'test string') == u'test string' assert utils.xml_safe(u'test< string') == u'test< string' assert utils.xml_safe('test< string') == 'test< string' def test_datetime_to_str(self): """ Test bauble.utils.date_to_str """ from datetime import datetime dt = datetime(2008, 12, 1) s = utils.date_to_str(dt, 'yyyy.m.d') assert s == '2008.12.1', s s = utils.date_to_str(dt, 'yyyy.mm.d') assert s == '2008.12.1', s s = utils.date_to_str(dt, 'yyyy.m.dd') assert s == '2008.12.01', s s = utils.date_to_str(dt, 'yyyy.mm.dd') assert s == '2008.12.01', s dt = datetime(2008, 12, 12) s = utils.date_to_str(dt, 'yyyy.m.d') assert s == '2008.12.12', s s = utils.date_to_str(dt, 'yyyy.mm.d') assert s == '2008.12.12', s s = utils.date_to_str(dt, 'yyyy.m.dd') assert s == '2008.12.12', s s = utils.date_to_str(dt, 'yyyy.mm.dd') assert s == '2008.12.12', s dt = datetime(2008, 1, 1) s = utils.date_to_str(dt, 'yyyy.m.d') assert s == '2008.1.1', s s = utils.date_to_str(dt, 'yyyy.mm.d') assert s == '2008.01.1', s s = utils.date_to_str(dt, 'yyyy.m.dd') assert s == '2008.1.01', s s = utils.date_to_str(dt, 'yyyy.mm.dd') assert s == '2008.01.01', s dt = datetime(2008, 1, 12) s = utils.date_to_str(dt, 'yyyy.m.d') assert s == '2008.1.12', s s = utils.date_to_str(dt, 'yyyy.mm.d') assert s == '2008.01.12', s s = utils.date_to_str(dt, 'yyyy.m.dd') assert s == '2008.1.12', s s = utils.date_to_str(dt, 'yyyy.mm.dd') assert s == '2008.01.12', s class UtilsDBTests(BaubleTestCase): def test_find_dependent_tables(self): """ Test bauble.utils.find_dependent_tables """ metadata = MetaData() metadata.bind = db.engine # table1 does't depend on any tables table1 = Table('table1', metadata, Column('id', Integer, primary_key=True)) # table2 depends on table1 table2 = Table('table2', metadata, Column('id', Integer, primary_key=True), Column('table1', Integer, ForeignKey('table1.id'))) # table3 depends on table2 table3 = Table('table3', metadata, Column('id', Integer, primary_key=True), Column('table2', Integer, ForeignKey('table2.id')), Column('table4', Integer, ForeignKey('table4.id')) ) # table4 depends on table2 table4 = Table('table4', metadata, Column('id', Integer, primary_key=True), Column('table2', Integer, ForeignKey('table2.id'))) # tables that depend on table 1 are 3, 4, 2 depends = list(utils.find_dependent_tables(table1, metadata)) print 'table1: %s' % [table.name for table in depends] self.assert_(list(depends) == [table2, table4, table3]) # tables that depend on table 2 are 3, 4 depends = list(utils.find_dependent_tables(table2, metadata)) print 'table2: %s' % [table.name for table in depends] self.assert_(depends == [table4, table3]) # no tables depend on table 3 depends = list(utils.find_dependent_tables(table3, metadata)) print 'table3: %s' % [table.name for table in depends] self.assert_(depends == []) # table that depend on table 4 are 3 depends = list(utils.find_dependent_tables(table4, metadata)) print 'table4: %s' % [table.name for table in depends] self.assert_(depends == [table3]) class ResetSequenceTests(BaubleTestCase): def setUp(self): super(ResetSequenceTests, self).setUp() self.metadata = MetaData() self.metadata.bind = db.engine def tearDown(self): super(ResetSequenceTests, self).tearDown() self.metadata.drop_all() @staticmethod def get_currval(col): if db.engine.name == 'postgres': name = col.sequence.name stmt = "select currval('%s');" % name return db.engine.execute(stmt).fetchone()[0] elif db.engine.name == 'sqlite': stmt = 'select max(%s) from %s' % (col.name, col.table.name) return db.engine.execute(stmt).fetchone()[0] + 1 def test_no_col_sequence(self): """ Test utils.reset_sequence on a column without a Sequence() This only tests that reset_sequence() doesn't fail if there is no sequence. """ # test that a column without an explicit sequence works table = Table('test_reset_sequence', self.metadata, Column('id', Integer, primary_key=True)) self.metadata.create_all() self.insert = table.insert()#.compile() db.engine.execute(self.insert, values=[{'id': 1}]) utils.reset_sequence(table.c.id) def test_empty_col_sequence(self): """ Test utils.reset_sequence on a column without a Sequence() This only tests that reset_sequence() doesn't fail if there is no sequence. """ # test that a column without an explicit sequence works table = Table('test_reset_sequence', self.metadata, Column('id', Integer, primary_key=True)) self.metadata.create_all() #self.insert = table.insert()#.compile() #db.engine.execute(self.insert, values=[{'id': 1}]) utils.reset_sequence(table.c.id) def test_with_col_sequence(self): """ Test utils.reset_sequence on a column that has an Sequence() """ table = Table('test_reset_sequence', self.metadata, Column('id', Integer, Sequence('test_id_seq'), primary_key=True, unique=True)) self.metadata.create_all() rangemax = 10 for i in range(1, rangemax+1): table.insert().values(id=i).execute() utils.reset_sequence(table.c.id) currval = self.get_currval(table.c.id) self.assert_(currval > rangemax) bauble-0.9.7/bauble/utils/log.py0000755000175000017500000000611511210626427015537 0ustar brettbrett# # logger/debugger for Bauble # import os import sys import logging import bauble.utils def _main_is_frozen(): import imp return (hasattr(sys, "frozen") or # new py2exe hasattr(sys, "importers") or # old py2exe imp.is_frozen("__main__")) # tools/freeze def _default_handler(): import bauble.paths as paths if _main_is_frozen(): filename = os.path.join(paths.user_dir(), 'bauble.log') handler = logging.FileHandler(filename, 'w+') sys.stdout = open(filename, 'w+') sys.stderr = open(filename, 'w+') else: handler = logging.StreamHandler() return handler # warning: HACK! so the error message only shows once __yesyesiknow = False def _config_logger(name, level, format, propagate=False): try: handler = _default_handler() except IOError, e: import traceback global __yesyesiknow if not __yesyesiknow and not _main_is_frozen(): msg = _('** Could not open the default log file.\n'\ 'Press OK key to continue.\n\n%s') % \ bauble.utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), gtk.MESSAGE_WARNING) __yesyesiknow = True handler = logging.StreamHandler() handler.setLevel(level) formatter = logging.Formatter(format) handler.setFormatter(formatter) logger = logging.getLogger(name) logger.addHandler(handler) logger.propagate = propagate return logger def sa_echo(logger='sqlalchemy', level=logging.DEBUG): import bauble.db as db db.engine.echo = True logging.getLogger(logger).setLevel(level) def echo(toggle=True): import bauble.db as db if toggle == True: db.engine.echo = False sa_echo(level=logging.DEBUG) else: db.engine.echo = True sa_echo(level=logging.ERROR) logging.basicConfig(level=logging.DEBUG, format='%(levelname)s: %(message)s') #root_logger = _config_logger('', logging.DEBUG, '%(levelname)s: %(message)s', # True) # info logger, prints only the message info_logger = _config_logger('bauble.info',logging.INFO, '%(message)s') info = info_logger.info # debug logger, prints file and line name with the message debug_logger = _config_logger('bauble.debug', logging.DEBUG, '%(filename)s(%(lineno)d): %(message)s') debug = debug_logger.debug # warning logger warning_logger = _config_logger('bauble.warning', logging.WARNING, '%(filename)s(%(lineno)d): %(message)s') warning = warning_logger.warning # error logger error_logger = _config_logger('bauble.error', logging.ERROR, '%(filename)s(%(lineno)d): %(message)s') error = error_logger.error class log: @staticmethod def debug(*args, **kw): debug(*args, **kw) @staticmethod def info(*args, **kw): info(*args, **kw) @staticmethod def warning(*args, **kw): logging.warning(*args, **kw) @staticmethod def error(*args, **kw): logging.error(*args, **kw) warning = log.warning error = log.error bauble-0.9.7/bauble/connmgr.glade0000644000175000017500000001725411210626427015710 0ustar brettbrett True Bauble False True GTK_WIN_POS_CENTER GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_CENTER True True True False False 5 True 10 True 3 True 3 gtk-add True 0 False False 1 True 3 gtk-remove True 0 False False 2 False False 1 True True 10 True True 0 Type: True GTK_PACK_END 1 False False True Connection Details label_item 5 2 GTK_PACK_END 2 True GTK_BUTTONBOX_END True True True gtk-cancel True -6 True True True gtk-connect True -5 1 False GTK_PACK_END bauble-0.9.7/bauble/prefs.py0000755000175000017500000002542011234144345014735 0ustar brettbrett# # prefs.py # import sys, os import gtk import bauble import bauble.utils as utils import bauble.paths as paths import bauble.pluginmgr as pluginmgr from bauble.utils.log import debug, warning # TODO: include the version of the database in the prefs so that if the prefs # are opened with a different version then the user will know and possible # migrate pref version though i don't think the prefs format will change much # TODO: make sure the version numbers are compatible, # if we are upgrading to a new version we should copy the old # config somewhere else, copy any relevant keys and set the config # version in the new file # TODO: should also possibly check that the config version and # database versions match up # TODO: maybe we should have a create method that creates the preferences # todo a one time thing if the files doesn't exist # TODO: Consider using ConfigObj since it does validation, type # conversion and unicode automatically...the cons are that it adds # another dependency and we would have to change the prefs interface # throughout bauble default_filename = 'config' default_prefs_file = os.path.join(paths.user_dir(), default_filename) prefs_icon_dir = os.path.join(paths.lib_dir(), 'images') general_prefs_icon = os.path.join(prefs_icon_dir, 'prefs_general.png') security_prefs_icon = os.path.join(prefs_icon_dir, 'prefs_security.png') config_version_pref = 'bauble.config.version' config_version = bauble.version_tuple[0], bauble.version_tuple[1] ## class PreferencesMgr(gtk.Dialog): ## def __init__(self): ## gtk.Dialog.__init__(self, "Preferences", None, ## gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, ## (gtk.STOCK_OK, gtk.RESPONSE_OK, ## gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) ## self.current_frame = None ## self.create_gui() ## def create_gui(self): ## model = gtk.ListStore(str, gtk.gdk.Pixbuf) ## #pixbuf = gtk.gdk.pixbuf_new_from_file("images/prefs_general.png") ## pixbuf = gtk.gdk.pixbuf_new_from_file(general_prefs_icon) ## model.append(["General", pixbuf]) ## #pixbuf = gtk.gdk.pixbuf_new_from_file("images/prefs_security.png") ## pixbuf = gtk.gdk.pixbuf_new_from_file(security_prefs_icon) ## model.append(["Security", pixbuf]) ## self.icon_view = gtk.IconView(model) ## self.icon_view.set_text_column(0) ## self.icon_view.set_pixbuf_column(1) ## self.icon_view.set_orientation(gtk.ORIENTATION_VERTICAL) ## self.icon_view.set_selection_mode(gtk.SELECTION_SINGLE) ## self.icon_view.connect("selection-changed", self.on_select, model) ## self.icon_view.set_columns(1) # this isn't in the pygtk docs ## self.icon_view.set_item_width(-1) ## self.icon_view.set_size_request(72, -1) ## self.content_box = gtk.HBox(False) ## self.content_box.pack_start(self.icon_view, fill=True, expand=False) ## self.icon_view.select_path((0,)) # select a category, will create frame ## self.show_all() ## self.vbox.pack_start(self.content_box) ## self.resize(640, 480) ## self.show_all() ## def on_select(self, icon_view, model=None): ## selected = icon_view.get_selected_items() ## if len(selected) == 0: return ## i = selected[0][0] ## category = model[i][0] ## if self.current_frame is not None: ## self.content_box.remove(self.current_frame) ## self.current_frame.destroy() ## self.current_frame = None ## if category == "General": ## self.current_frame = self.create_general_frame() ## elif category == "Security": ## self.current_frame = self.create_security_frame() ## self.content_box.pack_end(self.current_frame, fill=True, expand=True) ## self.show_all() ## def create_general_frame(self): ## frame = gtk.Frame("General") ## box = gtk.VBox(False) ## box.pack_start(gtk.Label("Nothing to see here. Move on.")) ## frame.add(box) ## return frame ## def create_security_frame(self): ## frame = gtk.Frame("Security") ## box = gtk.VBox(False) ## box.pack_start(gtk.Label("Nothing to see here. Move on.")) ## frame.add(box) ## return frame from ConfigParser import RawConfigParser class _prefs(dict): def __init__(self, filename=default_prefs_file): self._filename = filename def init(self): ''' initialize the preferences, should only be called from app.main ''' # create directory tree of filename if it doesn't yet exist head, tail = os.path.split(self._filename) if not os.path.exists(head): os.makedirs(head) self.config = RawConfigParser() # set the version if the file doesn't exist if not os.path.exists(self._filename): self[config_version_pref] = config_version else: self.config.read(self._filename) version = self[config_version_pref] if version is None: warning('%s has no config version pref' % self._filename) warning('setting the config version to %s.%s' % (config_version)) self[config_version_pref] = config_version @staticmethod def _parse_key(name): index = name.rfind(".") return name[:index], name[index+1:] def get(self, key, default): ''' get value for key else return default ''' value = self[key] if value is None: return default return value def __getitem__(self, key): section, option = _prefs._parse_key(key) # this doesn't allow None values for preferences if not self.config.has_section(section) or \ not self.config.has_option(section, option): return None else: i = self.config.get(section, option) eval_chars = '{[(' if i[0] in eval_chars: # then the value is a dict, list or tuple return eval(i) elif i == 'True' or i == 'False': return eval(i) return i #return self.config.get(section, option) def iteritems(self): return [('%s.%s' % (section, name), value) for section in sorted(prefs.config.sections()) for name, value in prefs.config.items(section)] def __setitem__(self, key, value): section, option = _prefs._parse_key(key) if not self.config.has_section(section): self.config.add_section(section) self.config.set(section, option, str(value)) def __contains__(self, key): section, option = _prefs._parse_key(key) if self.config.has_section(section) and \ self.config.has_option(section, option): return True return False def save(self): try: f = open(self._filename, "w+") self.config.write(f) f.close() except Exception: msg = _("Bauble can't save your user preferences. \n\nPlease " "check the file permissions of your config file:\n %s" \ % self._filename) if bauble.gui is not None and bauble.gui.window is not None: utils.message_dialog(msg, type=gtk.MESSAGE_ERROR, parent=bauble.gui.window) # TODO: remember pane sizes # TODO: we need to include the meta table in the pref view class PrefsView(pluginmgr.View): """ The PrefsView displays the values of in the preferences and the registry. """ pane_size_pref = 'bauble.prefs.pane_position' def __init__(self): super(PrefsView, self).__init__() self.create_gui() # def create_registry_view(self): # pass def create_meta_view(self): pass def create_gui(self): pane = gtk.VPaned() self.pack_start(pane) pane.set_border_width(5) width, height = pane.size_request() # TODO: check-resize and move_handle are not the correct # signals when the pane is resized....so right now the size is # not getting saved in the prefs def on_move_handle(paned, data=None): print p.get_position() prefs[self.pane_size_pref] = p.get_position() pane.connect('check-resize', on_move_handle) if prefs.get(self.pane_size_pref, None) is not None: pane.set_position(prefs[self.pane_size_pref]) else: # setting the default to half the height of the window is # close enough to the middle even though the top pane will # be a little larger rect = bauble.gui.window.get_allocation() pane.set_position(int(rect.height/2)) label = gtk.Label() label.set_markup(_('Preferences')) label.set_padding(5, 0) frame = gtk.Frame() frame.set_label_widget(label) view = self.create_prefs_view() frame.add(view) pane.pack1(frame) label = gtk.Label() label.set_markup(_('Plugins')) label.set_padding(5, 0) frame = gtk.Frame() frame.set_label_widget(label) view = self.create_registry_view() frame.add(view) pane.pack2(frame) def create_tree(self, columns, itemsiter): treeview = gtk.TreeView() treeview.set_rules_hint(True) i = 0 model_cols = [] for c in columns: renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(c, renderer, text=i) treeview.append_column(column) i += 1 model_cols.append(str) model = gtk.ListStore(*model_cols) for item in itemsiter: model.append(item) treeview.set_model(model) sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sw.add(treeview) return sw def create_prefs_view(self): global prefs tree = self.create_tree([_('Names'), _('Values')], prefs.iteritems()) return tree def create_registry_view(self): #from bauble.pluginmgr import Registry from bauble.pluginmgr import PluginRegistry session = bauble.Session() plugins = session.query(PluginRegistry.name, PluginRegistry.version) tree = self.create_tree([_('Name'), _('Version')], plugins) session.close() return tree class PrefsCommandHandler(pluginmgr.CommandHandler): command = ('prefs', 'config') view = None def __call__(self, arg): pass def get_view(self): if self.view is None: self.view = PrefsView() return self.view pluginmgr.register_command(PrefsCommandHandler) prefs = _prefs() bauble-0.9.7/bauble/assistant.py0000755000175000017500000000017011210626427015622 0ustar brettbrett# # assistant.py # # Descriptions: use gtk.Assistant to create a new database wizard # # TODO: implement the assistant #bauble-0.9.7/bauble/__init__.py0000755000175000017500000002230611310567555015364 0ustar brettbrett# Copyright (c) 2005,2006,2007,2008 Brett Adams # This is free software, see GNU General Public License v2 for details. """ The top level module for Bauble. """ import imp, os, sys import bauble.paths as paths import bauble.i18n # major, minor, revision version tuple version = '0.9.7' # :bump version_tuple = version.split('.') def main_is_frozen(): """ Return True if we are running in a py2exe environment, else return False """ return (hasattr(sys, "frozen") or # new py2exe hasattr(sys, "importers") or # old py2exe imp.is_frozen("__main__")) # tools/freeze if main_is_frozen(): # main is frozen # put library.zip first in the path when using py2exe so libxml2 # gets imported correctly, zipfile = sys.path[-1] sys.path.insert(0, zipfile) # put the bundled gtk at the beginning of the path to make it the # preferred version os.environ['PATH'] = '%s%s%s%s%s%s' \ % (os.pathsep, os.path.join(paths.main_dir(), 'gtk', 'bin'), os.pathsep, os.path.join(paths.main_dir(), 'gtk', 'lib'), os.pathsep, os.environ['PATH']) # if not hasattr(gtk.Widget, 'set_tooltip_markup'): # msg = _('Bauble requires GTK+ version 2.12 or greater') # utils.message_dialog(msg, gtk.MESSAGE_ERROR) # sys.exit(1) # make sure we look in the lib path for modules sys.path.append(paths.lib_dir()) #sys.stderr.write('sys.path: %s\n' % sys.path) #sys.stderr.write('PATH: %s\n' % os.environ['PATH']) # set SQLAlchemy logging level import logging logging.getLogger('sqlalchemy').setLevel(logging.WARNING) Session = None # Session is set by bauble.db.open() gui = None default_icon = None conn_name = None import traceback import bauble.error as err def save_state(): """ Save the gui state and preferences. """ from bauble.prefs import prefs # in case we quit before the gui is created if gui is not None: gui.save_state() prefs.save() def quit(): """ Stop all tasks and quit Bauble. """ import gtk import bauble.task as task save_state() try: task._quit() gtk.main_quit() except RuntimeError: # in case main_quit is called before main sys.exit(1) def set_busy(busy): """ Set the interface to appear busy. """ import gtk.gdk if gui is None or gui.widgets.main_box is None: return # main_box is everything but the statusbar gui.widgets.main_box.set_sensitive(not busy) if busy: gui.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) else: gui.window.window.set_cursor(None) last_handler = None def command_handler(cmd, arg): """ Call a command handler. :param cmd: The name of the command to call :type cmd: str :param arg: The arg to pass to the command handler :type arg: list """ import gtk import bauble.utils as utils import bauble.pluginmgr as pluginmgr global last_handler handler_cls = None try: handler_cls = pluginmgr.commands[cmd] except KeyError, e: if cmd is None: utils.message_dialog(_('No default handler registered')) else: utils.message_dialog(_('No command handler for %s' % cmd)) return if not isinstance(last_handler, handler_cls): last_handler = handler_cls() handler_view = last_handler.get_view() if type(gui.get_view()) != type(handler_view) and handler_view: gui.set_view(handler_view) try: last_handler(arg) except Exception, e: utils.message_details_dialog(str(e), traceback.format_exc(), gtk.MESSAGE_ERROR) conn_default_pref = "conn.default" conn_list_pref = "conn.list" def main(uri=None): """ Initialize Bauble and start the main Bauble interface. """ # TODO: it would be nice to show a Tk dialog here saying we can't # import gtk...but then we would have to include all of the Tk libs in # with the win32 batteries-included installer try: import gtk, gobject except ImportError, e: print _('** Error: could not import gtk and/or gobject') print e if sys.platform == 'win32': print _('Please make sure that GTK_ROOT\\bin is in your PATH.') sys.exit(1) import gtk.gdk # setup glade internationalization import gtk.glade gtk.glade.bindtextdomain('bauble', paths.locale_dir()) gtk.glade.textdomain('bauble') import pygtk if not main_is_frozen(): pygtk.require("2.0") display = gtk.gdk.display_get_default() if display is None: print _("**Error: Bauble must be run in a windowed environment.") sys.exit(1) import bauble.pluginmgr as pluginmgr from bauble.prefs import prefs import bauble.utils as utils from bauble.utils.log import debug, warning, error # create the user directory if not os.path.exists(paths.user_dir()): os.makedirs(paths.user_dir()) # initialize threading gtk.gdk.threads_init() gtk.gdk.threads_enter() try: import bauble.db as db except Exception, e: utils.message_dialog(utils.xml_safe_utf8(e), gtk.MESSAGE_ERROR) sys.exit(1) # declare module level variables global gui, default_icon, conn_name default_icon = os.path.join(paths.lib_dir(), "images", "icon.svg") # intialize the user preferences prefs.init() open_exc = None # open default database if uri is None: from bauble.connmgr import ConnectionManager default_conn = prefs[conn_default_pref] while True: if uri is None or conn_name is None: cm = ConnectionManager(default_conn) conn_name, uri = cm.start() if conn_name is None: quit() try: if db.open(uri, True, True): prefs[conn_default_pref] = conn_name break else: uri = conn_name = None except err.VersionError, e: warning(e) db.open(uri, False) break except (err.EmptyDatabaseError, err.MetaTableError, err.VersionError, err.TimestampError, err.RegistryError), e: warning(e) open_exc = e # reopen without verification so that bauble.Session and # db.engine, db.metadata will be bound to an engine db.open(uri, False) break except err.DatabaseError, e: debug(e) #traceback.format_exc() open_exc = e #break except Exception, e: msg = _("Could not open connection.\n\n%s") % \ utils.xml_safe_utf8(e) utils.message_details_dialog(msg, traceback.format_exc(), gtk.MESSAGE_ERROR) uri = None else: db.open(uri, True, True) # make session available as a convenience to other modules global Session Session = db.Session # load the plugins pluginmgr.load() # save any changes made in the conn manager before anything else has # chance to crash prefs.save() # set the default command handler import bauble.view as view pluginmgr.commands[None] = view.DefaultCommandHandler # now that we have a connection create the gui, start before the plugins # are initialized in case they have to do anything like add a menu import bauble._gui as _gui gui = _gui.GUI() def _post_loop(): gtk.gdk.threads_enter() try: if isinstance(open_exc, err.DatabaseError): msg = _('Would you like to create a new Bauble database at ' \ 'the current connection?\n\nWarning: If there is '\ 'already a database at this connection any existing '\ 'data will be destroyed!') if utils.yes_no_dialog(msg, yes_delay=2): try: db.create() # db.create() creates all tables registered with # the default metadata so the pluginmgr should be # loaded after the database is created so we don't # inadvertantly create tables from the plugins pluginmgr.init() # set the default connection prefs[conn_default_pref] = conn_name except Exception, e: utils.message_details_dialog(utils.xml_safe_utf8(e), traceback.format_exc(), gtk.MESSAGE_ERROR) error(e) else: pluginmgr.init() except Exception, e: warning(traceback.format_exc()) warning(e) utils.message_dialog(utils.utf8(e), gtk.MESSAGE_WARNING) gtk.gdk.threads_leave() gobject.idle_add(_post_loop) gui.show() gtk.main() gtk.gdk.threads_leave() bauble-0.9.7/bauble/types.py0000755000175000017500000001044211302535314014754 0ustar brettbrett# # types.py # import datetime import re import sqlalchemy.types as types import sqlalchemy.exc as exc import bauble.error as error from bauble.utils.log import debug # TODO: should we allow custom date formats? # TODO: do date formats depend on locale # TODO: store all times as UTC or support timezones class EnumError(error.BaubleError): """Raised when a bad value is inserted or returned from the Enum type""" class Enum(types.TypeDecorator): """A database independent Enum type. The value is stored in the database as a Unicode string. """ impl = types.Unicode def __init__(self, values, empty_to_none=False, strict=True, **kwargs): """ @param values: A list of valid values for column. @param empty_to_none: Treat the empty string '' as None. None must be in the values list in order to set empty_to_none=True. @param strict: """ if values is None or len(values) is 0: raise EnumError(_('Enum requires a list of values')) if empty_to_none and None not in values: raise EnumError(_('You have configured empty_to_none=True but '\ 'None is not in the values lists')) self.values = values[:] self.strict = strict self.empty_to_none = empty_to_none # the length of the string/unicode column should be the # longest string in values size = max([len(v) for v in values if v is not None]) super(Enum, self).__init__(size, **kwargs) def process_bind_param(self, value, dialect): """ Process the value going into the database. """ if self.empty_to_none and value is '': value = None if value not in self.values: raise EnumError(_('"%s" not in Enum.values: %s') % \ (value, self.values)) return value def process_result_value(self, value, dialect): """ Process the value returned from the database. """ #if self.strict and value not in self.values: # raise ValueError(_('"%s" not in Enum.values') % value) return value def copy(self): return Enum(self.values, self.empty_to_none, self.strict) class tzinfo(datetime.tzinfo): """ A tzinfo object that can handle timezones in the format -HH:MM or +HH:MM """ def __init__(self, name): super(tzinfo, self).__init__() self._tzname = name hours, minutes = [int(v) for v in name.split(':')] self._utcoffset = datetime.timedelta(hours=hours, minutes=minutes) def tzname(self): return self._tzname def utcoffset(self, dt): return self._utcoffset class DateTime(types.TypeDecorator): """ A DateTime type that allows strings """ impl = types.DateTime import re _rx_tz = re.compile('[+-]') def process_bind_param(self, value, dialect): # TODO: what about microseconds if not isinstance(value, basestring): return value date, time = value.split(' ') timezone = None match = self._rx_tz.search(time) if match: timezone = tzinfo(time[match.start():]) time = time[0:match.start()] h, mi, s = time.split(':') ms = 0 if '.' in s: s, ms = s.split('.') # microseconds y, mo, d = date.split('-') args = [int(v) for v in (y, mo, d, h, mi, s, ms)] args.append(timezone) return datetime.datetime(*args) return value def process_result_value(self, value, dialect): return value def copy(self): return DateTime() class Date(types.TypeDecorator): """ A Date type that allows Date strings """ impl = types.Date def process_bind_param(self, value, dialect): if not isinstance(value, basestring): return value if ' ' in value: date, time = value.split(' ') warning('bauble.Date.process_bind_param(): truncating %s to %s' \ % (value, date)) else: date = value y, mo, d = date.split('-') return datetime.datetime(*map(int, (y, mo, d))) def process_result_value(self, value, dialect): return value def copy(self): return Date() bauble-0.9.7/bauble/test/0000755000175000017500000000000011310570250014206 5ustar brettbrettbauble-0.9.7/bauble/test/test_meta.py0000644000175000017500000000235111210626427016555 0ustar brettbrett# # test for bauble.meta # import bauble.meta as meta from bauble.test import BaubleTestCase class MetaTests(BaubleTestCase): def __init__(self, *args): super(MetaTests, self).__init__(*args) def test_get_default(self): """ Test bauble.meta.get_default() """ # test the object isn't created if it doesn't exist and we # don't pass a default value name = u'name' obj = meta.get_default(name) self.assert_(obj is None) # test that the obj is created if it doesn't exists and that # the default value is set value = u'value' meta.get_default(name, default=value) obj = self.session.query(meta.BaubleMeta).filter_by(name=name).one() self.assert_(obj.value == value) # test that the value isn't changed if it already exists value2 = u'value2' obj = meta.get_default(name, default=value2) self.assert_(obj.value == value) # test that if we pass our own session when we are creating a # new value that the object is added to the session but not committed obj = meta.get_default(u'name2', default=value, session=self.session) self.assert_(obj in self.session.new) bauble-0.9.7/bauble/test/test_view.py0000644000175000017500000002743311220474450016607 0ustar brettbrett# # test_view.py # import os import sys import unittest from sqlalchemy import * import bauble import bauble.db as db from bauble.view import SearchParser from bauble.utils.pyparsing import * from bauble.view import SearchView, MapperSearch, ResultSet from bauble.utils.log import debug from bauble.test import BaubleTestCase # TODO: allow AND and OR in possible values, especially so we can do... # species where genus.family=='Orchidaceae' and accessions.acc_status!='Dead' # TODO: this also means that we need to somehow support != as well as = which # means we need to include the operator in the parse instead of just # suppressing parser = SearchParser() # TODO: should we make these search tests independent of any plugins, # we could use setup() to initialize a custom MapperSearch instead of # expecting a plugin to set it up class SearchParserTests(unittest.TestCase): def test_query_expression_token(self): s = 'domain where col=value' #debug(s) tokens = parser.query.parseString(s) #debug(tokens) s = 'domain where relation.col=value' tokens = parser.query.parseString(s) #debug(tokens) s = 'domain where relation.relation.col=value' tokens = parser.query.parseString(s) #debug(tokens) s = 'domain where relation.relation.col=value and col2=value2' tokens = parser.query.parseString(s) #debug(tokens) def test_statement_token(self): pass def test_domain_expression_token(self): """ Test the domain_expression token """ # allow dom=val1, val2, val3 s = 'domain=test' expected = ['domain', '=', 'test'] tokens = parser.domain_expression.parseString(s, parseAll=True) def breakup(tokens): domain, op, values = tokens values = list(values) return [domain, op, values] s = 'domain==test' expected = ['domain', '==', ['test']] tokens = parser.domain_expression.parseString(s, parseAll=True) self.assert_(breakup(tokens)==expected, self.error_msg(s, breakup(tokens), expected)) s = 'domain=test1 test2 test3' expected = ['domain', '=', ['test1', 'test2', 'test3']] tokens = parser.domain_expression.parseString(s, parseAll=True) self.assert_(breakup(tokens)==expected, self.error_msg(s, breakup(tokens), expected)) s = 'domain=test1 "test2 test3" test4' expected = ['domain', '=', ['test1', 'test2 test3', 'test4']] tokens = parser.domain_expression.parseString(s, parseAll=True) self.assert_(breakup(tokens)==expected, self.error_msg(s, breakup(tokens), expected)) s = 'domain="test test"' expected = ['domain', '=', ['test test']] tokens = parser.domain_expression.parseString(s, parseAll=True) self.assert_(breakup(tokens)==expected, self.error_msg(s, breakup(tokens), expected)) s = 'domain=*' expected = ['domain', '=', '*'] tokens = parser.domain_expression.parseString(s, parseAll=True) self.assert_(list(tokens) == expected, self.error_msg(s, tokens, expected)) def test_value_token(self): """ Test the value token """ strings = ['test', '"test"', "'test'"] expected = ['test'] for s in strings: tokens = parser.value.parseString(s, parseAll=True) self.assert_(list(tokens) == ['test'], self.error_msg(s, tokens, expected)) strings = ['"test1 test2"', "'test1 test2'"] expected = ['test1 test2'] for s in strings: tokens = parser.value.parseString(s, parseAll=True) self.assert_(list(tokens) == expected, self.error_msg(s, tokens, expected)) strings = ['%.-_*', '"%.-_*"'] expected = ['%.-_*'] for s in strings: tokens = parser.value.parseString(s, parseAll=True) self.assert_(list(tokens) == expected, self.error_msg(s, tokens, expected)) # these should be invalid strings = ['test test', '"test', "test'", '$',] for s in strings: try: tokens = parser.value.parseString(s, parseAll=True) except ParseException, e: pass else: self.fail('ParseException not raised: "%s" - %s' \ % (s, tokens)) error_msg = lambda me, s, v, e: '%s: %s == %s' % (s, v, e) def test_value_list_token(self): """ Test the value_list token """ strings = ['test', '"test"', "'test'"] expected = ['test'] for s in strings: tokens = parser.value_list.parseString(s, parseAll=True) self.assert_(list(tokens) == expected, self.error_msg(s, tokens, expected)) strings = ['test1, test2', '"test1", test2', "test1, 'test2'"] expected = ['test1', 'test2'] for s in strings: tokens = parser.value_list.parseString(s, parseAll=True) self.assert_(list(tokens)==expected, self.error_msg(s, tokens, expected)) strings = ['test1 test2 test3', '"test1" test2 \'test3\''] expected = ['test1', 'test2', 'test3'] for s in strings: tokens = parser.value_list.parseString(s, parseAll=True) self.assert_(list(tokens) == expected, self.error_msg(s, tokens, expected)) strings = ['"test1 test2", test3'] expected = ['test1 test2', 'test3'] for s in strings: tokens = parser.value_list.parseString(s, parseAll=True) self.assert_(list(tokens) == expected, self.error_msg(s, tokens, expected)) # these should be invalid strings = ['"test', "test'", "'test tes2"] for s in strings: try: tokens = parser.value_list.parseString(s, parseAll=True) except ParseException, e: pass else: self.fail('ParseException not raised: "%s" - %s' \ % (s, tokens)) class SearchTests(BaubleTestCase): def __init__(self, *args): super(SearchTests, self).__init__(*args) def setUp(self): super(SearchTests, self).setUp() def tearDown(self): super(SearchTests, self).tearDown() def test_result_set(self): # TODO: This doesn't really do anything at the moment, i # started writing it to test out slicing with the ResultSet # TODO: test the ResultSet(somelist) and # ResultSet().add(somelist) are the same return from bauble.plugins.plants.family import Family ids = xrange(1,1000) table = Family.__table__ values = [] for i in ids: values.append({'id': i, 'family': u'%s' % i}) db.engine.execute(table.insert(), values) view = SearchView() mapper_search = view.search_strategies[0] result = mapper_search.search('fam=*', self.session) #debug('list') for v in result: pass #debug('done') def test_search_by_values(self): """ Test searching by values with MapperSearch This test does not test that of the plugins setup their search properly, it only tests the MapperSearch works as expected """ from bauble.plugins.plants.family import Family from bauble.plugins.plants.genus import Genus view = SearchView() family = Family(family=u'family') genus = Genus(family=family, genus=u'genus') self.session.add_all([family, genus]) self.session.commit() mapper_search = view.search_strategies[0] self.assert_(isinstance(mapper_search, MapperSearch)) # search for family by family name results = mapper_search.search('family', self.session) f = list(results)[0] self.assert_(isinstance(f, Family) and f.id==family.id) # search for genus by genus name results = mapper_search.search('genus', self.session) g = list(results)[0] self.assert_(isinstance(g, Genus) and g.id==genus.id) def test_search_by_expression(self): """ Test searching by expression with MapperSearch This test does not test that of the plugins setup their search properly, it only tests the MapperSearch works as expected """ from bauble.plugins.plants.family import Family from bauble.plugins.plants.genus import Genus view = SearchView() family = Family(family=u'family') genus = Genus(family=family, genus=u'genus') self.session.add_all([family, genus]) self.session.commit() mapper_search = view.search_strategies[0] self.assert_(isinstance(mapper_search, MapperSearch)) # search for family by domain results = mapper_search.search('fam=family', self.session) f = list(results)[0] self.assert_(isinstance(f, Family) and f.id==family.id) # search for genus by domain results = mapper_search.search('gen=genus', self.session) g = list(results)[0] self.assert_(isinstance(g, Genus) and g.id==genus.id) def test_search_by_query(self): """ Test searching by expression with MapperSearch This test does not test that of the plugins setup their search properly, it only tests the MapperSearch works as expected """ from bauble.plugins.plants.family import Family from bauble.plugins.plants.genus import Genus view = SearchView() family = Family(family=u'family') family2 = Family(family=u'family2') genus = Genus(family=family, genus=u'genus') genus2 = Genus(family=family2, genus=u'genus2') self.session.add_all([family, family2, genus, genus2]) self.session.commit() mapper_search = view.search_strategies[0] self.assert_(isinstance(mapper_search, MapperSearch)) # search cls.column results = mapper_search.search('fam where family=family', self.session) f = list(results)[0] self.assert_(isinstance(f, Family) and f.id==family.id) # search cls.parent.column results = mapper_search.search('genus where family.family=family', self.session) g = list(results)[0] self.assert_(results.count() == 1 and isinstance(g, Genus) \ and g.id==genus.id, [str(o) for o in list(results)]) # search cls.children.column results = mapper_search.search('family where genera.genus=genus', self.session) f = list(results)[0] self.assert_(results.count() == 1 and isinstance(f, Family) \ and f.id==family.id) # search with multiple conditions and'ed together #debug('--------') f3 = Family(family=u'fam3') g3 = Genus(family=f3, genus=u'genus2') self.session.add_all([f3, g3]) self.session.commit() s = 'genus where genus=genus2 and family.family=fam3' results = mapper_search.search(s, self.session) g = list(results)[0] self.assert_(results.count() == 1 and isinstance(g, Genus) \ and g.id==g3.id) # search with or conditions g4 = Genus(family=f3, genus=u'genus4') self.session.add(g4) self.session.commit() s = 'genus where genus=genus2 or genus=genus' results = mapper_search.search(s, self.session) self.assert_(results.count() == 3) self.assert_(sorted([r.id for r in results]) \ == [g.id for g in (genus, genus2, g3)]) bauble-0.9.7/bauble/test/test_pluginmgr.py0000644000175000017500000001141611210626427017635 0ustar brettbrett# # test_pluginmgr.py # import os import sys import unittest from sqlalchemy import * import bauble import bauble.db as db from bauble.view import SearchParser from bauble.utils.pyparsing import * from bauble.view import SearchView, MapperSearch, ResultSet from bauble.utils.log import debug, error from bauble.test import BaubleTestCase, uri import bauble.pluginmgr as pluginmgr from bauble.pluginmgr import PluginRegistry # TODO: need tests for # 1. what happens when a plugin is in the plugins dict but not the registry # 2. what happens when a plugin has an error on init() # 3. what happens when a plugin has an error on install() # 4. what happens when a plugin is in the registry but not in plugins class A(pluginmgr.Plugin): initialized = False installed = False @classmethod def init(cls): cls.initialized = True @classmethod def install(cls, *args, **kwargs): cls.installed = True class B(pluginmgr.Plugin): depends = ['A'] initialized = False installed = False @classmethod def init(cls): assert A.initialized and not C.initialized, \ '%s, %s' % (A.initialized, C.instalialized) cls.initialized = True @classmethod def install(cls, *args, **kwargs): assert A.installed and not C.installed, \ '%s, %s' % (A.installed, C.installed) cls.installed = True class C(pluginmgr.Plugin): depends = ['B'] initialized = False installed = False @classmethod def init(cls): assert A.initialized and B.initialized cls.initialized = True @classmethod def install(cls, *args, **kwargs): assert A.installed and B.installed cls.installed = True class PluginMgrTests(BaubleTestCase): def test_install(self): """ Test importing default data from plugin """ # this emulates the PlantsPlugin install() method but only # imports the family.txt file...if PlantsPlugin.install() # changes we should change this method as well class Dummy(pluginmgr.Plugin): @classmethod def init(cls): pass @classmethod def install(cls, import_defaults=True): import bauble.paths as paths if not import_defaults: return path = os.path.join(paths.lib_dir(), "plugins", "plants", "default") filenames = os.path.join(path, 'family.txt') from bauble.plugins.imex.csv_ import CSVImporter csv = CSVImporter() try: csv.start([filenames], metadata=db.metadata, force=True) except Exception, e: error(e) raise from bauble.plugins.plants import Family self.assert_(self.session.query(Family).count() == 511) pluginmgr.plugins[Dummy.__name__] = Dummy pluginmgr.install([Dummy]) class StandalonePluginMgrTests(unittest.TestCase): def setUp(self): A.initialized = A.installed = False B.initialized = B.installed = False C.initialized = C.installed = False def tearDown(self): A.initialized = A.installed = False B.initialized = B.installed = False C.initialized = C.installed = False def test_command_handler(self): """ Test that the command handlers get properly registered...this could probably just be included in test_init() """ pass def test_init(self): """ Test bauble.pluginmgr.init() """ db.open(uri, verify=False) db.create(False) bauble.pluginmgr.plugins[C.__name__] = C bauble.pluginmgr.plugins[B.__name__] = B bauble.pluginmgr.plugins[A.__name__] = A bauble.pluginmgr.init(force=True) self.assert_(A.initialized and B.initialized and C.initialized) # def test_install(self): # """ # Test bauble.pluginmgr.install() # """ # bauble.pluginmgr.plugins[C.__name__] = C # bauble.pluginmgr.plugins[B.__name__] = B # bauble.pluginmgr.plugins[A.__name__] = A # db.open(uri, verify=False) # db.create(False) # #bauble.pluginmgr.install((A, B, C), force=True) # self.assert_(A.installed and B.installed and C.installed) class PluginRegistryTests(BaubleTestCase): def test_registry(self): """ Test bauble.pluginmgr.PluginRegistry """ # test that adding works PluginRegistry.add(A) self.assert_(PluginRegistry.exists(A)) # test that removing works PluginRegistry.remove(A) self.assert_(not PluginRegistry.exists(A)) bauble-0.9.7/bauble/test/__init__.py0000644000175000017500000000237611255224461016337 0ustar brettbrettimport sys import unittest import bauble import bauble.db as db from bauble.prefs import prefs import bauble.pluginmgr as pluginmgr uri = 'sqlite:///:memory:' #uri = 'postgres://postgres:4postgres*@localhost/test' def init_bauble(uri): try: db.open(uri, verify=False) except Exception, e: print >>sys.stderr, e #debug e prefs.init() pluginmgr.load() #print >>sys.stderr, 'init_bauble()' db.create(False) pluginmgr.init(True) class BaubleTestCase(unittest.TestCase): def setUp(self): assert uri is not None, "The database URI is not set" init_bauble(uri) self.session = bauble.Session() def set_logging_level(self, level, logger='sqlalchemy'): logging.getLogger('sqlalchemy').setLevel(level) def tearDown(self): #print >>sys.stderr, 'teardown' self.session.close() #print >>sys.stderr, 'BaubleTestCase.tearDown()' db.metadata.drop_all(bind=db.engine) bauble.pluginmgr.commands.clear() # why do we create the database again...? #db.create(False) pluginmgr.plugins.clear() #print >>sys.stderr, ' done' #db.engine.contextual_connect().close() #db.engine.close() #db.engine.close() bauble-0.9.7/bauble/test/test_bauble.py0000644000175000017500000000510511234566775017100 0ustar brettbrett# # test_bauble.py # import os import sys import unittest import datetime from sqlalchemy import * import bauble import bauble.db as db from bauble.types import Enum from bauble.utils.log import debug from bauble.view import SearchParser from bauble.utils.pyparsing import * from bauble.test import BaubleTestCase import bauble.meta as meta """ Tests for the main bauble module. """ class BaubleTests(BaubleTestCase): def test_enum_type(self): """ Test bauble.types.Enum """ class Test(db.Base): __tablename__ = '_enumtest' id = Column(Integer, primary_key=True) value = Column(Enum(values=['1', '2', '']), default=u'') table = Test.__table__ table.create(bind=db.engine) # t = Test(id=1) # self.session.add(t) # self.session.commit() db.engine.execute(table.insert(), {"id": 1}) #debug(t.value) table.drop(bind=db.engine) def test_date_type(self): """ Test bauble.types.Date """ pass def test_datetime_type(self): """ Test bauble.types.DateTime """ dt = bauble.types.DateTime() # with negative timezone s = '2008-12-1 11:50:01.001-05:00' result = '2008-12-01 11:50:01.000001-05:00' v = dt.process_bind_param(s, None) self.assert_(v.isoformat(' ') == result) # test with positive timezone s = '2008-12-1 11:50:01.001+05:00' result = '2008-12-01 11:50:01.000001+05:00' v = dt.process_bind_param(s, None) self.assert_(v.isoformat(' ') == result) # test with no timezone s = '2008-12-1 11:50:01.001' result = '2008-12-01 11:50:01.000001' v = dt.process_bind_param(s, None) self.assert_(v.isoformat(' ') == result) # test with no milliseconds s = '2008-12-1 11:50:01' result = '2008-12-01 11:50:01' v = dt.process_bind_param(s, None) self.assert_(v.isoformat(' ') == result) def test_base_table(self): """ Test db.Base is setup correctly """ m = meta.BaubleMeta(name=u'name', value=u'value') table = m.__table__ self.session.add(m) m = self.session.query(meta.BaubleMeta).first() # test that _created and _last_updated were created correctly self.assert_(hasattr(m, '_created') \ and isinstance(m._created, datetime.datetime)) self.assert_(hasattr(m, '_last_updated') \ and isinstance(m._last_updated, datetime.datetime)) bauble-0.9.7/bauble/connmgr.py0000755000175000017500000005733111230171341015257 0ustar brettbrett# # connmgr.py # """ The connection manager provides a GUI for creating and opening connections. This is the first thing displayed when Bauble starts. """ import os import copy import traceback import gtk from sqlalchemy import * import bauble.utils as utils from bauble.error import check, CheckConditionError import bauble import bauble.paths as paths from bauble.prefs import prefs from bauble.utils.log import log, debug, warning # TODO: make the border red for anything the user changes so # they know if something has changed and needs to be saved, or maybe # a red line should indicate that the value are valid, i.e. the name # is in the wrong format, or better just don't the allow the user to leave the # entry until whatever is there is an the correct format # TODO: when you start and there are no connections defined then make the user # create a connection or at least inform them # TODO: should redo this to use a model view presenter pattern like the new # editors, makes it easier to handle things like status on the entries # TODO: allow connecting to a database first to see if the database even, # exists will probably have to connected using python's dbapi first and # if the database doesn't exist then we can create it, set some permissions, # close the connection and then open it using SQLAlchemy class ConnectionManager: """ The main class that starts the connection manager GUI. """ def _get_working_dbtypes(self, retry=False): """ get for self.working_dbtypes property this sets self._working_dbtypes to a dictionary where the keys are the database names and the values are the index in the connectiona manager's database types """ if self._working_dbtypes != [] and not retry: return self._working_dbtypes self._working_dbtypes = [] try: try: import pysqlite2 except Exception: import sqlite3 self._working_dbtypes.append('SQLite') except ImportError, e: warning('ConnectionManager: %s' % e) try: import psycopg2 self._working_dbtypes.append('Postgres') except ImportError, e: warning('ConnectionManager: %s' % e) try: import MySQLdb self._working_dbtypes.append('MySQL') except ImportError, e: warning('ConnectionManager: %s' % e) return self._working_dbtypes _dbtypes = ['SQLite', 'Postgres', 'MySQL'] # a list of dbtypes that are importable working_dbtypes = property(_get_working_dbtypes) _working_dbtypes = [] def __init__(self, default=None): """ @param default: the name of the connection to select from the list of connection names """ self.default_name = default self.current_name = None # old_params is used to cache the parameter values for when the param # box changes but we want to keep the values, e.g. when the type # changes self.old_params = {} def start(self): """ Show the connection manager. """ self.create_gui() self.dialog.connect('response', self.on_dialog_response) self.dialog.connect('close', self.on_dialog_close_or_delete) self.dialog.connect('delete-event', self.on_dialog_close_or_delete) conn_list = prefs[bauble.conn_list_pref] if conn_list is None or len(conn_list.keys()) == 0: msg = _('You don\'t have any connections in your connection '\ 'list.\nClose this message and click on "Add" to create '\ 'a new connection.') utils.message_dialog(msg) else: self.set_active_connection_by_name(self.default_name) self._dirty = False self._error = True name = None uri = None while name is None or self._error: response = self.dialog.run() if response == gtk.RESPONSE_OK: name = self._get_connection_name() uri = self._get_connection_uri() if name is None: msg = _('You have to choose or create a new connection ' \ 'before you can connect to the database.') utils.message_dialog(msg) else: name = uri = None break # have to remove the cell_data_func to avoid a cyclical # reference which would cause the ConnectionManager to not get # garbage collected cell = self.type_combo.get_cells()[0] self.type_combo.set_cell_data_func(cell, None) self.type_combo.clear() self.name_combo.clear() self.dialog.destroy() return name, uri def on_dialog_response(self, dialog, response, data=None): """ """ self._error = False if response == gtk.RESPONSE_OK: settings = self.params_box.get_prefs() dbtype = self.widgets.type_combo.get_active_text() if dbtype == 'SQLite': filename = settings['file'] if not os.path.exists(filename): path, f = os.path.split(filename) if not os.access(path, os.R_OK): self._error = True msg = _("Bauble does not have permission to "\ "read the directory:\n\n%s") % path utils.message_dialog(msg, gtk.MESSAGE_ERROR) elif not os.access(path, os.W_OK): self._error = True msg = _("Bauble does not have permission to "\ "write to the directory:\n\n%s") % path utils.message_dialog(msg, gtk.MESSAGE_ERROR) elif not os.access(filename, os.R_OK): self._error = True msg = _("Bauble does not have permission to read the "\ "database file:\n\n%s") % filename utils.message_dialog(msg, gtk.MESSAGE_ERROR) elif not os.access(filename, os.W_OK): self._error = True msg = _("Bauble does not have permission to "\ "write to the database file:\n\n%s") % filename utils.message_dialog(msg, gtk.MESSAGE_ERROR) if not self._error: self.save_current_to_prefs() elif response == gtk.RESPONSE_CANCEL or \ response == gtk.RESPONSE_DELETE_EVENT: if not self.compare_prefs_to_saved(self.current_name): msg = _("Do you want to save your changes?") if utils.yes_no_dialog(msg): self.save_current_to_prefs() # system-defined GtkDialog responses are always negative, in which # case we want to hide it if response < 0: dialog.hide() #dialog.emit_stop_by_name('response') return response def on_dialog_close_or_delete(self, widget, event=None): self.dialog.hide() return True def create_gui(self): if self.working_dbtypes is None or len(self.working_dbtypes) == 0: msg = _("No Python database connectors installed.\n"\ "Please consult the documentation for the "\ "prerequesites for installing Bauble.") utils.message_dialog(msg, gtk.MESSAGE_ERROR) raise Exception(msg) glade_path = os.path.join(paths.lib_dir(), "connmgr.glade") self.widgets = utils.GladeWidgets(glade_path) self.dialog = self.widgets.main_dialog try: pixbuf = gtk.gdk.pixbuf_new_from_file(bauble.default_icon) self.dialog.set_icon(pixbuf) except Exception, e: utils.message_details_dialog(_('Could not load icon from %s' % \ bauble.default_icon), traceback.format_exc(), gtk.MESSAGE_ERROR) if bauble.gui is not None and bauble.gui.window is not None: self.dialog.set_transient_for(bauble.gui.window) if not bauble.gui.window.get_property('visible'): self.dialog.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) self.dialog.set_property('skip-taskbar-hint', False) handlers = {'on_add_button_clicked': self.on_add_button_clicked, 'on_remove_button_clicked': self.on_remove_button_clicked, } self.widgets.signal_autoconnect(handlers) # set the logo image manually, its hard to depend on glade to # get this right since the image paths may change logo = self.widgets.logo_image logo_path = os.path.join(paths.lib_dir(), "images", "bauble_logo.png") logo.set_from_file(logo_path) self.params_box = None self.expander_box = self.widgets.expander_box # setup the type combo self.type_combo = self.widgets.type_combo def type_combo_cell_data_func(combo, renderer, model, iter, data=None): """ if the database type is not in self.working_dbtypes then make it not sensitive """ dbtype = model[iter][0] sensitive = dbtype in self.working_dbtypes renderer.set_property('sensitive', sensitive) renderer.set_property('text', dbtype) utils.setup_text_combobox(self.type_combo, self._dbtypes, type_combo_cell_data_func) self.type_combo.connect("changed", self.on_changed_type_combo) # setup the name combo self.name_combo = self.widgets.name_combo utils.setup_text_combobox(self.name_combo) self.name_combo.connect("changed", self.on_changed_name_combo) self.dialog.set_focus(self.widgets.connect_button) def set_active_connection_by_name(self, name): """ sets the name of the connection in the name combo, this causes on_changed_name_combo to be fired which changes the param box type and set the connection parameters """ check(hasattr(self, "name_combo")) i = 0 active = 0 conn_list = prefs[bauble.conn_list_pref] if conn_list is None: return for conn in conn_list: self.name_combo.insert_text(i, conn) if conn == name: active = i i += 1 self.name_combo.set_active(active) def remove_connection(self, name): """ if we restrict the user to only removing the current connection then it saves us the trouble of having to iter through the model """ conn_list = prefs[bauble.conn_list_pref] if name in conn_list:#conn_list.has_key(name): del conn_list[name] prefs[bauble.conn_list_pref] = conn_list model = self.name_combo.get_model() for i in range(0, len(model)): row = model[i][0] if row == name: self.name_combo.remove_text(i) break def on_remove_button_clicked(self, button, data=None): """ remove the connection from connection list, this does not affect the database or it's data """ msg = _('Are you sure you want to remove "%s"?\n\n' \ 'Note: This only removes the connection to the database '\ 'and does not affect the database or it\'s data') \ % self.current_name if not utils.yes_no_dialog(msg): return self.current_name = None self.remove_connection(self.name_combo.get_active_text()) self.name_combo.set_active(0) def on_add_button_clicked(self, button, data=None): d = gtk.Dialog(_("Enter a connection name"), self.dialog, gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) d.set_default_response(gtk.RESPONSE_ACCEPT) d.set_default_size(250,-1) entry = gtk.Entry() entry.connect("activate", lambda entry: d.response(gtk.RESPONSE_ACCEPT)) d.vbox.pack_start(entry) d.show_all() d.run() name = entry.get_text() d.destroy() if name is not '': self.name_combo.prepend_text(name) expander = self.widgets.expander.set_expanded(True) self.name_combo.set_active(0) # TODO: # if sqlite.is_supported then sqlite, else set_active(0) #self.type_combo.set_active(0) ## def set_info_label(self, msg=_("Choose a connection")): ## self.info_label.set_text(msg) def save_current_to_prefs(self): """ save connection parameters from the widgets in the prefs """ if self.current_name is None: return if bauble.conn_list_pref not in prefs: prefs[bauble.conn_list_pref] = {} settings = copy.copy(self.params_box.get_prefs()) settings["type"] = self.type_combo.get_active_text() conn_list = prefs[bauble.conn_list_pref] if conn_list is None: conn_list = {} conn_list[self.current_name] = settings prefs[bauble.conn_list_pref] = conn_list prefs.save() def compare_prefs_to_saved(self, name): """ name is the name of the connection in the prefs """ if name is None: # in case no name selected, can happen on first run return True conn_list = prefs[bauble.conn_list_pref] if conn_list is None or name not in conn_list: return False stored_params = conn_list[name] params = copy.copy(self.params_box.get_prefs()) params["type"] = self.type_combo.get_active_text() return params == stored_params def on_changed_name_combo(self, combo, data=None): """ the name changed so fill in everything else """ name = combo.get_active_text() if name is None: return conn_list = prefs[bauble.conn_list_pref] if self.current_name is not None: if self.current_name not in conn_list: msg = _("Do you want to save %s?") % self.current_name if utils.yes_no_dialog(msg): self.save_current_to_prefs() else: self.remove_connection(self.current_name) #combo.set_active_iter(active_iter) self.current_name = None elif not self.compare_prefs_to_saved(self.current_name): msg = _("Do you want to save your changes to %s ?") \ % self.current_name if utils.yes_no_dialog(msg): self.save_current_to_prefs() if conn_list is not None and name in conn_list: conn = conn_list[name] self.type_combo.set_active(self._dbtypes.index(conn["type"])) self.params_box.refresh_view(conn_list[name]) else: # this is for new connections self.type_combo.set_active(0) self.type_combo.emit("changed") # in case 0 was already active self.current_name = name self.old_params.clear() def on_changed_type_combo(self, combo, data=None): """ the type changed so change the params_box """ if self.params_box is not None: self.old_params.update(self.params_box.get_parameters()) self.expander_box.remove(self.params_box) dbtype = combo.get_active_text() if dbtype == None: self.params_box = None return sensitive = dbtype in self._working_dbtypes self.widgets.connect_button.set_sensitive(sensitive) # get parameters box for the dbtype self.params_box = CMParamsBoxFactory.createParamsBox(dbtype, self) # if the type changed but is the same type of the connection # in the name entry then set the prefs conn_list = prefs[bauble.conn_list_pref] if conn_list is not None: name = self.name_combo.get_active_text() if name in conn_list: self.params_box.refresh_view(conn_list[name]) elif len(self.old_params.keys()) != 0: self.params_box.refresh_view(self.old_params) self.expander_box.pack_start(self.params_box, False, False) self.dialog.show_all() def get_passwd(self, title=_("Enter your password"), before_main=False): """ show a dialog with and entry and returh the value entered """ # TODO: if self.dialog is None then ask from the command line # or just set dialog parent to None d = gtk.Dialog(title, self.dialog, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) d.set_gravity(gtk.gdk.GRAVITY_CENTER) d.set_position(gtk.WIN_POS_CENTER) d.set_default_response(gtk.RESPONSE_ACCEPT) d.set_default_size(250,-1) entry = gtk.Entry() entry.set_visibility(False) entry.connect("activate", lambda entry: d.response(gtk.RESPONSE_ACCEPT)) d.vbox.pack_start(entry) d.show_all() d.run() passwd = entry.get_text() d.destroy() return passwd def parameters_to_uri(self, params): """ return connections paramaters as a uri """ import copy subs = copy.copy(params) if params['type'].lower() == "sqlite": filename = params['file'].replace('\\', '/') uri = "sqlite:///" + filename return uri subs['type'] = params['type'].lower() template = "%(type)s://%(user)s@%(host)s/%(db)s" if params["passwd"] == True: subs["passwd"] = self.get_passwd() template = "%(type)s://%(user)s:%(passwd)s@%(host)s/%(db)s" return template % subs def _get_connection_uri(self): type = self.type_combo.get_active_text() # no db has been selected, this can happen on first run if self.params_box is None: return None params = copy.copy(self.params_box.get_parameters()) params['type'] = type.lower() return self.parameters_to_uri(params) def _get_connection_name(self): return self.current_name def check_parameters_valid(self): """ check that all of the information in the current connection is valid and return true or false NOTE: this was meant to be used to implement an eclipse style information box at the top of the dialog but it's not really used right now """ if self.name_combo.get_active_text() == "": return False, _("Please choose a name for this connection") params = self.params_box if params["user"] == "": return False, _("Please choose a user name for this connection") class CMParamsBox(gtk.Table): def __init__(self, conn_mgr, rows=4, columns=2): gtk.Table.__init__(self, rows, columns) self.set_row_spacings(10) self.create_gui() # create a weak reference to the connection manager to avoid a # cyclical reference which would prevent it from being garbage # collected import weakref self.conn_mgr_ref = weakref.ref(conn_mgr) def create_gui(self): label_alignment = (0.0, 0.5) label = gtk.Label(_("Database: ")) label.set_alignment(*label_alignment) self.attach(label, 0, 1, 0, 1) self.db_entry = gtk.Entry() self.attach(self.db_entry, 1, 2, 0, 1) label = gtk.Label(_("Host: ")) label.set_alignment(*label_alignment) self.attach(label, 0, 1, 1, 2) self.host_entry = gtk.Entry() self.host_entry.set_text("localhost") self.attach(self.host_entry, 1, 2, 1, 2) label = gtk.Label(_("User: ")) label.set_alignment(*label_alignment) self.attach(label, 0, 1, 2, 3) self.user_entry = gtk.Entry() self.attach(self.user_entry, 1, 2, 2, 3) label = gtk.Label(_("Password: ")) label.set_alignment(*label_alignment) self.attach(label, 0, 1, 3, 4) self.passwd_check = gtk.CheckButton() self.attach(self.passwd_check, 1, 2, 3, 4) def get_prefs(self): """ see get_prefs """ return self.get_parameters() def get_parameters(self): """ return only those preferences that are used to build the connection uri """ d = {} d["db"] = self.db_entry.get_text() d["host"] = self.host_entry.get_text() d["user"] = self.user_entry.get_text() d["passwd"] = self.passwd_check.get_active() return d def refresh_view(self, prefs): """ refresh the widget values from prefs """ try: self.db_entry.set_text(prefs["db"]) self.host_entry.set_text(prefs["host"]) self.user_entry.set_text(prefs["user"]) self.passwd_check.set_active(prefs["passwd"]) except KeyError, e: debug('KeyError: %s' % e) #debug(traceback.format_exc()) class SQLiteParamsBox(CMParamsBox): def __init__(self, conn_mgr): CMParamsBox.__init__(self, conn_mgr, rows=1, columns=2) def create_gui(self): self.default_check = gtk.CheckButton(_('Use default filename')) self.attach(self.default_check, 0, 2, 0, 1) self.default_check.connect('toggled', lambda button: \ self.file_box.set_sensitive(not button.get_active())) label_alignment = (0.0, 0.5) label = gtk.Label(_("Filename: ")) label.set_alignment(*label_alignment) self.attach(label, 0, 1, 1, 2) self.file_box = gtk.HBox(False) self.file_entry = gtk.Entry() self.file_box.pack_start(self.file_entry) file_button = gtk.Button("Browse...") file_button.connect("clicked", self.on_activate_browse_button) self.file_box.pack_start(file_button) self.attach(self.file_box, 1, 2, 1, 2) def get_prefs(self): prefs = self.get_parameters() prefs['default'] = self.default_check.get_active() return prefs def get_parameters(self): d = {} invalid_chars = ', "\'():;' if self.default_check.get_active(): name = self.conn_mgr_ref()._get_connection_name() from string import maketrans fixed = name.translate(maketrans(invalid_chars, '_'*len(invalid_chars))) d['file'] = os.path.join(paths.user_dir(), '%s.db' % fixed) else: d['file'] = self.file_entry.get_text() return d def refresh_view(self, prefs): try: self.default_check.set_active(prefs['default']) self.file_entry.set_text(prefs['file']) except KeyError, e: pass #debug('KeyError: %s' % e) #debug(traceback.format_exc()) def on_activate_browse_button(self, widget, data=None): d = gtk.FileChooserDialog(_("Choose a file..."), None, action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) r = d.run() self.file_entry.set_text(d.get_filename()) d.destroy() class CMParamsBoxFactory: def __init__(self): pass def createParamsBox(db_type, conn_mgr): if db_type.lower() == "sqlite": return SQLiteParamsBox(conn_mgr) return CMParamsBox(conn_mgr) createParamsBox = staticmethod(createParamsBox) bauble-0.9.7/bauble/editor.py0000755000175000017500000006222211307574326015114 0ustar brettbrett# # editor.py # # Description: a collection of functions and abstract classes for creating # editors for Bauble data # import traceback import gtk import gobject from sqlalchemy import * from sqlalchemy.orm import * import bauble from bauble.error import check, CheckConditionError, BaubleError from bauble.prefs import prefs import bauble.utils as utils from bauble.error import CommitException from bauble.utils.log import log, debug, warning # TODO: create a generic date entry that can take a mask for the date format # see the date entries for the accession and accession source presenters class ValidatorError(Exception): pass class StringOrNoneValidator(object): """ If the value is an empty string then return None, else return the str() of the value. """ def to_python(self, value): if value in (u'', ''): return None return str(value) class UnicodeOrNoneValidator(object): """ If the value is an empty unicode string then return None, else return the unicode() of the value. The default encoding is 'utf-8'. """ def __init__(self, encoding='utf-8'): self.encoding = encoding def to_python(self, value): if value in (u'', ''): return None return utils.to_unicode(value, self.encoding) class IntOrNoneStringValidator(object): """ If the value is an int, long or can be cast to int then return the number, else return None """ def to_python(self, value): if value is None or (isinstance(value, str) and value == ''): return None elif isinstance(value, (int, long)): return value try: return int(value) except Exception: raise ValidatorError('Could not convert value to int: %s (%s)' \ % (value, type(value))) class FloatOrNoneStringValidator(object): """ If the value is an int, long, float or can be cast to float then return the number, else return None """ def to_python(self, value): if value is None or (isinstance(value, str) and value == ''): return None elif isinstance(value, (int, long, float)): return value try: return float(value) except Exception: raise ValidatorError('Could not convert value to float: %s (%s)' \ % (value, type(value))) def default_completion_cell_data_func(column, renderer, model, iter,data=None): ''' the default completion cell data function for GenericEditorView.attach_completions ''' v = model[iter][0] renderer.set_property('markup', utils.to_unicode(v)) def default_completion_match_func(completion, key_string, iter): ''' the default completion match function for GenericEditorView.attach_completions, does a case-insensitive string comparison of the the completions model[iter][0] ''' value = completion.get_model()[iter][0] return str(value).lower().startswith(key_string.lower()) class GenericEditorView(object): """ An generic object meant to be extended to provide the view for a GenericModelViewPresenterEditor """ _tooltips = {} def __init__(self, glade_xml, parent=None): ''' glade_xml either at gtk.glade.XML instance or a path to a glade XML file :param glade_xml: :param parent: ''' if isinstance(glade_xml, gtk.glade.XML): self.glade_xml = glade_xml else: # assume it's a path string #self.glade_xml = gtk.glade.XML(glade_xml) self.glade_xml = utils.GladeLoader.load(glade_xml) self.parent = parent self.widgets = utils.GladeWidgets(self.glade_xml) self.response = None self.__attached_signals = [] # pygtk 2.12.1 on win32 for some reason doesn't support the new # gtk 2.12 gtk.Tooltip API # if False: if hasattr(gtk.Widget, 'set_tooltip_markup'): for widget_name, markup in self._tooltips.iteritems(): try: self.widgets[widget_name].set_tooltip_markup(markup) except Exception, e: values = dict(widget_name=widget_name, exception=e) debug(_('Couldn\'t set the tooltip on widget '\ '%(widget_name)s\n\n%(exception)s' % values)) else: tooltips = gtk.Tooltips() for widget_name, markup in self._tooltips.iteritems(): widget = self.widgets[widget_name] tooltips.set_tip(widget, markup) def connect(self, obj, signal, callback, data=None): if isinstance(obj, basestring): obj = self.widgets[obj] if data: sid = obj.connect(signal, callback, data) else: sid = obj.connect(signal, callback) self.__attached_signals.append((obj, sid)) return sid def connect_after(self, obj, signal, callback, data=None): if isinstance(obj, basestring): obj = self.widgets[obj] if data: sid = obj.connect_after(signal, callback, data) else: sid = obj.connect_after(signal, callback) self.__attached_signals.append((obj, sid)) return sid def disconnect_all(self): for obj, sid in self.__attached_signals: obj.disconnect(sid) del self.__attached_signals[:] def get_window(self): """ Return the top level window for view """ raise NotImplementedError def set_widget_value(self, widget_name, value, markup=True, default=None): ''' :param widget_name: the name of the widget whose value we want to set :param value: the value to put in the widgets :param markup: whether the data in value uses pango markup :param default: the default value to put in the widget if value is None ''' utils.set_widget_value(self.glade_xml, widget_name, value, markup, default) def connect_dialog_close(self, dialog): ''' Connect the close event response, close and delete-event to a dialog. :param dialog: the dialog to attache self.on_dialog_close_or_delete and self.on_dialog_response to ''' self.connect(dialog, 'response', self.on_dialog_response) self.connect(dialog, 'close', self.on_dialog_close_or_delete) self.connect(dialog, 'delete-event', self.on_dialog_close_or_delete) def on_dialog_response(self, dialog, response, *args): ''' Close when the dialog receives a response if self.connect_dialog_close is called. ''' dialog.hide() self.response = response return response #if response < 0: # dialog.hide() def on_dialog_close_or_delete(self, dialog, event=None): ''' Called when a dialog receives the a close or delete event if self.connect_dialog_close is called. ''' dialog.hide() return False def attach_completion(self, entry_name, cell_data_func=default_completion_cell_data_func, match_func=default_completion_match_func, minimum_key_length=2, text_column=-1): """ Attach an entry completion to a gtk.Entry. The defaults values for this attach_completion assumes the completion popup only shows text and that the text is in the first column of the model. Return the completion attached to the entry. NOTE: If you are selecting completions from strings in your model you must set the text_column parameter to the column in the model that holds the strings or else when you select the string from the completions it won't get set properly in the entry even though you call entry.set_text(). :param entry_name: the name of the entry to attach the completion :param cell_data_func: the function to use to display the rows in the completion popup :param match_func: a function that returns True/False if the value from the model should be shown in the completions :param minimum_key_length: default=2 :param text_column: the value of the text-column property on the entry, default is -1 """ # TODO: we should add a default ctrl-space to show the list of # completions regardless of the length of the string completion = gtk.EntryCompletion() cell = gtk.CellRendererText() # set up the completion renderer completion.pack_start(cell) completion.set_cell_data_func(cell, cell_data_func) completion.set_match_func(match_func) completion.set_property('text-column', text_column) completion.set_minimum_key_length(minimum_key_length) completion.set_popup_completion(True) completion.set_popup_set_width(True) self.widgets[entry_name].set_completion(completion) return completion def save_state(self): ''' Save the state of the view by setting a value in the preferences that will be called restored in restore_state e.g. prefs[pref_string] = pref_value ''' pass def restore_state(self): ''' Restore the state of the view, this is usually done by getting a value by the preferences and setting the equivalent in the interface ''' pass def start(self): ''' Must be implemented. ''' raise NotImplementedError def cleanup(self): """ Should be caled when self.start() returns. """ # try: # self.get_window().destroy() # except NotImplementedError: # warning(_('Could not destroy window')) self.disconnect_all() class DontCommitException(Exception): """ this is used for GenericModelViewPresenterEditor.commit_changes() to signal that for some reason the editor doesn't want to commit the current values and would like to redisplay """ pass # TODO: could use this to add to the problem list and it could give us more # information about a problem and could have a unique id we could use to # compare with #class Problem: # # def __init__(self, name, description): # id = some random number # pass # # def __cmp__(self, other): # pass class Problems(object): def __init__(self): self._problems = [] def add(self, problem): ''' :param problem: the problem to add ''' self._problems.append(problem) def remove(self, problem): ''' :param problem: the problem to remove NOTE: If the problem does not exist then there is no change and no error. ''' while problem in self._problems: self._problems.remove(problem) def __len__(self): ''' Return the number of problems ''' return len(self._problems) def __str__(self): ''' Return a string of the list of problems ''' return str(self._problems) class GenericEditorPresenter(object): """ the presenter of the Model View Presenter Pattern """ problem_color = gtk.gdk.color_parse('#FFDCDF') def __init__(self, model, view): ''' :param model: an object instance mapped to an SQLAlchemy table :param view: should be an instance of GenericEditorView the presenter should usually be initialized in the following order: 1. initialize the widgets 2. refresh the view, put values from the model into the widgets 3. connect the signal handlers ''' widget_model_map = {} self.model = model self.view = view self.problems = Problems() # used by assign_completions_handler self._prev_text = {} # _problem_widgets was introduced in 0.9.7 in order to cache the # widgets that had problems attached to them so that the # widget background could be reverted to normal after the # presenter is closed...this because an issue when we starting # using cached gtk+...this should be fixed in 1.0 self._problem_widgets = [] # whether the presenter should be commited or not def dirty(self): """ Returns True or False depending on whether the presenter has changed anything that needs to be committed. This doesn't necessarily imply that the session is not dirty nor is it required to change back to True if the changes are committed. """ raise NotImplementedError def remove_problem(self, problem_id, problem_widgets=None): """ remove problem_id from self.problems and reset the background color of the widget(s) in problem_widgets :param problem_id: :param problem_widgets: """ self.problems.remove(problem_id) if isinstance(problem_widgets, (tuple, list)): for w in problem_widgets: w.modify_bg(gtk.STATE_NORMAL, None) w.modify_base(gtk.STATE_NORMAL, None) w.queue_draw() elif problem_widgets is not None: problem_widgets.modify_bg(gtk.STATE_NORMAL, None) problem_widgets.modify_base(gtk.STATE_NORMAL, None) problem_widgets.queue_draw() def add_problem(self, problem_id, problem_widgets=None): """ Add problem_id to self.problems and change the background of widget(s) in problem_widgets. problem_widgets: either a widget or list of widgets whose background color should change to indicate a problem :param problem_id: :param problem_widgets: """ self.problems.add(problem_id) if isinstance(problem_widgets, (tuple, list)): for w in problem_widgets: self._problem_widgets.append(w) w.modify_bg(gtk.STATE_NORMAL, self.problem_color) w.modify_base(gtk.STATE_NORMAL, self.problem_color) w.queue_draw() elif problem_widgets is not None: self._problem_widgets.append(problem_widgets) problem_widgets.modify_bg(gtk.STATE_NORMAL, self.problem_color) problem_widgets.modify_base(gtk.STATE_NORMAL, self.problem_color) problem_widgets.queue_draw() def init_enum_combo(self, widget_name, field, none_str=None): """ initialize a gtk.ComboBox widget with name widget_name from enum values in self.model.field WARNING: replacing None with the empty string is really dangerous since it might mean that a value is stored in the column that is not in the Enum...you should ensure that the changed handler on the combo converts the none_str back to None when you store the value in the model """ combo = self.view.widgets[widget_name] mapper = object_mapper(self.model) values = sorted(mapper.c[field].type.values) if None in values and none_str is not None: values.remove(None) values.insert(0, none_str) utils.setup_text_combobox(combo, values) # def bind_widget_to_model(self, widget_name, model_field): # # TODO: this is just an idea stub, should we have a method like # # this so to put the model values in the view we just # # need a for loop over the keys of the widget_model_map # pass def set_model_attr(self, attr, value, validator=None): """ :param attr: the attribute on self.model to set :param value: the value the attribute will be set to :param validator: validates the value before setting it It is best to use this method to set values on the model rather than setting them directly. Derived classes can override this method to take action when the model changes. """ if validator is not None: try: value = validator.to_python(value) self.problems.remove('BAD_VALUE_%s' % attr) except ValidatorError, e: self.problems.add('BAD_VALUE_%s' % attr) value = None # make sure the value in the model is reset setattr(self.model, attr, value) def assign_simple_handler(self, widget_name, model_attr, validator=None): ''' Assign handlers to widgets to change fields in the model. ''' widget = self.view.widgets[widget_name] check(widget is not None, _('no widget with name %s') % widget_name) if isinstance(widget, gtk.Entry): def insert(entry, new_text, new_text_length, position): entry_text = entry.get_text() pos = entry.get_position() full_text = entry_text[:pos] + new_text + entry_text[pos:] self.set_model_attr(model_attr, full_text, validator) def delete(entry, start, end, data=None): text = entry.get_text() full_text = text[:start] + text[end:] self.set_model_attr(model_attr, full_text, validator) self.view.connect(widget_name, 'insert-text', insert) self.view.connect(widget_name, 'delete-text', delete) elif isinstance(widget, gtk.TextView): def insert(buffer, iter, new_text, length, data=None): buff_text = buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter()) text_start = buffer.get_text(buffer.get_start_iter(), iter) text_end = buffer.get_text(iter, buffer.get_end_iter()) full_text = ''.join((text_start, new_text, text_end)) self.set_model_attr(model_attr, full_text, validator) def delete(buffer, start_iter, end_iter, data=None): start = start_iter.get_offset() end = end_iter.get_offset() text = buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter()) new_text = text[:start] + text[end:] self.set_model_attr(model_attr, new_text, validator) buff = widget.get_buffer() self.view.connect(buff, 'insert-text', insert) self.view.connect(buff, 'delete-range', delete) elif isinstance(widget, gtk.ComboBox): def changed(combo, data=None): model = combo.get_model() if model is None: return i = combo.get_active_iter() if i is None: return data = combo.get_model()[combo.get_active_iter()][0] self.set_model_attr(model_attr, data, validator) self.view.connect(widget, 'changed', changed) elif isinstance(widget, (gtk.ToggleButton, gtk.CheckButton, gtk.RadioButton)): def toggled(button, data=None): active = button.get_active() # debug('toggled %s: %s' % (widget_name, active)) button.set_inconsistent(False) self.set_model_attr(model_attr, active, validator) self.view.connect(widget, 'toggled', toggled) else: raise ValueError('assign_simple_handler() -- '\ 'widget type not supported: %s' % type(widget)) __changed_sid_name = lambda s, w: '__changed_%s_sid' % w.get_name() def pause_completions_handler(self, widget, pause=True): """ Pause a completion handler previously assigned with assign_completions_handler() """ if not isinstance(widget, gtk.Entry): widget = self.view.widgets[widget] sid = getattr(self, self.__changed_sid_name(widget)) if pause: widget.handler_block(sid) else: widget.handler_unblock(sid) def assign_completions_handler(self, widget, get_completions, on_select=lambda v: v): """ Dynamically handle completions on a gtk.Entry. :param widget: a gtk.Entry instance or widget name :param get_completions: the method to call when a list of completions is requested, returns a list of completions :param on_select: callback for when a value is selected from the list of completions """ if not isinstance(widget, gtk.Entry): widget = self.view.widgets[widget] PROBLEM = hash(widget.get_name()) prev_text_name = '__prev_text_%s' % widget.get_name() setattr(self, prev_text_name, None) def add_completions(text): #debug('add_completions(%s)' % text) if get_completions is None: # get_completions is None usually means that the # completions model already has a static list of # completions return # always get completions from the first two characters from # a string values = get_completions(text[:1]) def idle_callback(values): completion = widget.get_completion() utils.clear_model(completion) completion_model = gtk.ListStore(object) for v in values: completion_model.append([v]) completion.set_model(completion_model) gobject.idle_add(idle_callback, values) def on_changed(entry, *args): text = entry.get_text() #debug('on_changed(%s)' % text) prev_text = getattr(self, prev_text_name) if text == '' and prev_text: # this works around a funny problem where after the # completion is selected the changed signal is fired # again with a empty string self.pause_completions_handler(entry, True) widget.set_text(prev_text) setattr(self, prev_text_name, None) self.pause_completions_handler(entry, False) return self.add_problem(PROBLEM, widget) on_select(None) compl_model = widget.get_completion().get_model() if (not compl_model and len(text)>2) \ or len(text) == 2: add_completions(text) def on_match_select(completion, compl_model, treeiter): value = compl_model[treeiter][0] setattr(self, prev_text_name, utils.utf8(value)) self.pause_completions_handler(widget, True) widget.set_text(utils.utf8(value)) self.remove_problem(PROBLEM, widget) on_select(value) self.pause_completions_handler(widget, False) completion = widget.get_completion() check(completion is not None, 'the gtk.Entry %s doesn\'t have a '\ 'completion attached to it' % widget.get_name()) sid = self.view.connect(widget, 'changed', on_changed) setattr(self, self.__changed_sid_name(widget), sid) self.view.connect(completion, 'match-selected', on_match_select) def start(self): raise NotImplementedError def cleanup(self): for widget in self._problem_widgets: widget.modify_bg(gtk.STATE_NORMAL, None) widget.modify_base(gtk.STATE_NORMAL, None) self.view.cleanup() def refresh_view(self): # TODO: should i provide a generic implementation of this method # as long as widget_to_field_map exist raise NotImplementedError class GenericModelViewPresenterEditor(object): ''' GenericModelViewPresenterEditor assume that model is an instance of object mapped to a SQLAlchemy table ''' label = '' standalone = True ok_responses = () def __init__(self, model, parent=None): """ The editor creates it's own session and merges the model into it. If the model is already in another session that original session will not be effected. :param model: an instance of an object mapped to a SQLAlchemy Table :param parent: the parent windows for the view or None """ self.session = bauble.Session() self.model = self.session.merge(model) def attach_response(self, dialog, response, keyname, mask): ''' attach a response to dialog when keyname and mask are pressed ''' def callback(widget, event, key, mask): # debug(gtk.gdk.keyval_name(event.keyval)) if event.keyval == gtk.gdk.keyval_from_name(key) \ and (event.state & mask): widget.response(response) dialog.add_events(gtk.gdk.KEY_PRESS_MASK) dialog.connect("key-press-event", callback, keyname, mask) def commit_changes(self): ''' Commit the changes. ''' objs = list(self.session) try: self.session.commit() except: self.session.rollback() self.session.add_all(objs) raise return True def __del__(self): #debug('GenericEditor.__del__()') self.session.close() bauble-0.9.7/po/0000755000175000017500000000000011310570250012413 5ustar brettbrettbauble-0.9.7/po/pl.po0000644000175000017500000014463711310567254013417 0ustar brettbrett# Polish translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-08-11 12:22+0000\n" "Last-Translator: konrad509 \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Notatki" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Linki" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Szukaj w Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Szukaj w GBIF" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Szukaj w ITIS" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Szukaj w IPNI" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Szukaj w BGCI" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "Ilość roślin:" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" "Błąd zapisywania zmian.\n" "\n" "%s" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" "Wystąpił nieznany bład podczas zapisywania zmian. Zobacz szczegóły.\n" "\n" "%s" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "Czy na pewno chcesz pominąć zmiany?" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Nieznany błąd." #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Wybierz plik(i) do importu..." #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Wskaż katalog" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Import" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Eksport" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "Zapisz wszystkie dane do jednego pliku" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Czy jesteś pewien, że chcesz usunąć %s?" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" "model musi mieć długość i szerokość geograficzną lub obydwie wartości puste" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "Środowisko naturalne" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Położenie:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Długość geograficzna:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Email:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Faks:" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "Położenie" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "PKod rośliny" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "Email" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Nr faksu" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Faks" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "Opis środowiska naturalnego" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "Zatwierdź i dodaj rośliny..." #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "Zatwierdź i dodaj rośliny" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Położenie" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "Kod rośliny musi być unikalny" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "Położenie rośliny w Twojej kolekcji." #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" "Status tej rośliny w kolekcji.\n" "Możliwe wartości: %s" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "Dodatkowe notatki o tej roślinie." #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Nie można wczytać ikony z %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "rozmiar historii musi być większy niż zero i mniejszy rozmiar historii" #: bauble/_gui.py:368 msgid "_File" msgstr "_Plik" #: bauble/_gui.py:369 msgid "_New" msgstr "_Nowy" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Otwórz" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Wyjdź" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Edytuj" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Wytnij" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Kopiuj" #: bauble/_gui.py:380 msgid "_Paste" msgstr "W_klej" #: bauble/_gui.py:386 msgid "_Insert" msgstr "W_staw" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Narzędzia" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Pomoc" #: bauble/_gui.py:390 msgid "Contents" msgstr "Zawartości" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Zgłoś błąd" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Strona domowa Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "O programie" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "Nie można utworzyć nowej bazy danych..\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Czy chcesz przerwać aktualne zadania?" #: bauble/view.py:93 msgid "Properties" msgstr "Właściwości" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Typ:" #: bauble/view.py:117 msgid "Date created:" msgstr "Data utworzenia:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Ostatnio zmodyfikowany:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Błąd wyszukiwania ciągu znaków w kolumnie %s" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Błąd: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Nic nie znaleziono" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" "Zapytanie zwróciło %s wyników. Pobranie wszystkich danych może potrwać " "bardzo długo. Czy jesteś pewien, że chcesz kontynuować?" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Pobieranie wyników wyszukiwania %s..." #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s wyników wyszukiwania" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Pokaż szczegóły" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Nie można usunąć.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Edycja" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Usuń" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "Nazwy potoczne" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Synonimy" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Ogólne" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "Szukaj w Global Biodiversity Information Facility" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "Szukaj w Intergrated Taxonomic Information System" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "Szukaj w International Plant Names Index" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "Szukaj w Botanic Gardens Conservation International" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "Ilość roślin" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "Ilość gatunków:" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Dystrbucja:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "okno_rodziny" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "okno_rodzaju" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "okno_gatunku" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Autor" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Rozmieszczenie" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Rodzina" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Rodzaj" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Notatki" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "Kwalifikator" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "Kwalifikator gatunku" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "Synonimy" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "Rodzaj" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Gatunek" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "Edytor rodziny" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Pełna nazwa" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "Edytor rodzaju" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Język" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Następny" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "Zatwierdź i dodaj gatunek" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "Edytor gatunku rośliny" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "Nazwa potoczna" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "Czy na pewno chcesz usunąć nazwę potoczną %s?" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "Rodzaj " #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "Autor gatunku" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "Kwalifikator gatunku" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "Notatka" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "Nazwy potoczne" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "Synonimy gatunku" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "Dodaj gatunek" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "Nazwa rodziny" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "Nazwa rodzaju" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "Lista synonimów dla tego rodzaju.\n" "\n" "Aby dodać synonim wprowadź nazwę rodziny i zaznacz jeden z listy uzupełnień. " "Następnie kliknij Dodaj, aby dodać go do listy synonimów." #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "Dodatkowe notatki dla tego rodzaju." #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" "Czy na pewno chcesz usunąć %(genus)s jako synonim aktualnego rodzaju?\n" "\n" "Uwaga: Nie spowoduje to usunięcia rodzaju z bazy danych." #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" "Musisz najpierw dodać lub zaimportować co najmniej jedną rodzinę do bazy " "danych przed dodaniem roślin." #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "Dodaj wpis" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Rodzina" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Rodzaj" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Gatunek" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "Dodatkowe notatki o tej rodzinie." #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "Lista synonimów dla tej rodziny.\n" "\n" "Aby dodać synonim wprowadź nazwę rodziny i zaznacz jeden z listy uzupełnień. " "Następnie kiknij Dodaj, aby dodać go do listy synonimów." #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" "Błąd połączenia z bazą danych.\n" "%s" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" "Wskazano więcej niż jeden plik do zaimportowania do tabeli " "%(table_name)s: %(file_name)s, (file_name2)s" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" "Nie wszystkie nazwy plików pasują do nazw tabel.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "Importowanie tabeli %(table)s z %(filename)s" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "Błąd: Nie można ustawić sekwencji dla kolumny: %s" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" "CSVExporter: ścieżka nie istnieje.\n" "%s" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "eksportowanie tabeli %(table)s do %(filename)s" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" "Import danych do tej bazy danych może zniszczyć lub uszkodzić istniejące " "dane.\n" "\n" "Czy chcesz kontynuować?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "Czy na pewno chcesz usunąć wpis %s?" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "nieznany typ_źródła we wpisie: %s" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" "Gatunek musi zostać wybrany z listy uzupełnień. Aby dodać gatunek użyj " "Edytor gatunku" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "Numer identyfikacyjny wpisu musi być unikalny" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "Data wpisu tego gatunku" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "Rozmaite infoprmacje o tym wpisie." #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "Przyciski Północ/Południe są w stanie konfliktu" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "Przyciski Wschód/Zachód są w stanie konfliktu" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "Wpis" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "_Wpis" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" "Aby móc dodawać wpisy do bazy, należy najpierw zaimportować co najmniej " "jeden gatunek." #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Źródło" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "Numer identyfikacyjny kolekcji:" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "Kolekcjoner:" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "Data zbioru:" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "Dane GPS" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Szerokość geograficzna:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "Rośliny/Klony:" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "Pochodzenie:" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Adres:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "Wpis" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Nazwa" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "Gatunek" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "Skrót" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Adres" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "Wysokość/Głębokość" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "Kolekcjoner" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Data" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Opis" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "E-mail" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "Historia" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "Nazwa instytucji" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "Szerokość geograficzna" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "Szczegóły położenia" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "Długość geograficzna" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "Pochodzenie" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Status" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Nr tel" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Telefon" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Typ" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Dodaj" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Wschód" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Północ" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Południe" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "Zachód" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "dd/mm/rrrr" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "Roślina" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" "Typ materiału roślinnego.\n" "Możliwe wartości: %s" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "Szablon" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "Proszę wybrać szablon." #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" "Nie można otworzyć raportu za pomocą domyślnego programu. Możesz otworzyć go " "ręcznie w %s" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "Szablon" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Ustawienia" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "Nie można pobrać roślin z %s" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "Nie można pobrać gatunków z %s" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "%s już istnieje" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "Najpier coś wyszukaj." #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "Błąd formatowania" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Domyślny" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" "Nie ma roślin w wynikach wyszukiwania. Proszę spróbować inne zapytanie." #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" "Nie ma gatunków w wynikach wyszukiwania. Proszę spróbować inne zapytanie." #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "STyp źródła" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" "Część lub wszystkie informacje o twojej instytucji lub firmie są " "niekompletne. Proszę upewnić się, że pola: Imię, Kontakt Techniczny, Email, " "Kontakt i Kod Instytucji są wypełnione." #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "Wybierz plik do eksportu..." #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "Nie można autoryzować konta Google: %s" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "Ustawienia" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "Zdjęcia" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "Nie można zalogować się do konta PicasaWeb." #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "Brak zdjęć" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "Album" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Hasło" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "Wprowadź nazwę etykiety" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "Czy na pewno chesz usunąć etykietę \"%s\"?" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "Nic nie zaznaczono" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Etykiety" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "Pozycja(-e)" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "Etykiety" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "Nowa etykieta" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" "Nie można pobrać ścieżki dla ustawień użytkownika: brak zmiennej APPDATA lub " "USERPROFILE" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" "Nie można pobrać ścieżki dla ustawień użytkownika: niewspierana platforma" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Ta wersja programu Bauble wymaga SQLAlchemy w wersji 0.5.0 lub wyższej. " "Proszę pobrać i zainstalować nowszą wersję SQLAlchemy ze strony " "http://www.sqlalchemy.org lub skontaktować się z administratorem systemu." #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "Nie zainstalowano SQLAlchemy. Proszę zainstalować SQLAlchemy ze strony " "http://www.sqlalchemy.org" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "Baza danych, do której jesteś podłączony, jest pusta" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" "Baza danych, z którą się połączyłeś nie ma znacznika czasowego, kiedy " "została utworzona. Zazwyczaj znaczy to, że podczas tworzenia bazy danych " "wystąpił problem lub baza danych nie została utworzona przy pomocy Bauble." #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" "Używasz Bauble w wersji %(version)s natomiast baza danych, do której jesteś " "podłączony została stworzona za pomocą wersji %(db_version)s\n" "\n" "Pewne rzeczy mogą nie działać lub pewne dane mogą zostać nieoczekiwanie " "uszkodzone." #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" "Następujące wtyczki nie zostały znalezione w rejestrze wtyczek:\n" "\n" "%s\n" "\n" "Czy chcesz je teraz zainstalować?" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" "Wtyczka %(plugin_name)s znajduje się w rejestrze, lecz nie została " "znaleziona w katalogu wtyczek." #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" "Bład: Nie można zainicjować %(entry_name)s\n" "\n" "%(exception)s." #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" "Wtyczka zawiera pętlę zależności. Dzieje się tak, gdy dwie wtyczki zależą od " "siebie nawzajem." #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" "Nie można zaimportować modułu %(module)s.\n" "\n" "%(error)s" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Szczegóły połączenia" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Typ:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Dzisiejsza data" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" "Błąd: używanie sekwencji nie zostało przetestowane na tym typie bazy danych: " "%s" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" "Bauble nie może zapisać Twoich ustawień użytkownika. \n" "\n" "Proszę sprawdzić uprawnienia dla pliku w pliku konfiguracyjnym:\n" " %s" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Ustawienia" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "Nazwy" #: bauble/prefs.py:305 msgid "Values" msgstr "Wartości" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "**Błąd: Bauble musi być uruchomiony w środowisku okienkowych." #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Nie można otworzyć połączenia.\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" "W spisie połączeń nie ma żadnego połączenia.\n" "Zamknij ten komunikat i kliknij \"Dodaj\", aby utworzyć nowe połączenie." #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" "Musisz wybrać lub utworzyć nowe połączenie, zanim będziesz mógł połączyć się " "z bazą danych." #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" "Bauble nie ma uprawnień do odczytu katalogu.\n" "\n" "%s" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" "Bauble nie ma uprawnień do zapisu do katalogu.\n" "\n" "%s" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble nie ma uprawnień do odczytu pliku bazy danych:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" "Bauble nie ma uprawnień do zapisu do pliku bazy danych:\n" "\n" "%s" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Czy chcesz zapisać zmiany?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" "Czy na pewno chcesz usunąć \"%s\"?\n" "\n" "Uwaga: Zostanie usunięte tylko połączenie z bazą danych i nie wpłynie to " "na bazę danych i dane w niej zawarte" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Wprowadź nazwę połączenia" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Czy chcesz apisać %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Czy chcesz zapisać zmiany do %s?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Wprowadź hasło" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Proszę wybrać nazwę dla tego połączenia" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Proszę wybrać nazwę użytkownika dla tego połączenia" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Baza danych: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "" #: bauble/connmgr.py:535 msgid "User: " msgstr "Użytkownik: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Hasło: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Użyj domyślnej nazwy pliku" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Nazwa pliku: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Wybierz plik..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "Nie można zamknąć okna." #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "" #, python-format #~ msgid "Error: %s" #~ msgstr "Błąd: %s" #~ msgid "Users" #~ msgstr "Użytkownicy" #~ msgid "Permissions" #~ msgstr "Uprawnienia" #~ msgid "Administrator" #~ msgstr "Administrator" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Błąd tworzenia tabel.\n" #~ "\n" #~ "%s" #~ msgid "Registry" #~ msgstr "Rejestr" #~ msgid "Error installing plugins." #~ msgstr "Błąd instalacji wtyczek." #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Bład instalacji wtyczek: %s" #~ msgid "Write" #~ msgstr "Zapisz" #~ msgid "" #~ "The database you have connected to does not have a valid plugin registry. " #~ "This means that the database could be corrupt or was interrupted while " #~ "creating a new database at this connection." #~ msgstr "" #~ "Baza danych, z którą się połączyłeś nie zawiera prawidłowego rejestru " #~ "wtyczek. Oznacza to, że baza danych może być uszkodzona lub zostało " #~ "przerwane tworzenie nowej bazy danych w tym połączeniu." bauble-0.9.7/po/nl.po0000644000175000017500000012167011310567254013405 0ustar brettbrett# Dutch translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-07-02 10:34+0000\n" "Last-Translator: Bert Van Leemput \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" #: bauble/_gui.py:368 msgid "_File" msgstr "_Bestand" #: bauble/_gui.py:369 msgid "_New" msgstr "_Nieuw" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Openen" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Afsluiten" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Bewerken" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Knippen" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Kopiëren" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Plakken" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Invoegen" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Gereedschappen" #: bauble/_gui.py:388 msgid "_Help" msgstr "" #: bauble/_gui.py:390 msgid "Contents" msgstr "" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "" #: bauble/_gui.py:397 msgid "About" msgstr "" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Wilt u de de huidige taken annuleren?" #: bauble/view.py:93 msgid "Properties" msgstr "Eigenschappen" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Type:" #: bauble/view.py:117 msgid "Date created:" msgstr "" #: bauble/view.py:126 msgid "Last updated:" msgstr "" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Fout: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Kan niets vinden" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "" #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Toon details" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Bewerken" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Verwijderen" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Synoniemen" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Algemeen" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Zoek met Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Zoek GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Zoek ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Zoek IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Zoek BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "" #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "" #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "" #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" #: bauble/prefs.py:261 msgid "Preferences" msgstr "" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "" #: bauble/prefs.py:305 msgid "Values" msgstr "" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "" #: bauble/connmgr.py:522 msgid "Database: " msgstr "" #: bauble/connmgr.py:528 msgid "Host: " msgstr "" #: bauble/connmgr.py:535 msgid "User: " msgstr "" #: bauble/connmgr.py:541 msgid "Password: " msgstr "" #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "" #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "" #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "" bauble-0.9.7/po/fr.po0000644000175000017500000016366111310567254013411 0ustar brettbrett# French translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-11-05 00:03+0000\n" "Last-Translator: Florent (LSc) \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/view.py:108 msgid "Type:" msgstr "Type:" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "Erreur de Formatage" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "SQLAlchemy n'est pas installé. Veuillez installer SQLAlchemy depuis " "http://www.sqlalchemy.org" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "La date d'aujourd'hui" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" "Bauble ne peut pas sauvegarder vos préférences d'utilisateurs. \n" "\n" "Veuillez vérifier les autorisations de votre fichier de configuration:\n" " %s" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Préférences " #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "pas de widget avec le nom %s" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "N'a pas pu charger l'icône de %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "La taille de l'historique doit être plus grand que zéro et plus petit que la " "taille de l'historique" #: bauble/_gui.py:368 msgid "_File" msgstr "_Fichier" #: bauble/_gui.py:369 msgid "_New" msgstr "_Nouveau" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Ouvrir" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Quitter" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Editer" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Couper" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Copier" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Coller" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Insérer" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Outils" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Aide" #: bauble/_gui.py:390 msgid "Contents" msgstr "Contenu" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Rapporter un bug" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Site web de Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "À propos" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "Ne peux créer la base de donnée.\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Droits d'auteur © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Voulez-vous annuler les tâches courantes?" #: bauble/view.py:93 msgid "Properties" msgstr "Propriétés" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:117 msgid "Date created:" msgstr "Date de création:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Dernière mise à jour:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" "MapperSearch.add_meta(): l'argument default_columns doit être une liste" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" "MapperSearch.add_meta(): l'argument default_columns ne peut pas être vide" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Domain de recherche inconnu: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Erreur dans la recherche de chaîne à la columne %s" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Erreur: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "N'a rien pu trouver" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" "Cette requête a retournée %s résultats. Cela peut prendre un certain temps " "d'obtenir toutes les données. Êtes-vous sûr de vouloir continuer?" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Extraction de %s résultats de la recherche" #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s résultats de recherche" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Montrer les détails" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" "Les espèces %s ont %s adhérées. Êtes-vous sûr de vouloir le supprimer " "?" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "Êtes-vous sûr de vouloir supprimer l'espèce %s?" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "N'a pas pu supprimer.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Editer" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Enlever" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "Nom vernaculaires" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Synonymes" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Notes" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Général" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Liens" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Rechercher sur Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Rechercher sur GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "Rechercher sur le Système Mondial d'Information sur la Biodiversité" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Recherche ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "Recherche sur le Système d'information taxonomique intégré" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Recherche IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "Rechercher dans l'Index international des noms de plantes" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Recherche BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "Recherche Botanic Gardens Conservation International" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "# of d'Adhésions:" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "# de Genres:" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "# de Plantes:" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "# de Plantes" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "# d'Espèces:" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Distribution:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "Fenêtre_des_familles" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "Fenêtre_des_genres" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "Fenêtre_des_espèces" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Auteur" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "Groupe de culture" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Distribution" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Famille" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Genre" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "Hybride" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "Auteur infraspécifique" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "Epithète infraspécifique" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "Parties infraspécifiques" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "Rang infraspécifique" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "Méta Information" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Notes" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "Qualificatif" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "Qualificatif d'Espèces" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "Synonymes" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "Genre" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Espèces" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "Editeur de Familles" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Nom complet" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "Editeur de Genre" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Langue" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Suivant" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "OK et Ajouter des Adhésions" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "OK et ajouter des genres" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "OK et Ajouter des espèces" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "Editeur des Espèces de Plantes" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "Nom vernaculaire" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "ajouter_gtk" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "supprimer_gtk" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "Êtes-vous sûr de vouloir supprimer le nom verniculaire %s?" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "Genre " #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "Épithète d'espèces" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "Auteur des espèces" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "Rang infraspécifique" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "Indicateur d'hybride d'espèce" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "Epithète infraspécifique" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "Groupe de culture" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "Auteur infraspécifique" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "Espèce qualificatif" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "Note" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "Répartition des espèces" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "Noms vernaculaires" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "Synonymes d'espèces" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" "Erreur en soumettant les modifications.\n" "\n" "%s" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" "Erreur inconnue durant la soumission des modifications. Voyez les détails " "pour plus d'informations.\n" "\n" "%s" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" "Le genre %s a %s espèces. Êtes-vous sûr de vouloir le supprimer ?" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "Êtes-vous sûr de vouloir supprimer le genre %s?" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "Ajouter des espèces" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "Le nom de famille" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "Le type d'hybride pour ce genre." #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "Le nom du genre" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "Le nom ou les initiales de l'auteur qui a publié ce genre" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "Liste de synonymes pour ce genre.\n" "\n" "Pour ajouter un synonyme, entrez un nom de famille et sélectionnez un " "élément de la liste d'achèvements. Ensuite cliquez sur Ajouter pour " "l'ajouter à la liste des synonymes." #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "Diverses notes à propos de ce genre." #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" "Êtes-vous sûr de vouloir retirer %(genus)s comme synonyme du genre courant?\n" "\n" "Note: Ceci ne retirera pas le genre de la base de données." #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "Êtes-vous sûr de vouloir perdre vos modifications?" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" "Vous devez d'abord ajouter ou importer au moins une Famille dans la base de " "données avant de pouvoir ajouter des plantes." #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "Ajouter adhésion" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Famille" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Genre" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Espèce" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" "La famille %s a %s genres. Êtes-vous sûr de vouloir le supprimer ?" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "Êtes-vous sûr de vouloir supprimer la famille %s?" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "Ajouter des genres" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" "Le qualificatif de famille aide à lever les ambiguïtés qui peuvent être " "associées avec ce nom de famille" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "Diverses notes à propos de cette famille." #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "Liste des synonymes pour cette famille.\n" "\n" "Pour ajouter un synonyme entrez un nom de famille et sélectionnez un " "achèvement à partir de la liste. Ensuite cliquez sur Ajouter pour l'ajouter " "à la liste des synonymes." #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Erreur inconnue." #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" "Erreur en se connectant à la base de données.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" "Plus d'un fichier donné à importer dans la table %(table_name)s: " "%(file_name)s, (file_name2)s" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" "Les noms de fichiers ne correspondent pas tous aux noms de tables.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" "Pour importer les fichiers, les tables suivantes seront supprimées:\n" "\n" "%s\n" "\n" "Voulez-vous continuez?" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "Importe la table %(table)s à partir de %(filename)s" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" "La table %s existe déjà dans la base de données et peut contenir des " "données. Si une ligne du fichier importé à la même id qu'une ligne dans la " "base de données alors le fichier ne sera pas importé correctement.\n" "\n" "Voulez-vous supprimer la table dans la base de données en premier. Vous " "perdrez toutes les données dans la base de données si vous le faites?" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "Erreur: N'a pas pu définier la séquence pour la colonne: %s" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Choisir le(s) fichier(s) à importer..." #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Sélectionner un répertoire" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" "CSVExporter: le chemin n'existe pas.\n" "%s" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" "Le fichier a exporter %(filename)s pour la table %(table)s " "existe déjà.\n" "\n" "Voulez-vous continuer?" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "Exporte la table %(table)s vers %(filename)s" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Importer" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "Valeurs séparées par des virgules" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" "Il est possible que l'import de données dans cette base de données détruise " "ou corrompe vos données existantes.\n" "\n" "Voulez-vous continuer?" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Exporter" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "Sauver toutes les données dans un fichier" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Êtes-vous sûr de vouloir retirer %s?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" "Il y a %(num_plants)s plantes pour cette acquisition: " "%(plant_codes)s\n" "\n" "Voulez-vous vraiment supprimer l'acquisition %(acc_code)s?" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "Êtes-vous sûr de vouloir supprimer l'adhésion %s?" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "Si l'id_qual est aff. ou cf. alors id_qual_rank est requis. %s " #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "type de source inconnu dans l'acquisition: %s" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" "Les espèces doivent être sélectionnés à partir de la liste des compléments. " "Pour ajouter une espèce utiliser l'éditeur d'espèces." #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "L'ID d'adhésion doit avoir un code unique" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" "L'ID de qualification\n" "\n" "Les valeurs possibles: %s" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "La date de cette espèce a été ajoutée." #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" "L'origine ou la source de cette adhésion.\n" "\n" "Les valeurs possibles: %s" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" "L'état sauvage est utilisé pour préciser la provenance\n" "\n" "Les valeurs possibles: %s" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "Le type de source est en quoi cette adhésion a été obtenue" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "Divers notes à propos de cette adhésion." #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" "Indique si l'adhésion de ce dossier devrait être considéré comme privé." #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "_parse_lat_lon() -- format incorrect: %s" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "Nord/Sud des boutons radio dans une situation confuse" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "Est/Ouest des boutons radio dans une situation confuse" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "Acquisition" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "_Adhésion" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" "Vous devez d'abord ajouter ou importer au moins une espèce dans la base de " "données avant de pouvoir ajouter des adhésions." #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" "Le modèle doit avoir une latitude et une longitude ou aucun des deux" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Source" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "ID Collection:" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "Préleveur:" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "Date de prélèvement:" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "Notes sur le don" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "ID du donateur:" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "Donateur:" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "Hauteur:" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "Point GPS" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "Habitat" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Latitude:" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Localisation:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Longitude:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "Plantes/Clones:" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "Provenance:" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "Contrôleur:" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "Nombre de dons:" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Addresse:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Email:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tél:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "Institution.__getattr__: %s n'est pas une propriété d'Institution" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "Institution.__setattr__: %s n'est pas une propriété d'Institution" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "ID Acquisition" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "Acquisition" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "Lieu" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "Localisation" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Nom" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "Code de la Plante" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "Site" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "Espèces" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "Abréviation" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "Type de l'acquisition" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Addresse" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "Altitude/Profondeur" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "ID Collection" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "Informations sur la Collection" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "Préleveur" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "Nom du contact" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Date" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Description" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "ID du donateur" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "Donneur" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "E-mail" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "Email" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Numéro de fax" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "Description de l'habitat" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "Historique" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "Qualificatif" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "Nom de l'Institution" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "Code Institutionnel" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "Latitude" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "Détails sur la localisation" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "Longitude" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "Privé" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "Provenance" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "Rang Qualifié" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Statut" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "Contact technique" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Numéro de téléphone" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Téléphone" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Type" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "Type sauvage" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Ajouter" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Est" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "Editeur d'institution" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Nord" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "OK et ajouter des plantes..." #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "OK et ajouter des plantes" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Sud" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "Ouest" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "jj/mm/aaaa" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "gtk-editer" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "gtk-nouveau" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "Statut de l'acquisition:" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "Type de l'acquisition:" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "general_window" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "Plante" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Localisation" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" "Le site est le nom que vous utiliserez plus tard pour vous référer à cette " "localisation." #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" "Toute information pertinente concernant la localisation telle que où elle se " "situe ou qu'elle était le but" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "Le code de la plante doit être un code unique" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" "L'adhésion doit être sélectionné de la liste des complétions. Pour ajouter " "une adhésion à l'adhésion utilisation éditeur" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "La localisation de la plante dans votre collection" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" "Le type de plante.\n" "\n" "Valeurs possibles: %s" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" "Le statut de cette plante dans la collection.\n" "Valeurs possibles: %s" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "Diverses notes à propos de cette plante." #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "Modèle" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "Veuillez sélectionner un modèle." #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" "Le rapport n'a pas pu être ouvert avec le logiciel par défaut. Vous pouvez " "ouvrir manuellement le fichier dans %s" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "Inclure les données marquées comme privé" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "Modèle" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "Convertisseur" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Réglages" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "Impossible d'obtenir des plantes à partir d'un %s" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "Impossible d'obtenir l'adhésion d'un %s" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "Impossible d'obtenir une espèce de %s" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "Entrez le nom du nouveau convertisseur" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "%s existe déjà" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "Aucun plugin de conversion défini" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" "Aucun formateur trouvé. Pour créer un nouveau formater cliquez le bouton " "\"Nouveau\"" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "Rechercher pour quelque chose en premier." #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "Plante/Clone" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Défaut" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "Veuillez sélectionner une feuille de style" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "Sélectionnez un contributeur" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" "Il n'y a pas de plantes dans les résultats de la rechercher. Veuillez " "essayer une autre recherche." #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" "Il n'y a pas d'espèce dans les résultats de la rechercher. Veuillez essayer " "une autre recherche." #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" "Il n'y a pas d'adhésions dans les résultats de recherche. S'il vous plaît " "essayer une autre recherche." #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" "Erreur lors de la création du fichier PDF. Veuillez vous assurer que votre " "convertisseur PDF est correctement installé." #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "Contributeur" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "Type de source" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "Feuille de style" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "Utiliser les noms d'auteurs" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" "Acquisition\n" "Plante/Clone\n" "Espèces" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" "Certaines ou toutes les informations à propos de votre institution ou votre " "société ne sont pas complètes. Veuillez vous assurer que le nom, le contact " "technique, l'email, le contact et le code de l'institution sont remplis." #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "Choisissez un fichier dans lequel exporter..." #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "ABCD" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "Le module lxml est requis pour le plugin ABCD" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "N'a pu autoriser le compte Google: %s" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "Préférences" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "Images" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "Ne peut pas se logger au compte Picasaweb." #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "Pas d'images" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "Album" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Mot de Passe" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "Entrez un nom de tag" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "Êtes-vous sûr de vouloir supprimer ce tag \"%s\"?" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "Rien n'est sélectionné" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "Sélection de tag" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "N'a pu créer les menus de tags" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Tags" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "Élément(s)" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "Tags" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "Nouveau Tag" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" "Le chemin d'accès pour les réglages de l'utilisateur n'ont pu être obtenu: " "pas de variable APPDATA ou USERPROFILE" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" "Le chemin d'accès pour les réglages de l'utilisateur n'a pu être obtenu: " "$HOME ne peut être étendu pour l'utilisateur %(username)s" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" "Le chemin d'accès pour les réglages de l'utilisateur n'a pu être obtenu: la " "plate-forme n'est pas prise en charge" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Cette version de Bauble requiert SQLAlchemy 0.5.0 or supérieur. Veuillez " "télécharger et installer une nouvelle version de SQLAlchemy depuis " "http://www.sqlalchemy.org ou contactez votre administrateur système." #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "La base de données à laquelle vous vous êtes connecté est vide" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" "La base de données à laquelle vous vous êtes connecté n'a pas de méta table " "bauble. Ceci signifie que la base de données est soit corrompue, soit a été " "créée avec une version précédente de Bauble" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" "La base de données à laquelle vous vous êtes connecté n'a pas de timestamp " "indiquant sa création. Ceci signifie généralement qu'il y a eu un problème " "lorsque vous avez créé la base de données ou que la base de données n'a pas " "été créé avec Bauble." #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" "Vous utilisez la version %(version)s de Bauble tandis que la base de données " "à laquelle vous vous êtes connecté a été créé avec la version " "%(db_version)s\n" "\n" "Certaines opérations pourraient ne pas fonctionner ou certaines données " "peuvent devenir corrompue de façon inattendue." #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" "Les plugins suivants n'ont pas été trouvé dans le registre des plugins:\n" "\n" "%s\n" "\n" "Voulez-vous les installer maintenant?" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" "Le plugin suivant est dans le registre mais il ne peut être chargé:\n" "\n" "%s" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" "Le plugin contient une dépendance en boucle. Cela arrive si deux plugins " "sont reliés directement ou indirectement ensembles" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" "Le plugin %(plugin_name)s est présent dans le registre mais n'est pas " "disponible dans le répertoire des plugins" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" "Erreur: %(entry_name)s n'a pas pu être initialisé\n" "\n" "%(exception)s." #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" "Les plugins contiennent une boucle de dépendance. Ceci peut arriver si deux " "plugins sont basés directement ou indirectement l'un sur l'autre" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" "Le module %(module)s n'a pas pu être importé.\n" "\n" "%(error)s" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "%s.plugin n'est pas une instance de pluginmgr.Plugin" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Détails de la connexion" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Type" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" "Ne peux ouvrir %s\n" "\n" "Environnement de Bureau inconnu: %s\n" "\n" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "%s n'est pas dans le fichier glade" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" "Error: l'utilisation de séquences n'a pas été testé sur ce type de base de " "données: %s" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "** Ne peut pas ouvrir le journal par défaut.\n" "Presser OK pour continuer.\n" "\n" "%s" #: bauble/prefs.py:270 msgid "Plugins" msgstr " Plugins" #: bauble/prefs.py:305 msgid "Names" msgstr "Noms" #: bauble/prefs.py:305 msgid "Values" msgstr "Valeurs" #: bauble/prefs.py:313 msgid "Name" msgstr "Nom" #: bauble/prefs.py:313 msgid "Version" msgstr "Version" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "** Erreur: Ne peut importer gtk et/ou gobject" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "Veuillez vous assurer que GTK_ROOT\\bin est dans votre variable PATH" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "Pas de gestionnaire par défaut enregistré" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "Aucun gestionnaire de commande pour %s" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "** Erreur: Bauble doit être exécuté dans un environnement fenêtré." #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "N'a pas pu ouvrir la connexion.\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" "Voulez-vous créer une nouvelle base de données Bauble à la connexion " "courante?\n" "\n" "Attention: Si une base de données existe déjà à cette connexion toute " "donnée existante sera détruite!" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "Enum nécessite une liste de valeurs" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" "Vous avez configuré empty_to_none=True mais None n'est pas dans les listes " "de valeurs" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "\"%s\" n'est pas dans les valeurs énumérées" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" "Vous n'avez aucune connexions dans votre liste.\n" "Fermez ce message et cliquez sur \"Ajouter\" pour créer une nouvelle " "connexion." #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" "Vous devez choisir une connexion ou en créer une avant de vous connecter à " "la base de données." #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" "Bauble n'a pas la permission de lire ce répertoire:\n" "\n" "%s" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" "Bauble n'a pas la permission d'écrire dans ce répertoire:\n" "\n" "%s" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble n'a pas la permission de lire le fichier de base de données:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" "Bauble n'a pas la permission d'écrire dans le fichier de base de données:\n" "\n" "%s" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Voulez-vous sauver vos modifications?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" "Aucun connecteurs de base de données pour Python installé.\n" "Veuillez consulter la documentation à propos des pré-requis à l'installation " "de Bauble" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" "Êtes-vous sûr de vouloir enlever \"%s\"?\n" "\n" "Note: Ceci enlève seulement la connexion à la base de données et " "n'affecte pas la base de données ou ses données" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Entrez un nom de connexion" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Voulez-vous sauver %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Voulez-vous sauver vos modifications sur %s?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Entrez votre mot de passe" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Veuillez choisir un nom pour cette connexion" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Veuillez choisir un nom d'utilisateur pour cette connexion" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Base de données: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Hôte: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Utilisateur: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Mot de passe: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Utiliser le nom de fichier par défaut" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Nom de fichier: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Choisissez un fichier..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" "N'a pas pu assigner l'astuce sur le widget %(widget_name)s\n" "\n" "%(exception)s" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "N'a pas pu détruire la fenêtre" #~ msgid "Users" #~ msgstr "Utilisateurs" #~ msgid "Permissions" #~ msgstr "Autorisations" #~ msgid "Administrator" #~ msgstr "Administrateur" #~ msgid "Write" #~ msgstr "Écrire" #~ msgid "Error installing plugins." #~ msgstr "Erreur lors de l'installation des plugins." #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Erreur lors de l'installation du plugin: %s" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Erreur en créant les tables.\n" #~ "\n" #~ "%s" #~ msgid "Registry" #~ msgstr "Registre" #~ msgid "" #~ "The database you have connected to does not have a valid plugin registry. " #~ "This means that the database could be corrupt or was interrupted while " #~ "creating a new database at this connection." #~ msgstr "" #~ "La base de données à laquelle vous vous êtes connecté ne dispose pas d'un " #~ "registre de plugin valide. Ceci signifie que la base de données peut être " #~ "corrompue ou qu'elle a été interrompue durant la création d'une nouvelle " #~ "base de données à cette connexion." #~ msgid "" #~ "SimpleJSON not installed. Please install SimpleJSON from " #~ "http://cheeseshop.python.org/pypi/simplejson" #~ msgstr "" #~ "SimpleJSON n'est pas installé. Veuillez installer SimpleJSON à partir de " #~ "http://cheeseshop.python.org/pypi/simplejson" #, python-format #~ msgid "Error: %s" #~ msgstr "Erreur: %s" bauble-0.9.7/po/gl.po0000644000175000017500000013176011310567254013377 0ustar brettbrett# Galician translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-05-28 17:02+0000\n" "Last-Translator: brettatoms \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Non se puido cargar a icona dende %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "o tamaño do historial debe ser máis grande que cero e menos que o tamaño do " "historial" #: bauble/_gui.py:368 msgid "_File" msgstr "_Ficheiro" #: bauble/_gui.py:369 msgid "_New" msgstr "_Novo" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Abrir" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Saír" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Editar" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Cortar" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Copiar" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Pegar" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Inserir" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Ferramentas" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Axuda" #: bauble/_gui.py:390 msgid "Contents" msgstr "Contidos" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Informar de un erro" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Sitio web de Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "Sobre" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Quere cancelar a tarefa actual?" #: bauble/view.py:93 msgid "Properties" msgstr "Propiedades" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Tipo:" #: bauble/view.py:117 msgid "Date created:" msgstr "Data de creación:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Última actualización:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" "MapperSearch.add_meta(): débese listar o argumento default_columns argument" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" "MapperSearch.add_meta(): o argumento default_columns argument non pode estar " "baleiro" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Dominio de búsqueda descoñecido: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Erro na cadea de procura na columna %s" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Erro: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Non se puido atopar nada" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Devolvendo %s resultados da procura..." #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s resultados da procura" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Mostrar detalles" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Editar" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "Esta seguro que quere eliminar o nome vernacular %s?" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "" #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "" #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "" #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" "Non se puido obter a ruta ás preferencias do usuario: no existe a variable " "APPDATA ou USERPROFILE" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" "Non se puido obter a ruta ás preferencias de usuario: non se puido expandir " "$HOME para o usuario %(username)s" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" "Non se puido obter a ruta ás preferencias de usuario: plataforma non " "soportada" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Esta versión de Bauble require SQLAlchemy 0.5.0 ou superior. Descarge e " "instale unha nova versión de SQLAlchemy dende http://www.sqlalchemy.org ou " "contacte co seu administrador de sistemas." #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "SQLAlchemy non está instalado. Instáleo dende http://www.sqlalchemy.org" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "A base de datos á que conectou está baleira." #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" "A base de datos á que conectou non ten a táboa de metadatos de bauble. Isto " "significa que a base de datos está corrupta ou foi creada con unha versión " "antiga de Bauble" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" "O complemento %(plugin_name)s está listado no rexistro pero non foi atopado " "no directorio de complementos" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" "Erro: Non se puido iniciar %(entry_name)s\n" "\n" "%(exception)s." #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" "O complemento contén un bucle de dependencia. Isto pode acontecer cando dous " "complementos directa ou indirectamente están relacionados directamente." #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" "Non se puido importar o módulo %(module)s.\n" "\n" "%(error)s" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "O complemento %s non é unha instancia de pluginmgr.Plugin" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Detalles da conexión" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Tipo:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "%s non está no ficheiro glade" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Data de hoxe" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" "Erro:empregando sentezas que non foron comprobadas neste tipo de base de " "datos: %s" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "** Non se puido abrir o ficheiro de rexistro predeterminado.\n" "Faga clic en OK para continuar.\n" "%s" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Preferenzas" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "Nomes" #: bauble/prefs.py:305 msgid "Values" msgstr "Valores" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "** Erro: non se puido importar gtk e/ou o obxecto" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "Asegurese que GTK_ROOT\\bin está no seu PATH." #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "Non hai rexistrado un xestor predeterminado" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "Non hai un xestor de ordes para %s" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "**Erro: Bauble debe ser executado nun entorno con fiestras." #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Non se puido abrir a conexión.\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" "Quere crear unha nova base de datos de Bauble coa conexión actual?\n" "\n" "Advertencia: se existe unha base de datos con esta conexión, tódolos " "datos que contén serán borrados!" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "Enum require unha lista de valores" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" "Bauble non ten permiso para ler o cartafol:\n" "\n" "%s" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" "Bauble non ten permiso para escribir no cartafol\n" "\n" "%s" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble non ten permiso para ler o ficheiro da base de datos\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" "Bauble non ten permiso para escribir no ficheiro da base de datos\n" "\n" "%s" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Quere gardar os seus cambios?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" "Non hai nengún conector a base de datos para Python instalado.\n" "Consulte a documentación na procura dos prerequisitos de instalación de " "Bauble." #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Insira un nome para a conexión" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Quere gardar %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Quere gardar os seus cambios en %s?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Insira a súa contrasinal" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Elixa un nome para esta conexión" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Elixa un nome usuario para esta conexión" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Base de datos: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Equipo: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Usuario: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Contrasinal: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Empreguar nome de ficheiro predeterminado" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Nome de ficheiro: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Elixa un ficheiro..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "Non se puido destruír a fiestra" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "non hai unha miniaplicación co nome %s" #~ msgid "Users" #~ msgstr "Usuarios" #~ msgid "Administrator" #~ msgstr "Administrador" #~ msgid "Permissions" #~ msgstr "Permisos" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Erro ao crear as táboas.\n" #~ "\n" #~ "%s" #~ msgid "Error installing plugins." #~ msgstr "Ocorreu un erro ao instalar os complementos." #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Ocorreu un erro ao instalar os complementos: %s" #~ msgid "" #~ "SimpleJSON not installed. Please install SimpleJSON from " #~ "http://cheeseshop.python.org/pypi/simplejson" #~ msgstr "" #~ "SimpleJSON non está instalado. Pode instalar SimpleJSON dende " #~ "http://cheeseshop.python.org/pypi/simplejson" bauble-0.9.7/po/cs.po0000644000175000017500000012302611310567254013376 0ustar brettbrett# Czech translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-11-18 16:59+0000\n" "Last-Translator: Kuvaly \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Nelze zobrazit ikonku z %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" #: bauble/_gui.py:368 msgid "_File" msgstr "_Soubor" #: bauble/_gui.py:369 msgid "_New" msgstr "_Nový" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Otevřít" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Konec" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Upravit" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Vyjmout" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Kopírovat" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Vložit" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Vložit" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Nástroje" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Nápověda" #: bauble/_gui.py:390 msgid "Contents" msgstr "Obsah" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Nahlásit chybu" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Bauble webová stránka" #: bauble/_gui.py:397 msgid "About" msgstr "O programu" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "Nelze vytvořit nová databáze.\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "" #: bauble/view.py:93 msgid "Properties" msgstr "Vlastnosti" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Typ:" #: bauble/view.py:117 msgid "Date created:" msgstr "Datum vytvoření:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Poslední aktualizace:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Chyba: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "" #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s výsledků vyhledávání" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Zobrazit detaily" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Nelze odstranit.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Úpravy" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Odebrat" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "Lidové názvy" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Synonyma" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Poznámky" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Všeobecné" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Odkazy" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Vyhledávání Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Vyhledávání GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Vyhledávání ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "Hledat v Integrovaném Taxonomickém Informačním Systému" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Vyhledávání IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "Hledat v Mezinárodním Jmenném Indexu Rostlin" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Vyhledávání BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "# z rodu:" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "# z rostlin:" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "# z rostlin" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "# z druhů:" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "rodina_okno" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "rod_okno" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "druh_okno" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Autor" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Rodina" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "Synonyma" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Jazyk" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-přidat" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-odstranit" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "Poznámka" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "Přidat druh" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Neznámá chyba." #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "" #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Zvolte adresář" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Import" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Export" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Chcete odstranit %s?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "" #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" #: bauble/prefs.py:261 msgid "Preferences" msgstr "" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "" #: bauble/prefs.py:305 msgid "Values" msgstr "" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "" #: bauble/connmgr.py:522 msgid "Database: " msgstr "" #: bauble/connmgr.py:528 msgid "Host: " msgstr "" #: bauble/connmgr.py:535 msgid "User: " msgstr "" #: bauble/connmgr.py:541 msgid "Password: " msgstr "" #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "" #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "" #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "" bauble-0.9.7/po/da.po0000644000175000017500000013744711310567254013371 0ustar brettbrett# Danish translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-06-27 14:54+0000\n" "Last-Translator: Rasmus Andersen \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Kunne ikke indlæse ikon fra %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "historie størrelse skal være større end nul og mindre end historie størrelse" #: bauble/_gui.py:368 msgid "_File" msgstr "_Filer" #: bauble/_gui.py:369 msgid "_New" msgstr "_Ny" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Åben" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Afslut" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Rediger" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Klip" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Kopier" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Sæt ind" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Indsæt" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Værktøj" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Hjælp" #: bauble/_gui.py:390 msgid "Contents" msgstr "Indhold" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Fejlmeld et problem" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Bauble website" #: bauble/_gui.py:397 msgid "About" msgstr "Om programmet..." #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "Kunne ikke oprette en ny database.\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Vil du annullere den nuværende opgaver?" #: bauble/view.py:93 msgid "Properties" msgstr "Egenskaber" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Type:" #: bauble/view.py:117 msgid "Date created:" msgstr "Dato oprettet:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Seneste opdatering:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "MapperSearch.add_meta(): default_columns argument skal vises" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "MapperSearch.add_meta(): default_columns argument kan ikke være tom" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Ukendt søge domæne: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Fejl i søgestreng på kolonnen %s" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Fejl: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Kunne ikke finde noget" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Henter %s søgeresultater..." #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s søgeresultaterne" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Vis detaljer" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "Er du sikker på du vil fjerne de arter %s?" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Kunne ikke slette.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Rediger" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Fjern" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Synonymer" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Noter" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Almindelige" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Links" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Søg på Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Søg på GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "Søg på Global Biodiversity Information Facility" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Søg på ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Søg på IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "Søg på Internationale Plante navns index" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Søg på BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "Søg på Botanic Gardens Conservation International" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Forfatter" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "Kultivar Gruppe" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Distribution" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Familie" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Slægten" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "Hybrid" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Noter" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "Familie Editor" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Sprog" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Næste" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-tilføj" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-fjern" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "Slægten " #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "Species epithet" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "Kultivar gruppe" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "Art kvalifikation" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "Noter" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "Artsfordeling" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "Art synonymer" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" "Fejl begå ændringer.\n" "\n" "%s" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "Tilføj arter" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "Familie navn" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "Type af hybrid for denne slægt." #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "Slægtens navn" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" "Navn eller forkortelsen af forfatteren, der blev offentliggjorde denne slægt" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "Er du sikker på at du vil miste dine ændringer?" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" "Du skal først tilføje eller importere mindst én familie i databasen, før du " "kan tilføje planter." #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "Tilføj tiltrædelse" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Familie" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Slægten" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Arter" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "" #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "Fejl: Kunne ikke indstille sekvens for kolonne: %s" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Vælge fil(r) til import..." #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Vælg en mappe" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" "CSVExporter: Stien findes ikke.\n" "%s" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" "Export fil %(filename)s for %(table)s tabellen findes " "allerede.\n" "\n" "Would you like to continue?" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "eksporterende %(table)s tabellen til %(filename)s" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Import" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" "Det er muligt at importere data ind i denne database kan ødelægge eller " "beskadige dine eksisterende data.\n" "\n" "Would you like to continue?" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Export" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "Gem alle data i en fil" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Er du sikker på du vil fjerne %s?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Kilde" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "Indsamling ID:" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "Indsamler:" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "Dato indsamlet:" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "Donation Noter" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "Donorens ID:" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "Donor:" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "Højde:" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Breddegrad:" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Placering:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Længdegrad:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "Oprindelse:" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Email:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Type" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Tilføj" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Øst" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Nord" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "Ok og tilføje planter" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Syd" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "Vest" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "dd/mm/yyyy" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "Skabelon" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "Vælg en skabelon." #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" "Kunne ikke åbne den rapport med standard programmet. Du kan åbne filen " "manuelt på %s" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "Skabeloner" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "Formatter" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Indstillinger" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "Kan ikke få planter fra %s" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "Kan ikke få tiltrædelser fra %s" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "Kan ikke få arter fra et %s" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "Indtast et navn til den nye format" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "%s findes allerede" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "Ingen formatter plugins defineret" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "Søg efter noget først." #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "Formatering Fejl" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "Plant / Klon" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Standard" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "Vælg et typografiark." #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "Vælg en renderer" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "Der er ingen planter i søgeresultaterne. Prøv en anden søgning." #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "Der er ingen arter i søgeresultaterne. Prøv en anden søgning." #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "Der er ingen tiltrædelser i søgeresultaterne. Prøv en anden søgning." #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" "Fejl ved oprettelse af PDF-filen. Sørg for, at dine PDF-formatter er korrekt " "installeret." #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "Brug forfatter navne" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" "ANSVARSFRASKRIVELSE: ABCD Eksportoer ikke gennemføres fuldt ud. I " "øjeblikket vil det eksportere planter i databasen, men vil ikke indeholde " "oplysninger om kilde såsom indsamling og donation data." #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "Kunne ikke tillade Google-konto: %s" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "Indstillinger" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "Billeder" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "Kan ikke logge ind på PicasaWeb konto." #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "Ingen billeder" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "Album" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Password" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "Intet valgt" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Tags" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "Tags" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "Nyt Tag" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" "Kunne ikke finde stien til brugerens indstillinger: ikke understøttet " "platform" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "Den database, du har tilsluttet til, er tom." #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" "Den database, du har tilsluttet til har kke bauble meta table. Det betyder " "normalt, at databasen er enten beskadiget eller den blev oprettet med en " "gammel version af Bauble" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" "Den database, du har tilsluttet har ikke et tidsstempel for da den blev " "oprettet. Det betyder normalt, at der var et problem, da du oprettede " "databasen eller databasen du tilsluttet blev ikke oprettet med Bauble." #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" "Du bruger Bauble version %(version)s mens den database, du har tilsluttet " "blev oprettet med version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" "Kunne ikke importere %(module)s module.\n" "\n" "%(error)s" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "%s.plugin er ikke et tilfælde af pluginmgr.Plugin" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Kontakt-detaljer" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Type:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Dagsdato" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" "Fejl: brugte sekvenser er ikke blevet testet på denne database type: %s" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "** Kan ikke åbne standard logfil.\n" "Tryk på OK for at fortsætte.\n" "%s" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" "Bauble kan ikke gemme dine brugerindstillinger. \n" "Kontroller filrettigheder på din konfigurationsfil:\n" " %s" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Præferencer" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "Navne" #: bauble/prefs.py:305 msgid "Values" msgstr "Værdier" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "Ingen standard handling registreret" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "Ingen kommando handling for %s" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Kunne ikke åbne forbindelse.\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" "Kunne du tænke dig at oprette en ny Bauble database på den aktuelle " "forbindelse?" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "Enum kræver en liste med værdier" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" "Du har ikke nogen forbindelser på din forbindelse-liste.\n" "Luk denne meddelelse, og klik på \"Tilføj\" for at oprette en ny forbindelse." #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" "Du er nødt til at vælge eller oprette en ny forbindelse, før du kan oprette " "forbindelse til databasen." #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" "Bauble har ikke tilladelse til at læse denne mappe:\n" "\n" "%s" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" "Bauble har ikke tilladelse til at skrive til denne mappe:\n" "\n" "%s" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble har ikke tilladelse til at læse databasefil:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" "Bauble har ikke tilladelse til at skrive til databasefilen:\n" "\n" "%s" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Ønsker du at gemme dine ændringer?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Indtast et forbindelse navn" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Vil du gemme %s ?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Ønsker du at gemme dine ændringer %s ?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Indtast din adgangskode" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Vælg et navn for denne forbindelse" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Vælg et brugernavn til denne forbindelse" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Database: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Host: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Bruger: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Password: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Brug standard filnavn" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Filnavn: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Vælg en fil..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "Kunne ikke lukke vinduet" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "Ingen widget med navn %s" #~ msgid "Administrator" #~ msgstr "Administrator" #~ msgid "Permissions" #~ msgstr " Tilladelser " #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Fejl ved installation af plugins: %s" #~ msgid "Error installing plugins." #~ msgstr "Fejl ved installation af plugins." #, python-format #~ msgid "Error: %s" #~ msgstr "Fejl: %s" #~ msgid "" #~ "The database you have connected to does not have a valid plugin registry. " #~ "This means that the database could be corrupt or was interrupted while " #~ "creating a new database at this connection." #~ msgstr "" #~ "Den database, du har tilsluttet har ikke et gyldig plugin registrering. Det " #~ "betyder, at databasen kan blive beskadiget eller blev afbrudt samtidig " #~ "skabes en ny database i denne forbindelse." #~ msgid "" #~ "SimpleJSON not installed. Please install SimpleJSON from " #~ "http://cheeseshop.python.org/pypi/simplejson" #~ msgstr "" #~ "SimpleJSON er ikke installeret. Installer SimpleJSON fra " #~ "http://cheeseshop.python.org/pypi/simplejson" #~ msgid "gtk-cancel" #~ msgstr "gtk-annullere" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Fejl ved oprettelse af tabeller.\n" #~ "%s" #~ msgid "Write" #~ msgstr "Skrive" #~ msgid "Users" #~ msgstr "Brugere" #~ msgid "Registry" #~ msgstr "registratur" bauble-0.9.7/po/sq.po0000644000175000017500000013107511310567254013417 0ustar brettbrett# Albanian translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-09-06 19:58+0000\n" "Last-Translator: Edonit Rexhepi \n" "Language-Team: Albanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Nuk mund të mirrej ikona nga %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "Madhësija e historisë duhet të jetë më e madhe se zero dhe më pak se " "madhësija e historisë" #: bauble/_gui.py:368 msgid "_File" msgstr "_Skedar" #: bauble/_gui.py:369 msgid "_New" msgstr "_I ri" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Hape" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Largohu" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Ndrysho" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Prejë" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Kopjo" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Ekzekuto" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Shto" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Veglat" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Ndihmë" #: bauble/_gui.py:390 msgid "Contents" msgstr "Përmbajtja" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Raportimi i gabimeve" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Web-faqja e Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "Për" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "Databaza nuk mund të krijohej,\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Leje kopjimi © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "A doni të ndaloni ekzekutimet e tanishme?" #: bauble/view.py:93 msgid "Properties" msgstr "" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Shkruaj:" #: bauble/view.py:117 msgid "Date created:" msgstr "Data e krijimit:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Ndrryshimi i fundit:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Domen i panjohur i kërkimit: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Gabim gjat kërkimit të stringut në kolonën %s" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Gabim: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Asgjë nuk u gjend" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" "%s Ky pyetsor rrezulton. Mund të marrë disa kohë për të marrë të gjitha të " "dhanat a jeni i sigurtë që doni të vazhdoni?" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Duke i përsëritur rrezultatet e kërkimit %s ..." #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s rrezultatet e kërkimit" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Shiqoji detajet" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "A jeni i sigurt se doni të largoni specifikat %s?" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Nuk mund të fshihej.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Edito" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Fshije" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "Numra Vernakular" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Sinonimet" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Shënimet" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Gjenerale" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Linqe" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Kërkim në Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Kërko GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Kërko ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Kërko IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Kërko BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "# nga Veglat:" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "# të Bimëve:" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "# të Bimëve" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "# të Specieve:" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Distribucioni:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "familje_dritare" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "gjeni_dritarja" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "speciet_dritarja" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Autori" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "Grupi Kulivor" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Distribucioni" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Familja" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Gjeni" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "Hibrid" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Shënimet" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "Kualifikuesi" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "Sinonimet" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "Gjeni" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Speciet" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "Editori i Familjes" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Emri i plotë" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "Editori i Gjenit" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Gjuha" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Vazhdo" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "OK dhe Shto Vegla" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "OK dhe Shto Gjenera" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "OK dhe Shto Specie" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "shto-gtk" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-fshije" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "Gjeni. " #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "Epiteti i species" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "Autori i species" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "Shënim" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "" #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "" #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "" #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "Parametrat" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "Imazhet" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "Nuk ka imazhe" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Fjalëkalimi" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "A jeni i sigurt që doni ta fshini etiketën \"%s\"?" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "Asgjë e zgjedhur" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Etiketat" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "Etiketat" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "Etiketë e Re" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Këtij versioni të Bauble i nevojitet SQLAlchemy 0.5.0 ose më i ri. Ju lutem " "shkarkojeni dhe instalojeni versionin e ri të SQLAlchemy nga " "http://www.sqlalchemy.org ose kontaktojeni administruesin e sistemit tuaj." #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "SQLAlchemy nuk është i instaluar.Ju lutem instalojeni SQLAlchemy nga " "http://www.sqlalchemy.org" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "Databaza me të cilën jeni lidhur është e thatë." #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" "Databaza me të cilën jeni të lidhur nuk ka bauble meta tabelën. Kjo " "zakonisht do të thotë se databaza është e korruptuar osë që është krijuar me " "versionin e vjetër të Bauble" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" "Gabim: Nuk mund të gjindet %(entry_name)s\n" "\n" "%(exception)s." #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Detaje rreth lidhjes" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Data e ditës së Sotme" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "** Nuk mund të hapej log file i thjeshtë.\n" "Shtypeni OK për të vazhduar.\n" "\n" "%s" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" "Bauble nuk mund të ruaj preferencat tuaja. \n" "\n" "Ju lutem shiqojeni skedarin me lejet në config skedarin e juaj:\n" " %s" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Preferencat" #: bauble/prefs.py:270 msgid "Plugins" msgstr "Shtesat" #: bauble/prefs.py:305 msgid "Names" msgstr "Emrat" #: bauble/prefs.py:305 msgid "Values" msgstr "Shifrat" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Lidhja nuk u arrit.\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" "Ju e keni konfiguruar empty_to_none=True por asnjëra nuk është e vlefshme" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "\"%s\" nuk është e vlefshme në Enum" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble nuk e ka lejen që të lexoj në bazën e të dhënave:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "A doni që ti ruani ndrryshimet?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" "A jeni i sigurt që doni ta fshini \"%s\"?\n" "\n" "Vërejtje: Kjo fshin vetëm lidhjen për bazën e të dhënave dhe nuk ndikon " "në bazën e të dhënave ose në të dhënat e saj" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Shkruajeni emrin e lidhjes" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "A doni që ta ruani %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Doni të ruani ndrryshimet në %s ?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Shkruajeni fjalëkalimin" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Ju lutem zgjidheni emrin e lidhjes" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Ju lutem zgjidhe emrin e përdoruesit për këtë lidhje" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Baza e të dhënave: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Host: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Përdoruesi: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Fjalëkalim: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Përdore emrin e skedarit të zakonshëm" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Emër skedari: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Zgjidh një skedar..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "Faqja nuk mund të shkatrrohej" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "asnjë widget me emër %s" #~ msgid "Users" #~ msgstr "Përdoruesit" #~ msgid "Administrator" #~ msgstr "Administruesi" #~ msgid "Permissions" #~ msgstr "Lejet" #~ msgid "Write" #~ msgstr "Shkruaj" #~ msgid "gtk-cancel" #~ msgstr "ndale-gtk" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Gabim në krijimin e tabelave.\n" #~ "\n" #~ "%s" #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Gabim gjatë instalimit të plug-insit: %s" #~ msgid "Error installing plugins." #~ msgstr "Error gjat instalimit te plug-ins." bauble-0.9.7/po/it.po0000644000175000017500000015773011310567254013416 0ustar brettbrett# Italian translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-10-23 09:50+0000\n" "Last-Translator: Davide Bagarotti \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Impossibile caricare l'icona da %s" #: bauble/view.py:126 msgid "Last updated:" msgstr "Ultimo aggiornamento:" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" "MapperSearch.add_meta(): l'argomento default_columns non può essere vuoto" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "Il database a cui ci si è connessi è vuoto." #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Scegliere un file..." #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "La dimensione della cronologia dev'essere più grande di zero e più piccola " "della dimensione della cronologia stessa." #: bauble/_gui.py:368 msgid "_File" msgstr "_File" #: bauble/_gui.py:369 msgid "_New" msgstr "_Nuovo" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Apri" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Esci" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Modifica" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Taglia" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Copia" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Incolla" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Inserisci" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Strumenti" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Aiuto" #: bauble/_gui.py:390 msgid "Contents" msgstr "Contenuti" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Segnala un bug" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Sito web di Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "Riguardo A" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "Non è stato possibile creare un nuovo database.\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Vorresti cancellare i compiti correnti?" #: bauble/view.py:93 msgid "Properties" msgstr "Proprietà" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Tipo:" #: bauble/view.py:117 msgid "Date created:" msgstr "Data di creazione:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" "MapperSearch.add_meta(): default_columns l'argomento deve essere una lista" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Dominio di ricerca sconosciuto: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Errore nella ricerca della stringa nella colonna %s" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Errore: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Non è stato possibile trovare niente" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" "Questa query ha prodotto %s risultati. Può richiedere molto tempo per " "ottenere tutti i dati. Continuare?" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Ottenendo %s risultati di ricerca..." #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s risultati di ricerca" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Visualizza dettagli" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "La specie %s ha %s accessi. Sei sicuro di volerla eliminare?" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "Sei sicuro di voler eliminare la specie %s?" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Non è possibile eliminare\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Modifica" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Rimuovi" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "Nomi Vernacolari" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Sinonimi" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Appunti" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Generale" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Collegamenti" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Cerca Con Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Cerca GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "Cerca nel Global Biodiversity Information Facility" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Cerca ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "Cerca il Sistema Di Informazioni Tassonomiche Integrato" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Cerca IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "Cerca l'Indice Internazionale Dei Nomi Delle Piante" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Cerca BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "Cerca nel Botanic Gardens Conservation International" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "# di Accessi:" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "# di Generi:" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "# di Piante:" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "# di Piante" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "# di Specie:" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Distribuzione:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "finestra_famiglia" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "finestra_genere" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "finestra_specie" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Autore" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "Gruppo Della Specie Coltivata" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Distribuzione" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Famiglia" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Genere" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "Ibrido" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "Autore Intraspecifico" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "Epiteto Intraspecifico" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "Parti Infraspecifiche" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "Rango Intraspecifico" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "Meta Informationi" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Appunti" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "Qualificatore" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "Qualificatore specie" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "Sinonimi" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "Genere" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Specie" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "Editore Famiglia" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Nome completo" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "Editore Genere" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Lingua" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Successivo" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "OK e Aggiungi Accessi" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "OK e Aggiungi Generi" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "OK e Aggiungi Specie" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "Editor Specie Piante" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "Nome vernacolare" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-add" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-remove" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "Sei sicuro di voler rimuovere il nome vernacolare %s?" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "Genere " #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "Epiteto della specie" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "Autore della specie" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "Rango infraspecifico" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "Flag specie ibrida" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "Epiteto infraspecifico" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "Gruppo cultivar" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "Autore infraspecifico" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "Qualificatore della specie" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "Annotazione" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "Distribuzione della specie" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "Nomi in lingua corrente" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "Sinonimi della specie" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" "Errore compiendo le modifiche.\n" "\n" "%s" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" "Errore sconosciuto durante il compimento delle modifiche. Guardare i " "dettagli per più informazioni.\n" "\n" "%s" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "Il genere %s ha %s specie. Sei sicuro di volerlo rimuovere?" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "Sei sicuro di voler rimuovere il genere %s?" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "Aggiungi specie" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "Il nome della famiglia" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "Il tipo di ibrido per questo genere." #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "Il nome del genere" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "Il nome o abbreviazione dell'autore che ha pubblicato questo gene" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "Un elenco si sinonimi per questo genere.\n" "\n" "Per aggiungere un sinonimo inserire il nome della famiglia e selezionarne " "uno dalla lista di completamento. Successivamente fare click su \"Aggiungi\" " "per aggiungerlo alla lista dei sinonimi." #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "Appunti misti su questo genere." #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" "Sei sicuro di voler cancellare dai genere simili il %(genus)s corrente ?\n" "\n" "Nota: Questo non rimuoverà il genere dal database." #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "Sei sicuro di voler perdere le modifiche da te effettuate?" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" "Devi aggiungere o importare almeno una Famiglia nel database prima che tu " "possa aggiungere piante." #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "Aggiungi accesso" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Famiglia" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Genere" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Specie" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "La famiglia %s ha %s generi. Sei sicuro di volerla rimuovere?" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "Sei sicuro di voler rimuovere la famiglia %s?" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "Aggiungi generi" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" "Il qualificatore delle famiglie aiuta a rimuovere le ambiguità che " "potrebbero essere associate a questo nome famiglia" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "Appunti misti su questa famiglia." #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "Una lista di sinonimi per questa famiglia.\n" "\n" "Per aggiungere un sinonimo inserisci un nome di famiglia e selezionane uno " "dalla lista dei completamenti. Successivamente clicca Aggiungi per " "aggiungerlo alla lista dei sinonimi." #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Errore Sconosciuto." #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" "Errore connettendosi al database.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" "Più di un file dato da importare nella tabella %(table_name)s: " "%(file_name)s, (file_name2)s" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" "Non è stato possibile far corrispondere tutti i nomi dei file ai nomi delle " "tabelle.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" "Per importare i file, i dati all'interno delle seguenti tabelle saranno " "cancellati:\n" "\n" "%s\n" "\n" "Vuoi continuare?" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "importando %(table)s tabella da %(filename)s" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" "La tabella %s esiste già nel database e potrebbe contenere dati. Se " "una riga del file importato ha lo stesso id di na riga nel database, il file " "non verrà importato correttamente.\n" "\n" "Puoi cancellare la tabella nel database per prima cosa. Saranno persi " "tutti i dati del proprio database se effettuato." #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" "Errore: Non è stato possibile impostare la sequenza per la colonna: %s" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Seleziona file da importare..." #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Seleziona una directory" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" "CSVExporter: il percorso non esiste.\n" "%s" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" "Il file da esportare %(filename)s per la %(table)s tabella " "esiste già.\n" "\n" "Vuoi continuare?" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "esportando %(table)s tabella a %(filename)s" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Importa" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "Valore Separato Da Virgola" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" "È possibile che importare dati in questo database possa distruggere o " "corrompere i tuoi dati esistenti.\n" "\n" "Vuoi continuare?" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Esporta" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "Salva tutti i dati in un file" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Si è certi di voler rimuovere %s?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" "%(num_plants)s piante dipendono da questo accesso: %(plant_codes)s\n" "\n" "Sei sicuro di voler rimuovere l'accesso %(acc_code)s?" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "Sei sicuro di voler rimuovere l'accesso %s?" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "Se l'id_qual è aff. o cf. allora l'id_qual_rank è obbligatorio. %s " #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "tipo_fonte sconosciuto nell'accesso: %s" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" "Le specie devono essere selezionate dalla lista dei compimenti. Per " "aggiungere una specie usare l'Editor delle specie" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "L'ID di accesso deve essere un codice univoco" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" "Il Qualificatore ID\n" "\n" "Possibili valori: %s" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "La data in cui queste specie sono state inserite." #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" "L'origine o sorgente di questo accesso.\n" "\n" "Possibili valori: %s" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" "Lo stato del campo è usato per chiarire la provenienza\n" "\n" "Valori possibili: %s" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "Il tipo di fonte è quello da cui l'accesso è stato ottenuto" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "Note miste su questo accesso." #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" "indica se questo record di accesso dovrebbe essere considerato privato." #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "_parse_lat_lon() -- formato incorretto: %s" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "Bottoni radio Nord/Sud in uno stato confuso" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "Bottoni radio Est/Ovest in uno stato confuso" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "Accesso" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "_Accesso" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" "Devi aggiungere o importare almeno una specie nel database prima che tu " "possa aggiungere degli accessi." #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" "il modello deve avere sia latitudine che longitudine oppure nessuna delle due" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Fonte" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "ID Collezione:" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "Collettore:" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "Collezionato in data:" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "Appunti Di Donazione" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "ID Donatore:" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "Donatore:" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "Elevazione:" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "Dato GPS" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "Habitat" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Latitudine:" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Posizione:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Longitudine:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "Piante/Cloni:" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "Provenienza:" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "Verificatore:" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "# di Donazioni:" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Indirizzo:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Email:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "Institution.__getattr__: %s non è una proprietà di Intitution" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "Institution.__setattr__: %s non è una proprietà di Ente" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "ID Accesso" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "Accesso" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "Lingua Locale" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "Luogo" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Nome" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "Codice pianta" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "Sito" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "Specie" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "Abbreviazione" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "Tipo di accesso" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Indirizzo" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "Altitudine/Profondità" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "ID Collezione" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "Appunti Collezione" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "Raccoglitore" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "Nome contatto" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Data" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Descrizione" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "ID Donatore" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "Donatore" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "E-mail" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "Email" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Fax #" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "Descrizione habitat" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "Cronologia" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "Qualificatore ID" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "Nome Istituzione" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "Codice istituzionale" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "Latitudine" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "Dettagli Ubicazione" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "Longitudine" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "Privato" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "Provenienza" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "Rango di qualifica" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Stato" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "Contatto tecnico" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Tel #" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Telefono" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Tipo" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "Stato campo" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Aggiungi" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Est" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "Editore Istituzione" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Nord" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "OK e aggiungi piante..." #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "OK e aggiungi piante" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Sud" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "Ovest" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "gg/mm/aaaa" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "gtk-modifica" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "gtk-nuovo" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "Stato Accesso:" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "Tipo Accesso:" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "finestra_generale" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "Pianta" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Ubicazione" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" "Il sito è il nome che userai più tardi per riferirti a questa posizione." #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" "Qualsiasi informazione che potrebbe essere rilevante alla posizione come " "dov'è o qual'è il suo scopo" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "il codice della pianta deve essere un codice univoco" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" "L'accesso deve essere selezionato dalla lista dei compimenti. Per aggiungere " "un accesso usa l'Editor degli accessi" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "La posizione della pianta nella tua collezione." #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" "Il tipo del materiale della pianta.\n" "\n" "Possibili valori: %s" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" "Lo stato di questa pianta nella collezione.\n" "Possibili valori: %s" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "Varie annotazioni su questa pianta." #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "Modello" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "Scegli un modello." #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" "Impossibile aprire il report con il programma predefinito. È possibile " "aprire il file manualmente: %s" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "Includi dati marcati come privati" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "Modello" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "Formattatore" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Impostazioni" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "Non è possibile ottenere piante da %s" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "Non è possibile ottenere accessioni da un %s" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "Non è possibile ottenere specie da un %s" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "Inserisci un nome per il nuovo formattatore" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "%s esiste già" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "Nessuna estensione formattatrice definita" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" "Nessuna formattazione trovata. Per creare una nuova formattazione cliccare " "sul pulsante \"Nuovo\"." #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "Cerca qualcosa prima." #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "Errore Di Formattazione" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "Pianta/Clone" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Predefinito" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "Per piacere seleziona un foglio di stile" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "Per piacere seleziona un tributario" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" "Non ci sono piante nei risultati della ricerca. Per piacere prova un'altra " "ricerca." #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" "Non ci sono specie nei risultati della ricerca. Per piacere prova un'altra " "ricerca." #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" "Non ci sono accessi nei risultati della ricerca. Per piacere prova un'altra " "ricerca." #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" "Errore creando il file PDF. Per piacere assicurati che il tuo formattatore " "PDF è installato correttamente." #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "Tributario" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "Tipo sorgente" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "Foglio di stile" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "Usa nomi degli autori" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" "Accesso\n" "Pianta/Clone\n" "Specie" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" "Alcune o tutte le informazioni riguardo al tuo ente o lavoro non sono " "complete. Per piacere assicurati che i campi di Nome, Contatto Tecnico, " "Email, Contatto e Codice Ente siano riempiti." #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "Seleziona un file nel quale esportare i dati..." #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "ABCD" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" "ATTENZIONE: ABCD Exporter non è ancora stato pienamente implementato. Al " "momento esporta le piante presenti nel database ma non include informazioni " "sull'origine come ad esempio le collezioni e i dati di donazione." #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" "Il pacchetto lxml è un requisito obbligatorio per il plugin ABCD" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "Impossibile effettuare l'accesso all'account Google: %s" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "Impostazioni" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "Immagini" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "Impossibile effettuare l'accesso all'account Picasaweb." #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "Nessuna immagine" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "Album" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Password" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "Inserisci un nome etichetta" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "Sei sicuro di voler cancellare l'etichetta \"%s\"?" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "Nessuna selezione" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "Selezione Etichetta" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "Non è stato possibile creare i menu delle etichette" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Etichette" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "Oggetto/i" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "Etichette" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "Nuova Etichetta" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" "Impossibile ottenere il percorso delle impostazioni dell'utente: nessuna " "variabile APPDATA o USERPROFILE" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" "Impossibile ottenere il percorso delle impostazioni dell'utente: impossibile " "espandere $HOME per l'utente %(username)s" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" "Non è stato possibile ottenere il percorso per le impostazioni utente: " "piattaforma non supportata" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Questa versione di Bauble richiede SQLAlchemy 0.5.0 o superiore. Per favore " "scarica e installa una nuova versione di SQLAlchemy da " "http://www.sqlalchemy.org o contatta l'amministratore di sistema." #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "SQLAlchemy non è installato. Per piacere installa SQLAlchemy da " "http://www.sqlalchemy.org" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" "Il database al quale sei connesso non ha una tabella di metadati. Questo di " "solito significa che il database è rovinato oppure che è stato creato con " "una vecchia versione di Bauble" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" "Il database connesso non ha la data di creazione. Ciò significa in genere " "che ci sono stati problemi durante la creazione del database oppure il " "database connesso non è stato creato con Bauble." #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" "Stai usando la versione %(version)s di Bauble mentre sei connesso ad un " "database creato con la versione %(db_version)s\n" "\n" "Alcune cose potrebbero non funzionare correttamente oppure una parte dei " "dati potrebbe inaspettatamente risultare corrotta." #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" "I seguenti plugin non sono stati trovati nel registro dei plugin:\n" "\n" "%s\n" "\n" "Vuoi installarli ora?" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" "Il seguente plugin è nel registro ma non può essere caricato:\n" "\n" "%s" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" "I plugin contengono una dipendenza circolare. Questo accade se due plugin " "dipendono tra loro a vicenda direttamente o indirettamente." #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" "Il plugin %(plugin_name)s è elencato nel registro ma non è stato trovato " "nella directory dei plugin" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" "Errore: Non è stato possibile inizializzare %(entry_name)s\n" "\n" "%(exception)s." #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" "I plugin contengono una dipendenza circolare. Questo accade se due plugin " "dipendono tra loro a vicenda direttamente o indirettamente." #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" "Non è stato possibile importare il %(module)s modulo.\n" "\n" "%(error)s" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "%s.plugin non è un'istanza di pluginmgr.Plugin" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Dettagli Connessione" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Tipo:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" "Impossibile aprire %s\n" "\n" "Ambiente desktop sconosciuto: %s\n" "\n" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Data di oggi" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" "Errore: l'uso delle sequenze non è stato testato su questo tipo di database: " "%s" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "** Impossibile aprire il file di log di default.\n" "Premi il pulsante OK per continuare.\n" "\n" "%s" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" "Bauble non può salvare le tue preferenze di utente. \n" "\n" "Per piacere controlla i permessi file del tuo file di configurazione:\n" " %s" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Preferenze" #: bauble/prefs.py:270 msgid "Plugins" msgstr "Plugins" #: bauble/prefs.py:305 msgid "Names" msgstr "Nomi" #: bauble/prefs.py:305 msgid "Values" msgstr "Valori" #: bauble/prefs.py:313 msgid "Name" msgstr "Nome" #: bauble/prefs.py:313 msgid "Version" msgstr "Versione" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "** Errore: non è stato possibile importare gtk e/o gobject" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "Per piacere assicurati che GTK_ROOT\\bin sia nel tuo PERCORSO." #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "Nessun gestore predefinito registrato" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "Nessun gestore di comandi per %s" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "**Errore: Bauble deve essere eseguito in un ambiente grafico." #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Non è stato possibile aprire la connessione.\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" "Vorresti creare un nuovo database Bauble alla connessione attuale?\n" "\n" "Attenzione: Se è già presente un database in questa connessione ogni dato " "esistente sarà distrutto!" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "Enum richiede una lista di valori" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" "Hai configurato empty_to_none=True ma None non è nell'elenco dei valori" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "\"%s\" non è in Enum.values" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" "Non è presente alcuna connessione nel tuo elenco delle connessioni.\n" "Chiudi questo messaggio e clicca su \"Aggiungi\" per creare una nuova " "connessione." #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" "È necessario scegliere o creare una nuova connessione prima di connettersi " "al database." #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" "Bauble non ha i permessi per leggere la directory:\n" "\n" "%s" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" "Bauble non ha i permessi per scrivere nella directory:\n" "\n" "%s" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble non ha i permessi per leggere il file database:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" "Bauble non ha i permessi per scrivere nel file database:\n" "\n" "%s" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Vuoi salvare le modifiche?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" "Nessun connettore a database Python installato.\n" "Per piacere consulta la documentazione per i prerequisiti per " "l'installazione di Bauble." #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" "Sei sicuro di voler rimuovere \"%s\"?\n" "\n" "Attenzione: Ciò rimuove solamente la connessione al database e non " "riguarda il database o i suoi dati" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "inserisci un nome di connessione" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Vuoi salvare %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Vuoi salvare le modifiche a %s?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Inserisci la tua password" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Per piacere scegli un nome per questa connessione" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Per piacere scegli un nome utente per questa connessione" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Database: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Host: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Utente: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Password: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Usa il nome file predefinito" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Nome file: " #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" "Impossibile impostare il tooltip nel widget %(widget_name)s\n" "\n" "%(exception)s" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "Impossibile distruggere la finestra" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "nessun widget con nome %s" #~ msgid "Users" #~ msgstr "Utenti" #~ msgid "Permissions" #~ msgstr "Permessi" #~ msgid "Error installing plugins." #~ msgstr "Errore nell'installazione dei plugin." #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Errore nell'installazione dei plugin: %s" bauble-0.9.7/po/sk.po0000644000175000017500000015031511310567254013407 0ustar brettbrett# Slovak translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-07-20 17:26+0000\n" "Last-Translator: milboy \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Nepodarilo sa načítať ikonu z %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "veľkosť histórie musí byť väčšia ako nula a menšia ako veľkosť histórie" #: bauble/_gui.py:368 msgid "_File" msgstr "_Súbor" #: bauble/_gui.py:369 msgid "_New" msgstr "_Nový" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Otvoriť" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Koniec" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Úprava" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Vystrihnúť" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Kopírovať" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Vložiť" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Vložiť" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Nástroje" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Pomocník" #: bauble/_gui.py:390 msgid "Contents" msgstr "Obsah" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Nahlásiť chybu" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Webstránky Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "O aplikácii..." #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "Nepodarilo sa vytvoriť novú databázu.\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Želáte si zrušiť aktuálne úlohy?" #: bauble/view.py:93 msgid "Properties" msgstr "Vlastnosti" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Typ:" #: bauble/view.py:117 msgid "Date created:" msgstr "Dátum vytvorenia:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Posledná aktualizácia:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "MapperSearch.add_meta(): argument default_columns musí byť zoznam" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "MapperSearch.add_meta(): argument default_columns nesmie byť prázdny" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Neznáma oblasť hľadania: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Chyba vo vyhľadávacom reťazci na pozícii %s" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Chyba: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Nepodarilo sa nič nájsť" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" "Táto požiadavka vrátila %s výsledkov. Získanie všetkých údajov môže trvať " "dlho. Ste si istý, že chcete pokračovať?" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Sťahujú sa výsledky vyhľadávania %s..." #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s výsledky vyhľadávania" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Zobraziť podrobnosti" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "Ste si istý, že chcete odstrániť druh %s?" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Nemožno odstrániť.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Úprava" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Odstrániť" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "Miestne mená" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Synonymá" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Poznámka" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Všeobecné" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Odkazy" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Vyhľadať v Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Vyhľadať v GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "Hľadať v Global Biodiversity Information Facility" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Vyhľadať v ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "Hľadať v Intergrated Taxonomic Information System" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Vyhľadať v IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "Hľadať v International Plant Names Index" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Vyhľadať v BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "Hľadať v Botanic Gardens Conservation International" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "# rodov:" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "# Rastlín:" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "# Rastlín:" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "# Druhov:" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Distribúcia:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "rodové_okno" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "druhové_okno" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "druhové_okno" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Autor" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "Skupina kultivarov" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Rozšírenie" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Rodina" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Rod" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "Hybridné" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "Metainformácie" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Poznámky" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "Kandidát" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "Druh kandidáta" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "Synonymá" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "Rod" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Druh" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "Editor rodín" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Celý názov" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "Editor rodov" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Jazyk" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Ďalej" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "OK a Pridať prístup" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "OK a Pridať rody" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "OK a Pridať druhy" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "Editor rastlinných druhov" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "Miestne meno" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "Pridať" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "Odstrániť" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "Ste si istý, že chcete odstrániť miestne meno %s?" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "Rod " #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "Epitet druhu" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "Druh autora" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "Príznak hybridného druhu" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "Skupina kultivarov" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "Kvalifikátor druhu" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "Poznámka" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "Druh distribúcie" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "Miestne mená" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "Druh synonymá" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" "Chyba pri vykonaných zmenách.\n" "\n" "%s" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" "Neznáma chyba pri vykonaných zmenách. Pozri podrobnosti pre viac " "informácií.\n" "\n" "%s" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "Rod %s má %s druhov. Ste si istý, že ho chcete odstrániť?" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "Ste si istý, že chcete odstrániť rod %s?" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "Pridať druh" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "Názov rodiny" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "Typ hybrida tohto rodu." #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "Názov rodu" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "Skratka mena autora, ktorý zverejnil tento rod" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "Zoznam synoným tohto rodu.\n" "\n" "Ak chcete pridať synonymum, zadajte názov rodu a vyberte jeden zo zoznamu. " "Potom kliknite na Pridať, čím ho pridáte do zoznamu synoným." #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "Rozličné poznámky o tomto rode." #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" "Ste si istý, že chcete odstrániť %(genus)s ako synonymum aktuálneho rodu?\n" "\n" "Pozn.: Týmto sa neodstráni rod z databázy." #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "Ste si istí, že chcete prísť o urobené zmeny?" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" "Predtým, než budete môcť pridávať rastliny, musíte do databázy pridať aspoň " "jednu Rodinu." #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Rodina" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Rod" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Druh" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "Rodina %s má %s rodov. Ste si istý, že ju chcete odstrániť?" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "Ste si istý, že chcete odstrániť rodinu %s?" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "Pridať rody" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "Rozličné poznámky o tejto rodine." #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "Zoznam synoným tejto rodiny.\n" "\n" "Ak chcete pridať synonymum, zadajte názov rodiny a vyberte jednu zo zoznamu. " "Potom kliknite na Pridať, čím ju pridáte do zoznamu synoným." #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Neznáma Chyba." #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" "Chyba pri pripájaní k databáze.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" "Zadaný viac ako jeden súbor na import do tabuľky %(table_name)s: " "%(file_name)s, (file_name2)s" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" "Nepodarilo sa spárovať všetky názvy súborov s názvami tabuliek.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "Chyba: Nemožno nastaviť poradie pre stĺpce: %s" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Vyberte súbor(y) na import" #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Vyberte adresár" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" "CSVExporter: Cesta neexistuje:\n" "%s" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Import" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "Hodnoty oddelené čiarkami" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" "Je možné, že importovanie údajov do tejto databázy môže zničiť alebo " "poškodiť vaše existujúce údaje.\n" "\n" "Prajete si pokračovať?" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Export" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "Uložte všetky údaje v jednom súbore" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Ste si istí, že chcete odstrániť %s?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "Ak id_qual je aff. alebo cf. potom sa vyžaduje id_qual_rank. %s " #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" "Musíte vybrať druh zo zoznamu. Na pridanie druhu použite Editor druhov." #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" "Kvalifikátor ID\n" "\n" "Možné hodnotu: %s" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "_parse_lat_lon() -- nesprávny formát: %s" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "Výberové pole sever/juh je v zmätenom stave" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "Výberové pole východ/západ je v zmätenom stave" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "model musí mať buď zem. šírku aj dĺžku alebo ani jednu" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Zdroj" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "ID kolekcie:" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "Zberateľ:" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "Dátum získania:" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "Poznámky o darovaní" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "ID darcu:" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "Darca:" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "Nadm. výška:" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "Dátum GPS" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Zemepisná šírka:" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Umiestnenie:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Zemepisná dĺžka:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "Rastliny/klony:" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "Pôvod:" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "Overovateľ:" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "Počet darov:" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Adresa:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Email:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "Institution.__getattr__: %s nie je vlastnosť Institution" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "Institution.__setattr__: %s nie je vlastnosť Institution" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "Miesto" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "Umiestnenie" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Názov" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "Kód rastliny" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "Lokalita" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "Druh" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "Skratka" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Adresa" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "Nadmorská výška/hĺbka" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "Kolekcia ID" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "Kolekcia Poznámky" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "Zberateľ" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "Kontaktné meno" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Dátum" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Opis" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "Darcovia ID" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "Darca" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "E-mail" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "Email" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Č. faxu" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "Popis biotopu" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "História" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "Kvalifikátor ID" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "Názov organizácie" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "Kód organizácie" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "Zemepisná šírka" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "Podrobnosti o Mieste" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "Zemepisná dĺžka" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "Súkromné" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "Pôvod" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Stav" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "Technický kontakt" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Tel. č." #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Telefón" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Typ" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Pridať" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Východ" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "Editor inštitúcie" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Sever" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "OK a pridať rastliny..." #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "OK a pridať rastliny..." #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Juh" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "Západ" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "dd/mm/rrrr" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "Upraviť" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "Nový" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "OK" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "hlavné_okno" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "Rastlina" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Umiestnenie" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "Sieť je názov, ktoré budete neskôr odkazovať na toto miesto." #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" "Akákoľvek informácia, ktorá sa môže týkať umiestnenia ako kde je alebo aký " "je účel" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "Kód rastliny musí byť jedinečný kód" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "Umiestnenie rastliny vo vašej zbierke" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" "Druh rastlinného materiálu.\n" "\n" "Možné hodnoty: %s" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" "Stav tejto rastliny v zbierke.\n" "Možné hodnoty: %s" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "Rozličné poznámky o tejto rastline." #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "Šablóny" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "Prosím vyberte šablónu." #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" "Nemožno otvoriť správy s predvoleným programom. Môžete otvoriť súbor ručne " "na % s" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "Obsahuje údaje, označené ako súkromné" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "Šablóny" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Nastavenia" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "Nie je možné získať rastliny z %s" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "Nie je možné získať druhy z %s" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "Zadajte názov nového formátu" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "%s už existuje" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "Nie je definovaný zásuvný modul formátovača" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "Naskôr niečo hľadajte." #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "Chyba pri formátovaní" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "Rastlina/klon" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Predvolené" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "Prosím, vyberte štýl." #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "Prosím vyber zobrazenie" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" "Nie sú k dispozícii žiadne rastliny vo výsledkoch vyhľadávania. Skúste " "prosím iné vyhľadávanie." #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" "Nie sú k dispozícii žiadne druhy vo výsledkoch vyhľadávania. Skúste prosím " "iné vyhľadávanie." #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" "Chyba pri vytváraní súboru PDF. Uistite sa, že váš PDF formát je správne " "nainštalovaný." #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "Vykresľovač" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "Typ zdroja" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "Štýl" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "Použiť mená autorov" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "Vyberte súbor kam sa bude exportovať..." #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "ABCD" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "Zásuvný modul ABCD vyžaduje balík lxml" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "Nemožno povoliť, účet Google: %s" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "Nastavenia" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "Obrázky" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "Nepodarilo sa prihlásenie k účtu Picasaweb." #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "Žiadne obrázky" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "Album" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Heslo" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "Zadajte názov značky" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "Ste si istí, že chcete vymazať značku „%s“?" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "Nič nie je vybrané" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "Výber značky" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "Nebolo možné vytvoriť menu značiek" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Značky" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "Položka(y)" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "Značky" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "Nová značka" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" "Nebolo možné zistiť cestu používateľských nastavení: neexistuje premenná " "APPDATA alebo USERPROFILE" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" "Nebolo možné zistiť cestu používateľských nastavení: nebolo možné zistiť " "$HOME používateľa %(username)s" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" "Nebolo možné zistiť cestu používateľských nastavení: nepodporovaná platforma" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Táto verziaBauble vyžaduje SQLAlchemy 0.5.0 alebo vyšší. Prosím stiahnite si " "a nainštalujte novšiu verziu SQLAlchemy zo stránky " "http://www.sqlalchemy.org alebo kontaktujte správcu vášho systému." #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "SQLAlchemy nie je nainštalovaný. Prosím nainštalujte SQLAlchemy z " "http://www.sqlalchemy.org" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "Databáza ku ktorej ste pripojení je prázdna." #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" "Nasledujúce zásuvné moduly neboli nájdené v registri zásuvných modulov:\n" "\n" "%s\n" "\n" "Chcete ich teraz nainštalovať?" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" "Nasledovný zásuvný modul sa nachádza v registri, ale nebolo možné ho " "načítať:\n" "\n" "%s" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" "Tento zásuvný modul obsahuje slučku v závislostiach. To sa môže stať ak dva " "moduly priamo alebo nepriamo závisia jeden na druhom." #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" "Zásuvný modul %(plugin_name)s je uvedený v registri, ale nebol nájdený v " "adresári zásuvných modulov" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" "Chyba: Nepodarilo sa inicializovať %(entry_name)s\n" "\n" "%(exception)s." #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" "Zásuvné moduly obsahujú slučku závislostí. To sa môže stať, keď dva modulu " "priamo alebo nepriamo závisia jeden na druhom" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" "Nepodarilo sa importovať modul %(module)s.\n" "\n" "%(error)s" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Podrobnosti spojenia" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Typ:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" "Nedá sa otvoriť %s\n" "\n" "Neznáme zariadenie plochy: %s\n" "\n" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Dnešný dátum" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "Chyba: pomocou sekvencií nebol testovaný na tento typ databázy: %s" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "**Nemožno otvoriť predvolený súbor s protokolom.\n" "Pokračujte stlačením OK.\n" "\n" "%s" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" "Nemôže uložiť vaše používateľské nastavenia. \n" "\n" "Skontrolujte prosím oprávnenia k vášmu konfiguračnému súboru:\n" " %s" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Nastavenia" #: bauble/prefs.py:270 msgid "Plugins" msgstr "Zásuvné moduly" #: bauble/prefs.py:305 msgid "Names" msgstr "Názvy" #: bauble/prefs.py:305 msgid "Values" msgstr "Hodnoty" #: bauble/prefs.py:313 msgid "Name" msgstr "Názov" #: bauble/prefs.py:313 msgid "Version" msgstr "Verzia" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "** Chyba: nepodarilo sa importovať gtk alebo gobject" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "Prosím, uistite sa, že GTK_ROOT\\bin je vo vašej premennej PATH." #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "Nebola zaregistrovaná štandardná obsluha" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "Žiadna obsluha pre %s" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "**Chyba: Bauble musí bežať v grafickom prostredí." #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Nepodarilo sa otvoriť spojenie.\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" "Chcete vytvoriť novú databázu Bauble v súčasnom spojení?\n" "\n" "Upozornenie: Ak v tomto spojení už databáza existuje, všetky existujúce " "údaje sa stratia!" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "Enum vyžaduje zoznam hodnôt" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" "Nakonfigurovali ste empty_to_none=True, ale None nie je v zoznamoch hodnôt" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "„%s“ nie je v Enum.values" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" "Nemáte žiadne spojenie v zozname pripojení.\n" "Zatvorte túto správu a vytvorte nové pripojenie kliknutím na „Pridať“." #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" "Musíte si vybrať alebo vytvoriť nové pripojenie predtým než sa budete môcť " "pripojiť k databáze." #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" "Bauble nemá oprávnenie na čítanie adresára:\n" "\n" "%s" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" "Bauble nemá oprávnenie na zapisovanie do adresára:\n" "\n" "%s" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble nemá oprávnenie na čítanie databázového súboru:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" "Bauble nemá oprávnenie na zapisovanie do databázového súboru:\n" "\n" "%s" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Chcete uložiť zmeny?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" "neboli nainštalované žiadne pripojenia k databáze pre Python.\n" "Pozrite sa prosím do dokumentácie na požiadavky na inštaláciu Bauble." #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "Ste si istí, že chcete odstrániť „%s“?" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Vlož názov pripojenia" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Prajete si uložiť %s" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Prajete si uložiť zmeny do %s ?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Vložte svoje heslo" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Vyberte si prosím názov tohto pripojenia" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Vyberte si prosím používateľské meno pre toto spojenie" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Databáza: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Hostiteľ: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Používateľ: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Heslo: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Použite predvolený názov súboru" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Názov súboru " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Vyberte si súbor..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "Nepodarilo sa ukončiť okno" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "žiadny widget s názvom %s" #~ msgid "Users" #~ msgstr "Užívatelia" #~ msgid "Administrator" #~ msgstr "Administrátor" #~ msgid "Permissions" #~ msgstr "Povolenia" #~ msgid "Write" #~ msgstr "Zapísať" #~ msgid "gtk-cancel" #~ msgstr "gtk-zrušiť" #~ msgid "Error installing plugins." #~ msgstr "Chyba pri inštalácii pluginov." #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Chyba pri inštalácii pluginov: %s" #~ msgid "" #~ "SimpleJSON not installed. Please install SimpleJSON from " #~ "http://cheeseshop.python.org/pypi/simplejson" #~ msgstr "" #~ "SimpleJSON nie je nainštalovaný. Prosím inštaluj SimpleJSON z " #~ "http://cheeseshop.python.org/pypi/simplejson" #, python-format #~ msgid "Error: %s" #~ msgstr "Chyba: %s" bauble-0.9.7/po/pt_BR.po0000644000175000017500000013557711310567254014015 0ustar brettbrett# Brazilian Portuguese translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-09-03 21:26+0000\n" "Last-Translator: Rodrigo Henrique \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "Tamanho história deve ser maior que zero e menor que o tamanho da história" #: bauble/_gui.py:368 msgid "_File" msgstr "_Arquivo" #: bauble/_gui.py:369 msgid "_New" msgstr "_Novo" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Abrir" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Sair" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Editar" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Recortar" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Copiar" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Colar" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Inserir" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Ferramentas" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Ajuda" #: bauble/_gui.py:390 msgid "Contents" msgstr "Conteúdo" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Comunicar um erro" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "site do Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "Sobre" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "" #: bauble/view.py:93 msgid "Properties" msgstr "Propriedades" #: bauble/view.py:99 msgid "ID:" msgstr "" #: bauble/view.py:108 msgid "Type:" msgstr "Tipo:" #: bauble/view.py:117 msgid "Date created:" msgstr "" #: bauble/view.py:126 msgid "Last updated:" msgstr "" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Domínio de procura desconhecido: % s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Erro: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "" #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Exibir detalhes" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Não foi possível excluir.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Editar" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Remover" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Sinônimos" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Notas" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Geral" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Links" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "pesquisa no google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Pesquisa È" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Procure IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Procure BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "# de Plantas:" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Distribuição:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Autor" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Família" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Notas" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "editar família" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Nome completo" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "editar gênero" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "linguagem" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Próximo >>" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "tudo bem e Acrescentar as Adesões" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "Tudo Bem e Soma Espécies" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-adicionar" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" "Erro ao confirmar alterações\n" "\n" "%s" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" "Erro desconhecido ao confirmar alterações. Veja os detalhes para mais " "informações.\n" "\n" "%s" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "Adicionar espécies" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "O nome da família" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "Você tem certeza que deseja perder suas alterações?" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "Adiciona adesão" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Família" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Gênero" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Espécie" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "Adicionar gêneros" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Erro Desconhecido" #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Escolher(s) ficheiro para importar..." #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Selecione um diretório" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Exportar" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "salvar todos os dados em um arquivo" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Tem certeza que deseja remover %s?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Você tem certeza que deseja remover essa adesão %(acc_code)s?" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "Você tem certeza que deseja remover essa adesão %s?" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "fonte desconhecida_escreva em adesão: %s" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" "As espécies devem ser selecionadas da lista de finalizadas. Para adicionar " "espécies use o Editor de Espécies." #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "A adesão ID deve ser um código único" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" "O ID Qualificativo\n" "\n" "Valores possíveis: %s" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "A data desta espécie foi catalogada." #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" "A origem ou fonte desta adesão.\n" "\n" "Valores Possíveis: %s" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" "O estado selvagem é usado para esclarecer a procedência\n" "\n" "Valores possíveis: %s" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "O tipo de fonte está de que modo que esta acessão foi obtida" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "Miscelleanous nota sobre esta acessão." #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "Indica se este registro de acessão deveria ser considerado privado." #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "_parse_lat_lon() -- formato incorreto: %s" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "Norte/Sul radiofônico botões de um Estado confusa" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "Os botões Leste/Oeste do rádio estão numa situação confusa" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "Adesão" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "_Adesão" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" "Você deve primeiramente adicionar ou importar pelo menos uma espécie para a " "base de dados antes que possa adicionar adesões" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "modelo deve ter latitude e longitude ou nenhum deles." #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Fonte" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "Coleção ID:" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "< b > Coletor: < /b >" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "Data coletada:" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "Notas de Doação" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "ID do Doador:" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "Doador:" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "Elevação:" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "Dado do GPS" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "Habitat" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Latitude:" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Localização:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Longitude:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "Plantas/Clones:" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "Origem:" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "Verificador:" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "# de Doações:" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Endereço:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "E-mail:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "ID de Adesão" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "Adesão" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "Localidade" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "Localização" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Nome" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "Código da Planta" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "Site" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "Espécies" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "Abreviação" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "Tipo de adesão" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Endereço" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "Altitude/Profundidade" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "ID da Coleção" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "Notas da Coleção" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "Colecionador" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "Nome de Contato" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Data" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Descrição" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "ID do Doador" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "Doador" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "E-mail" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "E-mail" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Fax #" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "Descrição do Habitat" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "Histórico" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "ID Qualificador" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "Nome da Instituição" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "Código da Instituição" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "Latitude" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "Detalhes do Local" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "Longitude" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "Particular" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "Origem" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Situação" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "Contato Técnico" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Tel #" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Telefone" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Tipo" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "Estado selvagem" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Adicionar" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Leste" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "Editor de instituição" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Norte" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "OK e Acrescentamento Plantas..." #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "OK e Acrescentamento Plantas..." #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Sul" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "Oeste" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "dd/mm/yyyy" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "gtk-editar" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "gtk-nova" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "Situação da Adesão:" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "Planta" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Localização" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" "O site é o nome que você usará posteriormente para se referir a esse local." #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" "Qualquer informação que possa ser relevante para o local, como sua " "localização ou propósito." #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "O código da planta deve ser um código único" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" "A adesão deve ser escolhida da lista de finalizadas. Para acrescentar uma " "adesão use o Editor de Adesão." #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "O local da planta em sua coleção." #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" "O tipo de material da planta.\n" "\n" "Valores possíveis: %s" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" "O estado da planta na coleção.\n" "Valores Possíveis: %s" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "Notas variadas sobre essa planta." #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Configurações" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "Procure algo primeiro." #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "Erro formatando" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Padrão" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" "Algumas ou todas informações sobre sua instituição ou empresa não está " "completa. Por favor certifique-se que os campos Nome, Contato Técnico, " "Email, Contato e Código da Instituição estão preenchidos." #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "ponha um nome na etiqueta" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "Nada selecionado" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "selecione a etiqueta" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Etiquetas" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "Nova Etiqueta" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Esta versão do Bauble requer SQLAlchemy 0.5.0 ou maior. Por favor " "descarregue e instale uma versão mais nova do SQLAlchemy em " "http://www.sqlalchemy.org ou contate o administrador do sistema." #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "SQLAlchemy não está instalado. Por favor instale o SQLAlchemy em " "http://www.sqlalchemy.org" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "A base de dados à qual você se conectou está vazia." #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" "A base de dados à qual você se conectou não tem a tabela meta bauble. Isto " "geralmente significa que a base de dados ou está corrupto ou ela foi criada " "com uma versão velha do Bauble" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" "Erro: Não foi possível inicializar %(entry_name)s\n" "\n" "%(exception)s." #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" "Não foi possível importar o módulo %(module)s.\n" "\n" "%(error)s" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Detalhes da Conexão" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Tipo:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "%s não está no arquivo glade" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Data de hoje" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" "Erro: usando seqüências que não foram ainda testadas neste tipo de base de " "dados: %s" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "** Não pôde abrir o arquivo de log padrão.\n" "Pressione OK para continuar.\n" "\n" "%s" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Preferências" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "Nomes" #: bauble/prefs.py:305 msgid "Values" msgstr "Valores" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "** Erro: não foi possível importar gtk e/ou gobjeto" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble não possui permissão para ler o arquivo do banco de dados:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "quer salvar suas alterações?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Deseja salvar %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Forneça sua senha" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Por favor, escolha um nome de utilizador para esta conexão" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Banco de Dados: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Máquina: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Usuário: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Senha: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Nome do Arquivo : " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Escolha um arquivo..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "Não poderia destruir a janela" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "nenhum item com o nome %s" #~ msgid "Administrator" #~ msgstr "Administrador" #~ msgid "Users" #~ msgstr "Usuários" #~ msgid "Write" #~ msgstr "Gravar" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Erro criando tabelas.\n" #~ "\n" #~ "%s" #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Erro ao instalar plugins: %s" #~ msgid "Error installing plugins." #~ msgstr "Erro ao instalar plugins." bauble-0.9.7/po/eo.po0000644000175000017500000012143411310567254013375 0ustar brettbrett# Esperanto translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-05-28 17:01+0000\n" "Last-Translator: Michael Moroni \n" "Language-Team: Esperanto \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" #: bauble/_gui.py:368 msgid "_File" msgstr "" #: bauble/_gui.py:369 msgid "_New" msgstr "" #: bauble/_gui.py:371 msgid "_Open" msgstr "" #: bauble/_gui.py:373 msgid "_Quit" msgstr "" #: bauble/_gui.py:375 msgid "_Edit" msgstr "" #: bauble/_gui.py:376 msgid "_Cut" msgstr "" #: bauble/_gui.py:378 msgid "_Copy" msgstr "" #: bauble/_gui.py:380 msgid "_Paste" msgstr "" #: bauble/_gui.py:386 msgid "_Insert" msgstr "" #: bauble/_gui.py:387 msgid "_Tools" msgstr "" #: bauble/_gui.py:388 msgid "_Help" msgstr "" #: bauble/_gui.py:390 msgid "Contents" msgstr "" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "" #: bauble/_gui.py:397 msgid "About" msgstr "" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "" #: bauble/view.py:93 msgid "Properties" msgstr "" #: bauble/view.py:99 msgid "ID:" msgstr "" #: bauble/view.py:108 msgid "Type:" msgstr "" #: bauble/view.py:117 msgid "Date created:" msgstr "" #: bauble/view.py:126 msgid "Last updated:" msgstr "" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "" #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Montri detalojn" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-add" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-remove" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "" #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "" #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "" #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" #: bauble/prefs.py:261 msgid "Preferences" msgstr "" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "" #: bauble/prefs.py:305 msgid "Values" msgstr "" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "" #: bauble/connmgr.py:522 msgid "Database: " msgstr "" #: bauble/connmgr.py:528 msgid "Host: " msgstr "" #: bauble/connmgr.py:535 msgid "User: " msgstr "" #: bauble/connmgr.py:541 msgid "Password: " msgstr "" #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "" #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "" #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "" #~ msgid "Users" #~ msgstr "Uzantoj" #~ msgid "Administrator" #~ msgstr "Administranto" #~ msgid "Write" #~ msgstr "Skribi" #~ msgid "gtk-cancel" #~ msgstr "gtk-cancel" bauble-0.9.7/po/en_CA.po0000644000175000017500000015417211310567254013744 0ustar brettbrett# English (Canada) translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-06-22 06:49+0000\n" "Last-Translator: Itai Molenaar \n" "Language-Team: English (Canada) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Could not load icon from %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "history size must be greater than zero and less than the history size" #: bauble/_gui.py:368 msgid "_File" msgstr "_File" #: bauble/_gui.py:369 msgid "_New" msgstr "_New" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Open" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Quit" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Edit" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Cut" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Copy" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Paste" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Insert" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Tools" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Help" #: bauble/_gui.py:390 msgid "Contents" msgstr "Contents" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Report a bug" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Bauble website" #: bauble/_gui.py:397 msgid "About" msgstr "About" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "Could not create a new database.\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Would you like the cancel the current tasks?" #: bauble/view.py:93 msgid "Properties" msgstr "Properties" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Type:" #: bauble/view.py:117 msgid "Date created:" msgstr "Date created:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Last updated:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "MapperSearch.add_meta(): default_columns argument must be list" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "MapperSearch.add_meta(): default_columns argument cannot be empty" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Unknown search domain: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Error in search string at column %s" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Error: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Couldn't find anything" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Retrieving %s search results..." #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s search results" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Show details" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" "The species %s has %s accessions. Are you sure you want remove it?" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "Are you sure you want to remove the species %s?" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Could not delete.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Edit" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Remove" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "Vernacular Names" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Synonyms" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Notes" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "General" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Links" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Search Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Search GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "Search the Global Biodiversity Information Facility" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Search ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "Search the Intergrated Taxonomic Information System" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Search IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "Search the International Plant Names Index" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Search BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "Search Botanic Gardens Conservation International" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "# of Accessions:" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "# of Genera:" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "# of Plants:" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "# of Plants" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "# of Species:" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Distribution:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "family_window" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "genus_window" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "species_window" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Author" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "Cultivar Group" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Distribution" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Family" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Genus" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "Hybrid" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "Infraspecific Author" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "Infraspecific Epithet" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "Infraspecific Parts" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "Infraspecific Rank" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "Meta Information" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Notes" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "Qualifier" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "Species qualifier" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "Synonyms" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "Genus" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Species" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "Family Editor" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Full name" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "Genus Editor" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Language" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Next" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "OK and Add Accessions" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "OK and Add Genera" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "OK and Add Species" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "Plant Species Editor" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "Vernacular name" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-add" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-remove" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "Are you sure you want to remove the vernacular name %s?" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "Genus " #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "Species epithet" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "Species author" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "Infraspecific rank" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "Species hybrid flag" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "Infraspecific epithet" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "Cultivar group" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "Infraspecific author" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "Species qualifier" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "Note" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "Species distribution" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "Vernacular names" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "Species synonyms" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" "Error committing changes.\n" "\n" "%s" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" "The genus %s has %s species. Are you sure you want to remove it?" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "Are you sure you want to remove the genus %s?" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "Add species" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "The family name" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "The type of hybrid for this genus." #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "The genus name" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "The name or abbreviation of the author that published this genus" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "Miscelleanous notes about this genus." #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "Are you sure you want to lose your changes?" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" "You must first add or import at least one Family into the database before " "you can add plants." #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "Add accession" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Family" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Genus" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Species" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" "The family %s has %s genera. Are you sure you want to remove it?" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "Are you sure you want to remove the family %s?" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "Add genera" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "Miscellaneous notes about this family." #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Unknown Error." #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" "Error connecting to database.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" "Could not match all filenames to table names.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "importing %(table)s table from %(filename)s" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "Error: Could not set the sequence for column: %s" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Choose file(s) to import..." #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Select a directory" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" "CSVExporter: path does not exist.\n" "%s" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "exporting %(table)s table to %(filename)s" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Import" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "Comma Separated Value" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Export" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "Save all data in one file" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Are you sure you want to remove %s?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "Are you sure you want to remove accession %s?" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "If the id_qual is aff. or cf. then id_qual_rank is required. %s " #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "unknown source_type in accession: %s" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" "The species must be selected from the list of completions. To add a species " "use the Species editor." #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "The accession ID must be a unique code" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" "The ID Qualifier\n" "\n" "Possible values: %s" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "The date this species was accessioned." #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" "The origin or source of this accession.\n" "\n" "Possible values: %s" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "The source type is in what way this accession was obtained" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "Miscellaneous notes about this accession." #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" "Indicates whether this accession record should be considered private." #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "_parse_lat_lon() -- incorrect format: %s" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "North/South radio buttons in a confused state" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "East/West radio buttons in a confused state" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "Accession" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "_Accession" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" "You must first add or import at least one species into the database before " "you can add accessions." #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "model must have both latitude and longitude or neither" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Source" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "Collection ID:" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "Collector:" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "Date collected:" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "Donation Notes" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "Donor's ID:" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "Donor:" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "Elevation:" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "GPS Datum" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "Habitat" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Latitude:" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Location:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Longitude:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "Plants/Clones:" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "Provenance:" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "Verifier:" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "# of Donations:" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Address:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Email:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "Institution.__getattr__: %s not a property on Intitution" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "Institution.__setattr__: %s not a property on Intitution" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "Accession ID" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "Accession" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "Locale" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "Location" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Name" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "Plant code" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "Site" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "Species" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "Abbreviation" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "Accession type" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Address" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "Altitude/Depth" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "Collection ID" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "Collection Notes" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "Collector" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "Contact name" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Date" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Description" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "Donor's ID" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "Donor" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "E-mail" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "Email" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Fax #" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "Habitat description" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "History" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "ID Qualifier" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "Institution Name" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "Institutional code" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "Latitude" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "Location Details" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "Longitude" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "Private" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "Provenance" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "Qualifier Rank" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Status" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "Technical contact" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Tel #" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Telephone" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Type" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "Wild status" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Add" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "East" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "Institution Editor" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "North" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "OK and add plants..." #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "Ok and add plants" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "South" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "West" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "dd/mm/yyyy" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "gtk-edit" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "gtk-new" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "Accession Status:" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "Accession Type:" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "general_window" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "Plant" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Location" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" "The site is the name that you will use later to refer to this location." #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "The plant code must be a unique code" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "The location of the plant in your collection." #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" "The type of the plant material.\n" "\n" "Possible values: %s" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" "The status of this plant in the collection.\n" "Possible values: %s" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "Miscellaneous notes about this plant." #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "Template" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "Please select a template." #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" "Could not open the report with the default program. You can open the file " "manually at %s" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "Include data marked as private" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "Template" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "Formatter" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Settings" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "Can't get plants from a %s" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "Can't get accessions from a %s" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "Can't get species from a %s" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "Enter a name for the new formatter" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "%s already exists" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "No formatter plugins defined" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" "No formatters found. To create a new formatter click the \"New\" button." #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "Search for something first." #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "Formatting Error" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "Plant/Clone" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Default" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "Please select a stylesheet." #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "Please select a a renderer" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" "There are no plants in the search results. Please try another search." #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" "There are no species in the search results. Please try another search." #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" "There are no accessions in the search results. Please try another search." #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "Renderer" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "Source type" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "Stylesheet" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "Use author names" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" "Accession\n" "Plant/Clone\n" "Species" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "Choose a file to export to..." #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "ABCD" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "The lxml package is required for the ABCD plugin" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "Could not authorize Google account: %s" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "Settings" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "Images" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "Could not login to PicasaWeb account." #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "No images" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "Album" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Password" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "Enter a tag name" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "Are you sure you want to delete the tag \"%s\"?" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "Nothing selected" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "Tag Selection" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "Could not create the tags menus" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Tags" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "Item(s)" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "Tags" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "New Tag" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "Could not get path for user settings: unsupported platform" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "The database you have connected to is empty." #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" "Could not import the %(module)s module.\n" "\n" "%(error)s" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "%s.plugin is not an instance of pluginmgr.Plugin" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Connection Details" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Type:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "%s not in glade file" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Today's date" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "Error: using sequences hasn't been tested on this database type: %s" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Preferences" #: bauble/prefs.py:270 msgid "Plugins" msgstr "Plugins" #: bauble/prefs.py:305 msgid "Names" msgstr "Names" #: bauble/prefs.py:305 msgid "Values" msgstr "Values" #: bauble/prefs.py:313 msgid "Name" msgstr "Name" #: bauble/prefs.py:313 msgid "Version" msgstr "Version" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "** Error: could not import gtk and/or gobject" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "Please make sure that GTK_ROOT\\bin is in your PATH." #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "No default handler registered" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "No command handler for %s" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "**Error: Bauble must be run in a windowed environment." #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Could not open connection.\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "Enum requires a list of values" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" "You have configured empty_to_none=True but None is not in the values lists" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "\"%s\" not in Enum.values" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" "You have to choose or create a new connection before you can connect to the " "database." #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" "Bauble does not have permission to read the directory:\n" "\n" "%s" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble does not have permission to read the database file:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Do you want to save your changes?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequisites for installing Bauble." #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Enter a connection name" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Do you want to save %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Do you want to save your changes to %s ?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Enter your password" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Please choose a name for this connection" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Please choose a user name for this connection" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Database: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Host: " #: bauble/connmgr.py:535 msgid "User: " msgstr "User: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Password: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Use default filename" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Filename: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Choose a file..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "Could not destroy window" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "no widget with name %s" bauble-0.9.7/po/de.po0000644000175000017500000014455611310567254013374 0ustar brettbrett# German translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-12-02 20:43+0000\n" "Last-Translator: ucn| \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Schließen" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Fehler melden" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Bauble Webseite" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/view.py:93 msgid "Properties" msgstr "Einstellungen" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:117 msgid "Date created:" msgstr "Erstellungsdatum:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Zuletzt geändert:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" "MapperSearch.add_meta(): Standard_Spalten Argumente müssen aufgelistet sein" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" "MapperSearch.add_meta(): Standard_Spalten Argumente können nicht leer sein" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Unbekannte Suchdomäne: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Fehler im Zeichenketten Suche in der Spalte %s" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Fehler: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Konnte nichts finden" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" "Diese Anfrage gab folgendes Resultat %s. Es dürfte länger dauern um all " "Daten zu bekommen. Sind Sie sicher fortzufahren?" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Empfange Suchergebnisse %s ..." #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s Suchergebnisse" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-hinzufügen" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "SQLAlchemy ist nicht installiert. Bitte installieren Sie SQLAlchemy von " "http://www.sqlalchemy.org" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "Die Datenbank, zu welcher Sie verbunden sind, ist leer" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" "Die Datenbank, zu welcher Sie verbunden sind, hat keine Bauble Meta Tabelle. " "Das bedeuted im normalerweise, dass die Datenbank entweder fehlerhaft ist " "oder sie ist mit einer älteren Version von Bauble erstellt worden." #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" "Die Datenbank, zu welcher Sie verbunden sind, hat nicht den Zeitstempel von " "wann sie erstellt worden ist. Das heißt normalerweise, dass ein Fehler war " "als Sie die Datenbank erstellt haben oder die Datenbank wurde nicht mit " "Bauble erstellt." #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" "Sie verwenden die Bauble Version %(version)s, während die Datenbank, mit " "welcher Sie verbunden sind, wurde mit der Version %(db_version)s\n" "Manche Funktionen werden vielleicht nicht funktionieren oder mancher Ihrer " "Daten könnten unerwarter fehlerhaft sein." #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "%s.Plugin ist kein Beispiel PLugin von pluginmgr." #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Datum von heute" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" "Fehler: Verwendete Sequenz konnte an den Datenbank Typ nicht getesten " "werden: %s" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" "Bauble könnte die Benutzer Einstellungen nicht speichern. \n" "\n" "Bitte überprüfen Sie die Dateirechte Ihrer Konfigurationsdatei:\n" " %s" #: bauble/prefs.py:305 msgid "Names" msgstr "Benutzernamen:" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "Kein Standardanwender registriert" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Konnte Verbindung nicht öffnen.\n" "\n" "%s" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "\"%s\" ist kein Enum Wert" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" "Sie haben keine Verbindungen in Ihrer Verbindungsliste.\n" "Schließen Sie diese Nachricht und klicken Sie auf \"Add\" zum Erstellen " "einer neuen Verbindung." #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" "Sie müssen entweder eine Verbindung wählen oder erstellen bevor Sie zur " "Datenbank verbinden können." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" "Könnte nicht die Kurzinformation auf dem Widget %(widget_name)s bestimmen.\n" "\n" "%(exception)s" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "Kein Widget mit dem Namen %s" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Fehler beim Erstellen von den Tabellen-\n" #~ "\n" #~ "%s" #~ msgid "Registry" #~ msgstr "Registrierung" #~ msgid "" #~ "The database you have connected to does not have a valid plugin registry. " #~ "This means that the database could be corrupt or was interrupted while " #~ "creating a new database at this connection." #~ msgstr "" #~ "Die Datenbank, mit der Sie verbunden sind, hat nicht keine gültige " #~ "Erweiterungs Register. Das heißt, dass die Datenbank fehlerhaft ist oder die " #~ "Verbindung wurde unterbrochen während der Erstellung einer neuen Datenbank." #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Konnte Symbol nicht aus %s laden" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "history size must be greater than zero and less than the history size" #: bauble/_gui.py:368 msgid "_File" msgstr "_Datei" #: bauble/_gui.py:369 msgid "_New" msgstr "_Neu" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Öffnen" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Bearbeiten" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Ausschneiden" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Kopieren" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Einfügen" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Einfügen" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Werkzeuge" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Hilfe" #: bauble/_gui.py:390 msgid "Contents" msgstr "Inhalte" #: bauble/_gui.py:397 msgid "About" msgstr "Über" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "Konnte keine neue Datenbank erstellen.\n" "\n" "%s" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Möchten Sie die momentanen Aufgaben abbrechen?" #: bauble/view.py:108 msgid "Type:" msgstr "Typ:" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Zeige Details" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Konnte nicht löschen.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Bearbeiten" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Entfernen" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "Einheimischer Name" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Sinnverwandte Wörter" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Notizen" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Allgemein" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Links" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Google-Suche" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "GBIF-Suche" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "Suche in der Global Biodiversity Information Facility" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "ITIS-Suche" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "Suche in dem Integrated Taxonomic Information System" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "IPNI-Suche" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "Suche im International Plant Names Index" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "BGCI-Suche" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "# der Pflanzen:" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Distribution:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Autor" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "Kultursorte" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Distribution" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Familie" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Gattung" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "Hybrid" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "Meta Information" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Angaben" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Spezies" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Vollständiger Name" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Sprache" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Weiter" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-remove" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" "Fehler beim Durchführen der Änderungen.\n" "\n" "%s" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" "Unbekannter Fehler beim Durchführen der Änderung aufgetreten. Unter Details " "finden Sie mehr Informationen.\n" "\n" "%s" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "Sind Sie sicher, dass Sie die Änderungen nicht speichern wollen?" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "Zugang hinzufügen" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Familie" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Gattung" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Spezie" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Unbekannter Fehler." #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" "Fehler bei der Verbindung mit der Datenbank\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" "Mehr als eine Datei vorgegeben zum Eintrag in Tabelle %(table_name)s: " "%(file_name)s, (file_name2)s" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" "Nicht alle Dateinamen passen zu den Tabellennamen.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "Einfügen von %(table)s Tabelle von %(filename)s" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" "Die %s Tabelle existiert bereits in der Datenbank und enthält einige " "Daten. Wenn eine Reihe der eingefügten Datei dieselbe ID hat wie eine Reihe " "in der Datenbank, wird die Datei nicht korrekt eingefügt.\n" "\n" "Möchten Sie zuerst die Tabelle aus der Datenbank entfernen? Sie werden " "die daten in Ihrer Datenbank verlieren, wenn Sie dies tun." #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" "Fehler: Die Reihenfolge für die Spalten konnten nicht festgesetzt werden: %s" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Wählen Sie Datei(en) zum Einfügen..." #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Verzeichnis auswählen" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" "CVSEinfüger: Der Pfad existiert nicht.\n" "%s" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" "Eingefügte Datei %(filename)s für %(table)s Tabelle existiert " "bereits.\n" "\n" "Möchten Sie den Vorgang fortsetzen?" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "%(table)s Tabelle wird in %(filename)s eingefügt" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Importieren" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "durch Komma getrennter Wert" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" "Es ist möglich, dass das Einfügen von Daten in die Datenbank bereits " "existierende Daten zerstören oder verschlechtern könnte" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Exportieren" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "Alle Daten in einer datei speichern" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Wollen Sie %s wirklich löschen?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" "Die Pflanzen %(num_plants)s hängen von diesem Zugang ab: " "%(plant_codes)s\n" "\n" "Sind Sie sicher, dass Sie folgenden Zugang entfernen wollen: " "%(acc_code)s?" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "Sind Sie sicher, dass Sie den Zugang %s entfernen wollen?" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "Unbekannter source_type in dem Zugang: %s" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" "Die Spezie muss aus der Abschlussliste gewählt werden. Um eine Spezie " "hinzuzufügen, nutzen Sie den Spezieneditor." #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "Die Zugangs-ID muss ein spezischer Code sein" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" "Die Kennzeichner ID\n" "\n" "Mögliche Werte: %s" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "Diese Spezie wurde an diesem Datum hinzugefügt." #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" "Die Ausgangs-Quelle für diesen Zugang.\n" "\n" "Mögliche Werte: %s" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" "Der Wildnis Status dient zur Klärung der Herkunft\n" "\n" "Mögliche Werte: %s" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" "Die Art der Quelle gibt an, in welcher Weise der Zugang hergestellt wurde." #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "Verschiedene Angaben über diesen Zugang." #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "Gibt an, ob der Zugangseintrag als privat zu betrachten ist." #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "_parse_lat_lon() -- falsches Format: %s" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "Die Nord-/Süd-Optionsschaltfläche sind vertauscht." #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "Die Ost-/West-Optionsschaltflächen sind vertauscht." #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "Zugang" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "_Zugang" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" "Sie müssen erst mindestens eine Spezie in die Datenbank hinzufügen oder " "importieren, bevor Sie Zugänge hinzufügen können." #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" "Das Muster muss entweder Länge und Breite oder keines von beiden enthalten." #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Quelle" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "Eingangs ID:" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "Sammler:" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "Eingangsdatum der Sammlung:" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "Angaben der Spende" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "ID des Spenders:" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "Spender:" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "Profil:" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "GPS Datum" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "Habitat" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Breitengrad:" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Ort:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Längengrad:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "Pflanzen/Clone::" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "Herkunft:" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "Prüfer:" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "# der Spenden:" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Adresse:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "E-Mail:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "Institution.___getattr___:%s nicht geistiges Eigentum" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "Institution.___setattr___:%s nicht geistiges Eigentum" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "Zugangs-ID" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "Zugang" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "Örtlichkeit" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "Ort" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Name" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "Code der Pflanze" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "Seite" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "Spezien" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "Abkürzung" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "Art des Zugangs" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Adresse" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "Höhe/Tiefe" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "ID der Sammlung" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "Angaben zur Sammlung" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "Sammler" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "Kontaktname" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Datum" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Beschreibung" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "ID des Spenders" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "Spender" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "E-Mail" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "E-Mail" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Fax #" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "Beschreibung des Habitat" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "Chronik" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "ID Qualifikation" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "Name der Institution" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "Institutionaler Code" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "Breitengrad" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "Details zum Ort" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "Längengrad" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "Privat" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "Herkunft" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Status" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "Technischerl Kontakt" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Tel #" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Telefon" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Typ" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "Wildnis status" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Hinzufügen" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Ost" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "Institutionseditor" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Nord" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "OK und Pflanze hinzufügen..." #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "OK und Pflanze hinzufügen" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Süd" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "West" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "tt/mm/jjjj" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "gtk-bearbeiten" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "gtk-neu" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "Status des Zugangs:" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "Art des Zugangs:" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "allgemeines_Fenster" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "Pflanze" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Ort" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" "Die Seite trägt den Namen, den Sie später zum Verweis auf diese " "Internetseite brauchen." #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" "Alle Informationen, die wichtig für diese Adresse sein könnten, z.B. wo sie " "sich befindet und was ihr Zeck ist." #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "Der Pflanzencode muss spezifisch sein." #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" "Der Zugang muss von der Abschlussliste gewählt werden. Um einen Zugang " "zuzufügen, nutzen Sie den Zugangseditor." #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "Der Speicherstelle der Pflanze in Ihrer Samlung." #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" "Die Art des pflanzlichen Materials.\n" "\n" "Mögliche Werte: %s" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" "Der Status dieser Pflanze in der Sammlung.\n" "Mögliche Werte: %s" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "Verschiedene Angaben zu dieser Pflanze." #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Einstellungen" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "Bekomme keine Art von %s" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "%s existiert bereits" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Standard" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" "Einige oder alle Informationen über Ihre Institution oder Geschäft sind " "nicht vollständig. Stellen Sie sicher, dass der Name, technischer Kontakt, " "Email, Kontakt and Codefelder der Institution eingetragen sind." #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "Album" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Passwort" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "Nichts ausgewählt" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Tags" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "Tags" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "Neuer Tag" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Diese Version von Bauble benötigt SQLAlchemy Version 0.5.0 oder höher. Bitte " "laden Sie eine neuere Version von SQLAlchemy von http:www.sqlalchemy.org " "herunter und installieren Sie sie oder kontaktieren Sie Ihren " "Systemverwalter." #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Typ:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "%s ist keine glade Datei" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "** Konnte Standard Protokoll Datei nicht öffnen.\n" "Drücke OK um fortzufahren.\n" "%s" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Einstellungen" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Values" msgstr "Werte" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "Enum erfordert eine Liste an Weren" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" "Sie haben empty_to_none=True konfiguriert, aber None ist kein gelisteter Wert" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Wollen Sie Ihre Änderungen speichern?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Geben Sie Ihr Passwort ein" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Datenbank: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Rechner: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Benutzer: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Passwort: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Dateiname: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Datei auswählen …" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "Konnte Fenster nicht schließen" #~ msgid "Users" #~ msgstr "Benutzer" #~ msgid "Permissions" #~ msgstr "Berechtigungen" #~ msgid "Administrator" #~ msgstr "Systemverwalter" #~ msgid "Write" #~ msgstr "Speichern" #~ msgid "gtk-cancel" #~ msgstr "gtk-abbrechen" bauble-0.9.7/po/sv.po0000644000175000017500000012465211310567254013427 0ustar brettbrett# Swedish translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-06-15 18:50+0000\n" "Last-Translator: nairobie \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Kunde inte ladda ikoner från %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" #: bauble/_gui.py:368 msgid "_File" msgstr "_Fil" #: bauble/_gui.py:369 msgid "_New" msgstr "_Ny" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Öppen" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Avsluta" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Redigera" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Klipp ut" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Kopiera" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Klistra in" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Infoga" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Verktyg" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Hjälp" #: bauble/_gui.py:390 msgid "Contents" msgstr "Inehåll" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Rapportera en bugg" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Baubles hemsida" #: bauble/_gui.py:397 msgid "About" msgstr "Om" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "Kunde inte skapa en ny databas.\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "" #: bauble/view.py:93 msgid "Properties" msgstr "Egenskaper" #: bauble/view.py:99 msgid "ID:" msgstr "" #: bauble/view.py:108 msgid "Type:" msgstr "" #: bauble/view.py:117 msgid "Date created:" msgstr "" #: bauble/view.py:126 msgid "Last updated:" msgstr "Senast uppdaterad:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Error: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Kunde inte hitta någonting" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Hämtar %s sökresultat" #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s sökresultat" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Visa detaljer" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "Är du säker på att du vill tabort arten %s?" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Kunde inte ta bort.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Redigera" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Ta bort" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Synonymer" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Anteckningar" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Länkar" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Sök på Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Sök i GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "Sök i Global Biodiversity Information Facility" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Sök i ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "Sök i Intergrated Taxonomic Information System" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Sök i IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "Sök i International Plant Names Index" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Sök i BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "Sök i Botanic Gardens Conservation International" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "# av Plantor: " #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Författare" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Familj" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "Meta Information" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Språk" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Nästa" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-läggtil" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-tabort" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "" #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Välj fil(er) att importera..." #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Importera" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Exportera" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Är du säker på att du vill ta bort %s?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Email:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Namn" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Datum" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "E-mail" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "Email" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Fax #" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Tel #" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "dd/mm/åååå" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Lösenord" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Dagens datum" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" #: bauble/prefs.py:261 msgid "Preferences" msgstr "" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "Namn" #: bauble/prefs.py:305 msgid "Values" msgstr "Värden" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "** Fel: kunde inte importera gtk och/eller gobject" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Kunde inte öppna anslutning.\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Vill du spara dina ändringar?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Ange ett anslutningsnamn" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Vill du spara %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Ange ditt lösenord" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Välj ett namn på denna anslutning" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Välj ett användarnamn för denna anslutning" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Databas: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Värd: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Användare: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Lösenord: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Filnamn: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Välj en fil..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "" #~ msgid "Users" #~ msgstr "Användare" #~ msgid "Administrator" #~ msgstr "Administratör" #, python-format #~ msgid "Error: %s" #~ msgstr "Fel: %s" #~ msgid "" #~ "SimpleJSON not installed. Please install SimpleJSON from " #~ "http://cheeseshop.python.org/pypi/simplejson" #~ msgstr "" #~ "SimpleJSON är inte installerad. Installera SimpleJSON från " #~ "http://cheeseshop.python.org/pypi/simplejson" bauble-0.9.7/po/hu.po0000644000175000017500000012362511310567254013412 0ustar brettbrett# Hungarian translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-11-17 10:18+0000\n" "Last-Translator: Muszela Balázs \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" #: bauble/_gui.py:368 msgid "_File" msgstr "_Fájl" #: bauble/_gui.py:369 msgid "_New" msgstr "_Új" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Megnyit" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Kilép" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Szerkeszt" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Kivág" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Másol" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Beilleszt" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Beszúr" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Eszközök" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Súgó" #: bauble/_gui.py:390 msgid "Contents" msgstr "Tartalom" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Hibajelentés" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Bauble weboldal" #: bauble/_gui.py:397 msgid "About" msgstr "Egyebek" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "" #: bauble/view.py:93 msgid "Properties" msgstr "Beállítások" #: bauble/view.py:99 msgid "ID:" msgstr "" #: bauble/view.py:108 msgid "Type:" msgstr "Tipus:" #: bauble/view.py:117 msgid "Date created:" msgstr "" #: bauble/view.py:126 msgid "Last updated:" msgstr "" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Hiba: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "" #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Részletek Megjelenítése" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Szerkeszt" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Eltávolít" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Szinonimák" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Jegyzetek" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Általános" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Hivatkozások" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Google Keresés" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "GBIF Keresés" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "ITIS Keresés" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "IPNI Keresés" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "BGCI Keresés" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Disztribúció:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "család_ablak" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "nemzetség_ablak" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "faj_ablak" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Szerző" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Család" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Nemzetség" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Jegyzetek" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "Nemzetség" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Faj" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "Család Szerkesztő" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Teljes név" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "Nemzetség Szerkesztő" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Nyelv" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Következő" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-hozzáadás" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-törlés" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "Jegyzet" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "A család neve" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Család" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Faj" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Ismeretlen Hiba." #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "" #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Válasszon ki egy könyvtárat" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Importálás" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Exportálás" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Forrás" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Hely:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Cím:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Email:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Név" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Cím" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Dátum" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Leírás" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "Email" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Fax #" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Állapot" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Tel #" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Telefon" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Típus" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Hozzáadás" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Kelet" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Észak" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Dél" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "Nyugat" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "nn/hh/éééé" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "gtk-szerkeszt" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "gtk-új" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Hely" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "Sablon" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Beállítások" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "%s már létezik" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Alapértelmezett" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "Beállítások" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "Képek" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "Nincs kép" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "Album" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Jelszó" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "Az adatbázis amihez kapcsolódott üres." #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Tipus:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Beállítások" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "Nevek" #: bauble/prefs.py:305 msgid "Values" msgstr "Értékek" #: bauble/prefs.py:313 msgid "Name" msgstr "Név" #: bauble/prefs.py:313 msgid "Version" msgstr "Verzió" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Menteni kívánja a változtatásait?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Menteni kívánja %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Adja meg jelszavát" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Adatbázis: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "" #: bauble/connmgr.py:535 msgid "User: " msgstr "Felhasználó: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Jelszó: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Fájlnév: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Válasszon fájlt…" #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "" bauble-0.9.7/po/ru.po0000644000175000017500000013542411310567254013424 0ustar brettbrett# Russian translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-07-03 21:16+0000\n" "Last-Translator: Oleg Koptev \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Нет возможности загрузить иконку из %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" #: bauble/_gui.py:368 msgid "_File" msgstr "_Файл" #: bauble/_gui.py:369 msgid "_New" msgstr "_Новый" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Открыть" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Выход" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Править" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Вырезать" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Копировать" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Вставить" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Инструменты" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Помощь" #: bauble/_gui.py:390 msgid "Contents" msgstr "Содержание" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Сообщить об ошибке" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Вебсайт Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "О программе" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "Не смог создать новую базу данных.\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Хотите отменить текущие задачи?" #: bauble/view.py:93 msgid "Properties" msgstr "Свойства" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Тип:" #: bauble/view.py:117 msgid "Date created:" msgstr "Дата создание:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Последнее обновление:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" "MapperSearch.add_meta(): аргумент default_columns должен быть списком" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "MapperSearch.add_meta(): аргумент default_columns не может быть пуст" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Неизвестный поисковый домен: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Ошибка в строке поиска в столбце: %s" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Ошибка: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Не удалось ничего найти" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" "Этот запрос вернулся %s результатами. Это может занять много времени, чтобы " "получить все данные. Вы уверены, что хотите продолжить?" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Получение %s результатов поиска..." #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "результаты поиска %s" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Показать детали" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Не смог удалить.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Редактировать" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Удалить" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Синонимы" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Примечания" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Общие" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Ссылки" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Поиск в Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Искать в GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" "Искать в Глобальной информационной инфраструктуре по биоразнообразию (GBIF)" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Поиск в ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "Поиск в Объединённой таксономической информационной службе (ITIS)" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Поиск в IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "Поиск в Международном индексе названий растений (IPNI)" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Поиск в BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "Поиск в Поиск в Международной Ассоциации Ботанических Садов (BGCI)" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "family_window" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "genus_window" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "species_window" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Автор" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" "Ошибка применения изменений.\n" "\n" "%s" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" "Неизвестная ошибка во время применения изменений. смотрите подробнее для " "дополнительной инофрмации.\n" "\n" "%s" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "Вы уверены, что хотите потерять все ваши изменения?" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "" #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "" #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Вы действительно хотите удалить %s?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "" #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "Код растения должен быть уникальным" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "Расположение растения в вашей коллекции" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" "Часть или вся информация об организациии или спецалности отсутствует. " "Пожалуйста проверьте заполнение полей Имя, Технические контакты, " "Электронная почта, Контакты и Код Организации." #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Эта версия требует запустить SQLAlchemy 0.5.0 или greater.Пожалуйста " "скачайте и установите новую версию SQLAlchemy из http://www.sqlalchemy.org " "или обратитесь к системному администратору." #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "SQLAlchemy не установлен. Пожалуйста, установите SQLAlchemy из " "http://www.sqlalchemy.org" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "Вы подключены к пустой базе данных" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" "База данных к которой вы присоединились не содержит мета таблицы bauble. " "Обычно это означает ,что база данных повреждена или была создана с " "использованием старой версии Bauble" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Сегодняшняя дата" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" "Ошибка: использование последовательностей не был протестирован на этот тип " "базы данных: %s" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "** Не удалось открыть файл журнала по умолчанию.\n" "Нажмите OK для продолжения\n" "\n" "%s" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Предпочтения" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "Имена" #: bauble/prefs.py:305 msgid "Values" msgstr "" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" "Вы должны выбрать или создать новое соединение, прежде чем Вы сможете " "подключиться к базе данных." #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" "Bauble не имеет прав на чтение директории:\n" "\n" "%s" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" "Bauble не имеет прав на запись в директорию:\n" "\n" "%s" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble не имеет прав на чтение файла базы данных:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" "Bauble не имеет прав на запись в файл базы данных:\n" "\n" "%s" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Хотите ли вы сохранить изменения?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" "Желаете ли вы удалить \"%s\"?\n" "Примечание: Это удалит только подключение к базе данных и не повлияет на " "базу данных или на данные в ней" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Введите имя соединения" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Хотите ли вы сохранить %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Хотите ли вы сохранить изменения в %s?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Введите пароль" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Пожалуйста выберите имя для этого подключения" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Пожалуйста выберите имя пользователя для этого подключения" #: bauble/connmgr.py:522 msgid "Database: " msgstr "База данных: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Хост: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Юзер: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Пароль: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Использовать имя файла по умолчанию" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Имя файла: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Выберите файл..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "виджет с именем %s не найден" #~ msgid "Users" #~ msgstr "Пользователи" #~ msgid "Administrator" #~ msgstr "Администратор" #~ msgid "Permissions" #~ msgstr "Разрешения" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Ошибка при создании таблицы.\n" #~ "%s" #~ msgid "Write" #~ msgstr "Записать" #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Ошибка установки плагина: %s" #~ msgid "Error installing plugins." #~ msgstr "Ошибка установки плагина." bauble-0.9.7/po/es.po0000644000175000017500000016301711310567254013404 0ustar brettbrett# Spanish translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-09-27 02:56+0000\n" "Last-Translator: brettatoms \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "No se pudo cargar el icono desde %s" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Cortar" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Ayuda" #: bauble/_gui.py:390 msgid "Contents" msgstr "Contenidos" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Reportar un error" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "¿Le gustaria cancelar las tareas actuales?" #: bauble/view.py:126 msgid "Last updated:" msgstr "Ultima actualización:" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" "MapperSearch.add_meta(): default_columns el argumento no puede quedar vacío" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Campo de búsqueda desconocido: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Error al buscar cadena en la columna %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "No se encontró nada" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" "La consulta arrojó %s resultados. Puede que tome un tiempo para obtener toda " "la información. ¿Está seguro que desea continuar?" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Devolviendo %s resultados de búsqueda..." #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s resultados de búsqueda" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "No se puede borrar.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Editar" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "Nombres vernáculos" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "Buscar en la Utilidad de información de biodiversidad global" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "Buscar en el Sistema de Información Taxonómica Integrada" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "Buscar en el Indice Internacional de Nombres de Plantas" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "Buscar en Botanic Gardens Conservation International" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "# de Adquisiciones:" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "# de Géneros:" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "# de Plantas:" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "# de Plantas" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "# de Especies:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "ventana_familia" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "ventana_genero" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "ventana_especie" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "Grupo Cultivar" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Género" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "Autor Infraespecífico" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "Epíteto Infraespecífico" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "Partes Infraespecíficas" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "Rango Infraespecífico" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "Clasificador" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "Clasificador de especies" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "Sinónimos" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "Editor de familias" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "Editor de géneros" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "Nombre común" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "¿Esta seguro de que desea borrar el nombre común %s?" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "Genero " #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "Epíteto de la especie" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "Rango infraespecífico" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "Epíteto infraespecífico" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "Autor Infraespecífico" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "Clasificador de especies" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "Nota" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "Distribución de las especies" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "Sinonimos de las especies" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" "Error al realizar cambios.\n" "\n" "%s" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" "Error desconocido al realizar cambios. Vea los detalles para más " "información.\n" "\n" "%s" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "Nombre de la familia" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "Tipo de híbrido del género." #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "Nombre del género" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "Nombre o abreviatura del autor que publicó este género" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "Misceláneas acerca de este género" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" "¿Esta seguro que desea eliminar %(genus)s como sinónimo del género actual?\n" "\n" "Nota: Esto no eliminará el género de la base de datos." #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "¿Esta seguro que desea perder los cambios?" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" "Primero debe añadir o importar al menos una familia en la base de datos " "antes de poder añadir plantas." #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" "El clasificador de familias ayuda a eliminar ambigüedades que puedan " "asociarse con esta familia" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "Misceláneas acerca de esta familia." #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "Lista de sinónimos para esta familia.\n" "\n" "Para añadir un sinónimo ingrese el nombre de la familia y elija una de la " "lista . Luego pulse Añadir para agregar uno a la lista de sinónimos" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Error desconocido" #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" "Error al conectarse a la base de datos.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" "No se han podido asociar todos los nombres de archivos con los nombres de " "las tablas.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "Importando la tabla %(table)s desde %(filename)s" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" "Ya existe la tabla %s en la base de datos y tal vez contenga " "información. Si una fila del archivo que desea importar tiene la misma id " "que la fila del archivo en la base de datos, el archivo no se importara " "correctamente.\n" "\n" "¿Desea mandar la tabla a la base de datos primero? Si lo hace perderá la " "información en su base de datos" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "Error: No se pudo establecer la sequencia para la columna: %s" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Elija el(los) archivo(s) para importar..." #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" "El archivo %(filename)s donde desea exportar la tabla " "%(table)s ya existe.\n" "\n" "¿Desea continuar?" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "Exportando la tabla %(table)s a %(filename)s" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "Valores separados por coma" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" "Es posible que importar información a esta base de datos pueda destruir o " "corromper la información existente.\n" "\n" "¿Desea continuar?" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "Guardar toda la información en un archivo" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "¿Esta seguro que desea eliminar %s?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" "%(num_plants)s planta(s) depende de esta adquisición: " "%(plant_codes)s\n" "\n" "¿Esta seguro que quiere eliminar esta adquisición %(acc_code)s?" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "¿Esta seguro que quiere eliminar esta adquisición %s?" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" "Las especies deben seleccionarse de la lista. Para añadir una especie use el " "editor de especies" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "El ID de acceso debe ser un código único" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" "Clasificador de ID\n" "\n" "Posibles valores: %s" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "Fecha en que esta especie fue adquirida" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" "El estado salvaje es usado para aclarar la procedencia\n" "\n" "Posibles valores: %s" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "Misceláneas acerca de la adquisición" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "Indicar cuando esta adquisición debe ser considerada como privada." #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "_Adqusición" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" "Primero debe añadir o importar al menos una especie en la base de datos para " "poder añadir adquisiciones." #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "El modelo debe tener latitud y longitud o ninguno de los dos" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Fuente" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "ID de la colección:" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "Coleccionista:" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "Fecha de recolección:" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "Notas de donación" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "ID del donante:" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "Datos de GPS" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "Procedencia:" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "# of Donaciones:" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Direcciones:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Email:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "Institución.__getattr__: %s no es una propiedad en institución" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "Institución.__setattr__: %s no es una propiedad en institución" #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "ID de la adquisición" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "Adquisición" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "Escenario" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "Codigo de la planta" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "Sitio" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "Altura/Profundidad" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "ID de la colección" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "Notas de la colección" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "Coleccionista" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "E-mail" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "Email" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "Descripción del hábitat" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "Historia" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "Clasificador de ID" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "Nombre de la institución" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "Detalles de la ubicación" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "Procedencia" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Agregar" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "Editor de instituciones" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "Aceptar y añadir plantas..." #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "Aceptar y añadir plantas" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "dd/mm/aaaa" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "Estado de la adquisición:" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "El sitio es el nombre que usará luego para referirse a ubicación." #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" "Alguna información que pueda resultar relevante con respecto a la ubicación, " "como dónde está o cual es su propósito" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "El código de la planta debe ser un código único" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" "La adquisición debe ser seleccionada de la lista. Para añadir una " "adquisición utilice el editor de adquisiciones" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "La ubicación de la planta en su colección." #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" "Tipo de material vegetal.\n" "\n" "Valores posibles: %s" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" "Estado de la planta en su colección.\n" "Posibles valores: %s" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "Misceláneas acerca de esta planta." #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" "No se pudo abrir el informe con el programa predeterminado. Puede abrirlo " "manualmente en %s" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "Incluir la información marcada como privada" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Preferencias" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "No hay complementos de formateador definidos" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" "No se encontraron formateadores. Para crear uno nuevo pulse en el botón " "«Nuevo»." #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "Primero busque algo." #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "Error de formateo" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "Por favor, seleccione una hoja de estilo." #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "Seleccione un dibujador" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" "No hay plantas en los resultados de la búsqueda. Intente otra búsqueda." #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" "No hay especies en los resultados de la busqueda. Por favor, intente otra " "busqueda." #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" "No hay adquisiciones en los resultados de la búsqueda. Intente otra búsqueda." #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" "Error al crear el archivo PDF. Por favor, asegúrese que el creador de PDF " "esta correctamente instalado." #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "Dibujador" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "Usar el nombre del autor" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" "Adquisición\n" "Planta/Clon\n" "Especies" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" "Parte o toda la información acerca de la institución o el negocio no esta " "completa. Asegúrese que el Nombre, Contacto Técnico, Correo electrónico, y " "el código de Contacto e Institución estén completos." #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "Introduzca el nombre de la etiqueta" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "¿Está seguro de querer borrar la etiqueta «%s»?" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "No se ha seleccionado nada" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "No se pudo crear el menú de etiquetas" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "Elemento(s)" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "Nueva etiqueta" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" "No se puede conseguir la ruta de la configuración de usuario: no hay " "variable APPDATA o USERPROFILE" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" "No se puede conseguir la ruta de la configuración de usuario: no se puede " "expandir $HOME para el usuario %(username)s" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "SQLAlchemy no esta instalado. Por favor, instale SQLAlchemy desde " "http://www.sqlalchemy.org" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "La base de datos a la que se conectó esta vacía." #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" "La base de datos a la que se conectó no tiene la meta tabla de bauble. Esto " "generalmente significa que la base de datos esta corrupta o que fue creada " "con una versión vieja de Bauble" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" "La base de datos a la cual se conectó no tiene el sello de tiempo de cuando " "fue creada. Esto generalmente significa que ocurrió un problema en la " "creación de la base de datos o que la base de datos con la cual esta " "conectado no fue creada con Bauble." #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" "Usted esta usando la versión de Bauble %(version)s mientras que la base de " "datos con la que se ha conectado fue creada con la versión %(db_version)s\n" "\n" "Algunas cosas tal vez no funcionen como deberían o tal vez parte de su " "información pueda corromperse inesperadamente-" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" "Error: No se pudo inicializar %(entry_name)s\n" "\n" "%(exception)s." #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" "No se pudo importar el modulo %(module)s\n" "\n" "%(error)s" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Detalles de conexión" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Fecha actual" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" "Error: esta usando secuencias que no han sido comprobadas en este tipo de " "base de datos: %s" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" "Bauble no puede guardar sus preferencias de usuario \n" "\n" "Por favor, revise los permisos de sus archivo de configuración\n" " %s" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "** Error: no se pudo importar gtk y/o gobject" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "No hay registrado un gestor predeterminado" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "No hay un gestor de órdenes para %s" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "**Error: Bauble debe ejecutarse en un entorno con ventanas." #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "No se pudo abrir la conexión.\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" "¿Le gustaria crear una nueva base de datos de Bauble en la conexión actual?\n" "\n" "Aviso: ¡Si existe una base de datos en esta conexión se perderán los " "datos existentes!" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "\"%s\" no esta en Enum.values" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" "No tiene ninguna conexión en su lista de conexiones.\n" "Cierre este mensaje y pulse «Añadir» para crear una nueva conexión." #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" "Tiene que elegir o crear una nueva conexión antes de que pueda conectarse a " "la base de datos." #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" "Bauble no tiene permiso para leer el directorio:\n" "\n" "%s" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" "Bauble no tiene permiso para escribir en el directorio:\n" "\n" "%s" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble no tiene permiso para leer el archivo de la base de datos:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" "Bauble no tiene permiso para escribir el archivo de la base de datos:\n" "\n" "%s" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" "¿Esta seguro que quiere borrar \"%s\"?\n" "\n" "Nota: Esto sólo borra la conexión con la base de datos pero no afecta la " "base de datos o sus datos" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Introduzca el nombre de la conexión" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "¿Desea guardar %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "¿Desea guardar los cambios en %s?" #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Usar el nombre de archivo predeterminado" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Nombre del archivo: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Elija un archivo..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" "No se pudo asignar un mensaje de ayuda en el widget %(widget_name)s\n" "\n" "%(exception)s" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "No hay complemento con el nombre %s" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Error en la creación de tablas.\n" #~ "\n" #~ "%s" #~ msgid "" #~ "SimpleJSON not installed. Please install SimpleJSON from " #~ "http://cheeseshop.python.org/pypi/simplejson" #~ msgstr "" #~ "SimpleJSON no esta instalado. Por favor instale SimpleJSON desde " #~ "http://cheeseshop.python.org/pypi/simplejson" #, python-format #~ msgid "Error: %s" #~ msgstr "Error: %s" #~ msgid "" #~ "The database you have connected to does not have a valid plugin registry. " #~ "This means that the database could be corrupt or was interrupted while " #~ "creating a new database at this connection." #~ msgstr "" #~ "La base de datos a la que se conectó no tiene un registro de complementos " #~ "valido. Esto significa que la base de datos puede estar corrupta o que fue " #~ "interrumpida mientras se creaba una nueva base de datos en esta conexión." #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "El tamaño de la historia debe ser mayor que cero y menor que el tamaño de la " "historia" #: bauble/_gui.py:368 msgid "_File" msgstr "_Archivo" #: bauble/_gui.py:369 msgid "_New" msgstr "_Nuevo" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Abrir" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Salir" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Editar" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Copiar" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Pegar" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Insertar" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Herramientas" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Sitio web de Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "Acerca de" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "No se pudo crear una nueva base de datos.\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/view.py:93 msgid "Properties" msgstr "Propiedades" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Tipo:" #: bauble/view.py:117 msgid "Date created:" msgstr "Fecha de creación:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" "MapperSearch.add_meta(): el argumento default_columns debe ser listado" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Error: %s" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Mostrar detalles" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" "La especie %s tiene %s accesos. ¿Está seguro de que quiere eliminarla?" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "¿Está seguro de que quiere eliminar la especie %s?" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Eliminar" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Sinónimos" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Notas" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "General" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Enlaces" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Buscar en Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Buscar en GBIF" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Buscar en ITIS" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Buscar en IPNI" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Buscar en BGCI" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Distribución:" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Autor" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Distribución" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Familia" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "Híbrido" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "Meta Información" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Notas" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "Género" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Especie" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Nombre completo" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Idioma" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Siguiente" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "Aceptar y añadir adquisiciones" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "Aceptar y añadir géneros" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "Aceptar y añadir especies" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "Editor de especies de plantas" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-add" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-remove" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "Autor de la especie" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "Indicador de híbrido de especie" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "Grupo cultivar" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "Nombres vernáculos" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" "El género %s tiene %s especies. ¿Está seguro de que quiere eliminarlo?" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "¿Está seguro de que quiere eliminar el género %s?" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "Añadir especies" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" "Una lista de sinónimos de este género.\n" "\n" "Para añadir un sinónimo, escriba el nombre de una familia, elija una " "sugerencia de la lista y pulse «Añadir» para añadirla a la lista de " "sinónimos." #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "Añadir adquisición" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Familia" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Género" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Especies" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" "La familia %s tiene %s géneros. ¿Está seguro de que quiere eliminarla?" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "¿Está seguro de que quiere eliminar la familia %s?" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "Añadir género" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" "Más de un archivo dado para importar en la tabla %(table_name)s: " "%(file_name)s, (file_name2)s" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" "Para importar los archivos se tienen que eliminar las siguientes tablas:\n" "\n" "%s\n" "\n" "¿Quiere continuar?" #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Seleccione un directorio" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" "CSVExporter: la ruta no existe.\n" "%s" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Importar" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Exportar" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "Si el id_qual es aff. o cf. entonces se requiere id_qual_rank. %s " #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "source_type desconocido en la adquisición: %s" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" "El origen o la fuente de esta adquisición. \n" "\n" "Posibles valores: %s" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" "El tipo de fuente indica el medio por que el se ha obtenido esta adquisición" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "_parse_lat_lon() -- formato incorrecto: %s" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "Botones de radio Norte/Sur en un estado confuso" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "Botones de radio Este/Oeste en un estado confuso" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "Adquisición" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "Donante:" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "Elevación:" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "Hábitat" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Latitud:" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Ubicación:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Longitud:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "Plantas/Clones:" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "Verificador:" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "Ubicación" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Nombre" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "Especies" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "Abreviación" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "Tipo de adquisición" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Dirección" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "Nombre de contacto" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Fecha" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Descripción" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "ID del donante" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "Donante" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Fax #" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "Código institucional" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "Latitud" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "Longitud" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "Privado" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "Rango del clasificador" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Estado" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "Contacto técnico" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Tel #" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Teléfono" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Tipo" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "Estado salvaje" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Este" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Norte" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Sur" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "Oeste" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "gtk-edit" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "gtk-new" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "Tipo de adquisición:" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "general_window" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "Planta" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Ubicación" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "Plantilla" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "Por favor, seleccione una plantilla" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "Plantilla" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "Formateador" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "No se pueden obtener plantas de %s" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "No se pueden obtener adquisiciones de %s" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "No se pueden obtener especies de %s" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "Introduzca un nombre para el nuevo formateador" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "%s ya existe" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "Planta/Clon" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Predeterminado" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "Tipo de fuente" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "Hoja de estilo" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "Elija un archivo para exportar a..." #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "ABCD" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" "ADVERTENCIA: El exportador ABCD no esta completamente implementado. " "Exportará la plantas a la base de datos pero no incluirá información de la " "fuente como datos de la colección y donación." #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "Se requiere el paquete lxml para el complemento ABCD" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "No se pudo autorizar la cuenta de Google: %s" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "Preferencias" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "Imagenes" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "No se pudo ingresar a la cuenta de PicasaWeb" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "No hay imagenes" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "Album" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Contraseña" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "Selección de etiqueta" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Etiquetas" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "Etiquetas" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" "No se pudo obtener la ruta de acceso para configuración del usuario: la " "plataforma no está soportada" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Esta versión de Bauble requiere SQLAlchemy 0.5.0 o superior. Por favor " "descargue e instale un versión mas nueva de SQLAlchemy desde " "http://www.sqlalchemy.org o pongase en contacto con su administrador de " "sistemas." #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" "Los siguientes complementos no fueron encontrados en el registro de " "complementos:\n" "\n" "%s\n" "\n" "¿Le gustaría instalarlos ahora?" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" "El siguiente complemento está en el registro pero no se pudo cargar:\n" "\n" "%s" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" "El complemento contiene un bucle de dependencias. Esto puede pasar si dos " "complementos dependen directa o indirectamente uno de otro." #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" "El complemento %(plugin_name)s esta listado en el registro pero no fue " "encontrado en el directorio de complementos" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" "Los complementos contienen un bucle de dependencia. Esto puede suceder si " "dos complementos directa o indirectamente dependen uno de otro" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "%s.plugin no es una instancia de pluginmgr.Plugin" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Tipo:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" "No se pudo abrir %s\n" "\n" "Entorno de escritorio desconocido: %s\n" "\n" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "%s no está en el archivo glade" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "** No se pudo abrir el archivo de registro predeterminado\n" "Presione Aceptar para continuar\n" "\n" "%s" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Preferencias" #: bauble/prefs.py:270 msgid "Plugins" msgstr "Complementos" #: bauble/prefs.py:305 msgid "Names" msgstr "Nombres" #: bauble/prefs.py:305 msgid "Values" msgstr "Valores" #: bauble/prefs.py:313 msgid "Name" msgstr "Nombre" #: bauble/prefs.py:313 msgid "Version" msgstr "Versión" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "Compruebe que GTK_ROOT\\bin esté en PATH." #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "Enum requiere una lista de valores" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" "Ha configurado empty_to_none=True pero None no esta en la lista de valores" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "¿Quiere guardar los cambios?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" "No hay conectores instalados con la base de datos de Python.\n" "Consulte la documentación de los prerrequisitos para instalar Bauble." #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Introduzca su contraseña" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Por favor, elija un nombre para esta conexión" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Por favor, elija un nombre de usuario para esta conexión" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Base de datos: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Anfitrión: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Usuario: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Contraseña: " #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "No se pudo destruir la ventana" #~ msgid "Registry" #~ msgstr "Registro" #~ msgid "Users" #~ msgstr "Usuarios" #~ msgid "Administrator" #~ msgstr "Administrador" #~ msgid "Permissions" #~ msgstr "Permisos" #~ msgid "Write" #~ msgstr "Escribir" #~ msgid "Error installing plugins." #~ msgstr "Error al instalar los plugins" #~ msgid "gtk-cancel" #~ msgstr "gtk-cancel" #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Error instalando complementos: %s" #~ msgid "plant delimiter not set in bauble meta" #~ msgstr "el delimitador de planta no está asignado en los metadatos de bauble" bauble-0.9.7/po/et.po0000644000175000017500000012221711310567254013402 0ustar brettbrett# Estonian translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-05-28 17:02+0000\n" "Last-Translator: brettatoms \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" #: bauble/_gui.py:368 msgid "_File" msgstr "" #: bauble/_gui.py:369 msgid "_New" msgstr "" #: bauble/_gui.py:371 msgid "_Open" msgstr "" #: bauble/_gui.py:373 msgid "_Quit" msgstr "" #: bauble/_gui.py:375 msgid "_Edit" msgstr "" #: bauble/_gui.py:376 msgid "_Cut" msgstr "" #: bauble/_gui.py:378 msgid "_Copy" msgstr "" #: bauble/_gui.py:380 msgid "_Paste" msgstr "" #: bauble/_gui.py:386 msgid "_Insert" msgstr "" #: bauble/_gui.py:387 msgid "_Tools" msgstr "" #: bauble/_gui.py:388 msgid "_Help" msgstr "" #: bauble/_gui.py:390 msgid "Contents" msgstr "" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "" #: bauble/_gui.py:397 msgid "About" msgstr "" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "" #: bauble/view.py:93 msgid "Properties" msgstr "Omadused" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Tüüp:" #: bauble/view.py:117 msgid "Date created:" msgstr "Loomise kuupäev:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Viimati uuendatud:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Viga: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Ei leidnud midagi" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "" #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Näita üksikasju" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "" #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "" #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "" #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Eelistused" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "Nimed" #: bauble/prefs.py:305 msgid "Values" msgstr "Väärtused" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Sisesta oma parool" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "" #: bauble/connmgr.py:522 msgid "Database: " msgstr "" #: bauble/connmgr.py:528 msgid "Host: " msgstr "" #: bauble/connmgr.py:535 msgid "User: " msgstr "" #: bauble/connmgr.py:541 msgid "Password: " msgstr "" #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "" #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "" #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "" #~ msgid "Users" #~ msgstr "Kasutajad" #~ msgid "Administrator" #~ msgstr "Administraator" #~ msgid "Permissions" #~ msgstr "Õigused" #~ msgid "Write" #~ msgstr "Kirjuta" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Viga tabelite loomisel.\n" #~ "\n" #~ "%s" #~ msgid "Error installing plugins." #~ msgstr "Viga pluginate paigaldamisel." bauble-0.9.7/po/ar.po0000644000175000017500000012246511310567254013401 0ustar brettbrett# Arabic translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-09-24 11:51+0000\n" "Last-Translator: Propeng \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "لا يمكن تحميل الأيقونة من %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" #: bauble/_gui.py:368 msgid "_File" msgstr "_ملف" #: bauble/_gui.py:369 msgid "_New" msgstr "_جديد" #: bauble/_gui.py:371 msgid "_Open" msgstr "_فتح" #: bauble/_gui.py:373 msgid "_Quit" msgstr "أ_غلق" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_تحرير" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_قص" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_نسخ" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_لصق" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_أدرج" #: bauble/_gui.py:387 msgid "_Tools" msgstr "أد_وات" #: bauble/_gui.py:388 msgid "_Help" msgstr "_مساعدة" #: bauble/_gui.py:390 msgid "Contents" msgstr "المحتويات" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "الإبلاغ عن خطأ" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "موقع Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "حول" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" "لا يمكن إنشاء قاعدة بيانات جديدة.\n" "\n" "%s" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "حقوق النشر محفوظة © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "هل تريد إلغاء المهام الحالية؟" #: bauble/view.py:93 msgid "Properties" msgstr "الخصائص" #: bauble/view.py:99 msgid "ID:" msgstr "الهوية:" #: bauble/view.py:108 msgid "Type:" msgstr "النوع:" #: bauble/view.py:117 msgid "Date created:" msgstr "تاريخ الإنشاء:" #: bauble/view.py:126 msgid "Last updated:" msgstr "آخر تحديث:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" "MapperSearch.add_meta(): default_columns arguments يجب ان تكون في صيغة قائمة" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" "MapperSearch.add_meta(): default_columns argument لا يمكن ان تكون فارغة" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "" #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "الحذف غير ممكن.\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "" #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "" #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "" #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" #: bauble/prefs.py:261 msgid "Preferences" msgstr "" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "" #: bauble/prefs.py:305 msgid "Values" msgstr "" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "" #: bauble/connmgr.py:522 msgid "Database: " msgstr "" #: bauble/connmgr.py:528 msgid "Host: " msgstr "" #: bauble/connmgr.py:535 msgid "User: " msgstr "" #: bauble/connmgr.py:541 msgid "Password: " msgstr "" #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "" #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "" #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "" bauble-0.9.7/po/ro.po0000644000175000017500000013717111310567254013417 0ustar brettbrett# Romanian translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-05-28 17:04+0000\n" "Last-Translator: brettatoms \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Nu s-a putut încărca iconița din %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" "dimensiunea istoricului trebuie să fie mai mare ca zero și mai mică decât " "dimensiunea istoricului" #: bauble/_gui.py:368 msgid "_File" msgstr "_Fișier" #: bauble/_gui.py:369 msgid "_New" msgstr "_Nou" #: bauble/_gui.py:371 msgid "_Open" msgstr "" #: bauble/_gui.py:373 msgid "_Quit" msgstr "" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Editează" #: bauble/_gui.py:376 msgid "_Cut" msgstr "" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Copiază" #: bauble/_gui.py:380 msgid "_Paste" msgstr "Li_pește" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Inserează" #: bauble/_gui.py:387 msgid "_Tools" msgstr "Unel_te" #: bauble/_gui.py:388 msgid "_Help" msgstr "" #: bauble/_gui.py:390 msgid "Contents" msgstr "" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Raportați un defect" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "situl Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "Despre" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Doriți să renunțați la sarcinile curente?" #: bauble/view.py:93 msgid "Properties" msgstr "Proprietăți" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Tip:" #: bauble/view.py:117 msgid "Date created:" msgstr "Data creării:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Ultima actualizare:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Domeniu de căutare necunoscut: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Eroare: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "Nu s-a putut găsi nimic" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "" #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Arată detalii" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" "Nu s-a putut șterge.\n" "\n" "%s" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Editează" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Înlătură" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "Nume vernaculare" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Sinonime" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Notițe" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "General" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Legături" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Caută cu Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Caută în GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "Caută în Global Biodiversity Information Facility" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Caută în ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Caută în IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Caută în BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Distribuție:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "family_window" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "genus_window" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "species_window" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Autor" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Distribuție" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Familie" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Gen" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "Hibrid" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Notițe" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "Sinonime" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "Gen" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Specie" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "Editor de familie" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Nume complet" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "Editor de gen" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Limbă" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "Editor de specie de plante" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "Nume vernacular" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-add" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-remove" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "Chiar doriți să ștergeți numele vernacular %s?" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "Gen " #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "Nume vernaculare" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "Sinonime specie" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" "Eroare la înregistrarea modificărilor.\n" "\n" "%s" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" "Eroare în timpul înregistrării modificărilor. Vedeți detaliile pentru mai " "multe informații.\n" "\n" "%s" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "Adaugă specie" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "Numele familiei" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "Tipul de hibrid pentru acest gen." #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "Numele genului" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "Notițe diverse despre acest gen." #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "Chiar doriți să renunțați la modificări?" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Familie" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Gen" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Specie" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "Adaugă genuri" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "Notițe diverse despre această familie." #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Eroare necunoscută." #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" "Eroare la conectarea la baza de date.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" "Nu s-au putut potrivi toate numele de fișiere la numele de tabele.\n" "\n" "%s" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "se importă tabela %(table)s din %(filename)s" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Alegeți fișierele de importat..." #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Alegeți un director" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" "CSVExporter: calea nu există.\n" "%s" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "se exportă tabela %(table)s în %(filename)s" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Importă" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "Valori separate de virgulă" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Exportă" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "Salvează toate datele intr-un singur fișier" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Chiar doriți să eliminați %s?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "_parse_lat_lon() -- format incorect: %s" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Sursă" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "ID Colecție:" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "Date colectate:" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "ID donor:" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "Donor:" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "Elevație:" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "Date GPS" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "Habitat" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Latitudine:" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Locație:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Longitudine:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "Proveniență:" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "--" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Adresă:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Email:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "Localizare" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "Locație" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Nume" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "Cod plantă" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "Sit" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "Specie" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "Abreviere" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Adresă" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "Altitudine/adâncime" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "ID colecție" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "Nume de contact" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Dată" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Descriere" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "ID donor" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "Donor" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "E-mail" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "Email" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Nr. Fax" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "Descriere habitat" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "Istoric" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "Nume instituție" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "Latitudine" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "Detalii locație" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "Longitudine" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "Privat" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "Proveniență" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Statut" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Nr. Tel" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Telefon" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Tip" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "Statut sălbăticie" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Adaugă" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Est" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "Editor de instituție" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Nord" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Sud" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "Vest" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "zz/ll/aaaa" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "gtk-edit" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "gtk-new" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "general_window" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "Plantă" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Locație" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "Codul plantei trebuie să fie un cod unic" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "Notițe diverse despre această plantă." #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "Șablon" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "Alegeți un șablon." #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" "Raportul nu s-a putut deschide cu programul implicit. Puteți deschide manual " "fișierul la %s" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "Includeți datele marcate ca private" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "Șablon" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Setări" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "%s există deja" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "Căutați pentru ceva întâi." #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "Eroare de formatare" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Implicit" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "Nu există plante în rezultatele căutării. Încercați o nouă căutare." #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "Nu există specii în rezultatele căutării. Încercați o nouă căutare." #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "Tip sursă" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "Utilizează numele de autor" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "Alegeți un fișier în care să exportați..." #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "ABCD" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "Pachetul lxml este necesar pentru modulul ABCD" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "Nu s-a putut autoriza contul de Google: %s" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "Setări" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "Imagini" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "Nu s-a putut autentifica pentru contul de PicasaWeb." #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "Fără imagini" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "Album" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Parolă" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "Nimic selectat" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "Item(i)" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" "Nu s-a putut obține calea pentru setările de utilizator: nicio variabilă " "APPDATA sau USERPROFILE" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" "Nu s-a putut obține calea pentru setările de utilizator: nu s-a putut " "extinde $HOME pentru utilizatorul %(username)s" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" "Nu s-a putut obține calea pentru setările de utilizator: platforma fără " "suport" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Aceată versiune de Bauble necesită SQLAlchemy 0.5.0 sau mai nou. Descărcați " "și instalați o versiune mai recentă de SQLAlchemy de la " "http://www.sqlalchemy.org sau contactați-vă administratorul de sistem." #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "SQLAlchemy nu este instalat. Instalați SQLAlchemy de la " "http://www.sqlalchemy.org" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "Baza de date la care v-ați conectat este goală." #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" "Utilizați Bauble versiunea %(version)s în timp ce baza de date la care v-ați " "conectat a fost creată cu versiunea %(db_version)s\n" "\n" "Unele lucruri s-ar putea să nu funcționeze, iar unele date să devină eronate " "în mod inexplicabil." #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" "Următoarele module nu au fost găsite în registrul de module:\n" "\n" "%s\n" "\n" "Doriți să le instalați acum?" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" "Modulul %(plugin_name)s este listat în registru, însă nu se găsește în " "directorul de module" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" "Nu s-a putut importa modulul %(module)s.\n" "\n" "%(error)s" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Detalii conexiune" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Tip:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "%s nu este în fișierul glade" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Data de astăzi" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" "Bauble nu a putut să vă salveze preferințele de utilizator. \n" "\n" "Verificați permisiunile de acces la fișierul de configurare:\n" " %s" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Preferințe" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "Nume" #: bauble/prefs.py:305 msgid "Values" msgstr "Valori" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Nu s-a putut deschide conexiunea.\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" "Doriți să creați o noua bază de date Bauble odata cu conexiunea curentă?\n" "\n" "Avertisment: Dacă există deja o bază de date la această conexiune, atunci " "datele existente vor fi distruse!" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "„%s” nu este în Enum.values" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" "Trebuie să alegeți sau să creați o conexiune înainte de a vă putea conecta " "la baza de date." #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" "Bauble nu are permisiunea de a citi directorul:\n" "\n" "%s" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" "Bauble nu are permisiunea de a scrie în directorul:\n" "\n" "%s" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "Bauble nu are permisiunea de a citi fișierul bază de date:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" "Bauble nu are permisiunea de a scrie în fișierul bază de date:\n" "\n" "%s" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Doriți să vă salvați modificările?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" "Sunteți sigur că doriți să eliminați „%s”?\n" "\n" "Notă: Aceast lucru doar elimină conexiunea la baza de date, fără a afecta " "baza de date sau conținutul ei" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Introduceți un nume de conexiune" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Doriți să salvați %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Doriți să vă salvați modificările la %s ?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Introduceți parola" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Alegeți un nume pentru această conxiune" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Alegeți un nume de utilizator pentru această conexiune" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Bază de date: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Gazdă: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Utilizator: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Parolă: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Utilizați numele implicit de fișier" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Nume fișier: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Alegeți un fișier..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "Nu s-a putut distruge fereastra" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "niciun control cu numele %s" #~ msgid "Users" #~ msgstr "Utilizatori" #~ msgid "Administrator" #~ msgstr "Administrator" #~ msgid "Permissions" #~ msgstr "Permisiuni" #~ msgid "Write" #~ msgstr "Scrie" #~ msgid "gtk-cancel" #~ msgstr "gtk-cancel" #~ msgid "Error installing plugins." #~ msgstr "Eroare la instalarea modulelor." #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Eroare la instalarea modulelor: %s" #, python-format #~ msgid "Error: %s" #~ msgstr "Eroare: %s" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Eroare la crearea de tabele.\n" #~ "\n" #~ "%s" #~ msgid "Registry" #~ msgstr "Registru" bauble-0.9.7/po/ca.po0000644000175000017500000012457511310567254013366 0ustar brettbrett# Catalan translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-11-12 19:15+0000\n" "Last-Translator: David \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "No és possible carregar la icona des de %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" #: bauble/_gui.py:368 msgid "_File" msgstr "_Fitxer" #: bauble/_gui.py:369 msgid "_New" msgstr "_Nou" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Obre" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Surt" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Edita" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Talla" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Copia" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Enganxa" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Inserix" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Eines" #: bauble/_gui.py:388 msgid "_Help" msgstr "Aj_uda" #: bauble/_gui.py:390 msgid "Contents" msgstr "Continguts" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Avisa d'un error" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "" #: bauble/_gui.py:397 msgid "About" msgstr "Sobre" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "" #: bauble/view.py:93 msgid "Properties" msgstr "Propietats" #: bauble/view.py:99 msgid "ID:" msgstr "ID:" #: bauble/view.py:108 msgid "Type:" msgstr "Tipus:" #: bauble/view.py:117 msgid "Date created:" msgstr "" #: bauble/view.py:126 msgid "Last updated:" msgstr "" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "" #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s Resultats de la cerca" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Edita" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Suprimeix" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Sinònims" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Notes" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "General" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Enllaços" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Cerca a Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Cerca GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Cerca ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Cerca IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Cerca BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Distribució:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "family_window" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "genus_window" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "species_window" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Autor/a" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Distribució" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Família" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Gens" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "Híbrid" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Notes" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "Sinònims:" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "Gens" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Espècies" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Nom complet" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Idioma" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Següent" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-add" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-remove" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Família" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Gens" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Espècies" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Error desconegut." #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Escolliu un fitxer(s) per importar..." #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Selecciona un directori" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Importa" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Exporta" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "Estàs segur/a que vols esborrar %s ?" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Font" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "Elevació:" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "Dades GPS" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Latitud:" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Ubicació:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Longitud:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "Verificador:" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Adreça:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Correu-e:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Telf:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "Ubicació" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Nom" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "Lloc" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "Espècies" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "Abreviació" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Adreça" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Data" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Descripció" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "Correu-e" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "Correu-e" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Fax #" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "Historial" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "Latitud" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "Longitud" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "Privat" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Estat" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Telf #" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Telèfon" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Tipus" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Afegeix" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Est" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Nord" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Sud" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "Oest" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "dd/mm/aaaa" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "gtk-edit" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "gtk-new" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "Planta" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Localització" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "Notes i informació sobre aquesta planta" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Paràmetres" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "ja existeix %s" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Per defecte" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "" #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "No s'ha seleccionat res" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Etiquetes" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "Ítem(s)" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "Etiquetes" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "Etiqueta nova" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "" #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Detalls de la connexió" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Tipus:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Preferències" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "Noms" #: bauble/prefs.py:305 msgid "Values" msgstr "Valors" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "" #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "No hi ha cap gestor per a l'ordre %s" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Error: no s'ha pogut obrir la connexió \n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Voleu desar %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Voleu desar les modificacions a %s?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Introdueix la teva contrasenya" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Si us plau, elegeix un nom d'usuari per aquesta connexió" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Base de dades: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Servidor: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Usuari/a: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Contrasenya: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Utilitza un nom de fitxer per defecte" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Nom del fitxer: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Escull un arxiu..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "" bauble-0.9.7/po/pt.po0000644000175000017500000013600611310567254013416 0ustar brettbrett# Portuguese translation for bauble # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the bauble package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: bauble\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-27 22:09-0400\n" "PO-Revision-Date: 2009-05-28 17:03+0000\n" "Last-Translator: Glauco Vinicius \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-12 01:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bauble/_gui.py:66 bauble/connmgr.py:203 #, python-format msgid "Could not load icon from %s" msgstr "Não foi possível carregar o ícone de %s" #: bauble/_gui.py:267 msgid "history size must be greater than zero and less than the history size" msgstr "" #: bauble/_gui.py:368 msgid "_File" msgstr "_Arquivo" #: bauble/_gui.py:369 msgid "_New" msgstr "_Novo" #: bauble/_gui.py:371 msgid "_Open" msgstr "_Abrir" #: bauble/_gui.py:373 msgid "_Quit" msgstr "_Sair" #: bauble/_gui.py:375 msgid "_Edit" msgstr "_Editar" #: bauble/_gui.py:376 msgid "_Cut" msgstr "_Cortar" #: bauble/_gui.py:378 msgid "_Copy" msgstr "_Copiar" #: bauble/_gui.py:380 msgid "_Paste" msgstr "_Colar" #: bauble/_gui.py:386 msgid "_Insert" msgstr "_Inserir" #: bauble/_gui.py:387 msgid "_Tools" msgstr "_Ferramentas" #: bauble/_gui.py:388 msgid "_Help" msgstr "_Ajuda" #: bauble/_gui.py:390 msgid "Contents" msgstr "Conteúdos" #: bauble/_gui.py:392 msgid "Report a bug" msgstr "Reportar um erro (bug)" #: bauble/_gui.py:395 msgid "Bauble website" msgstr "Website do Bauble" #: bauble/_gui.py:397 msgid "About" msgstr "Sobre" #: bauble/_gui.py:577 #, python-format msgid "" "Could not create a new database.\n" "\n" "%s" msgstr "" #: bauble/_gui.py:663 msgid "http://bauble.belizebotanic.org" msgstr "http://bauble.belizebotanic.org" #: bauble/_gui.py:667 msgid "Copyright © Belize Botanic Gardens" msgstr "Copyright © Belize Botanic Gardens" #: bauble/_gui.py:684 msgid "Would you like the cancel the current tasks?" msgstr "Gostaria de cancelar a tarefa atual?" #: bauble/view.py:93 msgid "Properties" msgstr "Propriedades" #: bauble/view.py:99 msgid "ID:" msgstr "Identificador:" #: bauble/view.py:108 msgid "Type:" msgstr "Tipo:" #: bauble/view.py:117 msgid "Date created:" msgstr "Data de criação:" #: bauble/view.py:126 msgid "Last updated:" msgstr "Última atualização:" #: bauble/view.py:369 msgid "MapperSearch.add_meta(): default_columns argument must be list" msgstr "" "MapperSearch.add_meta(): default_columns o argumento deve ser uma lista" #: bauble/view.py:371 msgid "MapperSearch.add_meta(): default_columns argument cannot be empty" msgstr "" "MapperSearch.add_meta(): default_columns o argumento não pode estar vazio" #: bauble/view.py:444 #, python-format msgid "Unknown search domain: %s" msgstr "Domínio de pesquisa desconhecido: %s" #: bauble/view.py:852 #, python-format msgid "Error in search string at column %s" msgstr "Erro ao pesquisar o texto na coluna %s" #: bauble/view.py:855 #, python-format msgid "** Error: %s" msgstr "** Erro: %s" #: bauble/view.py:870 msgid "Couldn't find anything" msgstr "" #: bauble/view.py:874 #, python-format msgid "" "This query returned %s results. It may take a long time to get all the " "data. Are you sure you want to continue?" msgstr "" #: bauble/view.py:879 #, python-format msgid "Retrieving %s search results..." msgstr "Recuperando %s resultados da pesquisa..." #: bauble/view.py:892 #, python-format msgid "%s search results" msgstr "%s resultados da pesquisa" #: bauble/bauble.glade.h:1 bauble/plugins/plants/infoboxes.glade.h:1 #: bauble/plugins/plants/editors.glade.h:1 #: bauble/plugins/garden/acc_infobox.glade.h:1 #: bauble/plugins/garden/infoboxes.glade.h:1 #: bauble/plugins/garden/editors.glade.h:2 #: bauble/plugins/garden/plant_infobox.glade.h:1 #: bauble/plugins/report/report.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:1 #: bauble/plugins/tag/tag.glade.h:1 msgid "--" msgstr "--" #: bauble/bauble.glade.h:2 bauble/connmgr.glade.h:1 msgid "Bauble" msgstr "Bauble" #: bauble/bauble.glade.h:3 msgid "Show details" msgstr "Mostrar detalhes" #: bauble/plugins/plants/species.py:42 #, python-format msgid "" "The species %s has %s accessions. Are you sure you want remove it?" msgstr "" #: bauble/plugins/plants/species.py:45 #, python-format msgid "Are you sure you want to remove the species %s?" msgstr "" #: bauble/plugins/plants/species.py:54 bauble/plugins/plants/genus.py:82 #: bauble/plugins/plants/family.py:66 bauble/plugins/garden/donor.py:37 #: bauble/plugins/garden/accession.py:146 bauble/plugins/garden/location.py:45 #: bauble/plugins/garden/plant.py:78 bauble/plugins/tag/__init__.py:46 #, python-format msgid "" "Could not delete.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species.py:71 bauble/plugins/plants/species.py:74 #: bauble/plugins/plants/genus.py:89 bauble/plugins/plants/__init__.py:40 #: bauble/plugins/plants/__init__.py:47 bauble/plugins/plants/family.py:73 #: bauble/plugins/garden/editors.glade.h:50 msgid "Edit" msgstr "Editar" #: bauble/plugins/plants/species.py:73 bauble/plugins/plants/genus.py:93 #: bauble/plugins/plants/__init__.py:45 bauble/plugins/plants/family.py:77 msgid "Remove" msgstr "Remover" #: bauble/plugins/plants/species.py:128 msgid "Vernacular Names" msgstr "" #: bauble/plugins/plants/species.py:163 #: bauble/plugins/plants/editors.glade.h:28 bauble/plugins/plants/genus.py:800 #: bauble/plugins/plants/family.py:629 msgid "Synonyms" msgstr "Sinónimos" #: bauble/plugins/plants/species.py:206 bauble/plugins/plants/genus.py:843 #: bauble/plugins/plants/family.py:672 bauble/plugins/garden/accession.py:1748 msgid "Notes" msgstr "Notas" #: bauble/plugins/plants/species.py:231 bauble/plugins/plants/species.py:409 #: bauble/plugins/plants/genus.py:733 bauble/plugins/plants/family.py:562 #: bauble/plugins/garden/donor.py:262 bauble/plugins/garden/accession.py:1701 #: bauble/plugins/garden/editors.glade.h:51 msgid "General" msgstr "Geral:" #: bauble/plugins/plants/species.py:292 bauble/plugins/plants/genus.py:656 #: bauble/plugins/plants/family.py:692 msgid "Links" msgstr "Links" #: bauble/plugins/plants/species.py:296 bauble/plugins/plants/species.py:297 #: bauble/plugins/plants/genus.py:660 bauble/plugins/plants/genus.py:661 #: bauble/plugins/plants/family.py:695 bauble/plugins/plants/family.py:696 msgid "Search Google" msgstr "Procurar no Google" #: bauble/plugins/plants/species.py:300 bauble/plugins/plants/genus.py:664 #: bauble/plugins/plants/family.py:699 msgid "Search GBIF" msgstr "Procurar no GBIF" #: bauble/plugins/plants/species.py:302 bauble/plugins/plants/genus.py:666 #: bauble/plugins/plants/family.py:701 msgid "Search the Global Biodiversity Information Facility" msgstr "" #: bauble/plugins/plants/species.py:306 bauble/plugins/plants/genus.py:670 #: bauble/plugins/plants/family.py:705 msgid "Search ITIS" msgstr "Procurar no ITIS" #: bauble/plugins/plants/species.py:308 bauble/plugins/plants/genus.py:672 #: bauble/plugins/plants/family.py:707 msgid "Search the Intergrated Taxonomic Information System" msgstr "" #: bauble/plugins/plants/species.py:312 bauble/plugins/plants/genus.py:676 #: bauble/plugins/plants/family.py:711 msgid "Search IPNI" msgstr "Procurar no IPNI" #: bauble/plugins/plants/species.py:314 bauble/plugins/plants/genus.py:678 #: bauble/plugins/plants/family.py:713 msgid "Search the International Plant Names Index" msgstr "" #: bauble/plugins/plants/species.py:317 bauble/plugins/plants/genus.py:681 msgid "Search BGCI" msgstr "Procurar no BGCI" #: bauble/plugins/plants/species.py:319 bauble/plugins/plants/genus.py:683 msgid "Search Botanic Gardens Conservation International" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:2 msgid "# of Accessions:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:3 msgid "# of Genera:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:4 #: bauble/plugins/garden/infoboxes.glade.h:3 msgid "# of Plants:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:5 msgid "# of Plants" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:6 msgid "# of Species:" msgstr "" #: bauble/plugins/plants/infoboxes.glade.h:7 msgid "Distribution:" msgstr "Distribuição:" #: bauble/plugins/plants/infoboxes.glade.h:8 msgid "family_window" msgstr "family_window" #: bauble/plugins/plants/infoboxes.glade.h:9 msgid "genus_window" msgstr "genus_window" #: bauble/plugins/plants/infoboxes.glade.h:10 msgid "species_window" msgstr "especies_window" #: bauble/plugins/plants/editors.glade.h:2 msgid "Author" msgstr "Autor" #: bauble/plugins/plants/editors.glade.h:3 msgid "Cultivar Group" msgstr "" #: bauble/plugins/plants/editors.glade.h:4 msgid "Distribution" msgstr "Distribuição" #: bauble/plugins/plants/editors.glade.h:5 msgid "Family" msgstr "Família" #: bauble/plugins/plants/editors.glade.h:6 msgid "Genus" msgstr "Gênero" #: bauble/plugins/plants/editors.glade.h:7 msgid "Hybrid" msgstr "Híbrido" #: bauble/plugins/plants/editors.glade.h:8 msgid "Infraspecific Author" msgstr "" #: bauble/plugins/plants/editors.glade.h:9 msgid "Infraspecific Epithet" msgstr "" #: bauble/plugins/plants/editors.glade.h:10 msgid "Infraspecific Parts" msgstr "" #: bauble/plugins/plants/editors.glade.h:11 msgid "Infraspecific Rank" msgstr "" #: bauble/plugins/plants/editors.glade.h:12 msgid "Meta Information" msgstr "Meta informação" #: bauble/plugins/plants/editors.glade.h:13 #: bauble/plugins/garden/acc_infobox.glade.h:14 #: bauble/plugins/garden/editors.glade.h:38 msgid "Notes" msgstr "Notas" #: bauble/plugins/plants/editors.glade.h:14 msgid "Qualifier" msgstr "" #: bauble/plugins/plants/editors.glade.h:15 msgid "Species qualifier" msgstr "Qualificador das espécies" #: bauble/plugins/plants/editors.glade.h:16 msgid "Synonyms" msgstr "Sinônimos" #: bauble/plugins/plants/editors.glade.h:17 msgid "Genus" msgstr "Gêneros" #: bauble/plugins/plants/editors.glade.h:18 msgid "Species" msgstr "Espécies" #: bauble/plugins/plants/editors.glade.h:19 msgid "Family Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:20 msgid "Full name" msgstr "Nome completo" #: bauble/plugins/plants/editors.glade.h:21 msgid "Genus Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:22 msgid "Language" msgstr "Idioma" #: bauble/plugins/plants/editors.glade.h:23 #: bauble/plugins/garden/editors.glade.h:53 msgid "Next" msgstr "Próximo" #: bauble/plugins/plants/editors.glade.h:24 msgid "OK and Add Accessions" msgstr "" #: bauble/plugins/plants/editors.glade.h:25 msgid "OK and Add Genera" msgstr "" #: bauble/plugins/plants/editors.glade.h:26 msgid "OK and Add Species" msgstr "" #: bauble/plugins/plants/editors.glade.h:27 msgid "Plant Species Editor" msgstr "" #: bauble/plugins/plants/editors.glade.h:29 msgid "Vernacular name" msgstr "" #: bauble/plugins/plants/editors.glade.h:30 bauble/connmgr.glade.h:4 msgid "gtk-add" msgstr "gtk-add" #: bauble/plugins/plants/editors.glade.h:31 bauble/connmgr.glade.h:5 msgid "gtk-remove" msgstr "gtk-remove" #: bauble/plugins/plants/species_editor.py:511 #, python-format msgid "Are you sure you want to remove the vernacular name %s?" msgstr "" #: bauble/plugins/plants/species_editor.py:788 msgid "Genus " msgstr "" #: bauble/plugins/plants/species_editor.py:789 msgid "Species epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:790 msgid "Species author" msgstr "" #: bauble/plugins/plants/species_editor.py:791 msgid "Infraspecific rank" msgstr "" #: bauble/plugins/plants/species_editor.py:792 msgid "Species hybrid flag" msgstr "" #: bauble/plugins/plants/species_editor.py:793 msgid "Infraspecific epithet" msgstr "" #: bauble/plugins/plants/species_editor.py:794 msgid "Cultivar group" msgstr "" #: bauble/plugins/plants/species_editor.py:795 msgid "Infraspecific author" msgstr "" #: bauble/plugins/plants/species_editor.py:796 msgid "Species qualifier" msgstr "" #: bauble/plugins/plants/species_editor.py:797 msgid "Note" msgstr "Nota" #: bauble/plugins/plants/species_editor.py:798 msgid "Species distribution" msgstr "" #: bauble/plugins/plants/species_editor.py:799 msgid "Vernacular names" msgstr "" #: bauble/plugins/plants/species_editor.py:800 msgid "Species synonyms" msgstr "" #: bauble/plugins/plants/species_editor.py:940 #: bauble/plugins/plants/genus.py:568 bauble/plugins/plants/family.py:483 #: bauble/plugins/garden/donor.py:200 bauble/plugins/garden/accession.py:1565 #: bauble/plugins/garden/location.py:213 bauble/plugins/garden/plant.py:545 #, python-format msgid "" "Error committing changes.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/species_editor.py:946 #: bauble/plugins/plants/genus.py:574 bauble/plugins/plants/family.py:489 #: bauble/plugins/garden/donor.py:206 bauble/plugins/garden/accession.py:1571 #: bauble/plugins/garden/location.py:219 bauble/plugins/garden/plant.py:550 #, python-format msgid "" "Unknown error when committing changes. See the details for more " "information.\n" "\n" "%s" msgstr "" #: bauble/plugins/plants/genus.py:70 #, python-format msgid "" "The genus %s has %s species. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/genus.py:73 #, python-format msgid "Are you sure you want to remove the genus %s?" msgstr "" #: bauble/plugins/plants/genus.py:91 msgid "Add species" msgstr "Adicionar espécies" #: bauble/plugins/plants/genus.py:239 bauble/plugins/plants/family.py:206 msgid "The family name" msgstr "Nome da família" #: bauble/plugins/plants/genus.py:240 msgid "The type of hybrid for this genus." msgstr "" #: bauble/plugins/plants/genus.py:241 msgid "The genus name" msgstr "Nome do gênero" #: bauble/plugins/plants/genus.py:242 msgid "The name or abbreviation of the author that published this genus" msgstr "" #: bauble/plugins/plants/genus.py:244 msgid "" "A list of synonyms for this genus.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/plants/genus.py:248 msgid "Miscelleanous notes about this genus." msgstr "" #: bauble/plugins/plants/genus.py:515 #, python-format msgid "" "Are you sure you want to remove %(genus)s as a synonym to the current " "genus?\n" "\n" "Note: This will not remove the genus from the database." msgstr "" #: bauble/plugins/plants/genus.py:561 bauble/plugins/garden/donor.py:193 #: bauble/plugins/garden/plant.py:536 msgid "Are you sure you want to lose your changes?" msgstr "" #: bauble/plugins/plants/genus.py:611 msgid "" "You must first add or import at least one Family into the database before " "you can add plants." msgstr "" #: bauble/plugins/plants/__init__.py:42 bauble/plugins/plants/__init__.py:50 msgid "Add accession" msgstr "" #: bauble/plugins/plants/__init__.py:84 msgid "Family" msgstr "Família" #: bauble/plugins/plants/__init__.py:85 msgid "Genus" msgstr "Género" #: bauble/plugins/plants/__init__.py:86 #: bauble/plugins/report/default/__init__.py:66 msgid "Species" msgstr "Espécie" #: bauble/plugins/plants/family.py:54 #, python-format msgid "" "The family %s has %s genera. Are you sure you want to remove it?" msgstr "" #: bauble/plugins/plants/family.py:57 #, python-format msgid "Are you sure you want to remove the family %s?" msgstr "" #: bauble/plugins/plants/family.py:75 msgid "Add genera" msgstr "" #: bauble/plugins/plants/family.py:207 msgid "" "The family qualifier helps to remove ambiguities that might be associated " "with this family name" msgstr "" #: bauble/plugins/plants/family.py:210 msgid "Miscelleanous notes about this family." msgstr "" #: bauble/plugins/plants/family.py:211 msgid "" "A list of synonyms for this family.\n" "\n" "To add a synonym enter a family name and select one from the list of " "completions. Then click Add to add it to the list of synonyms." msgstr "" #: bauble/plugins/imex/csv_.py:201 msgid "Unknown Error." msgstr "Erro Desconhecido." #: bauble/plugins/imex/csv_.py:210 #, python-format msgid "" "Error connecting to database.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:225 #, python-format msgid "" "More than one file given to import into table %(table_name)s: " "%(file_name)s, (file_name2)s" msgstr "" #: bauble/plugins/imex/csv_.py:243 #, python-format msgid "" "Could not match all filenames to table names.\n" "\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:278 #, python-format msgid "" "In order to import the files the following tables will need to be dropped:\n" "\n" "%s\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:304 #, python-format msgid "importing %(table)s table from %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:328 #, python-format msgid "" "The %s table already exists in the database and may contain some " "data. If a row the import file has the same id as a row in the database then " "the file will not import correctly.\n" "\n" "Would you like to drop the table in the database first. You will lose the " "data in your database if you do this?" msgstr "" #: bauble/plugins/imex/csv_.py:457 #, python-format msgid "Error: Could not set the sequence for column: %s" msgstr "" #: bauble/plugins/imex/csv_.py:485 msgid "Choose file(s) to import..." msgstr "Selecione o(s) arquivo(s) para importar..." #: bauble/plugins/imex/csv_.py:512 bauble/plugins/imex/xml.py:68 msgid "Select a directory" msgstr "Selecione um diretório" #: bauble/plugins/imex/csv_.py:523 #, python-format msgid "" "CSVExporter: path does not exist.\n" "%s" msgstr "" #: bauble/plugins/imex/csv_.py:555 #, python-format msgid "" "Export file %(filename)s for %(table)s table already exists.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:580 #, python-format msgid "exporting %(table)s table to %(filename)s" msgstr "" #: bauble/plugins/imex/csv_.py:633 msgid "Import" msgstr "Importar" #: bauble/plugins/imex/csv_.py:634 bauble/plugins/imex/csv_.py:652 msgid "Comma Separated Value" msgstr "Vírgula separa os valores" #: bauble/plugins/imex/csv_.py:638 msgid "" "It is possible that importing data into this database could destroy or " "corrupt your existing data.\n" "\n" "Would you like to continue?" msgstr "" #: bauble/plugins/imex/csv_.py:651 bauble/plugins/abcd/__init__.py:316 msgid "Export" msgstr "Exportar" #: bauble/plugins/imex/xml.py:72 msgid "Save all data in one file" msgstr "Salvar todos os dados em um arquivo" #: bauble/plugins/garden/donor.py:28 bauble/plugins/garden/location.py:35 #: bauble/plugins/garden/plant.py:69 bauble/plugins/tag/__init__.py:37 #, python-format msgid "Are you sure you want to remove %s?" msgstr "" #: bauble/plugins/garden/accession.py:131 #, python-format msgid "" "%(num_plants)s plants depend on this accession: %(plant_codes)s\n" "\n" "Are you sure you want to remove accession %(acc_code)s?" msgstr "" #: bauble/plugins/garden/accession.py:136 #, python-format msgid "Are you sure you want to remove accession %s?" msgstr "" #: bauble/plugins/garden/accession.py:404 #, python-format msgid "If the id_qual is aff. or cf. then id_qual_rank is required. %s " msgstr "" #: bauble/plugins/garden/accession.py:443 #, python-format msgid "unknown source_type in accession: %s" msgstr "" #: bauble/plugins/garden/accession.py:480 msgid "" "The species must be selected from the list of completions. To add a species " "use the Species editor." msgstr "" #: bauble/plugins/garden/accession.py:483 msgid "The accession ID must be a unique code" msgstr "" #: bauble/plugins/garden/accession.py:484 #, python-format msgid "" "The ID Qualifier\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:487 msgid "The date this species was accessioned." msgstr "" #: bauble/plugins/garden/accession.py:488 #, python-format msgid "" "The origin or source of this accession.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:491 #, python-format msgid "" "The wild status is used to clarify the provenance\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/accession.py:494 msgid "The source type is in what way this accession was obtained" msgstr "" #: bauble/plugins/garden/accession.py:496 msgid "Miscelleanous notes about this accession." msgstr "" #: bauble/plugins/garden/accession.py:497 msgid "Indicates whether this accession record should be considered private." msgstr "" #: bauble/plugins/garden/accession.py:815 #, python-format msgid "_parse_lat_lon() -- incorrect format: %s" msgstr "" #: bauble/plugins/garden/accession.py:828 msgid "North/South radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:839 msgid "East/West radio buttons in a confused state" msgstr "" #: bauble/plugins/garden/accession.py:1528 #: bauble/plugins/garden/__init__.py:81 #: bauble/plugins/report/default/__init__.py:65 msgid "Accession" msgstr "" #: bauble/plugins/garden/accession.py:1529 msgid "_Accession" msgstr "" #: bauble/plugins/garden/accession.py:1607 msgid "" "You must first add or import at least one species into the database before " "you can add accessions." msgstr "" #: bauble/plugins/garden/accession.py:1656 msgid "model must have both latitude and longitude or neither" msgstr "" #: bauble/plugins/garden/accession.py:1761 #: bauble/plugins/garden/editors.glade.h:57 msgid "Source" msgstr "Fonte" #: bauble/plugins/garden/acc_infobox.glade.h:2 msgid "Collection ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:3 msgid "Collector:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:4 msgid "Date collected:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:5 #: bauble/plugins/garden/editors.glade.h:22 msgid "Donation Notes" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:6 msgid "Donor's ID:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:7 msgid "Donor:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:8 msgid "Elevation:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:9 #: bauble/plugins/garden/editors.glade.h:29 msgid "GPS Datum" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:10 msgid "Habitat" msgstr "Habitat" #: bauble/plugins/garden/acc_infobox.glade.h:11 msgid "Latitude:" msgstr "Latitude:" #: bauble/plugins/garden/acc_infobox.glade.h:12 #: bauble/plugins/garden/plant_infobox.glade.h:4 msgid "Location:" msgstr "Localização:" #: bauble/plugins/garden/acc_infobox.glade.h:13 msgid "Longitude:" msgstr "Longitude:" #: bauble/plugins/garden/acc_infobox.glade.h:15 msgid "Plants/Clones:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:16 msgid "Provenance:" msgstr "" #: bauble/plugins/garden/acc_infobox.glade.h:17 msgid "Verifier:" msgstr "Verificador:" #: bauble/plugins/garden/acc_infobox.glade.h:18 msgid "--" msgstr "Copy text \t --" #: bauble/plugins/garden/infoboxes.glade.h:2 msgid "# of Donations:" msgstr "# de Doações:" #: bauble/plugins/garden/infoboxes.glade.h:4 msgid "Address:" msgstr "Endereço:" #: bauble/plugins/garden/infoboxes.glade.h:5 msgid "Email:" msgstr "Email:" #: bauble/plugins/garden/infoboxes.glade.h:6 msgid "Fax:" msgstr "Fax:" #: bauble/plugins/garden/infoboxes.glade.h:7 msgid "Tel:" msgstr "Tel:" #: bauble/plugins/garden/institution.py:50 #, python-format msgid "Institution.__getattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/institution.py:61 #, python-format msgid "Institution.__setattr__: %s not a property on Intitution" msgstr "" #: bauble/plugins/garden/editors.glade.h:1 msgid "+/-" msgstr "+/-" #: bauble/plugins/garden/editors.glade.h:3 msgid "." msgstr "." #: bauble/plugins/garden/editors.glade.h:4 msgid "Accession ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:5 msgid "Accession" msgstr "" #: bauble/plugins/garden/editors.glade.h:6 msgid "Locale" msgstr "" #: bauble/plugins/garden/editors.glade.h:7 msgid "Location" msgstr "Localização" #: bauble/plugins/garden/editors.glade.h:8 msgid "Name" msgstr "Nome" #: bauble/plugins/garden/editors.glade.h:9 msgid "Plant code" msgstr "Código da planta" #: bauble/plugins/garden/editors.glade.h:10 msgid "Site" msgstr "Site" #: bauble/plugins/garden/editors.glade.h:11 msgid "Species" msgstr "Espécies" #: bauble/plugins/garden/editors.glade.h:12 msgid "Abbreviation" msgstr "Abreviação" #: bauble/plugins/garden/editors.glade.h:13 msgid "Accession type" msgstr "" #: bauble/plugins/garden/editors.glade.h:14 msgid "Address" msgstr "Endereço" #: bauble/plugins/garden/editors.glade.h:15 msgid "Altitude/Depth" msgstr "" #: bauble/plugins/garden/editors.glade.h:16 msgid "Collection ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:17 msgid "Collection Notes" msgstr "" #: bauble/plugins/garden/editors.glade.h:18 msgid "Collector" msgstr "" #: bauble/plugins/garden/editors.glade.h:19 msgid "Contact name" msgstr "" #: bauble/plugins/garden/editors.glade.h:20 msgid "Date" msgstr "Data" #: bauble/plugins/garden/editors.glade.h:21 msgid "Description" msgstr "Descrição" #: bauble/plugins/garden/editors.glade.h:23 msgid "Donor's ID" msgstr "" #: bauble/plugins/garden/editors.glade.h:24 msgid "Donor" msgstr "" #: bauble/plugins/garden/editors.glade.h:25 msgid "E-mail" msgstr "E-mail" #: bauble/plugins/garden/editors.glade.h:26 #: bauble/plugins/picasa/gui.glade.h:2 msgid "Email" msgstr "Email" #: bauble/plugins/garden/editors.glade.h:27 msgid "Fax #" msgstr "Fax #" #: bauble/plugins/garden/editors.glade.h:28 msgid "Fax" msgstr "Fax" #: bauble/plugins/garden/editors.glade.h:30 msgid "Habitat description" msgstr "Descrição do habitat" #: bauble/plugins/garden/editors.glade.h:31 msgid "History" msgstr "Hist[orico" #: bauble/plugins/garden/editors.glade.h:32 msgid "ID Qualifier" msgstr "" #: bauble/plugins/garden/editors.glade.h:33 msgid "Institution Name" msgstr "Nome da instituição" #: bauble/plugins/garden/editors.glade.h:34 msgid "Institutional code" msgstr "" #: bauble/plugins/garden/editors.glade.h:35 msgid "Latitude" msgstr "Latitude" #: bauble/plugins/garden/editors.glade.h:36 msgid "Location Details" msgstr "Detalhes da Localização" #: bauble/plugins/garden/editors.glade.h:37 msgid "Longitude" msgstr "Longitude" #: bauble/plugins/garden/editors.glade.h:39 msgid "Private" msgstr "Privado" #: bauble/plugins/garden/editors.glade.h:40 msgid "Provenance" msgstr "" #: bauble/plugins/garden/editors.glade.h:41 msgid "Qualifier Rank" msgstr "" #: bauble/plugins/garden/editors.glade.h:42 msgid "Status" msgstr "Situação" #: bauble/plugins/garden/editors.glade.h:43 msgid "Technical contact" msgstr "Contato técnico" #: bauble/plugins/garden/editors.glade.h:44 msgid "Tel #" msgstr "Tel #" #: bauble/plugins/garden/editors.glade.h:45 msgid "Telephone" msgstr "Telefone" #: bauble/plugins/garden/editors.glade.h:46 msgid "Type" msgstr "Tipo" #: bauble/plugins/garden/editors.glade.h:47 msgid "Wild status" msgstr "" #: bauble/plugins/garden/editors.glade.h:48 msgid "Add" msgstr "Adicionar" #: bauble/plugins/garden/editors.glade.h:49 msgid "East" msgstr "Leste" #: bauble/plugins/garden/editors.glade.h:52 msgid "Institution Editor" msgstr "" #: bauble/plugins/garden/editors.glade.h:54 msgid "North" msgstr "Norte" #: bauble/plugins/garden/editors.glade.h:55 msgid "OK and add plants..." msgstr "" #: bauble/plugins/garden/editors.glade.h:56 msgid "Ok and add plants" msgstr "" #: bauble/plugins/garden/editors.glade.h:58 msgid "South" msgstr "Sul" #: bauble/plugins/garden/editors.glade.h:59 msgid "West" msgstr "Oeste" #: bauble/plugins/garden/editors.glade.h:60 msgid "dd/mm/yyyy" msgstr "dd/mm/yyyy" #: bauble/plugins/garden/editors.glade.h:61 msgid "gtk-edit" msgstr "gtk-edit" #: bauble/plugins/garden/editors.glade.h:62 msgid "gtk-new" msgstr "gtk-new" #: bauble/plugins/garden/editors.glade.h:63 #: bauble/plugins/picasa/gui.glade.h:4 msgid "gtk-ok" msgstr "gtk-ok" #: bauble/plugins/garden/editors.glade.h:64 msgid "m" msgstr "m" #: bauble/plugins/garden/plant_infobox.glade.h:2 msgid "Accession Status:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:3 msgid "Accession Type:" msgstr "" #: bauble/plugins/garden/plant_infobox.glade.h:5 msgid "general_window" msgstr "general_window" #: bauble/plugins/garden/__init__.py:82 msgid "Plant" msgstr "Planta" #: bauble/plugins/garden/__init__.py:83 msgid "Location" msgstr "Localização" #: bauble/plugins/garden/location.py:97 msgid "" "The site is the name that you will use later to refer to this location." msgstr "" #: bauble/plugins/garden/location.py:99 msgid "" "Any information that might be relevant to the location such as where it is " "or what's it's purpose" msgstr "" #: bauble/plugins/garden/plant.py:260 msgid "The plant code must be a unique code" msgstr "" #: bauble/plugins/garden/plant.py:261 msgid "" "The accession must be selected from the list of completions. To add an " "accession use the Accession editor" msgstr "" #: bauble/plugins/garden/plant.py:264 msgid "The location of the plant in your collection." msgstr "" #: bauble/plugins/garden/plant.py:265 #, python-format msgid "" "The type of the plant material.\n" "\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:268 #, python-format msgid "" "The status of this plant in the collection.\n" "Possible values: %s" msgstr "" #: bauble/plugins/garden/plant.py:271 msgid "Miscelleanous notes about this plant." msgstr "" #: bauble/plugins/report/template/__init__.py:53 msgid "Template" msgstr "" #: bauble/plugins/report/template/__init__.py:65 msgid "Please selecte a template." msgstr "" #: bauble/plugins/report/template/__init__.py:82 #: bauble/plugins/report/default/__init__.py:365 #, python-format msgid "" "Could not open the report with the default program. You can open the file " "manually at %s" msgstr "" #: bauble/plugins/report/template/gui.glade.h:1 #: bauble/plugins/report/default/gui.glade.h:2 msgid "Include data marked as private" msgstr "" #: bauble/plugins/report/template/gui.glade.h:2 msgid "Template" msgstr "Modelo" #: bauble/plugins/report/report.glade.h:2 msgid "Formatter" msgstr "" #: bauble/plugins/report/report.glade.h:3 msgid "Settings" msgstr "Configurações" #: bauble/plugins/report/__init__.py:103 #, python-format msgid "Can't get plants from a %s" msgstr "" #: bauble/plugins/report/__init__.py:143 #, python-format msgid "Can't get accessions from a %s" msgstr "" #: bauble/plugins/report/__init__.py:185 #, python-format msgid "Can't get species from a %s" msgstr "" #: bauble/plugins/report/__init__.py:345 msgid "Enter a name for the new formatter" msgstr "" #: bauble/plugins/report/__init__.py:359 #, python-format msgid "%s already exists" msgstr "%s já existe" #: bauble/plugins/report/__init__.py:472 msgid "No formatter plugins defined" msgstr "" #: bauble/plugins/report/__init__.py:510 msgid "" "No formatters found. To create a new formatter click the \"New\" button." msgstr "" #: bauble/plugins/report/__init__.py:575 bauble/plugins/report/__init__.py:580 msgid "Search for something first." msgstr "" #: bauble/plugins/report/__init__.py:605 msgid "Formatting Error" msgstr "" #: bauble/plugins/report/default/__init__.py:64 msgid "Plant/Clone" msgstr "" #: bauble/plugins/report/default/__init__.py:241 msgid "Default" msgstr "Padrão" #: bauble/plugins/report/default/__init__.py:271 msgid "Please select a stylesheet." msgstr "Por favor, selecione uma folha de estilo." #: bauble/plugins/report/default/__init__.py:273 msgid "Please select a a renderer" msgstr "" #: bauble/plugins/report/default/__init__.py:288 msgid "" "There are no plants in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:300 msgid "" "There are no species in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:309 msgid "" "There are no accessions in the search results. Please try another search." msgstr "" #: bauble/plugins/report/default/__init__.py:357 msgid "" "Error creating the PDF file. Please ensure that your PDF formatter is " "properly installed." msgstr "" #: bauble/plugins/report/default/gui.glade.h:3 msgid "Renderer" msgstr "" #: bauble/plugins/report/default/gui.glade.h:4 msgid "Source type" msgstr "" #: bauble/plugins/report/default/gui.glade.h:5 msgid "Stylesheet" msgstr "" #: bauble/plugins/report/default/gui.glade.h:6 msgid "Use author names" msgstr "" #: bauble/plugins/report/default/gui.glade.h:7 msgid "" "Accession\n" "Plant/Clone\n" "Species" msgstr "" #: bauble/plugins/abcd/__init__.py:155 msgid "" "Some or all of the information about your institution or business is not " "complete. Please make sure that the Name, Technical Contact, Email, Contact " "and Institution Code fields are filled in." msgstr "" #: bauble/plugins/abcd/__init__.py:267 msgid "Choose a file to export to..." msgstr "" #: bauble/plugins/abcd/__init__.py:317 msgid "ABCD" msgstr "ABCD" #: bauble/plugins/abcd/__init__.py:321 msgid "" "DISCLAIMER: The ABCD Exporter is not fully implemented. At the moment it " "will export the plants in the database but will not include source " "information such as collection and donation data." msgstr "" #: bauble/plugins/abcd/__init__.py:338 msgid "The lxml package is required for the ABCD plugin" msgstr "" #: bauble/plugins/picasa/__init__.py:259 #, python-format msgid "Could not authorize Google account: %s" msgstr "" #: bauble/plugins/picasa/__init__.py:385 msgid "Settings" msgstr "Configurações" #: bauble/plugins/picasa/__init__.py:426 msgid "Images" msgstr "Imagens" #: bauble/plugins/picasa/__init__.py:502 msgid "Could not login to PicasaWeb account." msgstr "" #: bauble/plugins/picasa/__init__.py:523 msgid "No images" msgstr "Sem imagens" #: bauble/plugins/picasa/gui.glade.h:1 msgid "Album" msgstr "Álbum" #: bauble/plugins/picasa/gui.glade.h:3 msgid "Password" msgstr "Senha" #: bauble/plugins/tag/__init__.py:81 msgid "Enter a tag name" msgstr "" #: bauble/plugins/tag/__init__.py:145 #, python-format msgid "Are you sure you want to delete the tag \"%s\"?" msgstr "" #: bauble/plugins/tag/__init__.py:402 msgid "Nothing selected" msgstr "" #: bauble/plugins/tag/__init__.py:431 msgid "Tag Selection" msgstr "Seleção de Etiquetas" #: bauble/plugins/tag/__init__.py:451 msgid "Could not create the tags menus" msgstr "" #: bauble/plugins/tag/__init__.py:459 bauble/plugins/tag/tag.glade.h:5 msgid "Tags" msgstr "Etiquetas" #: bauble/plugins/tag/tag.glade.h:2 msgid "Item(s)" msgstr "Itens" #: bauble/plugins/tag/tag.glade.h:3 msgid "Tags" msgstr "Tags" #: bauble/plugins/tag/tag.glade.h:4 msgid "New Tag" msgstr "Nova Etiqueta" #: bauble/paths.py:99 msgid "" "Could not get path for user settings: no APPDATA or USERPROFILE variable" msgstr "" #: bauble/paths.py:109 #, python-format msgid "" "Could not get path for user settings: could not expand $HOME for user " "%(username)s" msgstr "" #: bauble/paths.py:113 msgid "Could not get path for user settings: unsupported platform" msgstr "" #: bauble/db.py:15 msgid "" "This version of Bauble requires SQLAlchemy 0.5.0 or greater.Please download " "and install a newer version of SQLAlchemy from http://www.sqlalchemy.org or " "contact your system administrator." msgstr "" "Essa versão do Bauble requer o SQLAlchemy 0.5.0 ou superior. Por favor, " "baixe e instale uma versão mais atual do SQLAlchemy de " "htt://www.sqlachemy.org ou contate seu administrador de sistemas." #: bauble/db.py:21 msgid "" "SQLAlchemy not installed. Please install SQLAlchemy from " "http://www.sqlalchemy.org" msgstr "" "O SQLAlchemy não está instalado. Por favor, instale o SQLAlchemy de " "http://www.sqlachemy.org" #: bauble/db.py:229 msgid "The database you have connected to is empty." msgstr "O banco de dados ao qual você se conectou está vazio." #: bauble/db.py:233 msgid "" "The database you have connected to does not have the bauble meta table. " "This usually means that the database is either corrupt or it was created " "with an old version of Bauble" msgstr "" "O banco de dados ao qual você se conectou não possui a meta tabela do " "bauble. Isso comumente significa que o banco de dados ou está corrompido ou " "que foi criado por uma versão anterior do Bauble." #: bauble/db.py:240 msgid "" "The database you have connected to does not have a timestamp for when it was " "created. This usually means that there was a problem when you created the " "database or the database you connected to wasn't created with Bauble." msgstr "" "O banco de dados ao qual você se conectou não possui uma marcação de quando " "ele foi criado. Isso comumente significa que houveram problemas quando você " "criou o banco de dados ou que o banco de dados não foi criado com o Bauble." #: bauble/db.py:248 #, python-format msgid "" "You are using Bauble version %(version)s while the database you have " "connected to was created with version %(db_version)s\n" "\n" "Some things might not work as or some of your data may become unexpectedly " "corrupted." msgstr "" "Você está utilzando a versão %(version)s do Bauble enquanto o banco de dados " "ao qual você está conectado foi criado com a versão %(db_version)s\n" "\n" "Algumas coisas podem não funcionar corretamente ou alguns dados podem " "repentinamente serem corrompidos." #: bauble/pluginmgr.py:159 #, python-format msgid "" "The following plugins were not found in the plugin registry:\n" "\n" "%s\n" "\n" "Would you like to install them now?" msgstr "" "Os seguintes plugins não foram encontrados no registro de plugins:\n" "\n" "%s\n" "\n" "Deseja instalá-los agora?" #: bauble/pluginmgr.py:170 #, python-format msgid "" "The following plugin is in the registry but could not be loaded:\n" "\n" "%s" msgstr "" #: bauble/pluginmgr.py:183 msgid "" "The plugins contain a dependency loop. This can happen if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:197 #, python-format msgid "" "The %(plugin_name)s plugin is listed in the registry but isn't wasn't found " "in the plugin directory" msgstr "" "O plugin %(plugin_name)s está listado no registro mas não foi encontrado no " "diretório de plugins" #: bauble/pluginmgr.py:207 #, python-format msgid "" "Error: Couldn't initialize %(entry_name)s\n" "\n" "%(exception)s." msgstr "" #: bauble/pluginmgr.py:259 msgid "" "The plugins contain a dependency loop. This can happend if two plugins " "directly or indirectly rely on each other" msgstr "" #: bauble/pluginmgr.py:516 #, python-format msgid "" "Could not import the %(module)s module.\n" "\n" "%(error)s" msgstr "" #: bauble/pluginmgr.py:538 #, python-format msgid "%s.plugin is not an instance of pluginmgr.Plugin" msgstr "%s. o plugin não é uma instância de pluginmgr.Plugin" #: bauble/connmgr.glade.h:2 msgid "Connection Details" msgstr "Detalhes da Conexão" #: bauble/connmgr.glade.h:3 msgid "Type:" msgstr "Tipo:" #: bauble/utils/desktop.py:274 #, python-format msgid "" "Could not open %s\n" "\n" "Unknown desktop environment: %s\n" "\n" msgstr "" #: bauble/utils/__init__.py:78 #, python-format msgid "%s not in glade file" msgstr "" #: bauble/utils/__init__.py:456 msgid "Today's date" msgstr "Data de hoje" #: bauble/utils/__init__.py:594 #, python-format msgid "Error: using sequences hasn't been tested on this database type: %s" msgstr "" "Erro: utilizando sequências que não foram testadas nesse tipo de banco de " "dados: %s" #: bauble/utils/log.py:40 #, python-format msgid "" "** Could not open the default log file.\n" "Press OK key to continue.\n" "\n" "%s" msgstr "" "** Não foi possível abrir o arquivo padrão de log.\n" "Pressione a tecla OK para continuar.\n" "\n" "%s" #: bauble/prefs.py:207 #, python-format msgid "" "Bauble can't save your user preferences. \n" "\n" "Please check the file permissions of your config file:\n" " %s" msgstr "" "O Bauble não pode salvar suas preferências de usuário.\n" "\n" "Por favor, verifique as permissões do seu arquivo de configuração:\n" "\n" "\n" "%s" #: bauble/prefs.py:261 msgid "Preferences" msgstr "Preferências" #: bauble/prefs.py:270 msgid "Plugins" msgstr "" #: bauble/prefs.py:305 msgid "Names" msgstr "Nomes" #: bauble/prefs.py:305 msgid "Values" msgstr "Valores" #: bauble/prefs.py:313 msgid "Name" msgstr "" #: bauble/prefs.py:313 msgid "Version" msgstr "" #: bauble/__init__.py:44 msgid "** Error: could not import gtk and/or gobject" msgstr "** Erro: não foi possível importar gtk e/ou gobject" #: bauble/__init__.py:47 msgid "Please make sure that GTK_ROOT\\bin is in your PATH." msgstr "Por favor, certifique-se de que GTK_ROOT\\bin está em seu PATH." #: bauble/__init__.py:143 msgid "No default handler registered" msgstr "" #: bauble/__init__.py:145 #, python-format msgid "No command handler for %s" msgstr "" #: bauble/__init__.py:173 msgid "**Error: Bauble must be run in a windowed environment." msgstr "" #: bauble/__init__.py:237 #, python-format msgid "" "Could not open connection.\n" "\n" "%s" msgstr "" "Não foi possível abrir a conexão:\n" "\n" "%s" #: bauble/__init__.py:269 msgid "" "Would you like to create a new Bauble database at the current connection?\n" "\n" "Warning: If there is already a database at this connection any existing " "data will be destroyed!" msgstr "" #: bauble/types.py:39 msgid "Enum requires a list of values" msgstr "Enum requer uma lista de valores" #: bauble/types.py:41 msgid "" "You have configured empty_to_none=True but None is not in the values lists" msgstr "" "Você configurou empty_to_nome=True mas None não está na lista de valores." #: bauble/types.py:69 #, python-format msgid "\"%s\" not in Enum.values" msgstr "" #: bauble/connmgr.py:106 msgid "" "You don't have any connections in your connection list.\n" "Close this message and click on \"Add\" to create a new connection." msgstr "" #: bauble/connmgr.py:123 msgid "" "You have to choose or create a new connection before you can connect to the " "database." msgstr "" "Você precisa escolher ou criar uma nova conexão antes de poder se conectar " "ao banco de dados." #: bauble/connmgr.py:146 #, python-format msgid "" "Bauble does not have permission to read the directory:\n" "\n" "%s" msgstr "" "O Bauble não possui permissão para ler o diretório:\n" "\n" "%s" #: bauble/connmgr.py:151 #, python-format msgid "" "Bauble does not have permission to write to the directory:\n" "\n" "%s" msgstr "" "O Bauble não possui permissão para escrever no diretório:\n" "\n" "%s" #: bauble/connmgr.py:156 #, python-format msgid "" "Bauble does not have permission to read the database file:\n" "\n" "%s" msgstr "" "O Bauble não possui permissão para ler o arquivo do banco de dados:\n" "\n" "%s" #: bauble/connmgr.py:161 #, python-format msgid "" "Bauble does not have permission to write to the database file:\n" "\n" "%s" msgstr "" "O Bauble não possui permissão para escrever no arquivo do banco de dados:\n" "\n" "%s" #: bauble/connmgr.py:169 msgid "Do you want to save your changes?" msgstr "Deseja guardar as suas alterações?" #: bauble/connmgr.py:189 msgid "" "No Python database connectors installed.\n" "Please consult the documentation for the prerequesites for installing Bauble." msgstr "" #: bauble/connmgr.py:295 #, python-format msgid "" "Are you sure you want to remove \"%s\"?\n" "\n" "Note: This only removes the connection to the database and does not " "affect the database or it's data" msgstr "" "Você tem certeza de que deseja remover \"%s\"?\n" "\n" "Nota: Isso apenas remove a conexão com o banco de dados e não afeta o " "mesmo ou seus dados" #: bauble/connmgr.py:308 msgid "Enter a connection name" msgstr "Entre com um nome para a conexão" #: bauble/connmgr.py:379 #, python-format msgid "Do you want to save %s?" msgstr "Deseja salvar %s?" #: bauble/connmgr.py:387 #, python-format msgid "Do you want to save your changes to %s ?" msgstr "Deseja salvar suas alterações em %s?" #: bauble/connmgr.py:436 msgid "Enter your password" msgstr "Entre com sua senha" #: bauble/connmgr.py:505 msgid "Please choose a name for this connection" msgstr "Por favor, selecione uma nome para essa conexão" #: bauble/connmgr.py:508 msgid "Please choose a user name for this connection" msgstr "Por favor, selecione um nome de usuário para essa conexão" #: bauble/connmgr.py:522 msgid "Database: " msgstr "Base de Dados: " #: bauble/connmgr.py:528 msgid "Host: " msgstr "Servidor: " #: bauble/connmgr.py:535 msgid "User: " msgstr "Usuário: " #: bauble/connmgr.py:541 msgid "Password: " msgstr "Senha: " #: bauble/connmgr.py:590 msgid "Use default filename" msgstr "Utilizar nome de arquivo padrão" #: bauble/connmgr.py:596 msgid "Filename: " msgstr "Nome do arquivo: " #: bauble/connmgr.py:639 msgid "Choose a file..." msgstr "Selecione um arquivo..." #: bauble/editor.py:144 #, python-format msgid "" "Couldn't set the tooltip on widget %(widget_name)s\n" "\n" "%(exception)s" msgstr "" #: bauble/editor.py:279 msgid "Could not destroy window" msgstr "Não é possível destruir a janela" #: bauble/editor.py:473 #, python-format msgid "no widget with name %s" msgstr "Nenhum widget com o nome %s" #~ msgid "Users" #~ msgstr "Usuários" #~ msgid "Permissions" #~ msgstr "Permissões" #~ msgid "Administrator" #~ msgstr "Administrador" #~ msgid "Write" #~ msgstr "Escrever" #~ msgid "gtk-cancel" #~ msgstr "gtk-cancel" #, python-format #~ msgid "" #~ "Error creating tables.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "Erro ao criar as tabelas.\n" #~ "\n" #~ "%s" #~ msgid "Registry" #~ msgstr "Registro" #~ msgid "" #~ "The database you have connected to does not have a valid plugin registry. " #~ "This means that the database could be corrupt or was interrupted while " #~ "creating a new database at this connection." #~ msgstr "" #~ "O banco de dados ao qual você está conectado não possui um registro válido " #~ "de plugins. Isso significa que o banco de dados pode estar corrompido ou que " #~ "foi interrompido enquanto criava um novo banco de dados utilizando essa " #~ "conexão." #~ msgid "Error installing plugins." #~ msgstr "Erro ao instalar os plugins." #, python-format #~ msgid "Error installing plugins: %s" #~ msgstr "Erro ao instalar os plugins: %s" #, python-format #~ msgid "Error: %s" #~ msgstr "Erro: %s" bauble-0.9.7/PKG-INFO0000644000175000017500000000051011310570250013066 0ustar brettbrettMetadata-Version: 1.0 Name: bauble Version: 0.9.7 Summary: Bauble is a biodiversity collection manager software application Home-page: http://bauble.belizebotanic.org Author: Brett Adams Author-email: brett@belizebotanic.org License: GPL Description: UNKNOWN Keywords: database biodiversity botanic collection Platform: UNKNOWN bauble-0.9.7/setup.py0000644000175000017500000003567711310567555013547 0ustar brettbrett#!/usr/bin/env python # # Copyright (c) 2005,2006,2007,2008 Brett Adams # This is free software, see GNU General # Public License v2 for details. try: import setuptools except ImportError: from ez_setup import use_setuptools use_setuptools() import setuptools import os import sys import glob import distutils.core from distutils.command.build import build as _build import distutils.util as util import distutils.spawn as spawn import distutils.dep_util as dep_util import distutils.dir_util as dir_util import distutils.file_util as file_util from setuptools import Command from setuptools.command.install import install as _install from setuptools.command.sdist import sdist as _sdist from bauble import version # TODO: external dependencies not in the PyPI: PyGTK>=2.14, pyglade # TODO: optional dependencies: MySQL-Python, psycopg2, # Sphinx (for building docs, maybe include in buildr-requires) # TODO: fix permissions on files when creating an sdist with: # find . -regex '.*?\.\(glade\|xsl\|txt\|svg\|ui\)' -exec chmod 644 {} \; # TODO: run the clean before creating an sdist, or at least the # manifest should not include those files that would be cleaned # relative path for locale files locale_path = os.path.join('share', 'locale') gtk_pkgs = ["pango", "atk", "gobject", "gtk", "cairo", "pango", "pangocairo"] plugins = setuptools.find_packages(where='bauble/plugins', exclude=['test', 'bauble.*.test']) plugins_pkgs = ['bauble.plugins.%s' % p for p in plugins] all_packages = setuptools.find_packages(exclude=['test', 'bauble.*.test']) package_data = {'': ['README', 'CHANGES', 'LICENSE'], 'bauble': ['*.ui','*.glade','images/*.png', 'pixmaps/*.png', 'images/*.svg', 'images/*.gif', 'images/*.ico']} # ceate a list of the data patterns to look for in the packages data_patterns = ['default/*.txt', '*.ui', '*.glade', '*.xsl', '*.xsd'] for pkg in plugins_pkgs: package_data[pkg] = data_patterns all_package_dirs = {'': '.'} for p in all_packages: all_package_dirs[p] = p.replace('.', '/') data_files = [] # setup py2exe and nsis installer if sys.platform == 'win32' and sys.argv[1] in ('nsis', 'py2exe'): import py2exe from distutils.command.py2exe import py2exe as _py2exe_cmd # setuptools.find packages doesn't dig deep enough so we search # for a list of all packages in the sqlalchemy namespace # TODO: although this works its kind of crappy, find_packages # should really be enough and maybe the problem lies elsewhere sqlalchemy_includes = [] from imp import find_module f, path, descr = find_module('sqlalchemy') for parent, subdir, files in os.walk(path): submod = parent[len(path)+1:] sqlalchemy_includes.append('sqlalchemy.%s' % submod) if submod in ('mods', 'ext', 'databases'): sqlalchemy_includes.extend(['sqlalchemy.%s.%s' % (submod, s) for s in [f[:-2] for f in files if not f.endswith('pyc') and not f.startswith('__init__.py')]]) # TODO: check again that this is necessary for pysqlite2, we might # be able to juse use the python 2.5 built in sqlite3 module py2exe_includes = ['pysqlite2.dbapi2', 'lxml', 'gdata', 'MySQLdb', 'psycopg2', 'encodings'] + \ gtk_pkgs + plugins_pkgs + sqlalchemy_includes py2exe_setup_args = {'console': ["scripts/bauble"], 'windows': [{'script': 'scripts/bauble', 'icon_resources': [(1, "bauble/images/icon.ico")]}]} py2exe_options = { "py2exe": { "compressed": 1, "optimize": 2, "includes": py2exe_includes, "dll_excludes": ["iconv.dll", "intl.dll", "libatk-1.0-0.dll", "libgdk_pixbuf-2.0-0.dll", "libgdk-win32-2.0-0.dll", "libglib-2.0-0.dll", "libgmodule-2.0-0.dll", "libgobject-2.0-0.dll", "libgthread-2.0-0.dll", "libgtk-win32-2.0-0.dll", "libpango-1.0-0.dll", "libpangowin32-1.0-0.dll", "libxml2", "libglade-2.0-0", "zlib1"] } } # py2exe doesn't seem to respect packages_data so build data_files from # package_data for package, patterns in package_data.iteritems(): pkg_dir = all_package_dirs[package] for p in patterns: matches = glob.glob(pkg_dir + '/' + p) if matches != []: index = p.rfind('/') if index != -1: install_dir = '%s/%s' % (pkg_dir, p[:index]) else: install_dir = pkg_dir data_files.append((install_dir, [m.replace(os.sep, '/') for m in matches])) class py2exe_cmd(_py2exe_cmd): def run(self): # TODO: make sure we have everything installed that we need to # bundle e.g. mysql-python, psycopg2, others... _py2exe_cmd.run(self) # install locale files locales = os.path.dirname(locale_path) build_base = self.get_finalized_command('build').build_base #print build_base src = os.path.join(build_base, locales) dir_util.copy_tree(src, os.path.join(self.dist_dir, locales)) # copy GTK to the dist directory # TODO: create a flag to control whether or not to copy gtk_root = 'c:\\gtk' #if os.path.exists(gtk_root): dist_gtk = os.path.join(self.dist_dir, 'gtk') if not os.path.exists(dist_gtk): dir_util.copy_tree(gtk_root, dist_gtk) # register the pixbuf loaders exe = '%s\\bin\\gdk-pixbuf-query-loaders.exe' % dist_gtk dest = '%s\\etc\\gtk-2.0\\gdk-pixbuf.loaders' % dist_gtk cmd = 'call "%s" > "%s"' % (exe, dest) print cmd os.system(cmd) # copy the the MS-Windows gtkrc to make it the default theme rc = '%s\\share\\themes\\MS-Windows\\gtk-2.0\\gtkrc' % dist_gtk dest = '%s\\etc\\gtk-2.0' % dist_gtk file_util.copy_file(rc, dest) class nsis_cmd(Command): # 1. copy the gtk dist to the dist directory # 2. run the script to update the pixbuf paths # 3. tun the nsis command to create the installer # 4. try to do everything silent if possible instead of using # the NSIS compiler GUI user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): print "**Error: Can't run this command." print sys.exit(1) # run py2exe else: py2exe_options = {} py2exe_setup_args = {} py2exe_includes = [] class _empty_cmd(Command): user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): print "**Error: Can't run this command." print sys.exit(1) class py2exe_cmd(_empty_cmd): pass class nsis_cmd(_empty_cmd): pass # build command class build(_build): def run(self): if sys.platform == 'win32': # try to guess the path of the gettext utilities os.environ['PATH'] = os.environ['PATH'] + \ ';c:\\Program Files\\GnuWin32\\bin' if not spawn.find_executable('msgfmt'): msg = '** Error: Building Bauble requires the gettext utilities ' \ 'be installed. If they are installed please ensure that ' \ 'the msgfmt command is in your PATH' print msg sys.exit(1) _build.run(self) # create build/share directory dir_util.mkpath(os.path.join(self.build_base, 'share')) dest_tmpl = os.path.join(self.build_base, locale_path, '%s', 'LC_MESSAGES') matches = glob.glob('po/*.po') for po in matches: # create an .mo in build/share/locale/$LANG/LC_MESSAGES loc, ext = os.path.splitext(os.path.basename(po)) localedir = dest_tmpl % loc mo = '%s/bauble.mo' % localedir if not os.path.exists(localedir): dir_util.mkpath(localedir) if not os.path.exists(mo) or dep_util.newer(po, mo): spawn.spawn(['msgfmt', po, '-o', mo]) # copy .desktop and icons if sys.platform == 'linux2': app_dir = os.path.join(self.build_base, 'share/applications') dir_util.mkpath(app_dir) file_util.copy_file('data/bauble.desktop', app_dir) icon_sizes = [16, 22, 24, 32, 48, 64]#, 128] icon_root = os.path.join(self.build_base, 'share/icons/hicolor') # copy scalable icon scalable_dir = os.path.join(icon_root, 'scalable/apps') dir_util.mkpath(scalable_dir) file_util.copy_file('data/bauble.svg', scalable_dir) pixmaps_dir = os.path.join(self.build_base, 'share/pixmaps') dir_util.mkpath(pixmaps_dir) file_util.copy_file('data/bauble.svg', pixmaps_dir) # copy .png icons dimension = lambda s: '%sx%s' % (s, s) for size in icon_sizes: img = 'data/bauble-%s.png' % size dest = os.path.join(icon_root, '%s/apps/bauble.png' % dimension(size)) dir_util.mkpath(os.path.split(dest)[0]) file_util.copy_file(img, dest) # install command class install(_install): def has_i18n(self): return True def initialize_options(self): _install.initialize_options(self) self.skip_xdg = False def finalize_options(self): _install.finalize_options(self) def run(self): if sys.platform not in ('linux2', 'win32'): msg = "**Error: Can't install on this platform: %s" % sys.platform print msg sys.exit(1) if not self.single_version_externally_managed: self.do_egg_install() else: _install.run(self) # check if someone else is copying the files to the destination #if self.single_version_externally_managed:# and not self.root: # return # install bauble.desktop and icons if sys.platform == 'linux2': # install everything in share dir_util.copy_tree(os.path.join(self.build_base, 'share'), os.path.join(self.install_data, 'share')) elif sys.platform == 'win32': # install only i18n files locales = os.path.dirname(locale_path) install_cmd = self.get_finalized_command('install') build_base = install_cmd.build_base src = os.path.join(build_base, locales) dir_util.copy_tree(src, os.path.join(self.install_data, locales)) # docs command DOC_BUILD_PATH = 'doc/.build/' class docs(Command): user_options = [('all', None, 'rebuild all the docs')] def initialize_options(self): self.all = False def finalize_options(self): pass def run(self): try: import sphinx except ImportError: print 'Building the docs requires the '\ 'Sphinx(http://sphinx.pocoo.org) package' return if not os.path.exists(DOC_BUILD_PATH): dir_utils.mkpath(DOC_BUILD_PATH) cmd = ['sphinx-build', '-E', '-b', 'html', 'doc', DOC_BUILD_PATH] if self.all: # rebuild all the docs cmd.insert(1, '-a') spawn.spawn(cmd) # clean command class clean(Command): user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): patterns = ['MANIFEST', '*~', '*flymake*', '*.pyc'] cwd = os.getcwd() import fnmatch for path, subdirs, files in os.walk(cwd): for pattern in patterns: matches = fnmatch.filter(files, pattern) if matches: def delete(p): print 'removing %s' % p os.remove(p) map(delete ,[os.path.join(path, m) for m in matches]) if os.path.exists('dist'): dir_util.remove_tree('dist') if os.path.exists('build'): dir_util.remove_tree('build') if os.path.exists(DOC_BUILD_PATH): dir_util.remove_tree(DOC_BUILD_PATH) # .egg info egg_info_dir = 'bauble.egg-info' if os.path.exists(egg_info_dir): dir_util.remove_tree(egg_info_dir) # deb_dist - used by stdeb deb_dist = 'deb_dist' if os.path.exists(deb_dist): dir_util.remove_tree(deb_dist) # TODO: sdist_deb should be run from a fresh checkout and never from a # working directory as it could contain uncommited files and other # files in the tarball that shouldn't be included in the dist # sdist_deb command class sdist_deb(_sdist): user_options = [] # def initialize_options(self): # pass def finalize_options(self): _sdist.finalize_options(self) self.formats = ['gztar'] def run(self): _sdist.run(self) cfg = os.path.abspath('stdeb.cfg') cmd = ['py2dsc', '--extra-cfg-file', cfg, #'--no-pycentral', '--dist-dir', 'dist/deb_dist', '--ignore-install-requires', self.archive_files[0]] spawn.spawn(cmd) # require pysqlite if not using python2.5 or greater needs_sqlite = [] try: import sqlite3 except ImportError: needs_sqlite = "pysqlite>=2.3.2" # TODO: images in bauble/images should really be in data and copied as # package_data or data_files setuptools.setup(name="bauble", cmdclass={'build': build, 'install': install, 'py2exe': py2exe_cmd, 'nsis': nsis_cmd, 'docs': docs, 'clean': clean, 'sdist_deb': sdist_deb}, version=version, scripts=["scripts/bauble", "scripts/bauble-admin"], packages = all_packages, package_dir = all_package_dirs, package_data = package_data, data_files = data_files, install_requires=["SQLAlchemy>=0.5rc4",#<0.6", "lxml",#==2.1.1", "mako>=0.2.2", "gdata>=1.2.4"] + needs_sqlite, test_suite="nose.collector", author="Brett Adams", author_email="brett@belizebotanic.org", description="Bauble is a biodiversity collection manager " \ "software application", license="GPL", keywords="database biodiversity botanic collection", url="http://bauble.belizebotanic.org", options=py2exe_options, **py2exe_setup_args ) bauble-0.9.7/MANIFEST.in0000755000175000017500000000043111210626427013543 0ustar brettbrettrecursive-include bauble *.ui *.py *.glade *.txt *.xsl recursive-include po *.po #recursive-include debian *.* recursive-include bauble/images *.* recursive-include bauble/pixmaps *.* recursive-include data *.* include README LICENSE CHANGES INSTALL ez_setup.py setup.cfg stdeb.cfgbauble-0.9.7/README0000644000175000017500000000350611210626427012670 0ustar brettbrettBauble ============ ********** WARNING: This file is terribly out of date and most like not very accurate. ********** At it's heart Bauble is a framework for creating database applications. In it's distributed form Bauble is an application to manage plant records and specifically living collections. It is used by Belize Botanic Gardens to manage their live collections. Included by default is RBG Kew's Family and Genera list from Vascular Plant Families and Genera compiled by R. K. Brummitt and published by the Royal Botanic Gardens, Kew in 1992 used by permission from RBG Kew. All code contained as part of the Buable package is licenced under the GNU GPL. Requirements: ------------- Bauble requires the following packages to run. The installer for Windows comes with everything already built in except for GTK+ and the optional XSL->PDF renderer which is need to use the formatter plugin. Python 2.4 (not tested with other versions but they may work as well) SQLAlchemy>=0.5.0 pygtk>=2.12 lxml>=2.0 At least one of the following database connectors: pysqlite >= 2.3.2 psycopg2 >= 2.0.5 mysql-python >= 1.2.1 To use the formatter plugin you will also need to install an XSL->PDF renderer. For a free renderer check out Apache FOP (>=.92beta) at http://xmlgraphics.apache.org/fop/ Installation: ------------- Linux ----- 1. Download one of the Bauble archives from http://bauble.belizebotanic.org. 2. Extract the archive to a directory. 3. Change to the Bauble directory where you extract the archive. 4. Type "python setup.py install" on the command line 5. To run Bauble type bauble on the command line. Windows ------- 1. Download the bauble--.exe file from http://bauble.belizebotanic.org 2. Double click on the file when it finishes downloading. 3. Run Bauble from the Start menu. bauble-0.9.7/data/0000755000175000017500000000000011310570250012706 5ustar brettbrettbauble-0.9.7/data/bauble.desktop0000644000175000017500000000031111310567555015544 0ustar brettbrett[Desktop Entry] Encoding=UTF-8 Name=Bauble Version=0.9.7 # :bump Comment=An application for managing botanical collections Terminal=False Icon=bauble Type=Application Exec=bauble Categories=Education;bauble-0.9.7/data/bauble.svg0000644000175000017500000001076311210626427014677 0ustar brettbrett image/svg+xml bauble-0.9.7/data/bauble-64.png0000644000175000017500000001055311210626427015110 0ustar brettbrettPNG  IHDR@@iqsRGBbKGD pHYs  IDATxݛwXW?34 R(*XP /quMQJI555FE,bkPT,JGzLƟ3@ٽ3 MŗAĚs^b9/)Oa`'{qŵ- Enu`L1U\*`H(_tr3fv߳B6ͽZrb8s!D;;׮WW$.q%z&@ ++K|؏];Ő19aٮƷ'51[ҬYlGHql۵%hGH$97:⅘aeeExOmu*0e_-MXr6ӟA#rQQ[[+~ }ɶDŽ.Xwk/K@rzVOiIGķl xN&7 %%E,]h'toA@٧\sKSUVVqx8 `uL d2E=a8q^6Tڲ@ `wQW Ԥ*% >x55,Y9bdd$i5`e)I߲i&0eϒ2غ>j1ݾ{vٶm+,# #SO ̻Łccl[|.sʊ*ՀHNW.Fai.]̌sCEWyqoyp;4.^^p?y_Ljf:NHq*TvW `? b٢J4i )*ҘYWKٻ?Ӛ;VZt,JX[[ 3KU2ՌM>Ė3O펋k/]+(@K徝(MMMM[KrU@K[v?374HKyRv}-dZ`@?zpeFʯLw(IfN[{Cg89(R@y&~RM-&9&enl OX ϧt^d*]=-ĺ544TIEk+e4~.=vl*1OL^@V ZKf4rnNiI9٨dwD8PaߢԷGzxtgl\z9F+5LmZj۽,u4Fv Mu8w Q>,_wiԠVP_F;rvSVTɟ=)- ;g\<(LK[=,pq!ZOG_?"7k5Fg~x2or9B\nL-F6qx\YVMQV)/|r:ha8wVu aÊ]N&V O~_hk&#96U=)fvt~!f([96FtvWzdHR  !& I[&x!X2k?1Y|eZ*-zha`ۘJӊxGbdfIxxREPwڷX+qTScJ%¦)v,RLY~4ýGq\Ju|\[U~yx#"3j)V%^aӺ-YKPUQKUE UkkشoyGDL_9ȴ ZpBF3r;JB^)g)m;P]]d)i lgS !x(($ gvažX;)GPB iHM)Y VgozRn߷'~WyIg=h *Y̟5ɾa01Q8KσۯstMƵ 9IE\rÒM7L+D"C<ƾ"g ljU*~d mdnغ7X\'L9/[e^LJ;R_a\}#+--Tά́/ү@233S{ &3%:v2}:{rO{6^e.tcrcwǷ́݇%VE|NEC^ 3Y^N .LQC#\%bhËtz(ൗ7ǁ6*1'91wQa$iI%OwC*ΦplYy>!o 1???)&҉:OeJo҄Bwi{+ bR/;Ā jRqQ!ٲ2̈́[?; :]F-jkkahJ.u]][wlUUU5HiH nNTTTWGW9o_d!%%%|1KoqhG\֨$IENDB`bauble-0.9.7/data/bauble-24.png0000644000175000017500000000313011210626427015075 0ustar brettbrettPNG  IHDRw=sRGBbKGD pHYs  IDATHǝ[lgƟ|9N|s\i%vH5Mh661 +4  $ZnHn:UՄX;m]%kInMb'qCspmׇY]ҕ\ܧ>O^9mM D+䓓".2 ߄Z[|.C_ԪVdjmՎCG‘o^~g׎Cd$xGep jšb‰ح^;s44M?//*v 7$I T㡞ZJq(EAah46陚znȾ?~E%;V wJQ5xE a-Gl:@ωʳ#4݃ݭXZHͿTpZFt+oo}dRJI7@Gh,E$cp\ߜWA_EQleLuCS6uNd`j$ZܸHa54x\ IP*V0_خckhFW/@ܪR wՒ@.63%\t*iH'4CaZL@JTRAS48Ip<ں-Ŷ0{cQ tm]25I@k-}qzv`;7([H^S0,j>3ܔDN7(HlDr2U-^mV D8Z6pKae  4, -!V,p&V X; Vg8 h?:hf ˬ +˘}5ռ\Z?>:S<ˆ+6hU4,-gqs%VbjIhDIF3csk`ШxW#qUɇ/{}\E4epϪec+^T:ޱӣ;>-=CB,ں 톚X.pd@۪A]f;oON]JVEje֐J"H@aE K;;0~`<޷V15)VCMIrH.gޥȏ8 l}!_ϛ^g̻ 6.GϤY_Oa7}^LၑW=㏟W)w[Mbxscz`N-3[dB``t|???v '?o]Gk,,IENDB`bauble-0.9.7/data/bauble-22.png0000644000175000017500000000300011210626427015067 0ustar brettbrettPNG  IHDRĴl;sRGBbKGD pHYs  IDAT8˕ˏWƿ{U]==35cm+V ,CBH,H@bo!!D"bؙQ2dp߻R:dIA%E<@Q4] qd!lmH-HH(2yN(kiEI\) $QJipF6 tPK#"HU FM ;I)$bQ-E 8 t"G0ԷGMȂ3]P҂{cƽӏR  H!+Qt$muqڇs YFZFfFQ XYzNwC8E495rQ8jB1%q=#g^H]CW~Aq@e,D#0 "=~ۄqDK~䌶.a3SIt쟽^X8$JrNCo0] IO8Xyr8LUeq6&" h \W}ϐgnv֎wWxA\6m'6)MUJwJg_=!Ĭ|0.QUs̽r~m[?QOǎ?ɏ꽞/*_f7$Q)?*lIENDB`bauble-0.9.7/data/bauble-32.png0000644000175000017500000000427111210626427015103 0ustar brettbrettPNG  IHDR szzsRGBbKGD pHYs  LIDATXíkPSg~!p "RGjez8v;n۱k~XՊWP9X/(/!p!' $9a>y YIsOeu'd%Uukm ~3}wԵk׳,ǔ,T92!Z5Tر7,ox".H"fA0dQU0> u eBҼ_dCϟ7jO(u9ҙI!^ \⹇ˡj\W |2-hiIya?9|>~e/:N1}}Gk(]<?]EMصi8:2Uv@ѦD.NUj._D|Yz)q"J{ʸT*A;˱UFJ{99fR*p?ݭ;asXD,BmM_@NVc%cDB6S\*abyoz,..O ޲iDuu*X4۠G!G^qb x^4$IBgA.H٢FcnԩoZ(CI%ӤrؑQn2T5́@mvfmF4>^MH%2SaFJ1EݭЪ [222褤djs*n%b! Ѩ)fã] 7Enݵ !"ϺPr W`qzD"!8ArzQS\탗e ě=F]^$-BǢnOC-X"z 9o<$y9\έFiy 4 J3`7H‡R#AbZ gG hmuM_p yR3p --Mb`vŽA !% /}Z5A9ZbQN̑pҹUBQ!ᒩb8jò5! ! !;MO?Ad2"H 43 Lqns# h*AUؼ? w7>"@)J 7Fr467i'E0%aJ>|"8b1d !*1>u 0CM(~qLΧJ--@)f!恱9=CV5 (%x\X ͛nfѿT&~i;>(Dtz~Q/{Y<|dEѭVnH$%UiܬAJK ăD_p yP@ZopFs,͟TTnҸ'9k`ysؤkdF>#s_Jʓ ٬c 8! g(#I7LI0du`^"'*:dgX= 쟂~ .>+ 6?Ӄ;$n5/O߳$m)}W'ۇi^ "f~= ~vȍV,2c΂#$iA҃ bTS!0'{Fv^ġߞ\'f$-@Yc38賌 }iwJ5zC04䏃A'V:6X0[ݘۿ9Myė._b=_eZt &U@m B#[7|c9~mi|7&xY@H$ܹ^zS0ڨc~'oO5?`Vy][M]=\AM;/99?7Se9qEpF\>BØekm[Q4^:NMKm6l6Z :p ^*0da#IENDB`bauble-0.9.7/data/bauble-16.png0000644000175000017500000000172611210626427015107 0ustar brettbrettPNG  IHDRasRGBbKGD pHYs  iIDAT8}Kk\ers93sf2dƐX\&ظ(PotK\ ]ZӦ1!d&L2s(tхx/KsRo9׳^ L1:u|#W}޸Q0ʇO<ݿpa9c߽: >Wbx^hQ:D?2\5[{ۮV^{4T_~ըT*=֕Ѻ2zR xvY*rdio='!ԽIObLB$&QQ@ w#\*MWȟv'͕VgRwJs= &N`8GY9"b?7ڭ^+roݡt.1P$3vPp8 {[^P<.Ye$deY8j!q!$fvDʑ)p" XB6$'< Jd\H@f!Ԕ&-s~E*C$(L^~[?|^ *#srn08e1(^B~i0cYAAϞY]=4-Y@%$I>ہ(yD,ߥ뒗Vk\͏庺XnsR:6660%"-%qO _Y3CE;\̶NP,mya` R?.w|xxN XFmYO5Ɵs9lx8T+Oxͮ wcHIMU0oNX KW?CLptPE]TG?gDm>ꄟhIENDB`bauble-0.9.7/data/bauble-48.png0000644000175000017500000000716111210626427015113 0ustar brettbrettPNG  IHDR00WsRGBbKGD pHYs  IDAThYy\Sg~ɾPdQqJtZmkTgzouFжmj+D) "0,$! ɹt;~==&{ąPPn2YӤ{5/{ d 47⦦Ƭ^m95p5W:-a֬Y .JIU[tzφFQPK䅀p!u-cyM= EUV3oL&K?!j ;X iS15khW pOÁ?ŀč[( w[1^"gOdP۳S!Uƌb)`i#;mOw6OdI`ЛPr u2$X0Al<$5r 9=7ԊRD!O3H{Պ?~a(7}M}]_޹sNghbեb#9~BG`EK'j:؉)Q׸n4i?۷=H؊*@PEeEEEIqi#",.}ҁ&' 7"XAxˍej\y1hۂ/ʂ3twwd2لK0W_}(F]=zD%LGoabG ˰ )^ᘿ8s,*+s׮IˋT'СC|E[Wc'Pq >q;8n\=e77 ?Sƕj1 @% Fr1{$B]E|e 6:]"ԏ Z@oe>xmbӅxvKT| s8lBo ٓSy(Ř2z^+l}Pٸ(|oMF'`MRm\<].7^Fc`UHRW H |p[2#***:%EbQΛ}C{p6=X $nϻofݛ.1~奷p .'yHE2[!OddMM}$`hFdV>R" 7(SG Ftoz)ӡT `?> τ|z~$΃D Jrѫӣ&=KqCfEdۡNGp:]X5FPO܈E$j!0TI H$A 'H$ 8nHxAP}y5;O5 b1tfu3;fJ;.4#&&Q~roȧ dpc+wG_F1@* u@ f39벌!:91hZY5뭏ѧ3>$B E>ްX,r4`1vzӂ_OFy ۄ 4ַ AKX6pHl20rSkXʃL.B3x%`8~ 4Ju|"ږN'L8d_q_۲uSa1:఻'PӇycՖXYax%.mDl(? 1`2gPqp /D*@ȅُ/!f/xBք 8l.ADްݕ)OOf'@AHD'\.@Q~NDlbv'b֤KEymxKF 0 `5fS")-d q-!"&%1)h'Ǯϣ݀[Y K9`s!rRhkkS +vΝ)ni*&|}}@Jn`O31odc8-}64]D g*5D\*W.ݑfZȉp2Cp0'8q9hQwKW@#~z33#Կ-OAխ/;͔Dq+Gkg/Dg@oGmT0|#o''f@Λ}2)^x ;1xAq!?:=H1n ZnvASٍ9+xVjREO߸=h#s'D$bE_8]ݦK{LW 蚍[3C+KMX#BmHmw*!-6䟼{mH D[m/׌9x/'Wbcy cҏ<Xhnl~3<$o+QWEQw9h텦 B-YڼisihH<$<@ H$Rh:-C5Ί/{%iEtZ(x^#KkCZHxa~P;uú>x$bTӖPW@5k~AMlGGUل-<̹i2B[Óϫ~<\ؑiQ@0( ]~$Xb8pԸYфCS. : 7qtHV~Wa̓eQb*~(fz;, v⧷pZ#kCc`U5¶ O=uϯjMO1 i8OcAX?fub~5.!qKD~ # This is free software, see GNU General Public License v2 for details. """ The bauble-admin script makes it easier to create and database and change some of its properties. """ import sys import os from optparse import OptionParser from getpass import getpass import logging from logging import info, warn, error print '\n*** This script is considered ALPHA quality. You mileage may vary.\n' usage = 'usage: %prog [command] [options] dbname' parser = OptionParser(usage) parser.add_option('-H', '--host', dest='hostname', metavar='HOST', help='the host to connect to') parser.add_option('-u', '--user', dest='user', metavar='USER', help='the user name to use when connecting to the server') parser.add_option('-P', '--port', dest='port', metavar='PORT', help='the port on the server to connect to') parser.add_option('-o', '--owner', dest='owner', metavar='OWNER', help='the owner of the newly created database, if not ' \ 'set then use the user name') parser.add_option('-p', action='store_true', default=False, dest='password', help='ask for a password') parser.add_option('-d', '--dbtype', dest='dbtype', metavar='TYPE', help='the database type') parser.add_option('-v', '--verbose', dest='verbose', action='store_true', default=False, help='verbose output') parser.add_option('-y', '--dryrun', dest='dryrun', action='store_true', default=False, help="don't execute anything") options, args = parser.parse_args() commands = {} logging.basicConfig(format='%(levelname)s: %(message)s') #if options.verbose: logging.getLogger().setLevel(logging.INFO) def error_and_exit(msg, retval=1): error(msg) sys.exit(retval) default_encoding = 'UTF8' class Command(object): """ New commands should subclass the Command class. """ def __init__(self): if self.__doc__ == Command.__doc__: warn('No help set for %s' % self) @classmethod def run(self): raise NotImplementedError def execute(cursor, command, verbose=options.verbose): if verbose: logging.info(command) if not options.dryrun: cursor.execute(command) return cursor class CreateCommand(Command): """ The create command creates a database. """ name = 'create' @classmethod def run(cls): if options.dbtype != 'postgres': error_and_exit('Creating a database is only supported for ' 'PostgreSQL database') cls._run_postgres() @classmethod def _run_mysql(cls): raise NotImplementedError @classmethod def _run_postgres(cls): # ISOLATION_LEVEL_AUTOCOMMIT needed from create database from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT cursor = None if not options.dryrun: conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) cursor = conn.cursor() # check if the database already exists sql = "SELECT datname FROM pg_database WHERE datname='%s';" % dbname execute(cursor, sql) if not options.dryrun: rows = cursor.fetchall() if (dbname,) in rows: print 'database %s already exists' % dbname sys.exit(1) # create the owner if the owner doesn't already exist sql = "SELECT rolname FROM pg_roles WHERE rolname='%s';" % \ options.owner execute(cursor, sql, verbose=False) password = '' if not options.dryrun: if (options.owner,) in cursor.fetchall(): print 'user %s already exist' % options.owner else: password = getpass('Password for new database owner %s: ' % \ options.owner) sql = "CREATE ROLE %s LOGIN PASSWORD '%s';" % \ (options.owner, password) execute(cursor, sql) # create the database and give owner permissions full permissions options_dict = dict(dbname=dbname, owner=options.owner, encoding=default_encoding) sql = 'CREATE DATABASE %(dbname)s WITH OWNER="%(owner)s" ' \ 'ENCODING=\'%(encoding)s\';' % options_dict execute(cursor, sql) sql = 'GRANT ALL ON DATABASE %(dbname)s TO "%(owner)s" ' \ 'WITH GRANT OPTION;' % options_dict execute(cursor, sql) class GroupCommand(Command): """ The group command allows you to add, remove and change groups on a database With this command you can either create "admin" groups or regular groups. For more fine-grained control then you must edit the database manually. """ name = 'group' @classmethod def run(cls): pass def _run_postgres(cls): pass class UserCommand(Command): """ The user command allows you to add, remove and change the permissions of a user on a database. With this command you can either create "admin" users or regular users. For more fine-grained control then you must edit the database manually. """ name = 'user' @classmethod def run(cls): if options.dbtype != 'postgres': error_and_exit('User properties can only be changed on a ' 'postgres database.') cls._run_postgres() @classmethod def _run_postgres(cls): # TODO: get subcommands pass class DropCommand(Command): """ Remove a database from a server. BE CAREFUL. """ name = 'drop' @classmethod def _run_postgres(cls): from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) cursor = conn.cursor() msg = '** WARNING: Dropping a database will completely remove the ' \ 'database and all its data. Are you sure you want to drop the ' \ '"%s" database? ' % dbname response = raw_input(msg) if response not in ('Y', 'y'): print 'Whew.' return args = [] for a in connect_args: if a.startswith('dbname='): args.append('dbname=postgres') else: args.append(a) logging.info(args) conn2 = dbapi.connect(' '.join(connect_args)) conn2.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) cursor2 = conn2.cursor() #logging.info(connect_args) sql = 'DROP DATABASE %s;' % dbname execute(cursor2, sql) conn2.close() @classmethod def run(cls): if options.dbtype != 'postgres': error_and_exit('Creating a database is only supported for ' 'PostgreSQL database') cls._run_postgres() def register_command(command): """ Register a new command. """ commands[command.name] = command register_command(CreateCommand) register_command(UserCommand) register_command(DropCommand) if len(args) < 1: parser.error('You must supply a command') cmd = args[0] if cmd not in commands: parser.error('%s is an invalid command' % cmd) try: dbname = args[-1] except: parser.error('You must specify a database name') def build_postgres_command(): pass def build_mysql_command(): pass dbapi = None if options.dbtype == 'sqlite': parser.error('It it not necessary to use this script on an SQLite ' 'database') elif options.dbtype == 'postgres': dbapi = __import__('psycopg2') elif options.dbtype == 'mysql': dbapi = __import__('MySQLdb') else: parser.error('You must specify the database type with -d') if not options.user: options.user = os.environ['USER'] if not options.owner: # options.owner = #os.environ['USER'] options.owner = options.user print 'Setting owner as %s' % options.owner # build connect() args and connect to the server connect_args = ['dbname=postgres'] if options.hostname is not None: connect_args.append('host=%s' % options.hostname) if options.password: password = getpass('Password for %s: ' % options.user) connect_args.append('password=%s' % password) if options.user: connect_args.append('user=%s' % options.user) if options.port: connect_args.append('port=%s' % options.port) #connect_args = ' '.join(connect_args) if options.verbose: logging.info('connect_args: %s' % ' '.join(connect_args)) conn = None if not options.dryrun: conn = dbapi.connect(' '.join(connect_args)) commands[cmd].run() conn.close() bauble-0.9.7/CHANGES0000644000175000017500000015273311210626427013012 0ustar brettbrett0.7.0 ------- - More robust and cleaned up plugin interface - Translatable 0.6.0 (changes since 0.5.3) ------- - Now uses SQLAlchemy instead of SQLObject as the database ORM. - Moved away from the table/spreadsheet style data entry. - Reworked formatter plugin. - More reliable CSV import/export - More correct ABCD export (still some work to be done) - Close to 3 billion bug fixes. 2006.07.04 ---------- - builds now include the revision in the filename - fix a bug when there is no infobox for a type in the search results 2006.07.02 ---------- - don't remove and destroy the infobox if the current infobox is the same type we are going to create - cache infoboxes so we only create one of each type once - create a (crappy) icon for windows 2006.07.01 ---------- - added an InfoBox for Family - lots of improvements all the infoboxes - context menu for locations 2006.06.30 ---------- - improved behavior of resetting the view after an action has been done from the context menu or insert menu - don't change sensitivity on search - first go at a Genus infobox 2006.06.29 ---------- - change the way the results in the search view are displayed and how the context menu is built, push more of the work off to the plugins since they should know more about the types they represent 2006.06.28 ---------- - fixed error message in update_infobox if the iter was None - fixed a problem when trying to commit donations, refactored out fixing up the model from the accession source presenter depending on the type of the presenter 2006.06.26 ---------- release 0.5.2 2006.06.25 ---------- - pass species correctly accession editor when opened from the species editor - fixes for windows - set app busy when creating a new database, this doesn't work very well since the gui isn't given time to update and csv import doesn't block - now get plants from family and genera in results - make sure that the plants in the formatter list are unique - other minor improvements to formatter plugin and documentation updates 2006.06.24 ---------- - on going doc improvements - improved speed of editor.SQLObjectProxy by doing less attribute lookups in some methods - removed some unnecessary code in species_editor.py - removing a row from the vernacular name table with now set any Species.default_vernacular_name column to None if the default_vernacular_name refers to the deleted row - basic cleanup/fixing to get ready for 0.5.2 release - new vernacular names and synonyms are now blue to show that they have just been added but not committed - some tweaks to the search results tree view - update infobox after editing an existing row 2006.06.21 ---------- - documentation updates - species now includes sp_qual in the name and the id_qual is included in the infobox 2006.06.14 ---------- - documentation updates 2006.06.13 ---------- - now ask in BaubleApp.create_database if the user wants to import the genera - show a message and don't let the use open the accession or species editor unless species or genera already exist in the database - forgot to change GenusSynonyms.txt to new imex_csv format - change Family.family to not be alternateID so we can have both, e.g., Malvaceae (s. lat) and Malvaceae (s. str), this is a bit of a fuck up since it changes the model so it should require us to bump the minor number and recreate the database if you want this feature - other small bugs in imex_csv and the utils message_dialog 2006.06.12 ---------- - changed the format of csv import to now use the column names as they are in the database instead of how SQLObject sees them - changed the way dialogs are show in csv import to prevent lock ups - tried to improve the speed of imports a bit by changing the way the rows are inserted, we now use sqlobject.sqlbuild.Insert. though it would still probably be faster if we got it to work by sending the entire list of values to the insert instead of one row at i time, i'm not sure if this is the real bottleneck on the imports - lots of other small fixes in csv import/export 2006.06.09 ---------- - more work on csv export to make the gui more responsive - code cleanups and docs 2006.06.08 ---------- - rewrote csv importing to use gtasklets (http://www.gnome.org/~gjc/gtasklet/gtasklets.html) so now we have a progress dialog 2006.06.07 ---------- - created some test for Species.str() to make sure we are getting string that conform to proper botanical nomenclature 2006.06.06 ---------- - fixed bug with setting background color on the species editor genus entry when a character is deleted - fixed a bug when cancelling a dirty model in the species and accession editors would make further commits not commit until bauble was closed and possibly not commit at all - connected the full name label in the species editor - lots of small changes in the species editor so we can stabilize for 0.5.2 - any value from a widget that doesn't validate against the model now adds a problem to the presenter which usually disables the ok buttons - fixes and on the species and accession info boxes 2006.06.01 ---------- - continue work on species editor - fixed but in utils.search_tree_model where the function was calling itself recursively with the wrong arguments - fixed setting False values on a gtk.CheckBoxe in utils.set_widget_value 2006.05.30 ---------- - did some work on the species editor and the vernacular name editor, can now set default vernacular names for the species 2006.05.29 ---------- - can no longer set attributes in SQLObjectProxy that don't exist, this helps reduce possible bugs - first pass at adding vernacular names in the species editor 2006.05.29 ---------- - got the basics working on the species editor - first pass at adding synonyms with new species editor 2006.05.28 ---------- - did some work to try and improve the speed of displaying strings - cleaned up SearchView.search and added status bar message for the number of results in a search 2006.05.27 ---------- - started toying around with the species editor - alot of changes in the plants plugin, all species model definitions were moved to species_model.py while all editor(and for now infoboxes) for species model are in species_model.py - changed all plugins to use absolute instead of relative paths - fixed problem with acc_id_entry and the sensitivity/self.problems 2006.05.23 ---------- - changed the way that the accession editor displays when something is wrong with an entry, the old way using event boxes didn't work like i thought - moved Problems class into editor.py and added self.problem to GenericEditorPresenter and added GenericEditorPresenter.add_problem and GenericEditorPresenter.remove_problem - fix calculation error with accession.dms_to_decimal when the direction is west or source, i.e. negative - don't save the elevation accuracy for the accession if the elevation is None - make sure that both or neither latitude and longitude are required - don't save geo accuracy of latitude and longitude are none - desensitize geoacc_entry if latitude or longitude are None - desensitize altacc_entry if alt_entry is None - accession editor gui tweaks for win32 - add dms labels back to accession editor which i accidentaly deleted 2006.05.23 ---------- - bumped version to 0.5.1 - accession editor now gives status is accession entered is a duplicate accession id - fixed problem with existing accession notes not showing up in the editor - now include README, LICENSE and CHANGES in the distribution - fixed annoying 'feature' where the species entry on the accession editor would reset the completions for the species when a species was selected, this caused weird pauses when the a species was selected 2006.05.22 ---------- - interface tweaks for windows - niced up the donor editor and donation editors a bit - fix accidental line change in init_species_entry - fix warning from the donor_combo in the accession editor - problem with dates in the accession editor - upgrade SQLObject to SQLObject-0.7.1dev_r1788 bugfix branch for the windows bundle - branch for 0.5.0 2006.05.20 ---------- - fixed provenance combos in the accession editor 2006.05.18 ---------- - added a main.py to bauble which will start the full application - some win32 tweaks and import cleanups - added a custom validator to accession.py for when floats col gets and empty string from it's widget 2006.05.17 ---------- - fixed problem with setting the completion when a species is passed to an accession editor - the species entry on the accession editor now shows if the value in the entry, or rather in the model, is a valid species by setting the ok buttons sensitive and changing the color of the species entry - changed donor contact info the unicode - Accession.acc_id now unicode - Plant.plant_id now unicode - Donor.donor_acc now unicode - changed some other columns from StringCol to UnicodeCol but I can't remember all of them 2006.05.16 ---------- - fixed problems passing default values into new editors - fixed problem with arguments on old editors, added temporary fix for old editors - workaround for weird bug with text entries and completions in the accession editor 2006.05.14 ---------- - more model changes on family, genus and species - sort text files on csv import so we import them in order of dependencies - can now import csv from the command line, it's crude but it works - more work on bauble-upgrade-0.4-to-0.5.py script - appropriate changes to editors where the model changed - changes to BaubleApp so that we can open and create database without starting up the gui/full app - don't load plugins on automatically on plugins module import, # wait until either plugins.load is called or plugins.init_plugins() - more, more, more 2006.05.12 ---------- - more tweaks on the accession editor, the labels on required fields are now italicized, the lon/lat editing should be a dream now - don't round lon/lat conversion values 2006.05.12 ---------- - drastically improved the accession editor gui - changed version to 0.5.0 - made model changes for 0.5.0 - added PlantHistory table though it doesn't have an editor yet - added Accession.date and updated the editor - removed Collection.collector2 - changed all 's in EnumCol's to None 2006.05.11 ---------- - brought the decimal/dms conversion funcation back into accession.py since this is the only place they are used and fixed them up a bit - wrote my first unit test for the conversion funcations and added the test.py to the garden plugin 2006.05.10 ---------- - added validator support to GenericEditorPresenter.assign_simple_handler() - changed Accession.source_type to an EnumCol(Collection, Donation, None), this shouldn't change anything in the database but could cause problems if using an older broken version of bauble that was storing the string NoneType in the source type, although this changes the model i'm not bumping the minor version number - small fixes on the accession infobox - added proper handlers for collection dates and lat/lon though lat/lon still doesn't work that well - and loads of other improvements/fixes to accession.py that i can't remember 2006.05.09 ---------- - fixed indentation problems in search.py - improvements on the accession editor, should open faster now but completion for the species entry are built in an idle_add callback so when this is being done the things seem to lock up - connect next and ok_and_add buttons to accession editor 2006.05.05 ---------- - refactored TreeViewEditorDialog and all relevant code out of bauble/editor.py and into bauble/treevieweditor.py - changed all files relevant to TreeViewEditorDialog refactoring - more accession editor work - start of work for a better donor editor - committed r251 - both accession and donor editor seem more or less finished, just need to hook up next and ok_and_add buttons - more refactoring and cleanup, too much to list 2006.05.04 ---------- - added accelerator for Insert menu - changed to utils.set_widget_value to try and make setting the combobox value a bit more correct - indentation fixes in _gui.py - factored check_constraints and commit_to_table out of the editor - accession editor seems to be working pretty good though I still need to write test and work on editing donations 2006.05.02 ---------- - add a callback system to SQLObjectProxy to notify of changed in the model - the basics seem to work on the accession editor as long as you don't mess around with the collection/donation information - created bauble/error.py to hold exception/error classes 2006.05.01 ---------- - mostly work on new accession editor - some small fixes for utils - added get method to prefs to return default value - small change in searchview.search.py to support new editor api ======= >>>>>>> .r343 ======= 2006.07.02 ---------- - don't remove and destroy the infobox if the current infobox is the same type we are going to create - cache infoboxes so we only create one of each type once - create a (crappy) icon for windows 2006.07.01 ---------- - added an InfoBox for Family - lots of improvements all the infoboxes - context menu for locations 2006.06.30 ---------- - improved behavior of resetting the view after an action has been done from the context menu or insert menu - don't change sensitivity on search - first go at a Genus infobox 2006.06.29 ---------- - change the way the results in the search view are displayed and how the context menu is built, push more of the work off to the plugins since they should know more about the types they represent 2006.06.28 ---------- - fixed error message in update_infobox if the iter was None - fixed a problem when trying to commit donations, refactored out fixing up the model from the accession source presenter depending on the type of the presenter 2006.06.26 ---------- release 0.5.2 2006.06.25 ---------- - pass species correctly accession editor when opened from the species editor - fixes for windows - set app busy when creating a new database, this doesn't work very well since the gui isn't given time to update and csv import doesn't block - now get plants from family and genera in results - make sure that the plants in the formatter list are unique - other minor improvements to formatter plugin and documentation updates 2006.06.24 ---------- - on going doc improvements - improved speed of editor.SQLObjectProxy by doing less attribute lookups in some methods - removed some unnecessary code in species_editor.py - removing a row from the vernacular name table with now set any Species.default_vernacular_name column to None if the default_vernacular_name refers to the deleted row - basic cleanup/fixing to get ready for 0.5.2 release - new vernacular names and synonyms are now blue to show that they have just been added but not committed - some tweaks to the search results tree view - update infobox after editing an existing row 2006.06.21 ---------- - documentation updates - species now includes sp_qual in the name and the id_qual is included in the infobox 2006.06.14 ---------- - documentation updates 2006.06.13 ---------- - now ask in BaubleApp.create_database if the user wants to import the genera - show a message and don't let the use open the accession or species editor unless species or genera already exist in the database - forgot to change GenusSynonyms.txt to new imex_csv format - change Family.family to not be alternateID so we can have both, e.g., Malvaceae (s. lat) and Malvaceae (s. str), this is a bit of a fuck up since it changes the model so it should require us to bump the minor number and recreate the database if you want this feature - other small bugs in imex_csv and the utils message_dialog 2006.06.12 ---------- - changed the format of csv import to now use the column names as they are in the database instead of how SQLObject sees them - changed the way dialogs are show in csv import to prevent lock ups - tried to improve the speed of imports a bit by changing the way the rows are inserted, we now use sqlobject.sqlbuild.Insert. though it would still probably be faster if we got it to work by sending the entire list of values to the insert instead of one row at i time, i'm not sure if this is the real bottleneck on the imports - lots of other small fixes in csv import/export 2006.06.09 ---------- - more work on csv export to make the gui more responsive - code cleanups and docs 2006.06.08 ---------- - rewrote csv importing to use gtasklets (http://www.gnome.org/~gjc/gtasklet/gtasklets.html) so now we have a progress dialog 2006.06.07 ---------- - created some test for Species.str() to make sure we are getting string that conform to proper botanical nomenclature 2006.06.06 ---------- - fixed bug with setting background color on the species editor genus entry when a character is deleted - fixed a bug when cancelling a dirty model in the species and accession editors would make further commits not commit until bauble was closed and possibly not commit at all - connected the full name label in the species editor - lots of small changes in the species editor so we can stabilize for 0.5.2 - any value from a widget that doesn't validate against the model now adds a problem to the presenter which usually disables the ok buttons - fixes and on the species and accession info boxes 2006.06.01 ---------- - continue work on species editor - fixed but in utils.search_tree_model where the function was calling itself recursively with the wrong arguments - fixed setting False values on a gtk.CheckBoxe in utils.set_widget_value 2006.05.30 ---------- - did some work on the species editor and the vernacular name editor, can now set default vernacular names for the species 2006.05.29 ---------- - can no longer set attributes in SQLObjectProxy that don't exist, this helps reduce possible bugs - first pass at adding vernacular names in the species editor 2006.05.29 ---------- - got the basics working on the species editor - first pass at adding synonyms with new species editor 2006.05.28 ---------- - did some work to try and improve the speed of displaying strings - cleaned up SearchView.search and added status bar message for the number of results in a search 2006.05.27 ---------- - started toying around with the species editor - alot of changes in the plants plugin, all species model definitions were moved to species_model.py while all editor(and for now infoboxes) for species model are in species_model.py - changed all plugins to use absolute instead of relative paths - fixed problem with acc_id_entry and the sensitivity/self.problems 2006.05.23 ---------- - changed the way that the accession editor displays when something is wrong with an entry, the old way using event boxes didn't work like i thought - moved Problems class into editor.py and added self.problem to GenericEditorPresenter and added GenericEditorPresenter.add_problem and GenericEditorPresenter.remove_problem - fix calculation error with accession.dms_to_decimal when the direction is west or source, i.e. negative - don't save the elevation accuracy for the accession if the elevation is None - make sure that both or neither latitude and longitude are required - don't save geo accuracy of latitude and longitude are none - desensitize geoacc_entry if latitude or longitude are None - desensitize altacc_entry if alt_entry is None - accession editor gui tweaks for win32 - add dms labels back to accession editor which i accidentaly deleted 2006.05.23 ---------- - bumped version to 0.5.1 - accession editor now gives status is accession entered is a duplicate accession id - fixed problem with existing accession notes not showing up in the editor - now include README, LICENSE and CHANGES in the distribution - fixed annoying 'feature' where the species entry on the accession editor would reset the completions for the species when a species was selected, this caused weird pauses when the a species was selected 2006.05.22 ---------- - interface tweaks for windows - niced up the donor editor and donation editors a bit - fix accidental line change in init_species_entry - fix warning from the donor_combo in the accession editor - problem with dates in the accession editor - upgrade SQLObject to SQLObject-0.7.1dev_r1788 bugfix branch for the windows bundle - branch for 0.5.0 2006.05.20 ---------- - fixed provenance combos in the accession editor 2006.05.18 ---------- - added a main.py to bauble which will start the full application - some win32 tweaks and import cleanups - added a custom validator to accession.py for when floats col gets and empty string from it's widget 2006.05.17 ---------- - fixed problem with setting the completion when a species is passed to an accession editor - the species entry on the accession editor now shows if the value in the entry, or rather in the model, is a valid species by setting the ok buttons sensitive and changing the color of the species entry - changed donor contact info the unicode - Accession.acc_id now unicode - Plant.plant_id now unicode - Donor.donor_acc now unicode - changed some other columns from StringCol to UnicodeCol but I can't remember all of them 2006.05.16 ---------- - fixed problems passing default values into new editors - fixed problem with arguments on old editors, added temporary fix for old editors - workaround for weird bug with text entries and completions in the accession editor 2006.05.14 ---------- - more model changes on family, genus and species - sort text files on csv import so we import them in order of dependencies - can now import csv from the command line, it's crude but it works - more work on bauble-upgrade-0.4-to-0.5.py script - appropriate changes to editors where the model changed - changes to BaubleApp so that we can open and create database without starting up the gui/full app - don't load plugins on automatically on plugins module import, # wait until either plugins.load is called or plugins.init_plugins() - more, more, more 2006.05.12 ---------- - more tweaks on the accession editor, the labels on required fields are now italicized, the lon/lat editing should be a dream now - don't round lon/lat conversion values 2006.05.12 ---------- - drastically improved the accession editor gui - changed version to 0.5.0 - made model changes for 0.5.0 - added PlantHistory table though it doesn't have an editor yet - added Accession.date and updated the editor - removed Collection.collector2 - changed all 's in EnumCol's to None 2006.05.11 ---------- - brought the decimal/dms conversion funcation back into accession.py since this is the only place they are used and fixed them up a bit - wrote my first unit test for the conversion funcations and added the test.py to the garden plugin 2006.05.10 ---------- - added validator support to GenericEditorPresenter.assign_simple_handler() - changed Accession.source_type to an EnumCol(Collection, Donation, None), this shouldn't change anything in the database but could cause problems if using an older broken version of bauble that was storing the string NoneType in the source type, although this changes the model i'm not bumping the minor version number - small fixes on the accession infobox - added proper handlers for collection dates and lat/lon though lat/lon still doesn't work that well - and loads of other improvements/fixes to accession.py that i can't remember 2006.05.09 ---------- - fixed indentation problems in search.py - improvements on the accession editor, should open faster now but completion for the species entry are built in an idle_add callback so when this is being done the things seem to lock up - connect next and ok_and_add buttons to accession editor 2006.05.05 ---------- - refactored TreeViewEditorDialog and all relevant code out of bauble/editor.py and into bauble/treevieweditor.py - changed all files relevant to TreeViewEditorDialog refactoring - more accession editor work - start of work for a better donor editor - committed r251 - both accession and donor editor seem more or less finished, just need to hook up next and ok_and_add buttons - more refactoring and cleanup, too much to list 2006.05.04 ---------- - added accelerator for Insert menu - changed to utils.set_widget_value to try and make setting the combobox value a bit more correct - indentation fixes in _gui.py - factored check_constraints and commit_to_table out of the editor - accession editor seems to be working pretty good though I still need to write test and work on editing donations 2006.05.02 ---------- - add a callback system to SQLObjectProxy to notify of changed in the model - the basics seem to work on the accession editor as long as you don't mess around with the collection/donation information - created bauble/error.py to hold exception/error classes 2006.05.01 ---------- - mostly work on new accession editor - some small fixes for utils - added get method to prefs to return default value - small change in searchview.search.py to support new editor api >>>>>>> .r343 ======= 2006.07.02 ---------- - don't remove and destroy the infobox if the current infobox is the same type we are going to create - cache infoboxes so we only create one of each type once - create a (crappy) icon for windows 2006.07.01 ---------- - added an InfoBox for Family - lots of improvements all the infoboxes - context menu for locations 2006.06.30 ---------- - improved behavior of resetting the view after an action has been done from the context menu or insert menu - don't change sensitivity on search - first go at a Genus infobox 2006.06.29 ---------- - change the way the results in the search view are displayed and how the context menu is built, push more of the work off to the plugins since they should know more about the types they represent 2006.06.28 ---------- - fixed error message in update_infobox if the iter was None - fixed a problem when trying to commit donations, refactored out fixing up the model from the accession source presenter depending on the type of the presenter 2006.06.26 ---------- release 0.5.2 2006.06.25 ---------- - pass species correctly accession editor when opened from the species editor - fixes for windows - set app busy when creating a new database, this doesn't work very well since the gui isn't given time to update and csv import doesn't block - now get plants from family and genera in results - make sure that the plants in the formatter list are unique - other minor improvements to formatter plugin and documentation updates 2006.06.24 ---------- - on going doc improvements - improved speed of editor.SQLObjectProxy by doing less attribute lookups in some methods - removed some unnecessary code in species_editor.py - removing a row from the vernacular name table with now set any Species.default_vernacular_name column to None if the default_vernacular_name refers to the deleted row - basic cleanup/fixing to get ready for 0.5.2 release - new vernacular names and synonyms are now blue to show that they have just been added but not committed - some tweaks to the search results tree view - update infobox after editing an existing row 2006.06.21 ---------- - documentation updates - species now includes sp_qual in the name and the id_qual is included in the infobox 2006.06.14 ---------- - documentation updates 2006.06.13 ---------- - now ask in BaubleApp.create_database if the user wants to import the genera - show a message and don't let the use open the accession or species editor unless species or genera already exist in the database - forgot to change GenusSynonyms.txt to new imex_csv format - change Family.family to not be alternateID so we can have both, e.g., Malvaceae (s. lat) and Malvaceae (s. str), this is a bit of a fuck up since it changes the model so it should require us to bump the minor number and recreate the database if you want this feature - other small bugs in imex_csv and the utils message_dialog 2006.06.12 ---------- - changed the format of csv import to now use the column names as they are in the database instead of how SQLObject sees them - changed the way dialogs are show in csv import to prevent lock ups - tried to improve the speed of imports a bit by changing the way the rows are inserted, we now use sqlobject.sqlbuild.Insert. though it would still probably be faster if we got it to work by sending the entire list of values to the insert instead of one row at i time, i'm not sure if this is the real bottleneck on the imports - lots of other small fixes in csv import/export 2006.06.09 ---------- - more work on csv export to make the gui more responsive - code cleanups and docs 2006.06.08 ---------- - rewrote csv importing to use gtasklets (http://www.gnome.org/~gjc/gtasklet/gtasklets.html) so now we have a progress dialog 2006.06.07 ---------- - created some test for Species.str() to make sure we are getting string that conform to proper botanical nomenclature 2006.06.06 ---------- - fixed bug with setting background color on the species editor genus entry when a character is deleted - fixed a bug when cancelling a dirty model in the species and accession editors would make further commits not commit until bauble was closed and possibly not commit at all - connected the full name label in the species editor - lots of small changes in the species editor so we can stabilize for 0.5.2 - any value from a widget that doesn't validate against the model now adds a problem to the presenter which usually disables the ok buttons - fixes and on the species and accession info boxes 2006.06.01 ---------- - continue work on species editor - fixed but in utils.search_tree_model where the function was calling itself recursively with the wrong arguments - fixed setting False values on a gtk.CheckBoxe in utils.set_widget_value 2006.05.30 ---------- - did some work on the species editor and the vernacular name editor, can now set default vernacular names for the species 2006.05.29 ---------- - can no longer set attributes in SQLObjectProxy that don't exist, this helps reduce possible bugs - first pass at adding vernacular names in the species editor 2006.05.29 ---------- - got the basics working on the species editor - first pass at adding synonyms with new species editor 2006.05.28 ---------- - did some work to try and improve the speed of displaying strings - cleaned up SearchView.search and added status bar message for the number of results in a search 2006.05.27 ---------- - started toying around with the species editor - alot of changes in the plants plugin, all species model definitions were moved to species_model.py while all editor(and for now infoboxes) for species model are in species_model.py - changed all plugins to use absolute instead of relative paths - fixed problem with acc_id_entry and the sensitivity/self.problems 2006.05.23 ---------- - changed the way that the accession editor displays when something is wrong with an entry, the old way using event boxes didn't work like i thought - moved Problems class into editor.py and added self.problem to GenericEditorPresenter and added GenericEditorPresenter.add_problem and GenericEditorPresenter.remove_problem - fix calculation error with accession.dms_to_decimal when the direction is west or source, i.e. negative - don't save the elevation accuracy for the accession if the elevation is None - make sure that both or neither latitude and longitude are required - don't save geo accuracy of latitude and longitude are none - desensitize geoacc_entry if latitude or longitude are None - desensitize altacc_entry if alt_entry is None - accession editor gui tweaks for win32 - add dms labels back to accession editor which i accidentaly deleted 2006.05.23 ---------- - bumped version to 0.5.1 - accession editor now gives status is accession entered is a duplicate accession id - fixed problem with existing accession notes not showing up in the editor - now include README, LICENSE and CHANGES in the distribution - fixed annoying 'feature' where the species entry on the accession editor would reset the completions for the species when a species was selected, this caused weird pauses when the a species was selected 2006.05.22 ---------- - interface tweaks for windows - niced up the donor editor and donation editors a bit - fix accidental line change in init_species_entry - fix warning from the donor_combo in the accession editor - problem with dates in the accession editor - upgrade SQLObject to SQLObject-0.7.1dev_r1788 bugfix branch for the windows bundle - branch for 0.5.0 2006.05.20 ---------- - fixed provenance combos in the accession editor 2006.05.18 ---------- - added a main.py to bauble which will start the full application - some win32 tweaks and import cleanups - added a custom validator to accession.py for when floats col gets and empty string from it's widget 2006.05.17 ---------- - fixed problem with setting the completion when a species is passed to an accession editor - the species entry on the accession editor now shows if the value in the entry, or rather in the model, is a valid species by setting the ok buttons sensitive and changing the color of the species entry - changed donor contact info the unicode - Accession.acc_id now unicode - Plant.plant_id now unicode - Donor.donor_acc now unicode - changed some other columns from StringCol to UnicodeCol but I can't remember all of them 2006.05.16 ---------- - fixed problems passing default values into new editors - fixed problem with arguments on old editors, added temporary fix for old editors - workaround for weird bug with text entries and completions in the accession editor 2006.05.14 ---------- - more model changes on family, genus and species - sort text files on csv import so we import them in order of dependencies - can now import csv from the command line, it's crude but it works - more work on bauble-upgrade-0.4-to-0.5.py script - appropriate changes to editors where the model changed - changes to BaubleApp so that we can open and create database without starting up the gui/full app - don't load plugins on automatically on plugins module import, # wait until either plugins.load is called or plugins.init_plugins() - more, more, more 2006.05.12 ---------- - more tweaks on the accession editor, the labels on required fields are now italicized, the lon/lat editing should be a dream now - don't round lon/lat conversion values 2006.05.12 ---------- - drastically improved the accession editor gui - changed version to 0.5.0 - made model changes for 0.5.0 - added PlantHistory table though it doesn't have an editor yet - added Accession.date and updated the editor - removed Collection.collector2 - changed all 's in EnumCol's to None 2006.05.11 ---------- - brought the decimal/dms conversion funcation back into accession.py since this is the only place they are used and fixed them up a bit - wrote my first unit test for the conversion funcations and added the test.py to the garden plugin 2006.05.10 ---------- - added validator support to GenericEditorPresenter.assign_simple_handler() - changed Accession.source_type to an EnumCol(Collection, Donation, None), this shouldn't change anything in the database but could cause problems if using an older broken version of bauble that was storing the string NoneType in the source type, although this changes the model i'm not bumping the minor version number - small fixes on the accession infobox - added proper handlers for collection dates and lat/lon though lat/lon still doesn't work that well - and loads of other improvements/fixes to accession.py that i can't remember 2006.05.09 ---------- - fixed indentation problems in search.py - improvements on the accession editor, should open faster now but completion for the species entry are built in an idle_add callback so when this is being done the things seem to lock up - connect next and ok_and_add buttons to accession editor 2006.05.05 ---------- - refactored TreeViewEditorDialog and all relevant code out of bauble/editor.py and into bauble/treevieweditor.py - changed all files relevant to TreeViewEditorDialog refactoring - more accession editor work - start of work for a better donor editor - committed r251 - both accession and donor editor seem more or less finished, just need to hook up next and ok_and_add buttons - more refactoring and cleanup, too much to list 2006.05.04 ---------- - added accelerator for Insert menu - changed to utils.set_widget_value to try and make setting the combobox value a bit more correct - indentation fixes in _gui.py - factored check_constraints and commit_to_table out of the editor - accession editor seems to be working pretty good though I still need to write test and work on editing donations 2006.05.02 ---------- - add a callback system to SQLObjectProxy to notify of changed in the model - the basics seem to work on the accession editor as long as you don't mess around with the collection/donation information - created bauble/error.py to hold exception/error classes 2006.05.01 ---------- - mostly work on new accession editor - some small fixes for utils - added get method to prefs to return default value - small change in searchview.search.py to support new editor api >>>>>>> .r343 2006.04.09 ---------- - fixed a small problem with the logger and the user directory that could make Bauble not run at all - released 0.4.6 2006.04.09 ---------- - released 0.4.5 2006.04.08 ---------- - fix for a problem with constraints and EnumCols returning unicode strings - preparing for 0.4.5 2006.04.07 ---------- - fix regression for source editor not returning the correct response codes 2006.04.05 ---------- - fixed problem where bauble wouldn't run if it couldn't open the log file (reported by Helder Perez) 2006.04.04 ---------- - cache Species strings but disable it until we can invalidate the cache in case the Species is changed 2006.03.13 ---------- - fix for searching for strings in unicode columns 2006.03.10 ---------- - search parser correctness fixes - remove name domain for searching species and replaced it with 'species' - made quoting of value in search expression more portable with _LikeQuotedx 2006.03.07 ---------- - fix problem with unicode strings and constraints 2006.03.04 ---------- - finally made the ok button on the message_details_dialog the default focus - check the constraints on the columns before we try and commit se we don't mess up out transaction which can screw up any pending commits from an editor's sub editors - starting the mockups for the new editors and combined all editors in a plugin into one glade file, see editors.glade in the plugin directory - created basic installer script for windows 2006.03.04 ---------- - combined editor.pre_commit_hook and _transform_row in _model_row_to_values - updated all editors to use _model_row_values and got rid of all instances of _transform_row and pre_commit_hook - cleaned out old bits code 2006.03.02 ---------- - forgot to add icon and logo to svn - disabled icon from win32 since my gtk for win32 doesn't have an svg pixbuf loader 2006.03.01 ---------- - fixed the open_database() fix - adding and editing item from the context menu refreshes the view a bit smarter - new logo image - new logo as window icon - cleaned up some old code in the GUI - fixed problem with storing the string 'NoneType' instead of the value None in the accession.source_type column 2006.02.28 ---------- - fixed problem with creating vernacular names - save an editors state even if the dialog is canceled - fixed problem when opening a database fails the wrong value was being return from open_database() 2006.02.23 ---------- - more or less finished the new search queries, can now do search like acc where plants.acc_status = Dead 2006.02.22 ---------- - first commit on new search query features 2006.02.20 ---------- - don't continue with program if loading one of the plugins fail - upgraded searchview.pyparsing to 1.4.1 2006.02.08 ---------- - release 0.4.4 2006.02.07 ---------- - if we can't find any connections in the prefs then popup a dialog telling the user they should create one - change the window title to include the name of the current connection - opening a new connection or creating a new database now resets the searchview - include the example xsl files in the distribution - add .pdf to formatter output filename so file associations work on windows - added user_dir() to bauble.paths to get the users setting directory - log message now automatically go to a file in a frozen executable on win32 - in general made logging better, shouldn't get logger popup on windows anymore though it may still come up if there's a print statement somewhere 2006.02.06 ---------- - fixes for building a py2exe executable using pygtk >= 2.8.4 - make sure we check for pysqlite even if SQLObject says sqlite is not supported 2006.02.03 ---------- - fixed removing existing data in a row which also means you can now set None to a row - fixed a problem where we were corrupting $PATH 2006.02.02 ---------- - some usability work on the connection manager and minor fixes - the prefs config directory is now only created when bauble is run, not just when it's packages are imported, like when run from setup.py - small try..except changes to the utils dialogs 2006.01.25 ---------- - fixed a problem are trying to commit the values in an editor if there had been a previous exception trying to commit - the offending row is now highlighted when there is a problem trying to commit the values in an editor - added editor.CommitException to wrap the exception throws from the database on commit, also allows us to pass the model row used when trying to commit 2006.01.23 ---------- - changed TreeViewEditorDialog._commit_model_row to _commit_model_rows 2006.01.19 ---------- - make the default sort order more reasonable for accessions, plants, families, genera, and species - removed sorting of results in the search view since tables should now specify their own sort order 2006.01.16 ---------- - a clicking on the "Search" button in the search view now turns off the current infobox - the ConnectionManager and its password dialog now ask to be centered on the screen - fixed problem with editing an Accession's Donation if the donations already exists - fixed some problems with the Accession Infobox - fixes for the message dialog in utils if they are opened before the gui starts 2006.01.16 ---------- - properly escape Species.sp_author and Species. - fixed a problem if tag table couldn't be loaded then the global transaction is invalidated and bauble can't be used - move set_widget_value into utils, eventually need to change all the plugins to use this one to be consisten 2005.01.07 ---------- - think i finally fixed what was causing all the crashes, for some reason i was unparenting widgets instead of removing them from their containers - ready for 0.4.2, the real release of the 0.4.x series - had to revert some changes in setup.py to make py2exe work for win32 - small fix for the libxml2/formatter problem 2005.01.04 ---------- - some 'correctness' fixes, like giving dialogs parents if applicable - forgot to package the 'tag' plugin which is a major feature for 0.4.x, yes i'm an idiot - tweaks to the example xsl stylesheet in the formatter plugin (labels.xsl, larger_label.xsl) - removed all signs of threading code, there's no going back - the SpeciesMetaEditor now just uses the vbox from the glade file instead of destroying the dialog it was graciously given by TableEditorDialog only to replace it by another dialog 2005.01.04 ---------- - fixed bug where editing an existing SpeciesMeta would just create a new one - back to deleting dialogs instead of just hiding them - abcd export and formatter wouldn't work if a Species SpeciesMeta was None 2005.01.03 ---------- - did a terrible job packaging 0.4.0 and probably earlier version, should be better now - results in the search view are now sorted alphabetically 2005.01.02 ---------- - drastically improved csv export speed by about a million percent by using map() - some fixes for win32, mostly works now - ready for 0.4.0 - released 0.4.0 - tried to get rid of that annoying dialog caused by the logger - rearranged the sys.path to put library.zip in front when using py2exe so that libxml2 get imported correctly, this fixes the formatter on win32 2005.12.31 ---------- - small regression fix for opening databases created with a version different from the version of Bauble you're using - properly handle exception thrown when importing csv files 2005.12.30 ---------- - you can now do 'OR'ed searches with by separting values with a comma, e.g 2004.0001,2004.0002 would give you both accessions with those acc_id's 2005.12.28 ---------- - fixed datetime issues with the CollectionEditor - change TreeViewEditorDialog.commit_changes again to just iterate of the model in the view and call _transform_row on each row in the model instead of calling _set_value_from_widgets in start() - if everything doesn't get successfully committed in a TreeViewEditorDialog then desensitize those rows that were committed correctly and reshow the dialog - removed 'Preferences' from the Edit menu until we get some preferences tabs - forgot to commit plugin\tag\tag.glade to svn - too many fixes to name, i think we're ready for 0.4.0, just have to test on Windows 2005.12.26 ---------- - got fed up with connections and transactions behaving differently between postgres and sqlite so i changed everything that accesses the database to use transactions 2005.12.23 ---------- - fixed bug when creating Tag tables - think i fixed the problem with transaction and ghost data by setting cacheValues=True - a large refactoring of TableEditor, TreeViewEditor and now TableEditorDialog - refresh search view after creating tables - fixes a bug importing csv tables where we pass in more than one filename to csv.start() and the file has the id's included in the rows 2005.12.22 ---------- - editing SingleJoin and MultipleJoin columns now work - creating a column in a TreeViewEditorDialog that's not a column in the table is now much easier - lots of fixes in speciesmeta.py - preparing for a release soon - too many fixes to list 2005.12.20 ---------- - columns that have external editors now have a star(*) in their header - think i need to rethink this whole multiple join editors on columns 2005.12.18 ---------- - synonym editors work, now just have to finish the VernacularNameEditor 2005.12.17 ---------- - editing multiple join columns now seems to be pretty stable, just have to finish the GenusSynonym, SpeciesSynonym and VernacularName tables and editors - check that plugins, views, tool, editors and tables are subclasses of the appropriate types 2005.12.15 ---------- - change editor.text_values_before_commit to pre_commit_hook - editing multiple join columns somewhat working though alot of things are still broke i'm sure 2005.12.13 ---------- - explicitly set the cascade on most database objects to help keep the database from getting dangling references incase something is deleted - show a dialog in case removing an item from the search view fails 2005.12.10 ---------- - some spring cleaning of old, unused code - reworked tag schemas, the previous ones were an embarassment to all thats good and decent in the world - tagging results in the search view should now work - some UI love - forgot the add conn_mgr.glade to svn - had to remove some duplicate genus entries from Genus.txt until we get the synonyms better sorted out - refresh the search view after adding or removing items from the results 2005.12.09 ---------- - major overhaul on the connection manager, now (mostly) uses glade 2005.12.08 --------- - started work on tag support in plugins\tag, the db schema seems to be set and tagging working, just need to create an interface for it - field Genus.genus is now an alternateID, probably more schema changes coming soon so we can get everything in a relatively stable state 2005.12.02 --------- - lots of work on connecting the database to the infoboxes and creating infoboxes for those database types that didn't have 2005.12.01 --------- - fixes for formatters - fixes to use vernacular_name instead of default_vernacular_name in abcd.py - Accession and Plant now have markup() which give the species name - some searchview fixes - tagged 0.3.0 and forgot to uncomment the schema changes, tag 0.3.1 - fixed problem with exporting CSV that was only in 0.3.0 so no worries - changed setup.py to use version_str from bauble\__init__.py so we only have to set the version in one place 2005.11.26 --------- - hopefully fixes some unstableness by not deleting the dialog of a TreeViewEditorDialog - changed the model again to add a notes column to both Plant and Accession - bumped revision to 0.3.0 because of change to the model 2005.11.24 --------- - fixed editing a species giving a message as if you were adding a new one - fixed markup tag on species 2005.11.23 --------- - added some more safety check that you're not connected to a corrupt - fixed a problem when on committing multiple items in an editor - csv export is painfully slow, need to do something about it - fixe for expanding a species - 0.2.0 and 0.2.1 was tagged but not release - released 0.2.2 2005.11.23 --------- - changed version to 0.2.0 since we're not using the VernacularName table at the moment altough there was never a way to edit it - some fixes for the connection manager so it acts the way you would expect it to, could still use some love - 2005.11.23 -------- - remove most of the null values from the EnumCols - gave up on the VernacularName table and editor at the moment and just made a Species.vernacular_name UnicodeCol 2005.11.22 --------- - forgot to fix the VernacularName editor - made ABCD export and more xml safe 2005.11.20 --------- - fixed bug when trying to cancel importing CSV files - the combined plant_id and accession_id of Plant now have to be unique - removed most of the None default values from the EnumCols - release 0.1.1 2005.11.19 --------- - fixed some logic in editor.py so that the editor dialog acts as expected when you close it - fixed the donor editor so it works correctly - registered the 'donor' and 'don' keywords for the search view - made some dummy classes for DonorInfoBox and its expanders, now it just needs to be filled in - Ctrl-l now correctly gives focus to the search entry, to do this i had to move the part that sets the current_view in the gui into app.main() - other small fixes i can't remember - disabled the MySQL importer - a new table was added to the database to keep information about the database, right now it just hold the version of the database and the datetime it was created - will give a warning if trying to connect to a database with different major and minor numbers than the software - will not connect to a database that doesn't have a 'bauble' table in the database - fixed some win32 problems - fixed problem with create the first database at a connection - message dialog from utils now accept markup - fixed a problem in imex_csv when creating a database before the gui has been started - changed setup.py to use the new formatter module instead of the old labels ones - released 0.1.0 2005.11.13 --------- - fixed adding donors from the donation editor 2005.11.12 --------- - searchview parser now uses pyparser and can now handle more complex queries though some work still needs to be done 2005.11.5 ---------- - lots of fixes related to the Donor table and DonorEditor 2005.11.3 ---------- - fixed completion bug so that the selected value is inserted into the proper row 2005.11.2 ---------- - editors should be fixed for the most part but i'm sure they still need some polish - invoking an editor inside an editor to edit a single join work now - editors now set sqlhub.processConnection to the editors transaction so that all operations that happend while something is being edited can be rolled backed, this doesn't seem to cause any problems and is the best way to keep from getting straggling data such as collection data not associated with an accession - need alot of API cleanup - commited r114 - remove TableEditorDialog, i don't think its really a useful abstraction - alot of code cleanup and removing debugging code and old irrelevant stuff - committed r115 - just before i committed i noticed that there's a problem with editing multiple values in a treevieweditor dialog with completion, it seems that only the first row gets set no matter which row is being edited - there also seem to be a problem with the accession editor that causes it to randomly crash, usually when entering the species name 2005.11.1 ---------- - editors now take keyword argument connection 2005.10.29 ---------- - the editor start method no longer commits your changes, whoever invokes the editor is responsible or commiting the changes - tried to simplify TreeViewEditorDialog.commit_changes - the editing the single joins are broken at the moment 2005.10.28 ---------- - still doing some work on external editors, still broken but closer 2005.10.27 ---------- - got external editors working for SingleJoins, its far from perfect yet but its a first pass, e.g. right now you can create species_meta for a species table but you can't edit it later - external editors can now signal that changes were made so the dirty flag can be properly set on the editor - commited r111 - update species_infobox to reflect species meta 2005.10.25 ---------- - changed Plantnames to Species - added a SpeciesMeta table to hold extra information about a species such as distribution and created an SpeciesMetaEditor 2005.10.23 ---------- - more work on XSL formatter plugin, should work now 2005.10.21 ---------- - canged preferences to use python's ConfigParse with a dict interfase, the prefs API should be the same as before but the config file format is no longer compatible, the new format uses an ini type syntax - added a generic XSL formatter plugin, though not finished yet - moved main_is_frozen to bauble.__init__.py 2005.10.15 ---------- - fixes in latitude/longitude handling in the CollectionEditor dialog as well as in the Collection infobox - ** dates still don't work in the CollectionEditor - removed Plantname.supfam,subgen and subgen_rank - got the great idea to create a 'CHANGES' files and added to version control - see revision 106 for other things for the day bauble-0.9.7/stdeb.cfg0000644000175000017500000000162711210626427013574 0ustar brettbrett[DEFAULT] default-maintainer: Brett Adams [bauble] Package: bauble Source: bauble Distribution: jaunty Architecture: any Homepage: http://bauble.belizebotanic.org Build-Depends: debhelper (>= 7), python, python-support, gettext, python-sqlalchemy-0.5 | python-sqlalchemy (>= 0.5), python-lxml (>= 1.3), python-pysqlite2 (>= 2.3.2), python-setuptools, python-gtk2, python-glade2, python-gdata (>= 1.1.1), python-mako (>= 0.2.2), librsvg2-common, xdg-utils Depends: xdg-utils, python, python-egenix-mxdatetime, python-sqlalchemy-0.5 | python-sqlalchemy (>= 0.5), python-lxml, python-gtk2 (>=2.10), librsvg2-common, python-glade2, python-gdata (>=1.1.1), python-mako (>=0.2.2), python-pysqlite2 (>= 2.3.2) | python-mysqldb | python-psycopg2, ${misc:Depends}, ${python:Depends} #MIME-Desktop-Files: data/bauble.desktop Recommends: python-mysqldb | python-psycopg2 XS-Python-Version: >= 2.5, <<3.0bauble-0.9.7/bauble.egg-info/0000755000175000017500000000000011310570250014721 5ustar brettbrettbauble-0.9.7/bauble.egg-info/top_level.txt0000644000175000017500000000000711310570245017454 0ustar brettbrettbauble bauble-0.9.7/bauble.egg-info/requires.txt0000644000175000017500000000006011310570245017321 0ustar brettbrettSQLAlchemy>=0.5rc4 lxml mako>=0.2.2 gdata>=1.2.4bauble-0.9.7/bauble.egg-info/PKG-INFO0000644000175000017500000000051011310570245016016 0ustar brettbrettMetadata-Version: 1.0 Name: bauble Version: 0.9.7 Summary: Bauble is a biodiversity collection manager software application Home-page: http://bauble.belizebotanic.org Author: Brett Adams Author-email: brett@belizebotanic.org License: GPL Description: UNKNOWN Keywords: database biodiversity botanic collection Platform: UNKNOWN bauble-0.9.7/bauble.egg-info/SOURCES.txt0000644000175000017500000000667311310570250016621 0ustar brettbrettCHANGES LICENSE MANIFEST.in README ez_setup.py setup.cfg setup.py stdeb.cfg bauble/__init__.py bauble/_gui.py bauble/assistant.py bauble/bauble.glade bauble/bauble.ui bauble/connmgr.glade bauble/connmgr.py bauble/db.py bauble/editor.py bauble/error.py bauble/i18n.py bauble/meta.py bauble/paths.py bauble/pluginmgr.py bauble/prefs.py bauble/task.py bauble/types.py bauble/view.py bauble.egg-info/PKG-INFO bauble.egg-info/SOURCES.txt bauble.egg-info/dependency_links.txt bauble.egg-info/requires.txt bauble.egg-info/top_level.txt bauble/images/bauble.xpm bauble/images/bauble_logo.png bauble/images/calendar.png bauble/images/icon.ico bauble/images/icon.png bauble/images/icon.svg bauble/images/icon2.png bauble/images/icon2.svg bauble/images/icon24.png bauble/images/loading.gif bauble/images/prefs_general.png bauble/images/prefs_security.png bauble/plugins/__init__.py bauble/plugins/abcd/__init__.py bauble/plugins/abcd/test.py bauble/plugins/garden/__init__.py bauble/plugins/garden/acc_infobox.glade bauble/plugins/garden/accession.py bauble/plugins/garden/donor.py bauble/plugins/garden/editors.glade bauble/plugins/garden/infoboxes.glade bauble/plugins/garden/institution.py bauble/plugins/garden/location.py bauble/plugins/garden/plant.py bauble/plugins/garden/plant_infobox.glade bauble/plugins/garden/source.py bauble/plugins/garden/test.py bauble/plugins/imex/__init__.py bauble/plugins/imex/csv_.py bauble/plugins/imex/postgres.py bauble/plugins/imex/sqlite.py bauble/plugins/imex/test.py bauble/plugins/imex/xml.py bauble/plugins/picasa/__init__.py bauble/plugins/picasa/gui.glade bauble/plugins/picasa/test.py bauble/plugins/plants/__init__.py bauble/plugins/plants/editors.glade bauble/plugins/plants/family.py bauble/plugins/plants/genus.py bauble/plugins/plants/geography.py bauble/plugins/plants/infoboxes.glade bauble/plugins/plants/species.py bauble/plugins/plants/species_editor.py bauble/plugins/plants/species_model.py bauble/plugins/plants/test.py bauble/plugins/plants/default/Genus_removed.txt bauble/plugins/plants/default/family.txt bauble/plugins/plants/default/genus.txt bauble/plugins/plants/default/genus_synonym.txt bauble/plugins/plants/default/geography.txt bauble/plugins/report/__init__.py bauble/plugins/report/report.glade bauble/plugins/report/test.py bauble/plugins/report/default/__init__.py bauble/plugins/report/default/basic.xsl bauble/plugins/report/default/gui.glade bauble/plugins/report/default/labels.xsl bauble/plugins/report/default/plant_list.xsl bauble/plugins/report/default/plant_list_ex.xsl bauble/plugins/report/default/small_labels.xsl bauble/plugins/report/template/__init__.py bauble/plugins/report/template/gui.glade bauble/plugins/report/template/test.py bauble/plugins/tag/__init__.py bauble/plugins/tag/tag.glade bauble/plugins/tag/test.py bauble/test/__init__.py bauble/test/test_bauble.py bauble/test/test_meta.py bauble/test/test_pluginmgr.py bauble/test/test_view.py bauble/utils/__init__.py bauble/utils/desktop.py bauble/utils/log.py bauble/utils/pyparsing.py bauble/utils/sql.py bauble/utils/test.py bauble/utils/thread.py data/bauble-16.png data/bauble-22.png data/bauble-24.png data/bauble-32.png data/bauble-48.png data/bauble-64.png data/bauble.desktop data/bauble.svg po/ar.po po/ca.po po/cs.po po/da.po po/de.po po/en_CA.po po/eo.po po/es.po po/et.po po/fr.po po/gl.po po/hu.po po/it.po po/nl.po po/pl.po po/pt.po po/pt_BR.po po/ro.po po/ru.po po/sk.po po/sq.po po/sv.po scripts/bauble scripts/bauble-admin test/test.py test/test_task.pybauble-0.9.7/bauble.egg-info/dependency_links.txt0000644000175000017500000000000111310570245020773 0ustar brettbrett bauble-0.9.7/test/0000755000175000017500000000000011310570250012754 5ustar brettbrettbauble-0.9.7/test/test_task.py0000755000175000017500000000376611210626427015355 0ustar brettbrett# # test_plugin.py # import os, sys, unittest from sqlalchemy import * from testbase import BaubleTestCase, log import bauble import bauble.pluginmgr as pluginmgr import bauble.meta as meta import bauble.task from bauble.utils.log import debug import gtk # TODO: this needs to be updated to use our own tasklet interface so we # can get rid of gtasklet once and for all def example_task(monitor): # timeout = gtasklet.WaitForTimeout(1000) # msgwait = gtasklet.WaitForMessages(accept='quit') for i in range(1, 10): debug(i) yield # timeout gtasklet.get_event() try: if i == 2: #raise Exception pass except Exception, e: return return #gtasklet.WaitForMessages(accept='quit') #for i in xrange(10, 0, -1): # dialog.format_secondary_markup("Time left: %i seconds" % i) # yield timeout, msgwait # ev = self.get_event() # if isinstance(ev, gtasklet.Message) and ev.name == 'quit': # return # elif ev is timeout: # pass # else: # raise AssertionError # yield gtasklet.Message('quit', dest=monitor) class TaskTests(unittest.TestCase): def setUp(self): pass def testTask(self): return # def example_task(monitor): # yield gtasklet.Message('quit', dest=monitor) try: bauble.task.queue(example_task, None, gtk.main_quit) except: debug('caught exception') debug('call gtk.main()') # gtk.main() debug('past gtk.main()') def tearDown(self): pass class TaskTestSuite(unittest.TestSuite): def __init__(self): unittest.TestSuite.__init__(self, map(TaskTests, ('testTask',))) testsuite = TaskTestSuite if __name__ == '__main__': uri = 'sqlite:///:memory:' # global_connect(uri) # bauble.create_database() # bauble.main(uri) unittest.main() bauble-0.9.7/test/test.py0000755000175000017500000001137711210626427014330 0ustar brettbrett#!/usr/bin/env python import os, sys import nose raise nose.SkipTest if 'PYTHONPATH' not in os.environ or os.environ['PYTHONPATH'] is '': msg = 'This test suite should be run from the top of the source tree '\ 'with the command:\n PYTHONPATH=. python test/test.py' print msg sys.exit(1) else: sys.path.insert(0, os.environ['PYTHONPATH']) import imp, unittest, traceback from optparse import OptionParser import bauble.pluginmgr as pluginmgr import testbase # TODO: right now this just runs all tests but should really be able to # pass individuals tests or test suites on the command line default_uri = 'sqlite:///:memory:' parser = OptionParser() parser.add_option("-c", "--connection", dest="connection", metavar="CONN", default=default_uri, help="connect to CONN") parser.add_option("-l", "--loglevel", dest='loglevel', metavar='LEVEL (0-61)', type='int', default=30, help="display extra test information") parser.add_option('-v', "--verbosity", dest='verbosity', metavar="VERBOSITY", type='int', default=1, help="verbosity noise level") if __name__ == '__main__': # try: # options, args = parser.parse_args() # testbase.uri = options.connection # except: testbase.uri = default_uri print >>sys.stderr, testbase.uri nose.run() # def find_all_tests(verbose=False): # test_suites = unittest.TestSuite() # modules = [] # # get all the modules with tests in the test directory that start # # with test_ # test_path = os.path.join(os.getcwd(), 'test') # for f in os.listdir(test_path): # if f.startswith('test_'): # name, ext = os.path.splitext(f) # if name not in sys.modules: # f, path, desc = imp.find_module(name)#, test_path) # try: # modules.append(imp.load_module(name, f, path, desc)) # except ImportError, e: # print e # # get all the plugin test modules # module_names = pluginmgr._find_module_names(os.getcwd()) # for name in [m for m in module_names if m.startswith('bauble')]: # try: # mod = __import__('%s.test' % name, globals(), locals(), [name]) # modules.append(mod) # except ImportError, e: # # TODO: this could cause a problem if there is an ImportError # # inside the module when importing # ## testbase.log.debug(traceback.format_exc()) # # TODO: this is a bad hack # if str(e) != 'No module named test': #shouldn't rely on string here # testbase.log.warning('** ImportError: Could not import '\ # '%s.test -- %s' \ # % (name, e)) # for mod in modules: # ## tests = test_loader.loadTestsFromModule(mod) # ## if tests.countTestCases() != 0: # ## test_suites.addTest(tests) # if hasattr(mod, 'testsuite'): # if verbose: # testbase.log.msg('adding tests from bauble.plugins.%s' % \ # mod.__name__) # test_suites.addTest(mod.testsuite()) # # suites.append(mod.testsuite()) # def get_test_cases(suite): # """ # get all test cases from suite, called recursively # """ # pass # return test_suites # #if __name__ == '__main__': # if False: # (options, args) = parser.parse_args() # testbase.log.setLevel(options.loglevel) # testbase.uri = options.connection # test_loader = unittest.defaultTestLoader # if testbase.uri != default_uri: # print 'uri: %s' % testbase.uri # global tests # test_suites = find_all_tests(options.verbosity>=2) # #sys.exit(1) # if options.verbosity>=2: # testbase.log.msg('=======================') # runner = unittest.TextTestRunner(verbosity=options.verbosity) # if len(args) > 0: # # run a specific testsuite, would be nice to allow running # # specific test cases or test methods... # # unittest.TestLoader().loadTestsFromNames() is a but # # cumbersome since you have to enter the entire test name like # # bauble.plugins.garden.test.GardenTestSuite # test_names = set([t.__class__.__name__ for t in test_suites]) # tn = set([t.__class__.__module__ for t in test_suites]) # # print tn # not_found = set(args).difference(test_names) # if len(not_found) != 0: # raise Exception('Could not find the following tests: %s' % \ # list(not_found)) # for t in test_suites: # if t.__class__.__name__ in args: # runner.run(t) # else: # runner.run(test_suites) bauble-0.9.7/ez_setup.py0000644000175000017500000002277211210626427014226 0ustar brettbrett#!/usr/bin/env python """Bootstrap setuptools installation If you want to use setuptools in your package's setup.py, just include this file in the same directory with it, and add this to the top of your setup.py:: from ez_setup import use_setuptools use_setuptools() If you want to require a specific version of setuptools, set a download mirror, or use an alternate download directory, you can do so by supplying the appropriate options to ``use_setuptools()``. This file can also be run as a script to install or upgrade setuptools. """ import sys DEFAULT_VERSION = "0.6c9" DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] md5_data = { 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27', 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277', 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa', 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f', 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2', 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc', 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167', 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64', 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d', 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20', 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab', 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53', 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2', 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e', 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372', 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902', 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de', 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b', 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03', 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a', 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6', 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a', } import sys, os try: from hashlib import md5 except ImportError: from md5 import md5 def _validate_md5(egg_name, data): if egg_name in md5_data: digest = md5(data).hexdigest() if digest != md5_data[egg_name]: print >>sys.stderr, ( "md5 validation of %s failed! (Possible download problem?)" % egg_name ) sys.exit(2) return data def use_setuptools( version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, download_delay=15 ): """Automatically find/download setuptools and make it available on sys.path `version` should be a valid setuptools version number that is available as an egg for download under the `download_base` URL (which should end with a '/'). `to_dir` is the directory where setuptools will be downloaded, if it is not already available. If `download_delay` is specified, it should be the number of seconds that will be paused before initiating a download, should one be required. If an older version of setuptools is installed, this routine will print a message to ``sys.stderr`` and raise SystemExit in an attempt to abort the calling script. """ was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules def do_download(): egg = download_setuptools(version, download_base, to_dir, download_delay) sys.path.insert(0, egg) import setuptools; setuptools.bootstrap_install_from = egg try: import pkg_resources except ImportError: return do_download() try: pkg_resources.require("setuptools>="+version); return except pkg_resources.VersionConflict, e: if was_imported: print >>sys.stderr, ( "The required version of setuptools (>=%s) is not available, and\n" "can't be installed while this script is running. Please install\n" " a more recent version first, using 'easy_install -U setuptools'." "\n\n(Currently using %r)" ) % (version, e.args[0]) sys.exit(2) else: del pkg_resources, sys.modules['pkg_resources'] # reload ok return do_download() except pkg_resources.DistributionNotFound: return do_download() def download_setuptools( version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, delay = 15 ): """Download setuptools from a specified location and return its filename `version` should be a valid setuptools version number that is available as an egg for download under the `download_base` URL (which should end with a '/'). `to_dir` is the directory where the egg will be downloaded. `delay` is the number of seconds to pause before an actual download attempt. """ import urllib2, shutil egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) url = download_base + egg_name saveto = os.path.join(to_dir, egg_name) src = dst = None if not os.path.exists(saveto): # Avoid repeated downloads try: from distutils import log if delay: log.warn(""" --------------------------------------------------------------------------- This script requires setuptools version %s to run (even to display help). I will attempt to download it for you (from %s), but you may need to enable firewall access for this script first. I will start the download in %d seconds. (Note: if this machine does not have network access, please obtain the file %s and place it in this directory before rerunning this script.) ---------------------------------------------------------------------------""", version, download_base, delay, url ); from time import sleep; sleep(delay) log.warn("Downloading %s", url) src = urllib2.urlopen(url) # Read/write all in one block, so we don't create a corrupt file # if the download is interrupted. data = _validate_md5(egg_name, src.read()) dst = open(saveto,"wb"); dst.write(data) finally: if src: src.close() if dst: dst.close() return os.path.realpath(saveto) def main(argv, version=DEFAULT_VERSION): """Install or upgrade setuptools and EasyInstall""" try: import setuptools except ImportError: egg = None try: egg = download_setuptools(version, delay=0) sys.path.insert(0,egg) from setuptools.command.easy_install import main return main(list(argv)+[egg]) # we're done here finally: if egg and os.path.exists(egg): os.unlink(egg) else: if setuptools.__version__ == '0.0.1': print >>sys.stderr, ( "You have an obsolete version of setuptools installed. Please\n" "remove it from your system entirely before rerunning this script." ) sys.exit(2) req = "setuptools>="+version import pkg_resources try: pkg_resources.require(req) except pkg_resources.VersionConflict: try: from setuptools.command.easy_install import main except ImportError: from easy_install import main main(list(argv)+[download_setuptools(delay=0)]) sys.exit(0) # try to force an exit else: if argv: from setuptools.command.easy_install import main main(argv) else: print "Setuptools version",version,"or greater has been installed." print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' def update_md5(filenames): """Update our built-in md5 registry""" import re for name in filenames: base = os.path.basename(name) f = open(name,'rb') md5_data[base] = md5(f.read()).hexdigest() f.close() data = [" %r: %r,\n" % it for it in md5_data.items()] data.sort() repl = "".join(data) import inspect srcfile = inspect.getsourcefile(sys.modules[__name__]) f = open(srcfile, 'rb'); src = f.read(); f.close() match = re.search("\nmd5_data = {\n([^}]+)}", src) if not match: print >>sys.stderr, "Internal error!" sys.exit(2) src = src[:match.start(1)] + repl + src[match.end(1):] f = open(srcfile,'w') f.write(src) f.close() if __name__=='__main__': if len(sys.argv)>2 and sys.argv[1]=='--md5update': update_md5(sys.argv[2:]) else: main(sys.argv[1:])