[orca] More work on profile-based language switching.



commit 98f439210005cf64e29359bb49f57ff051548bf8
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Mon Feb 18 17:17:29 2013 -0500

    More work on profile-based language switching.

 po/POTFILES.in                                     |    1 +
 src/orca/Makefile.am                               |    1 +
 src/orca/messages.py                               |  875 ++++++++++++++++++++
 src/orca/orca.py                                   |   67 +--
 src/orca/orca_i18n.py.in                           |    9 +-
 src/orca/scripts/apps/soffice/script.py            |   65 +--
 .../scripts/apps/soffice/structural_navigation.py  |    6 +-
 src/orca/scripts/default.py                        |  807 +++----------------
 src/orca/speechdispatcherfactory.py                |   16 +-
 src/orca/structural_navigation.py                  |  477 ++----------
 10 files changed, 1071 insertions(+), 1253 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 1abd26f..d6b1cbf 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -18,6 +18,7 @@ src/orca/input_event.py
 src/orca/keybindings.py
 src/orca/keynames.py
 src/orca/liveregions.py
+src/orca/messages.py
 src/orca/notification_messages.py
 src/orca/orca_bin.py.in
 src/orca/orca_console_prefs.py
diff --git a/src/orca/Makefile.am b/src/orca/Makefile.am
index 6eae0d1..9533d9c 100644
--- a/src/orca/Makefile.am
+++ b/src/orca/Makefile.am
@@ -35,6 +35,7 @@ orca_python_PYTHON = \
        laptop_keyboardmap.py \
        liveregions.py \
        logger.py \
+       messages.py \
        mouse_review.py \
        notification_messages.py \
        orca.py \
diff --git a/src/orca/messages.py b/src/orca/messages.py
new file mode 100644
index 0000000..ed340fa
--- /dev/null
+++ b/src/orca/messages.py
@@ -0,0 +1,875 @@
+# Orca
+#
+# Copyright 2004-2009 Sun Microsystems Inc.
+# Copyright 2010-2013 The Orca Team
+#
+# 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., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Messages which Orca presents in speech and/or braille. These
+have been put in their own module so that we can present them in
+the correct language when users change the synthesizer language
+on the fly without having to reload a bunch of modules."""
+
+__id__        = "$Id$"
+__version__   = "$Revision$"
+__date__      = "$Date$"
+__copyright__ = "Copyright (c) 2004-2009 Sun Microsystems Inc." \
+                "Copyright (c) 2010-2013 The Orca Team"
+__license__   = "LGPL"
+
+from .orca_i18n import _, C_, ngettext
+from .orca_platform import version
+
+# Translators: This is presented when the user has navigated to an empty line.
+BLANK = _("blank")
+
+# Translators: This refers to font weight.
+BOLD = _("bold")
+
+# Translators: Orca normally intercepts all keyboard commands and only passes
+# them along to the current application when they are not Orca commands. This
+# command causes the next command issued to be passed along to the current
+# application, bypassing Orca's interception of it.
+BYPASS_MODE_ENABLED = _("Bypass mode enabled.")
+
+# Translators: Orca uses Speech Dispatcher to present content to users via
+# text-to-speech. Speech Dispatcher has a feature to control how capital
+# letters are presented: Do nothing at all, say the word 'capital' prior to
+# presenting a capital letter, or play a tone which Speech Dispatcher refers
+# to as a sound 'icon'. This string to be translated refers to the brief/
+# non-verbose output presented in response to the use of an Orca command which
+# makes it possible for users to quickly cycle amongst these alternatives
+# without having to get into a GUI.
+CAPITALIZATION_ICON_BRIEF = C_("capitalization style", "icon")
+
+# Translators: Orca uses Speech Dispatcher to present content to users via
+# text-to-speech. Speech Dispatcher has a feature to control how capital
+# letters are presented: Do nothing at all, say the word 'capital' prior to
+# presenting a capital letter, or play a tone which Speech Dispatcher refers
+# to as a sound 'icon'. This string to be translated refers to the full/verbose
+# output presented in response to the use of an Orca command which makes it
+# possible for users to quickly cycle amongst these alternatives without having
+# to get into a GUI.
+CAPITALIZATION_ICON_FULL = _("Capitalization style set to icon.")
+
+# Translators: Orca uses Speech Dispatcher to present content to users via
+# text-to-speech. Speech Dispatcher has a feature to control how capital
+# letters are presented: Do nothing at all, say the word 'capital' prior to
+# presenting a capital letter, or play a tone which Speech Dispatcher refers
+# to as a sound 'icon'. This string to be translated refers to the brief/
+# non-verbose output presented in response to the use of an Orca command which
+# makes it possible for users to quickly cycle amongst these alternatives
+# without having to get into a GUI.
+CAPITALIZATION_NONE_BRIEF = C_("capitalization style", "none")
+
+# Translators: Orca uses Speech Dispatcher to present content to users via
+# text-to-speech. Speech Dispatcher has a feature to control how capital
+# letters are presented: Do nothing at all, say the word 'capital' prior to
+# presenting a capital letter, or play a tone which Speech Dispatcher refers
+# to as a sound 'icon'. This string to be translated refers to the full/verbose
+# output presented in response to the use of an Orca command which makes it
+# possible for users to quickly cycle amongst these alternatives without having
+# to get into a GUI.
+CAPITALIZATION_NONE_FULL = _("Capitalization style set to none.")
+
+# Translators: Orca uses Speech Dispatcher to present content to users via
+# text-to-speech. Speech Dispatcher has a feature to control how capital
+# letters are presented: Do nothing at all, say the word 'capital' prior to
+# presenting a capital letter, or play a tone which Speech Dispatcher refers
+# to as a sound 'icon'. This string to be translated refers to the brief/
+# non-verbose output presented in response to the use of an Orca command which
+# makes it possible for users to quickly cycle amongst these alternatives
+# without having to get into a GUI.
+CAPITALIZATION_SPELL_BRIEF = C_("capitalization style", "spell")
+
+# Translators: Orca uses Speech Dispatcher to present content to users via
+# text-to-speech. Speech Dispatcher has a feature to control how capital
+# letters are presented: Do nothing at all, say the word 'capital' prior to
+# presenting a capital letter, or play a tone which Speech Dispatcher refers
+# to as a sound 'icon'. This string to be translated refers to the full/verbose
+# output presented in response to the use of an Orca command which makes it
+# possible for users to quickly cycle amongst these alternatives without having
+# to get into a GUI.
+CAPITALIZATION_SPELL_FULL = _("Capitalization style set to spell.")
+
+# Translators: this is the name of a cell in a spreadsheet.
+CELL = _("Cell %s")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user selects the entire
+# document by pressing Ctrl+A.
+DOCUMENT_SELECTED_ALL = _("entire document selected")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user selects from the
+# current location to the end of the document by pressing Ctrl+Shift+End.
+DOCUMENT_SELECTED_DOWN = _("document selected from cursor position")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user unselects previously
+# selected text by pressing Ctrl+Shift+End.
+DOCUMENT_UNSELECTED_DOWN = _("document unselected from cursor position")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user selects from the
+# current location to the start of the document by pressing Ctrl+Shift+Home.
+DOCUMENT_SELECTED_UP = _("document selected to cursor position")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user unselects previously
+# selected text by pressing Ctrl+Shift+Home.
+DOCUMENT_UNSELECTED_UP = _("document unselected to cursor position")
+
+# Translators: Orca allows you to dynamically define which row of a spreadsheet
+# or table should be treated as containing column headers. This message is
+# presented when the user sets the row to a particular row number.
+DYNAMIC_COLUMN_HEADER_SET = _("Dynamic column header set for row %d")
+
+# Translators: Orca allows you to dynamically define which row of a spreadsheet
+# or table should be treated as containing column headers. This message is
+# presented when the user unsets the row so it is no longer treated as if it
+# contained column headers.
+DYNAMIC_COLUMN_HEADER_CLEARED = _("Dynamic column header cleared.")
+
+# Translators: Orca allows you to dynamically define which column of a
+# spreadsheet or table should be treated as containing column headers. This
+# message is presented when the user sets the column to a particular column
+# number.
+DYNAMIC_ROW_HEADER_SET = _("Dynamic row header set for column %s")
+
+# Translators: Orca allows you to dynamically define which column of a
+# spreadsheet or table should be treated as containing column headers. This
+# message is presented when the user unsets the column so it is no longer
+# treated as if it contained row headers.
+DYNAMIC_ROW_HEADER_CLEARED = _("Dynamic row header cleared.")
+
+# Translators: this is used to announce that the current input line in a
+# spreadsheet is blank/empty.
+EMPTY = _("empty")
+
+# Translators: the 'flat review' feature of Orca allows the blind user to
+# explore the text in a window in a 2D fashion.  That is, Orca treats all
+# the text from all objects in a window (e.g., buttons, labels, etc.) as a
+# sequence of words in a sequence of lines.  This message is presented to
+# let the user know that he/she successfully appended the contents under
+# flat review onto the existing contents of the clipboard.
+FLAT_REVIEW_APPENDED = _("Appended contents to clipboard.")
+
+# Translators: the 'flat review' feature of Orca allows the blind user to
+# explore the text in a window in a 2D fashion.  That is, Orca treats all
+# the text from all objects in a window (e.g., buttons, labels, etc.) as a
+# sequence of words in a sequence of lines.  This message is presented to
+# let the user know that he/she successfully copied the contents under flat
+# review to the clipboard.
+FLAT_REVIEW_COPIED = _("Copied contents to clipboard.")
+
+# Translators: the 'flat review' feature of Orca allows the blind user to
+# explore the text in a window in a 2D fashion.  That is, Orca treats all
+# the text from all objects in a window (e.g., buttons, labels, etc.) as a
+# sequence of words in a sequence of lines.  This message is presented to
+# let the user know that he/she attempted to use a flat review command when
+# not using flat review.
+FLAT_REVIEW_NOT_IN = _("Not using flat review.")
+
+# Translators: the 'flat review' feature of Orca allows the blind user to
+# explore the text in a window in a 2D fashion.  That is, Orca treats all
+# the text from all objects in a window (e.g., buttons, labels, etc.) as a
+# sequence of words in a sequence of lines.  This message is presented to
+# let the user know he/she just entered flat review.
+FLAT_REVIEW_START = _("Entering flat review.")
+
+# Translators: the 'flat review' feature of Orca allows the blind user to
+# explore the text in a window in a 2D fashion.  That is, Orca treats all
+# the text from all objects in a window (e.g., buttons, labels, etc.) as a
+# sequence of words in a sequence of lines.  This message is presented to
+# let the user know he/she just entered flat review.
+FLAT_REVIEW_STOP = _("Leaving flat review.")
+
+# Translators: this means a particular cell in a spreadsheet has a formula
+# (e.g., "=sum(a1:d1)")
+HAS_FORMULA = _("has formula")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command. The
+# following string is a brief message which will be presented to the user who
+# is cycling amongst the various echo options.
+KEY_ECHO_KEY_BRIEF = C_("key echo", "key")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command.
+KEY_ECHO_KEY_FULL = _("Key echo set to key.")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command. The
+# following string is a brief message which will be presented to the user who
+# is cycling amongst the various echo options.
+KEY_ECHO_NONE_BRIEF = C_("key echo", "None")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command.
+KEY_ECHO_NONE_FULL = _("Key echo set to None.")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command. The
+# following string is a brief message which will be presented to the user who
+# is cycling amongst the various echo options.
+KEY_ECHO_KEY_AND_WORD_BRIEF = C_("key echo", "key and word")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command.
+KEY_ECHO_KEY_AND_WORD_FULL = _("Key echo set to key and word.")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command. The
+# following string is a brief message which will be presented to the user who
+# is cycling amongst the various echo options.
+KEY_ECHO_SENTENCE_BRIEF = C_("key echo", "sentence")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command.
+KEY_ECHO_SENTENCE_FULL = _("Key echo set to sentence.")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command. The
+# following string is a brief message which will be presented to the user who
+# is cycling amongst the various echo options.
+KEY_ECHO_WORD_BRIEF = C_("key echo", "word")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command.
+KEY_ECHO_WORD_FULL = _("Key echo set to word.")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command. The
+# following string is a brief message which will be presented to the user who
+# is cycling amongst the various echo options.
+KEY_ECHO_WORD_AND_SENTENCE_BRIEF = C_("key echo", "word and sentence")
+
+# Translators: Orca has an "echo" setting which allows the user to configure
+# what is spoken in response to a key press. Given a user who typed "Hello
+# world.":
+# - key echo: "H e l l o space w o r l d period"
+# - word echo: "Hello" spoken when the space is pressed;
+#   "world" spoken when the period is pressed.
+# - sentence echo: "Hello world" spoken when the period
+#   is pressed.
+# A user can choose to have no echo, one type of echo, or multiple types of
+# echo and can cycle through the various levels quickly via a command.
+KEY_ECHO_WORD_AND_SENTENCE_FULL = _("Key echo set to word and sentence.")
+
+# Translators: This brief message indicates that indentation and
+# justification will be spoken.
+INDENTATION_JUSTIFICATION_OFF_BRIEF = \
+    C_("indentation and justification", "Disabled")
+
+# Translators: This detailed message indicates that indentation and
+# justification will not be spoken.
+INDENTATION_JUSTIFICATION_OFF_FULL = \
+    _("Speaking of indentation and justification disabled.")
+
+# Translators: This brief message indicates that indentation and
+# justification will be spoken.
+INDENTATION_JUSTIFICATION_ON_BRIEF = \
+    C_("indentation and justification", "Enabled")
+
+# Translators: This detailed message indicates that indentation and
+# justification will be spoken.
+INDENTATION_JUSTIFICATION_ON_FULL = \
+    _("Speaking of indentation and justification enabled.")
+
+# Translators: Orca has a "Learn Mode" that will allow the user to type any key
+# on the keyboard and hear what the effects of that key would be.  The effects
+# might be what Orca would do if it had a handler for the particular key
+# combination, or they might just be to echo the name of the key if Orca doesn't
+# have a handler. This message is what is presented on the braille display when
+# entering Learn Mode.
+LEARN_MODE_START_BRAILLE = _("Learn mode.  Press escape to exit.")
+
+# Translators: Orca has a "Learn Mode" that will allow the user to type any key
+# on the keyboard and hear what the effects of that key would be.  The effects
+# might be what Orca would do if it had a handler for the particular key
+# combination, or they might just be to echo the name of the key if Orca doesn't
+# have a handler. This message is what is spoken to the user when entering Learn
+# Mode.
+LEARN_MODE_START_SPEECH = \
+    _("Entering learn mode.  Press any key to hear its function.  " \
+      "To get a list of Orca shortcuts, press the Orca modifier " \
+      "plus H twice quickly. To view the documentation, press F1. " \
+      "To exit learn mode, press the escape key.")
+
+# Translators: Orca has a "Learn Mode" that will allow the user to type any key
+# on the keyboard and hear what the effects of that key would be.  The effects
+# might be what Orca would do if it had a handler for the particular key
+# combination, or they might just be to echo the name of the key if Orca doesn't
+# have a handler. This message is what is presented in speech and braille when
+# exiting Learn Mode.
+LEARN_MODE_STOP = _("Exiting learn mode.")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user selects from the
+# current location to the start of the line by pressing Ctrl+Shift+Page_Up.
+LINE_SELECTED_LEFT = _("line selected from start to previous cursor position")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user selects from the
+# current location to the end of the line by pressing Ctrl+Shift+Page_Down.
+LINE_SELECTED_RIGHT = _("line selected to end from previous cursor position")
+
+# Translators: this indicates that this piece of text is a hypertext link.
+LINK = _("link")
+
+# Translators: The following string instructs the user how to navigate amongst
+# the list of commands presented in 'list shortcuts' mode as well as how to exit
+# the list when finished.
+LIST_SHORTCUTS_MODE_NAVIGATION = \
+    _("Use Up and Down Arrow to navigate the list. Press Escape to exit.")
+
+# Translators: This message is presented when the user is in 'list shortcuts'
+# mode. This is the message we present when the user requested a list of
+# application-specific shortcuts, but none could be found for that application.
+LIST_SHORTCUTS_MODE_NO_RESULTS = _("No Orca shortcuts for %s found.")
+
+# Translators: Orca has a 'List Shortcuts' mode by which a user can navigate
+# through a list of the bound commands in Orca. This is the message that is
+# presented to the user as confirmation that this mode has been entered.
+LIST_SHORTCUTS_MODE_START = _("List shortcuts mode.")
+
+# Translators: Orca has a 'List Shortcuts' mode by which a user can navigate
+# through a list of the bound commands in Orca. This is the message that is
+# presented to the user as confirmation that this mode has been exited.
+LIST_SHORTCUTS_MODE_STOP = _("Exiting list shortcuts mode.")
+
+# Translators: Orca has a 'List Shortcuts' mode by which a user can navigate
+# through a list of the bound commands in Orca. Pressing 1 presents the
+# commands/shortcuts available for all applications. These are the "default"
+# commands/shortcuts. Pressing 2 presents commands/shortcuts Orca provides for
+# the application with focus. The following message is presented to the user
+# upon entering this  mode.
+LIST_SHORTCUTS_MODE_TUTORIAL = \
+    _("Press 1 for Orca's default shortcuts. Press 2 for " \
+      "Orca's shortcuts for the current application. " \
+      "Press escape to exit.")
+
+# Translators: A live region is an area of a web page that is periodically
+# updated, e.g. stock ticker. http://www.w3.org/TR/wai-aria/terms#def_liveregion
+# Orca has several features to facilitate accessing live regions. This message
+# is presented to inform the user that Orca's live region features have been
+# turned off.
+LIVE_REGIONS_OFF = _("Live region support is off")
+
+# Translators: Orca has a command that allows the user to move the mouse pointer
+# to the current object. This is a brief message which will be presented if for
+# some reason Orca cannot identify/find the current location.
+LOCATION_NOT_FOUND_BRIEF = C_("location", "Not found")
+
+# Translators: Orca has a command that allows the user to move the mouse pointer
+# to the current object. This is a detailed message which will be presented if
+# for some reason Orca cannot identify/find the current location.
+LOCATION_NOT_FOUND_FULL = _("Could not find current location.")
+
+# Translators: This is to inform the user of the presence of the red squiggly
+# line which indicates that a given word is not spelled correctly.
+MISSPELLED = _("misspelled")
+
+# Translators: Orca tries to provide more compelling output of the spell check
+# dialog in some applications. The first thing it does is let the user know
+# what the misspelled word is.
+MISSPELLED_WORD = _("Misspelled word: %s")
+
+# Translators: Orca tries to provide more compelling output of the spell check
+# dialog in some applications. The second thing it does is give the phrase
+# containing the misspelled word in the document. This is known as the context.
+MISSPELLED_WORD_CONTEXT = _("Context is %s")
+
+# Translators: Orca has a command that presents a list of structural navigation
+# objects in a dialog box so that users can navigate more quickly than they
+# could with native keyboard navigation. This is a message that will be
+# presented to the user when an error (such as the operation timing out) kept us
+# from getting these objects.
+NAVIGATION_DIALOG_ERROR = _("Error: Could not create list of objects.")
+
+# Translators: This is for navigating document content by moving from anchor to
+# anchor. (An anchor is a named spot that one can jump to.) This is a detailed
+# message which will be presented to the user if no more anchors can be found.
+NO_MORE_ANCHORS = _("No more anchors.")
+
+# Translators: This is for navigating document content by moving from blockquote
+# to blockquote. This is a detailed message which will be presented to the user
+# if no more blockquotes can be found.
+NO_MORE_BLOCKQUOTES = _("No more blockquotes.")
+
+# Translators: This is for navigating document content by moving from button
+# to button. This is a detailed message which will be presented to the user
+# if no more buttons can be found.
+NO_MORE_BUTTONS = _("No more buttons.")
+
+# Translators: This is for navigating document content by moving from check
+# box to check box. This is a detailed message which will be presented to the
+# user if no more check boxes can be found.
+NO_MORE_CHECK_BOXES = _("No more check boxes.")
+
+# Translators: This is for navigating document content by moving from 'large
+# object' to 'large object'. A 'large object' is a logical chunk of text,
+# such as a paragraph, a list, a table, etc. This is a detailed message which
+# will be presented to the user if no more check boxes can be found.
+NO_MORE_CHUNKS = _("No more large objects.")
+
+# Translators: This is for navigating document content by moving from combo
+# box to combo box. This is a detailed message which will be presented to the
+# user if no more combo boxes can be found.
+NO_MORE_COMBO_BOXES = _("No more combo boxes.")
+
+# Translators: This is for navigating document content by moving from entry
+# to entry. This is a detailed message which will be presented to the user
+# if no more entries can be found.
+NO_MORE_ENTRIES = _("No more entries.")
+
+# Translators: This is for navigating document content by moving from form
+# field to form field. This is a detailed message which will be presented to
+# the user if no more form fields can be found.
+NO_MORE_FORM_FIELDS = _("No more form fields.")
+
+# Translators: This is for navigating document content by moving from heading
+# to heading. This is a detailed message which will be presented to the user
+# if no more headings can be found.
+NO_MORE_HEADINGS = _("No more headings.")
+
+# Translators: This is for navigating document content by moving from heading
+# to heading at a particular level (i.e. only <h1> or only <h2>, etc.). This
+# is a detailed message which will be presented to the user if no more headings
+# at the desired level can be found.
+NO_MORE_HEADINGS_AT_LEVEL = _("No more headings at level %d.")
+
+# Translators: this is for navigating to the previous ARIA role landmark.
+# ARIA role landmarks are the W3C defined HTML tag attribute 'role' used to
+# identify important part of webpage like banners, main context, search etc.
+# This is an indication that one was not found.
+NO_LANDMARK_FOUND = _("No landmark found.")
+
+# Translators: This is for navigating document content by moving from link to
+# link (regardless of visited state). This is a detailed message which will be
+# presented to the user if no more links can be found.
+NO_MORE_LINKS = _("No more links.")
+
+# Translators: This is for navigating document content by moving from bulleted/
+# numbered list to bulleted/numbered list. This is a detailed message which will
+# be presented to the user if no more lists can be found.
+NO_MORE_LISTS = _("No more lists.")
+
+# Translators: This is for navigating document content by moving from bulleted/
+# numbered list item to bulleted/numbered list item. This is a detailed message
+# which will be presented to the user if no more list items can be found.
+NO_MORE_LIST_ITEMS = _("No more list items.")
+
+# Translators: This is for navigating document content by moving from live
+# region to live region. A live region is an area of a web page that is
+# periodically updated, e.g. stock ticker. This is a detailed message which
+# will be presented to the user if no more live regions can be found. For
+# more info, see http://www.w3.org/TR/wai-aria/terms#def_liveregion
+NO_MORE_LIVE_REGIONS = _("No more live regions.")
+
+# Translators: This is for navigating document content by moving from paragraph
+# to paragraph. This is a detailed message which will be presented to the user
+# if no more paragraphs can be found.
+NO_MORE_PARAGRAPHS = _("No more paragraphs.")
+
+# Translators: This is for navigating document content by moving from radio
+# button to radio button. This is a detailed message which will be presented to
+# the user if no more radio buttons can be found.
+NO_MORE_RADIO_BUTTONS = _("No more radio buttons.")
+
+# Translators: This is for navigating document content by moving from separator
+# to separator (e.g. <hr> tags). This is a detailed message which will be
+# presented to the user if no more separators can be found.
+NO_MORE_SEPARATORS = _("No more separators.")
+
+# Translators: This is for navigating document content by moving from table to
+# to table. This is a detailed message which will be presented to the user if
+# no more tables can be found.
+NO_MORE_TABLES = _("No more tables.")
+
+# Translators: This is for navigating document content by moving from unvisited
+# link to unvisited link. This is a detailed message which will be presented to
+# the user if no more unvisited links can be found.
+NO_MORE_UNVISITED_LINKS = _("No more unvisited links.")
+
+# Translators: This is for navigating document content by moving from visited
+# link to visited link. This is a detailed message which will be presented to
+# the user if no more visited links can be found.
+NO_MORE_VISITED_LINKS = _("No more visited links.")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user selects from the
+# current location to the end of the page by pressing Shift+Page_Down.
+PAGE_SELECTED_DOWN = _("page selected from cursor position")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user selects from the
+# current location to the start of the page by pressing Shift+Page_Up.
+PAGE_SELECTED_UP = _("page selected to cursor position")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user unselects a previously
+# selected page by pressing Shift+Page_Down.
+PAGE_UNSELECTED_DOWN = _("page unselected from cursor position")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user unselects a previously
+# selected page by pressing Shift+Page_Up.
+PAGE_UNSELECTED_UP = _("page unselected to cursor position")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user selects from the
+# current location to the end of the paragraph by pressing Ctrl+Shift+Down.
+PARAGRAPH_SELECTED_DOWN = _("paragraph selected down from cursor position")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user selects from the
+# current location to the start of the paragraph by pressing Ctrl+Shift+UP.
+PARAGRAPH_SELECTED_UP = _("paragraph selected up from cursor position")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user unselects previously
+# selected text from the current location to the end of the paragraph by
+# pressing Ctrl+Shift+Down.
+PARAGRAPH_UNSELECTED_DOWN = _("paragraph unselected down from cursor position")
+
+# Translators: when the user selects (highlights) or unselects text in a
+# document, Orca will speak information about what they have selected or
+# unselected. This message is presented when the user unselects previously
+# selected text from the current location to the start of the paragraph by
+# pressing Ctrl+Shift+UP.
+PARAGRAPH_UNSELECTED_UP = _("paragraph unselected up from cursor position")
+
+# Translators: This is a detailed message which will be presented as the user
+# cycles amongst his/her saved profiles. A "profile" is a collection of settings
+# which apply to a given task, such as a "Spanish" profile which would use
+# Spanish text-to-speech and Spanish braille and selected when reading Spanish
+# content. The string representing the profile name is created by the user.
+PROFILE_CHANGED = _("Profile set to %s.")
+
+# Translators: This is an error message presented when the user attempts to
+# cycle among his/her saved profiles, but no profiles can be found. A profile
+# is a collection of settings which apply to a given task, such as a "Spanish"
+# profile which would use Spanish text-to-speech and Spanish braille and
+# selected when reading Spanish content.
+PROFILE_NOT_FOUND = _("No profiles found.")
+
+# Translators: this is an index value so that we can present value changes
+# regarding a specific progress bar in environments where there are multiple
+# progress bars (e.g. in the Firefox downloads dialog).
+PROGRESS_BAR_NUMBER = _("Progress bar %d.")
+
+# Translators: This brief message will be presented as the user cycles
+# through the different levels of spoken punctuation. The options are:
+# All puntuation marks will be spoken, None will be spoken, Most will be
+# spoken, or Some will be spoken.
+PUNCTUATION_ALL_BRIEF = C_("spoken punctuation", "All")
+
+# Translators: This detailed message will be presented as the user cycles
+# through the different levels of spoken punctuation. The options are:
+# All puntuation marks will be spoken, None will be spoken, Most will be
+# spoken, or Some will be spoken.
+PUNCTUATION_ALL_FULL = _("Punctuation level set to all.")
+
+# Translators: This brief message will be presented as the user cycles
+# through the different levels of spoken punctuation. The options are:
+# All puntuation marks will be spoken, None will be spoken, Most will be
+# spoken, or Some will be spoken.
+PUNCTUATION_MOST_BRIEF = C_("spoken punctuation", "Most")
+
+# Translators: This detailed message will be presented as the user cycles
+# through the different levels of spoken punctuation. The options are:
+# All puntuation marks will be spoken, None will be spoken, Most will be
+# spoken, or Some will be spoken.
+PUNCTUATION_MOST_FULL = _("Punctuation level set to most.")
+
+# Translators: This brief message will be presented as the user cycles
+# through the different levels of spoken punctuation. The options are:
+# All puntuation marks will be spoken, None will be spoken, Most will be
+# spoken, or Some will be spoken.
+PUNCTUATION_NONE_BRIEF = C_("spoken punctuation", "None")
+
+# Translators: This detailed message will be presented as the user cycles
+# through the different levels of spoken punctuation. The options are:
+# All puntuation marks will be spoken, None will be spoken, Most will be
+# spoken, or Some will be spoken.
+PUNCTUATION_NONE_FULL = _("Punctuation level set to none.")
+
+# Translators: This brief message will be presented as the user cycles
+# through the different levels of spoken punctuation. The options are:
+# All puntuation marks will be spoken, None will be spoken, Most will be
+# spoken, or Some will be spoken.
+PUNCTUATION_SOME_BRIEF = C_("spoken punctuation", "Some")
+
+# Translators: This detailed message will be presented as the user cycles
+# through the different levels of spoken punctuation. The options are:
+# All puntuation marks will be spoken, None will be spoken, Most will be
+# spoken, or Some will be spoken.
+PUNCTUATION_SOME_FULL = _("Punctuation level set to some.")
+
+# Translators: This message is presented to the user when Orca's preferences
+# have been reloaded.
+SETTINGS_RELOADED = _("Orca user settings reloaded.")
+
+# Translators: This message is presented to the user when speech synthesis
+# has been temporarily turned off.
+SPEECH_DISABLED = _("Speech disabled.")
+
+# Translators: This message is presented to the user when speech synthesis
+# has been turned back on.
+SPEECH_ENABLED = _("Speech enabled.")
+
+# Translators: This string announces speech rate change.
+SPEECH_FASTER = _("faster.")
+
+# Translators: This string announces speech rate change.
+SPEECH_SLOWER = _("slower.")
+
+# Translators: This string announces speech pitch change.
+SPEECH_HIGHER = _("higher.")
+
+# Translators: This string announces speech pitch change.
+SPEECH_LOWER  = _("lower.")
+
+# Translators: This message is presented to the user when Orca is launched.
+START_ORCA = _("Welcome to Orca.")
+
+# Translators: This message is presented to the user when Orca is quit.
+STOP_ORCA = _("Goodbye.")
+
+# Translators: the Orca "Find" dialog allows a user to search for text in a
+# window and then move focus to that text.  For example, they may want to find
+# the "OK" button.  This message lets them know a string they were searching
+# for was not found.
+STRING_NOT_FOUND = _("string not found")
+
+# Translators: The structural navigation keys are designed to move the caret
+# around document content by object type. H moves you to the next heading,
+# Shift H to the previous heading, T to the next table, and so on. Some users
+# prefer to turn this off to use Firefox's search when typing feature. This
+# message is presented when the user toggles the structural navigation feature
+# of Orca. It should be a brief informative message.            
+STRUCTURAL_NAVIGATION_KEYS_OFF = _("Structural navigation keys off.")
+
+# Translators: The structural navigation keys are designed to move the caret
+# around document content by object type. H moves you to the next heading,
+# Shift H to the previous heading, T to the next table, and so on. Some users
+# prefer to turn this off to use Firefox's search when typing feature. This
+# message is presented when the user toggles the structural navigation feature
+# of Orca. It should be a brief informative message.            
+STRUCTURAL_NAVIGATION_KEYS_ON = _("Structural navigation keys on.")
+
+# Translators: Orca has a command that allows the user to move to the next
+# structural navigation object. In Orca, "structural navigation" refers to
+# quickly moving through a document by jumping amongst objects of a given
+# type, such as from link to link, or from heading to heading, or from form
+# field to form field. This is a brief message which will be presented to the
+# user if the desired structural navigation object could not be found.
+STRUCTURAL_NAVIGATION_NOT_FOUND = C_("structural navigation", "Not found")
+
+# Translators: When users are navigating a table, they sometimes want the entire
+# row of a table read; other times they want just the current cell presented.
+# This string is a message presented to the user when this setting is toggled.
+TABLE_MODE_CELL = _("Speak cell")
+
+# Translators: When users are navigating a table, they sometimes want the entire
+# row of a table read; other times they want just the current cell presented.
+# This string is a message presented to the user when this setting is toggled.
+TABLE_MODE_ROW = _("Speak row")
+
+# Translators: This is for navigating document content by moving from table cell
+# to table cell. If the user gives a table navigation command but is not in a
+# table, presents this message.
+TABLE_NOT_IN_A = _("Not in a table.")
+
+# Translators: This is a message presented to users when the columns in a table
+# have been reordered.
+TABLE_REORDERED_COLUMNS = _("Columns reordered")
+
+# Translators: This is a message presented to users when the rows in a table
+# have been reordered.
+TABLE_REORDERED_ROWS = _("Rows reordered")
+
+# Translators: This is for navigating document content by moving from table cell
+# to table cell. This is the message presented when the user attempts to move to
+# the cell below the current cell and is already in the last row.
+TABLE_COLUMN_BOTTOM = _("Bottom of column.")
+
+# Translators: This is for navigating document content by moving from table cell
+# to table cell. This is the message presented when the user attempts to move to
+# the cell above the current cell and is already in the first row.
+TABLE_COLUMN_TOP = _("Top of column.")
+
+# Translators: This is for navigating document content by moving from table cell
+# to table cell. This is the message presented when the user attempts to move to
+# the left of the current cell and is already in the first column.
+TABLE_ROW_BEGINNING = _("Beginning of row.")
+
+# Translators: This is for navigating document content by moving from table cell
+# to table cell. This is the message presented when the user attempts to move to
+# the right of the current cell and is already in the last column.
+TABLE_ROW_END = _("End of row.")
+
+# Translators: This message is presented to the user to confirm that he/she just
+# deleted a table row.
+TABLE_ROW_DELETED = _("Row deleted.")
+
+# Translators: This message is presented to the user to confirm that he/she just
+# deleted the last row of a table.
+TABLE_ROW_DELETED_FROM_END = _("Last row deleted.")
+
+# Translators: This message is presented to the user to confirm that he/she just
+# inserted a table row.
+TABLE_ROW_INSERTED = _("Row inserted.")
+
+# Translators: This message is presented to the user to confirm that he/she just
+# inserted a table row at the end of the table. This typically happens when the
+# user presses Tab from within the last cell of the table.
+TABLE_ROW_INSERTED_AT_END = _("Row inserted at the end of the table.")
+
+# Translators: when the user selects (highlights) text in a document, Orca lets
+# them know.
+TEXT_SELECTED = C_("text", "selected")
+
+# Translators: when the user unselects (un-highlights) text in a document, Orca
+# lets them know.
+TEXT_UNSELECTED = C_("text", "unselected")
+
+# Translators: this is information about a unicode character reported to the
+# user.  The value is the unicode number value of this character in hex.
+UNICODE = _("Unicode %s")
+
+# Translators: This message presents the Orca version number.
+VERSION = _("Orca version %s.") % version
+
+# Translators: This is presented when the user has navigated to a line with only
+# whitespace characters (space, tab, etc.) on it.
+WHITE_SPACE = _("white space")
+
+# Translators: when the user is attempting to locate a particular object and the
+# top of a page or list is reached without that object being found, we "wrap" to
+# the bottom and continue looking upwards. We need to inform the user when this
+# is taking place.
+WRAPPING_TO_BOTTOM = _("Wrapping to bottom.")
+
+# Translators: when the user is attempting to locate a particular object and the
+# bottom of a page or list is reached without that object being found, we "wrap"
+# to the top and continue looking downwards. We need to inform the user when
+# this is taking place.
+WRAPPING_TO_TOP = _("Wrapping to top.")
diff --git a/src/orca/orca.py b/src/orca/orca.py
index 3b210df..cbd1da6 100644
--- a/src/orca/orca.py
+++ b/src/orca/orca.py
@@ -60,6 +60,7 @@ except:
 from . import braille
 from . import debug
 from . import event_manager
+from . import messages
 from . import notification_messages
 from . import orca_state
 from . import script_manager
@@ -68,7 +69,6 @@ from . import settings_manager
 from . import speech
 from .input_event import BrailleEvent
 from .input_event import KeyboardEvent
-from .orca_i18n import _
 from .orca_i18n import ngettext
 
 _eventManager = event_manager.getManager()
@@ -430,12 +430,8 @@ def loadUserSettings(script=None, inputEvent=None, skipReloadMessage=False):
         try:
             speech.init()
             if reloaded and not skipReloadMessage:
-                # Translators: there is a keystroke to reload the user
-                # preferences.  This is a spoken prompt to let the user
-                # know when the preferences has been reloaded.
-                #
-                msg = _("Orca user settings reloaded.")
-                speech.speak(msg, settings.voices.get(settings.SYSTEM_VOICE))
+                speech.speak(messages.SETTINGS_RELOADED,
+                             settings.voices.get(settings.SYSTEM_VOICE))
             debug.println(debug.LEVEL_CONFIGURATION,
                           "Speech module has been initialized.")
         except:
@@ -541,13 +537,7 @@ def listShortcuts(event):
     consumed = False
     message = ""
 
-    # Translators: The following string instructs the user how to navigate
-    # amongst the list of commands presented in 'list shortcuts' mode as
-    # well as how to exit the list when finished.
-    #
-    navigation = \
-        _("Use Up and Down Arrow to navigate the list. Press Escape to exit.")
-
+    navigation = messages.LIST_SHORTCUTS_MODE_NAVIGATION
     if event.type == pyatspi.KEY_PRESSED_EVENT:
         if (event.event_string == "1"):
             if not numShortcuts or orca_state.typeOfShortcuts != "default":
@@ -594,13 +584,8 @@ def listShortcuts(event):
                 orca_state.activeScript.speakMessage(message)
                 orca_state.activeScript.displayBrailleMessage(message, -1, -1)
             else:
-                # Translators: This message is presented when the user is in
-                # 'list of shortcuts mode'. This is the message we present
-                # when the user requested a list of application-specific
-                # shortcuts, but none could be found for that application.
-                #
-                message = _("No Orca shortcuts for %s found.") % \
-                    (orca_state.activeScript.app.name)
+                message = messages.LIST_SHORTCUTS_MODE_NO_RESULTS % \
+                    orca_state.activeScript.app.name
                 orca_state.activeScript.speakMessage(message)
                 orca_state.activeScript.displayBrailleMessage(message, -1, -1)
             consumed = True
@@ -609,16 +594,9 @@ def listShortcuts(event):
                 if orca_state.ptrToShortcut > 0: 
                     orca_state.ptrToShortcut = orca_state.ptrToShortcut-1
                 else:
-                    orca_state.ptrToShortcut = numShortcuts-1 
-                    # Translators: when the user is attempting to locate a
-                    # particular object and the top of a page or list is
-                    # reached without that object being found, we "wrap" to
-                    # the bottom and continue looking upwards. We need to
-                    # inform the user when this is taking place.
-                    #
-                    orca_state.activeScript.\
-                        presentMessage(_("Wrapping to bottom."))
-
+                    orca_state.ptrToShortcut = numShortcuts-1
+                    orca_state.activeScript.presentMessage(
+                        messages.WRAPPING_TO_BOTTOM)
                 message = \
                   orca_state.listOfShortcuts[orca_state.ptrToShortcut][0] + \
                   " " + orca_state.listOfShortcuts[orca_state.ptrToShortcut][1]
@@ -631,14 +609,7 @@ def listShortcuts(event):
                     orca_state.ptrToShortcut = orca_state.ptrToShortcut+1
                 else:
                     orca_state.ptrToShortcut = 0 
-                    # Translators: when the user is attempting to locate a
-                    # particular object and the bottom of a page or list is
-                    # reached without that object being found, we "wrap" to the
-                    # top and continue looking downwards. We need to inform the
-                    # user when this is taking place.
-                    #
-                    orca_state.activeScript.\
-                        presentMessage(_("Wrapping to top."))
+                    orca_state.activeScript.presentMessage(messages.WRAPPING_TO_TOP)
                 message = \
                   orca_state.listOfShortcuts[orca_state.ptrToShortcut][0] + \
                   " " + orca_state.listOfShortcuts[orca_state.ptrToShortcut][1]
@@ -649,17 +620,7 @@ def listShortcuts(event):
             orca_state.activeScript.exitListShortcutsMode(event)
             consumed = True 
         else:
-            # Translators: Orca has a 'List Shortcuts' mode by which a user can
-            # navigate through a list of the bound commands in Orca. Pressing 1
-            # presents the commands/shortcuts available for all applications.
-            # These are the "default" commands/shortcuts. Pressing 2 presents
-            # commands/shortcuts Orca provides for the application with focus.
-            # The following message is presented to the user upon entering this
-            # mode.
-            #
-            message = _("Press 1 for Orca's default shortcuts. Press 2 for " \
-                        "Orca's shortcuts for the current application. " \
-                        "Press escape to exit.")
+            message = messages.LIST_SHORTCUTS_MODE_TUTORIAL
             orca_state.activeScript.speakMessage(message)
             orca_state.activeScript.displayBrailleMessage(message, -1, -1)
             consumed = True
@@ -820,9 +781,7 @@ def shutdown(script=None, inputEvent=None):
         signal.signal(signal.SIGALRM, settings.timeoutCallback)
         signal.alarm(settings.timeoutTime)
 
-    # Translators: this is what Orca speaks and brailles when it quits.
-    #
-    orca_state.activeScript.presentMessage(_("Goodbye."))
+    orca_state.activeScript.presentMessage(messages.STOP_ORCA)
 
     _eventManager.deactivate()
     _scriptManager.deactivate()
@@ -950,7 +909,7 @@ def main():
     init(pyatspi.Registry)
 
     try:
-        message = _("Welcome to Orca.")
+        message = messages.START_ORCA
         if not _settingsManager.getSetting('onlySpeakDisplayedText'):
             speech.speak(message, settings.voices.get(settings.SYSTEM_VOICE))
         braille.displayMessage(message)
diff --git a/src/orca/orca_i18n.py.in b/src/orca/orca_i18n.py.in
index 3c54e77..b71787e 100644
--- a/src/orca/orca_i18n.py.in
+++ b/src/orca/orca_i18n.py.in
@@ -32,6 +32,7 @@ import sys
 #
 _ = gettext.gettext
 ngettext = gettext.ngettext
+cgettext = gettext.gettext
 
 # Tell gettext where to find localized strings.
 #
@@ -47,22 +48,24 @@ gettext.textdomain("orca")
 
 def C_(ctx, s):
     """Provide qualified translatable strings via context."""
-    translated = gettext.gettext('%s\x04%s' % (ctx, s))
+    translated = cgettext('%s\x04%s' % (ctx, s))
     if '\x04' in translated:
         # no translation found, return input string
         return s
     return translated
 
 def setModuleLocale(moduleName, newLocale=None):
-    global _, ngettext
+    global _, ngettext, cgettext
 
     if not newLocale:
         _ = gettext.gettext
         ngettext = gettext.ngettext
+        cgettext = gettext.gettext
     else:
-        translation = gettext.translation('orca', languages=[newLocale])
+        translation = gettext.translation('orca', localedir, languages=[newLocale])
         _ = translation.gettext
         ngettext = translation.ngettext
+        cgettext = translation.gettext
 
     module = sys.modules.get(moduleName)
     if module:
diff --git a/src/orca/scripts/apps/soffice/script.py b/src/orca/scripts/apps/soffice/script.py
index 142c9a1..9421e34 100644
--- a/src/orca/scripts/apps/soffice/script.py
+++ b/src/orca/scripts/apps/soffice/script.py
@@ -44,6 +44,7 @@ import orca.debug as debug
 import orca.scripts.default as default
 import orca.keybindings as keybindings
 import orca.input_event as input_event
+import orca.messages as messages
 import orca.orca as orca
 import orca.orca_state as orca_state
 import orca.speech as speech
@@ -875,10 +876,7 @@ class Script(default.Script):
                     inputLine = \
                         self.utilities.substring(self.inputLineForCell, 0, -1)
                     if not inputLine:
-                        # Translators: this is used to announce that the
-                        # current input line in a spreadsheet is blank/empty.
-                        #
-                        inputLine = _("empty")
+                        inputLine = messages.EMPTY
                     debug.println(self.debugLevel,
                         "StarOffice.speakInputLine: contents: %s" % inputLine)
                     self.displayBrailleMessage(inputLine, \
@@ -955,10 +953,7 @@ class Script(default.Script):
         if table:
             row = self.getTableRow(orca_state.locusOfFocus)
             self.dynamicColumnHeaders[hash(table)] = row
-            # Translators: Orca allows you to dynamically define which
-            # row of a spreadsheet or table counts as column headers.
-            #
-            line = _("Dynamic column header set for row %d") % (row+1)
+            line = messages.DYNAMIC_COLUMN_HEADER_SET % (row+1)
             self.presentMessage(line)
 
         return True
@@ -977,10 +972,7 @@ class Script(default.Script):
             row = self.getTableRow(orca_state.locusOfFocus)
             try:
                 del self.dynamicColumnHeaders[hash(table)]
-                # Translators: Orca allows you to dynamically define which
-                # row of a spreadsheet or table counts as column headers.
-                #
-                line = _("Dynamic column header cleared.")
+                line = messages.DYNAMIC_COLUMN_HEADER_CLEARED
                 speech.stop()
                 self.presentMessage(line)
             except:
@@ -1029,11 +1021,7 @@ class Script(default.Script):
         if table:
             column = self.getTableColumn(orca_state.locusOfFocus)
             self.dynamicRowHeaders[hash(table)] = column
-            # Translators: Orca allows you to dynamically define which
-            # column of a spreadsheet or table counts as row headers.
-            #
-            line = _("Dynamic row header set for column %s") \
-                   % self.columnConvert(column+1)
+            line = messages.DYNAMIC_ROW_HEADER_SET % self.columnConvert(column+1)
             self.presentMessage(line)
 
         return True
@@ -1052,10 +1040,7 @@ class Script(default.Script):
             column = self.getTableColumn(orca_state.locusOfFocus)
             try:
                 del self.dynamicRowHeaders[hash(table)]
-                # Translators: Orca allows you to dynamically define which
-                # column of a spreadsheet or table counts as row headers.
-                #
-                line = _("Dynamic row header cleared.")
+                line = messages.DYNAMIC_ROW_HEADER_CLEARED
                 speech.stop()
                 self.presentMessage(line)
             except:
@@ -1333,10 +1318,7 @@ class Script(default.Script):
         """
 
         if not textToSpeak and event and self.speakBlankLine(event.source):
-            # Translators: "blank" is a short word to mean the
-            # user has navigated to an empty line.
-            #
-            speech.speak(_("blank"), None, False)
+            speech.speak(messages.BLANK, None, False)
 
         # Check to see if there are any hypertext links in this paragraph.
         # If no, then just speak the whole line. Otherwise, split the text
@@ -1938,25 +1920,11 @@ class Script(default.Script):
                 fullMessage = briefMessage = ""
                 voice = self.voices.get(settings.SYSTEM_VOICE)
                 if activeRow == itable.nRows:
-                    # Translators: This message is to inform the user that
-                    # the last row of a table in a document was just deleted.
-                    #
-                    fullMessage = _("Last row deleted.")
-                    # Translators: This message is to inform the user that
-                    # a row in a table was just deleted.
-                    #
-                    briefMessage = _("Row deleted.")
+                    fullMessage = messages.TABLE_ROW_DELETED_FROM_END
+                    briefMessage = messages.TABLE_ROW_DELETED
                 else:
-                    # Translators: This message is to inform the user that a
-                    # new table row was inserted at the end of the existing
-                    # table. This typically happens when the user presses Tab
-                    # from within the last cell of the table.
-                    #
-                    fullMessage = _("Row inserted at the end of the table.")
-                    # Translators: This message is to inform the user that
-                    # a row in a table was just inserted.
-                    #
-                    briefMessage = _("Row inserted.")
+                    fullMessage =  messages.TABLE_ROW_INSERTED_AT_END
+                    briefMessage = messages.TABLE_ROW_INSERTED
                 if fullMessage:
                     self.presentMessage(fullMessage, briefMessage, voice)
 
@@ -2128,12 +2096,7 @@ class Script(default.Script):
                                                  self.inputLineForCell, 0, -1)
                                         if inputLine and (len(inputLine) > 1) \
                                             and (inputLine[0] == "="):
-                                            # Translators: this means a
-                                            # particular cell in a spreadsheet
-                                            # has a formula
-                                            # (e.g., "=sum(a1:d1)")
-                                            #
-                                            hf = _("has formula")
+                                            hf = messages.HAS_FORMULA
                                             speech.speak(" %s" % hf,
                                                          None, False)
                                             self.presentItemsInBraille([hf])
@@ -2154,9 +2117,7 @@ class Script(default.Script):
         - name: the name of the cell
         """
 
-        # Translators: this is the name of a cell in a spreadsheet.
-        #
-        line = _("Cell %s") % name
+        line = messages.CELL % name
         speech.speak(line)
 
     def onCaretMoved(self, event):
diff --git a/src/orca/scripts/apps/soffice/structural_navigation.py 
b/src/orca/scripts/apps/soffice/structural_navigation.py
index 48b0297..b7dc80f 100644
--- a/src/orca/scripts/apps/soffice/structural_navigation.py
+++ b/src/orca/scripts/apps/soffice/structural_navigation.py
@@ -27,6 +27,7 @@ __license__   = "LGPL"
 
 import pyatspi
 
+import orca.messages as messages
 import orca.structural_navigation as structural_navigation
 import orca.settings as settings
 import orca.speech as speech
@@ -110,10 +111,7 @@ class StructuralNavigation(structural_navigation.StructuralNavigation):
             for child in cell:
                 speech.speak(self._script.utilities.displayedText(child))
         else:
-            # Translators: "blank" is a short word to mean the
-            # user has navigated to an empty line.
-            #
-            speech.speak(_("blank"))
+            speech.speak(messages.BLANK)
 
         if settings.speakCellCoordinates:
             [row, col] = self.getCellCoordinates(cell)
diff --git a/src/orca/scripts/default.py b/src/orca/scripts/default.py
index 8154ef0..7afb6a0 100644
--- a/src/orca/scripts/default.py
+++ b/src/orca/scripts/default.py
@@ -43,6 +43,7 @@ import orca.find as find
 import orca.flat_review as flat_review
 import orca.input_event as input_event
 import orca.keybindings as keybindings
+import orca.messages as messages
 import orca.outline as outline
 import orca.orca as orca
 import orca.orca_i18n as orca_i18n
@@ -60,7 +61,6 @@ import orca.notification_messages as notification_messages
 from orca.orca_i18n import _
 from orca.orca_i18n import ngettext
 from orca.orca_i18n import C_
-from orca.orca_platform import version
 
 _settingsManager = settings_manager.getManager()
 
@@ -1524,14 +1524,7 @@ class Script(script.Script):
         Returns True to indicate the input event has been consumed.
         """
 
-        # Translators: Orca normally intercepts all keyboard
-        # commands and only passes them along to the current
-        # application when they are not Orca commands.  This
-        # command causes the next command issued to be passed
-        # along to the current application, bypassing Orca's
-        # interception of it.
-        #
-        self.presentMessage(_("Bypass mode enabled."))
+        self.presentMessage(messages.BYPASS_MODE_ENABLED)
         orca_state.bypassNextCommand = True
         return True
 
@@ -1545,33 +1538,9 @@ class Script(script.Script):
         if orca_state.learnModeEnabled:
             return True
 
-        # Translators: This message presents the Orca version number.
-        self.presentMessage(_("Orca version %s.") % version)
-
-        self.speakMessage(
-            # Translators: Orca has a "Learn Mode" that will allow
-            # the user to type any key on the keyboard and hear what
-            # the effects of that key would be.  The effects might
-            # be what Orca would do if it had a handler for the
-            # particular key combination, or they might just be to
-            # echo the name of the key if Orca doesn't have a handler.
-            # This text here is what is spoken to the user.
-            #
-            _("Entering learn mode.  Press any key to hear its function.  " \
-              "To get a list of Orca shortcuts, press the Orca modifier " \
-              "plus H twice quickly. To view the documentation, press F1. " \
-              "To exit learn mode, press the escape key."))
-
-        # Translators: Orca has a "Learn Mode" that will allow
-        # the user to type any key on the keyboard and hear what
-        # the effects of that key would be.  The effects might
-        # be what Orca would do if it had a handler for the
-        # particular key combination, or they might just be to
-        # echo the name of the key if Orca doesn't have a handler.
-        # This text here is what is to be presented on the braille
-        # display.
-        #
-        self.displayBrailleMessage(_("Learn mode.  Press escape to exit."))
+        self.presentMessage(messages.VERSION)
+        self.speakMessage(messages.LEARN_MODE_START_SPEECH)
+        self.displayBrailleMessage(messages.LEARN_MODE_START_BRAILLE)
         orca_state.learnModeEnabled = True
         return True
 
@@ -1588,16 +1557,7 @@ class Script(script.Script):
            and not inputEvent.event_string == 'Escape':
             return False
 
-        # Translators: Orca has a "Learn Mode" that will allow
-        # the user to type any key on the keyboard and hear what
-        # the effects of that key would be.  The effects might
-        # be what Orca would do if it had a handler for the
-        # particular key combination, or they might just be to
-        # echo the name of the key if Orca doesn't have a handler.
-        # Exiting learn mode puts the user back in normal operating
-        # mode.
-        #
-        self.presentMessage(_("Exiting learn mode."))
+        self.presentMessage(messages.LEARN_MODE_STOP)
         orca_state.learnModeEnabled = False
 
     def enterListShortcutsMode(self, inputEvent):
@@ -1613,26 +1573,8 @@ class Script(script.Script):
         if orca_state.listShortcutsModeEnabled:
             return True
 
-        # Translators: Orca has a 'List Shortcuts' mode by which a user can
-        # navigate through a list of the bound commands in Orca. This is the
-        # message that is presented to the user as confirmation that this
-        # mode has been entered.
-        #
-        mode = _("List shortcuts mode.")
-
-        # Translators: Orca has a 'List Shortcuts' mode by which a user can
-        # navigate through a list of the bound commands in Orca. Pressing 1
-        # presents the commands/shortcuts available for all applications.
-        # These are the "default" commands/shortcuts. Pressing 2 presents
-        # commands/shortcuts Orca provides for the application with focus.
-        # The following message is presented to the user upon entering this
-        # mode.
-        #
-        message = _("Press 1 for Orca's default shortcuts. Press 2 for " \
-                    "Orca's shortcuts for the current application. " \
-                    "Press escape to exit.")
-
-        message = mode + " " + message
+        message = "%s %s" % (messages.LIST_SHORTCUTS_MODE_START,
+                             messages.LIST_SHORTCUTS_MODE_TUTORIAL)
         self.speakMessage(message)
         self.displayBrailleMessage(message, -1, -1)
         orca_state.listShortcutsModeEnabled = True
@@ -1648,17 +1590,7 @@ class Script(script.Script):
         orca_state.typeOfShortcuts = ""
         orca_state.ptrToShortcut = -1
         orca_state.listShortcutsModeEnabled = False
-
-        # Translators: Orca has a "List Shortcuts Mode" that allows the user to
-        # list a group of keyboard shortcuts. Pressing 1 makes it possible for
-        # the user to navigate amongst a list of global ("default") commands.
-        # Pressing 2 allows the user to navigate amongst Orca commands specific
-        # to the application with focus. Escape exists this mode. This string
-        # is the prompt which will be presented to the user in both speech and
-        # braille upon exiting this mode.
-        #
-        message = _("Exiting list shortcuts mode.")
-        self.presentMessage(message)
+        self.presentMessage(messages.LIST_SHORTCUTS_MODE_STOP)
         return True
 
     def findNext(self, inputEvent):
@@ -1933,18 +1865,8 @@ class Script(script.Script):
                 try:
                     eventsynthesizer.routeToObject(orca_state.locusOfFocus)
                 except:
-                    # Translators: Orca has a command that allows the user to
-                    # move the mouse pointer to the current object. This is a
-                    # detailed message which will be presented if for some
-                    # reason Orca cannot identify/find the current location.
-                    #
-                    full = _("Could not find current location.")
-                    # Translators: Orca has a command that allows the user to
-                    # move the mouse pointer to the current object. This is a
-                    # brief message which will be presented if for some reason
-                    # Orca cannot identify/find the current location.
-                    #
-                    brief = C_("location", "Not found")
+                    full = messages.LOCATION_NOT_FOUND_FULL
+                    brief = messages.LOCATION_NOT_FOUND_BRIEF
                     self.presentMessage(full, brief)
 
         return True
@@ -2046,14 +1968,9 @@ class Script(script.Script):
 
             self.outputCharAttributes(userAttrList, attributes)
 
-            # If this is a hypertext link, then let the user know:
-            #
             if self.utilities.linkIndex(
                 orca_state.locusOfFocus, caretOffset) >= 0:
-                # Translators: this indicates that this piece of
-                # text is a hypertext link.
-                #
-                speech.speak(_("link"))
+                speech.speak(messages.LINK)
 
         return True
 
@@ -2069,12 +1986,7 @@ class Script(script.Script):
                 try:
                     eventsynthesizer.clickObject(orca_state.locusOfFocus, 1)
                 except:
-                    # Translators: Orca has a command that allows the user
-                    # to move the mouse pointer to the current object. If
-                    # for some reason Orca cannot identify the current
-                    # location, it will speak this message.
-                    #
-                    self.speakMessage(_("Could not find current location."))
+                    self.speakMessage(messages.LOCATION_NOT_FOUND_FULL)
         return True
 
     def rightClickReviewItem(self, inputEvent=None):
@@ -2089,18 +2001,8 @@ class Script(script.Script):
                 try:
                     eventsynthesizer.clickObject(orca_state.locusOfFocus, 3)
                 except:
-                    # Translators: Orca has a command that allows the user to
-                    # move the mouse pointer to the current object. This is a
-                    # detailed message which will be presented if for some
-                    # reason Orca cannot identify/find the current location.
-                    #
-                    full = _("Could not find current location.")
-                    # Translators: Orca has a command that allows the user to
-                    # move the mouse pointer to the current object. This is a
-                    # brief message which will be presented if for some reason
-                    # Orca cannot identify/find the current location.
-                    #
-                    brief = C_("location", "Not found")
+                    full = messages.LOCATION_NOT_FOUND_FULL
+                    brief = messages.LOCATION_NOT_FOUND_BRIEF
                     self.presentMessage(full, brief)
 
         return True
@@ -2142,23 +2044,14 @@ class Script(script.Script):
             if (not wordString) \
                or (not len(wordString)) \
                or (wordString == "\n"):
-                # Translators: "blank" is a short word to mean the
-                # user has navigated to an empty line.
-                #
-                speech.speak(_("blank"))
+                speech.speak(messages.BLANK)
             else:
                 [lineString, x, y, width, height] = \
                          context.getCurrent(flat_review.Context.LINE)
                 if lineString == "\n":
-                    # Translators: "blank" is a short word to mean the
-                    # user has navigated to an empty line.
-                    #
-                    speech.speak(_("blank"))
+                    speech.speak(messages.BLANK)
                 elif wordString.isspace():
-                    # Translators: "white space" is a short phrase to mean the
-                    # user has navigated to a line with only whitespace on it.
-                    #
-                    speech.speak(_("white space"))
+                    speech.speak(messages.WHITE_SPACE)
                 elif wordString.isupper() and speechType == 1:
                     speech.speak(wordString,
                                  self.voices[settings.UPPERCASE_VOICE])
@@ -2269,18 +2162,12 @@ class Script(script.Script):
         #
         if not isinstance(inputEvent, input_event.BrailleEvent):
             if (not charString) or (not len(charString)):
-                # Translators: "blank" is a short word to mean the
-                # user has navigated to an empty line.
-                #
-                speech.speak(_("blank"))
+                speech.speak(messages.BLANK)
             else:
                 [lineString, x, y, width, height] = \
                          context.getCurrent(flat_review.Context.LINE)
                 if lineString == "\n" and speechType != 3:
-                    # Translators: "blank" is a short word to mean the
-                    # user has navigated to an empty line.
-                    #
-                    speech.speak(_("blank"))
+                    speech.speak(messages.BLANK)
                 elif speechType == 3:
                     self.speakUnicodeCharacter(charString)
                 elif speechType == 2:
@@ -2411,15 +2298,9 @@ class Script(script.Script):
             if (not lineString) \
                or (not len(lineString)) \
                or (lineString == "\n"):
-                # Translators: "blank" is a short word to mean the
-                # user has navigated to an empty line.
-                #
-                speech.speak(_("blank"))
+                speech.speak(messages.BLANK)
             elif lineString.isspace():
-                # Translators: "white space" is a short phrase to mean the
-                # user has navigated to a line with only whitespace on it.
-                #
-                speech.speak(_("white space"))
+                speech.speak(messages.WHITE_SPACE)
             elif lineString.isupper() \
                  and (speechType < 2 or speechType > 3):
                 speech.speak(lineString, self.voices[settings.UPPERCASE_VOICE])
@@ -2536,27 +2417,9 @@ class Script(script.Script):
             clipboard = Gtk.Clipboard.get(Gdk.Atom.intern("CLIPBOARD", False))
             clipboard.set_text(
                 self.currentReviewContents, len(self.currentReviewContents))
-            # Translators: the 'flat review' feature of Orca
-            # allows the blind user to explore the text in a
-            # window in a 2D fashion.  That is, Orca treats all
-            # the text from all objects in a window (e.g.,
-            # buttons, labels, etc.) as a sequence of words in a
-            # sequence of lines.  This message is spoken to let
-            # the user to know that they have successfully copied
-            # the contents under flat review to the clipboard.
-            #
-            self.presentMessage(_("Copied contents to clipboard."))
+            self.presentMessage(messages.FLAT_REVIEW_COPIED)
         else:
-            # Translators: the 'flat review' feature of Orca
-            # allows the blind user to explore the text in a
-            # window in a 2D fashion.  That is, Orca treats all
-            # the text from all objects in a window (e.g.,
-            # buttons, labels, etc.) as a sequence of words in a
-            # sequence of lines. If this error message is spoken,
-            # it means that the user attempted to use a flat review
-            # command when not using flat review.
-            #
-            self.presentMessage(_("Not using flat review."))
+            self.presentMessage(messages.FLAT_REVIEW_NOT_IN)
 
         return True
 
@@ -2579,28 +2442,9 @@ class Script(script.Script):
             clipboard = Gtk.Clipboard.get(Gdk.Atom.intern("CLIPBOARD", False))
             clipboard.request_text(
                 self._appendToClipboard, self.currentReviewContents)
-            # Translators: the 'flat review' feature of Orca
-            # allows the blind user to explore the text in a
-            # window in a 2D fashion.  That is, Orca treats all
-            # the text from all objects in a window (e.g.,
-            # buttons, labels, etc.) as a sequence of words in a
-            # sequence of lines.  This message is spoken to let
-            # the user to know that they have successfully appended
-            # the contents under flat review onto the existing contents
-            # of the clipboard.
-            #
-            self.presentMessage(_("Appended contents to clipboard."))
+            self.presentMessage(messages.FLAT_REVIEW_APPENDED)
         else:
-            # Translators: the 'flat review' feature of Orca
-            # allows the blind user to explore the text in a
-            # window in a 2D fashion.  That is, Orca treats all
-            # the text from all objects in a window (e.g.,
-            # buttons, labels, etc.) as a sequence of words in a
-            # sequence of lines. If this error message is spoken,
-            # it means that the user attempted to use a flat review
-            # command when not using flat review.
-            #
-            self.presentMessage(_("Not using flat review."))
+            self.presentMessage(messages.FLAT_REVIEW_NOT_IN)
 
         return True
 
@@ -2656,33 +2500,13 @@ class Script(script.Script):
         verbosity = _settingsManager.getSetting('speechVerbosityLevel')
         if self.flatReviewContext:
             if inputEvent and verbosity != settings.VERBOSITY_LEVEL_BRIEF:
-                # Translators: the 'flat review' feature of Orca
-                # allows the blind user to explore the text in a
-                # window in a 2D fashion.  That is, Orca treats all
-                # the text from all objects in a window (e.g.,
-                # buttons, labels, etc.) as a sequence of words in a
-                # sequence of lines.  The flat review feature allows
-                # the user to explore this text by the {previous,next}
-                # {line,word,character}.  This message lets the user know
-                # they have left the flat review feature.
-                #
-                self.presentMessage(_("Leaving flat review."))
+                self.presentMessage(messages.FLAT_REVIEW_STOP)
             self.drawOutline(-1, 0, 0, 0)
             self.flatReviewContext = None
             self.updateBraille(orca_state.locusOfFocus)
         else:
             if inputEvent and verbosity != settings.VERBOSITY_LEVEL_BRIEF:
-                # Translators: the 'flat review' feature of Orca
-                # allows the blind user to explore the text in a
-                # window in a 2D fashion.  That is, Orca treats all
-                # the text from all objects in a window (e.g.,
-                # buttons, labels, etc.) as a sequence of words in a
-                # sequence of lines.  The flat review feature allows
-                # the user to explore this text by the {previous,next}
-                # {line,word,character}.  This message lets the user know
-                # they have entered the flat review feature.
-                #
-                self.presentMessage(_("Entering flat review."))
+                self.presentMessage(messages.FLAT_REVIEW_START)
             context = self.getFlatReviewContext()
             [wordString, x, y, width, height] = \
                      context.getCurrent(flat_review.Context.WORD)
@@ -2699,15 +2523,9 @@ class Script(script.Script):
         speech.stop()
         if _settingsManager.getSetting('silenceSpeech'):
             _settingsManager.setSetting('silenceSpeech', False)
-            # Translators: this is a spoken prompt letting the user know
-            # that speech synthesis has been turned back on.
-            #
-            self.presentMessage(_("Speech enabled."))
+            self.presentMessage(messages.SPEECH_ENABLED)
         else:
-            # Translators: this is a spoken prompt letting the user know
-            # that speech synthesis has been temporarily turned off.
-            #
-            self.presentMessage(_("Speech disabled."))
+            self.presentMessage(messages.SPEECH_DISABLED)
             _settingsManager.setSetting('silenceSpeech', True)
         return True
 
@@ -2717,26 +2535,11 @@ class Script(script.Script):
         value = _settingsManager.getSetting('enableSpeechIndentation')
         _settingsManager.setSetting('enableSpeechIndentation', not value)
         if _settingsManager.getSetting('enableSpeechIndentation'):
-            # Translators: This is a detailed message indicating that
-            # indentation and justification will be spoken.
-            #
-            full = _("Speaking of indentation and justification enabled.")
-            # Translators: This is a brief message that will be presented
-            # to the user who has just enabled/disabled the speaking of
-            # indentation and justification information.
-            #
-            brief = C_("indentation and justification", "Enabled")
+            full = messages.INDENTATION_JUSTIFICATION_ON_FULL
+            brief = messages.INDENTATION_JUSTIFICATION_ON_BRIEF
         else:
-            # Translators: This is a detailed message indicating that
-            # indentation and justification will not be spoken.
-            #
-            full = _("Speaking of indentation and justification disabled.")
-            # Translators: This is a brief message that will be presented
-            # to the user who has just enabled/disabled the speaking of
-            # indentation and justification information.
-            #
-            brief = C_("indentation and justification", "Disabled")
-
+            full = messages.INDENTATION_JUSTIFICATION_OFF_FULL
+            brief = messages.INDENTATION_JUSTIFICATION_OFF_BRIEF
         self.presentMessage(full, brief)
 
         return True
@@ -2747,61 +2550,20 @@ class Script(script.Script):
         currentLevel = _settingsManager.getSetting('verbalizePunctuationStyle')
         if currentLevel == settings.PUNCTUATION_STYLE_NONE:
             newLevel = settings.PUNCTUATION_STYLE_SOME
-            # Translators: This detailed message will be presented as the
-            # user cycles through the different levels of spoken punctuation.
-            # The options are: All puntuation marks will be spoken, None
-            # will be spoken, Most will be spoken, or Some will be spoken.
-            #
-            full = _("Punctuation level set to some.")
-            # Translators: This brief message will be presented as the user
-            # cycles through the different levels of spoken punctuation.
-            # The options are: All puntuation marks will be spoken, None
-            # will be spoken, Most will be spoken, or Some will be spoken.
-            #
-            brief = C_("spoken punctuation", "Some")
+            full = messages.PUNCTUATION_SOME_FULL
+            brief = messages.PUNCTUATION_SOME_BRIEF
         elif currentLevel == settings.PUNCTUATION_STYLE_SOME:
             newLevel = settings.PUNCTUATION_STYLE_MOST
-            # Translators: This detailed message will be presented as the
-            # user cycles through the different levels of spoken punctuation.
-            # The options are: All puntuation marks will be spoken, None
-            # will be spoken, Most will be spoken, or Some will be spoken.
-            #
-            full = _("Punctuation level set to most.")
-            # Translators: This brief message will be presented as the user
-            # cycles through the different levels of spoken punctuation.
-            # The options are: All puntuation marks will be spoken, None
-            # will be spoken, Most will be spoken, or Some will be spoken.
-            #
-            brief = C_("spoken punctuation", "Most")
+            full = messages.PUNCTUATION_MOST_FULL
+            brief = messages.PUNCTUATION_MOST_BRIEF
         elif currentLevel == settings.PUNCTUATION_STYLE_MOST:
             newLevel = settings.PUNCTUATION_STYLE_ALL
-            # Translators: This detailed message will be presented as the
-            # user cycles through the different levels of spoken punctuation.
-            # The options are: All puntuation marks will be spoken, None
-            # will be spoken, Most will be spoken, or Some will be spoken.
-            #
-            full = _("Punctuation level set to all.")
-            # Translators: This brief message will be presented as the user
-            # cycles through the different levels of spoken punctuation.
-            # The options are: All puntuation marks will be spoken, None
-            # will be spoken, Most will be spoken, or Some will be spoken.
-            #
-            brief = C_("spoken punctuation", "All")
+            full = messages.PUNCTUATION_ALL_FULL
+            brief = messages.PUNCTUATION_ALL_BRIEF
         else:
-            # the all case, so cycle to none.
             newLevel = settings.PUNCTUATION_STYLE_NONE
-            # Translators: This detailed message will be presented as the
-            # user cycles through the different levels of spoken punctuation.
-            # The options are: All puntuation marks will be spoken, None
-            # will be spoken, Most will be spoken, or Some will be spoken.
-            #
-            full = _("Punctuation level set to none.")
-            # Translators: This brief message will be presented as the user
-            # cycles through the different levels of spoken punctuation.
-            # The options are: All puntuation marks will be spoken, None
-            # will be spoken, Most will be spoken, or Some will be spoken.
-            #
-            brief = C_("spoken punctuation", "None")
+            full = messages.PUNCTUATION_NONE_FULL
+            brief = messages.PUNCTUATION_NONE_BRIEF
 
         _settingsManager.setSetting('verbalizePunctuationStyle', newLevel)
         self.presentMessage(full, brief)
@@ -2813,14 +2575,7 @@ class Script(script.Script):
 
         profiles = _settingsManager.availableProfiles()
         if not (profiles and profiles[0]):
-            # Translators: This is an error message presented when the user
-            # attempts to cycle among his/her saved profiles, but no profiles
-            # can be found. A profile is a collection of settings which apply
-            # to a given task, such as a "Spanish" profile which would use
-            # Spanish text-to-speech and Spanish braille and selected when
-            # reading Spanish content.
-            #
-            self.presentMessage(_("No profiles found."))
+            self.presentMessage(messages.PROFILE_NOT_FOUND)
             return True
 
         isMatch = lambda x: x[1] == _settingsManager.getProfile()
@@ -2837,18 +2592,12 @@ class Script(script.Script):
         # Once we sort out all of the language changing details, this
         # code probably should go somewhere else.
         if oldVoiceLocale != newVoiceLocale:
-            modules = ['orca.chnames']
+            modules = ['orca.chnames', 'orca.keynames', 'orca.phonnames',
+                       'orca.text_attribute_names.py', 'orca.messages']
             for module in modules:
                 orca_i18n.setModuleLocale(module, newVoiceLocale)
 
-        # Translators: This is a detailed message which will be presented
-        # as the user cycles amongst his/her saved profiles. A "profile"
-        # is a collection of settings which apply to a given task, such
-        # as a "Spanish" profile which would use Spanish text-to-speech
-        # and Spanish braille and selected when reading Spanish content.
-        # The string representing the profile name is something created
-        # by the user.
-        self.presentMessage(_("Profile set to %s.") % name, name)
+        self.presentMessage(messages.PROFILE_CHANGED % name, name)
         return True
 
     def cycleCapitalizationStyle(self, inputEvent=None):
@@ -2857,82 +2606,16 @@ class Script(script.Script):
         currentStyle = _settingsManager.getSetting('capitalizationStyle')
         if currentStyle == settings.CAPITALIZATION_STYLE_NONE:
             newStyle = settings.CAPITALIZATION_STYLE_SPELL
-            # Translators: Orca uses Speech Dispatcher to present content
-            # to users via text-to-speech. Speech Dispatcher has a feature
-            # to control how capital letters are presented: Do nothing at
-            # all, say the word 'capital' prior to presenting a capital
-            # letter, or play a tone which Speech Dispatcher refers to as
-            # a sound 'icon'. This string to be translated refers to the
-            # full/verbose output presented in response to the use of an
-            # Orca command which makes it possible for users to quickly
-            # cycle amongst these alternatives without having to get into
-            # a GUI.
-            #
-            full = _("Capitalization style set to spell.")
-            # Translators: Orca uses Speech Dispatcher to present content
-            # to users via text-to-speech. Speech Dispatcher has a feature
-            # to control how capital letters are presented: Do nothing at
-            # all, say the word 'capital' prior to presenting a capital
-            # letter, or play a tone which Speech Dispatcher refers to as
-            # a sound 'icon'. This string to be translated refers to the
-            # brief/non-verbose output presented in response to the use of
-            # an Orca command which makes it possible for users to quickly
-            # cycle amongst these alternatives without having to get into
-            # a GUI.
-            #
-            brief = C_("capitalization style", "spell")
+            full = messages.CAPITALIZATION_SPELL_FULL
+            brief = messages.CAPITALIZATION_SPELL_BRIEF
         elif currentStyle == settings.CAPITALIZATION_STYLE_SPELL:
             newStyle = settings.CAPITALIZATION_STYLE_ICON
-            # Translators: Orca uses Speech Dispatcher to present content
-            # to users via text-to-speech. Speech Dispatcher has a feature
-            # to control how capital letters are presented: Do nothing at
-            # all, say the word 'capital' prior to presenting a capital
-            # letter, or play a tone which Speech Dispatcher refers to as
-            # a sound 'icon'. This string to be translated refers to the
-            # full/verbose output presented in response to the use of an
-            # Orca command which makes it possible for users to quickly
-            # cycle amongst these alternatives without having to get into
-            # a GUI.
-            #
-            full = _("Capitalization style set to icon.")
-            # Translators: Orca uses Speech Dispatcher to present content
-            # to users via text-to-speech. Speech Dispatcher has a feature
-            # to control how capital letters are presented: Do nothing at
-            # all, say the word 'capital' prior to presenting a capital
-            # letter, or play a tone which Speech Dispatcher refers to as
-            # a sound 'icon'. This string to be translated refers to the
-            # brief/non-verbose output presented in response to the use of
-            # an Orca command which makes it possible for users to quickly
-            # cycle amongst these alternatives without having to get into
-            # a GUI.
-            #
-            brief = C_("capitalization style", "icon")
+            full = messages.CAPITALIZATION_ICON_FULL
+            brief = messages.CAPITALIZATION_ICON_BRIEF
         else:
             newStyle = settings.CAPITALIZATION_STYLE_NONE
-            # Translators: Orca uses Speech Dispatcher to present content
-            # to users via text-to-speech. Speech Dispatcher has a feature
-            # to control how capital letters are presented: Do nothing at
-            # all, say the word 'capital' prior to presenting a capital
-            # letter, or play a tone which Speech Dispatcher refers to as
-            # a sound 'icon'. This string to be translated refers to the
-            # full/verbose output presented in response to the use of an
-            # Orca command which makes it possible for users to quickly
-            # cycle amongst these alternatives without having to get into
-            # a GUI.
-            #
-            full = _("Capitalization style set to none.")
-            # Translators: Orca uses Speech Dispatcher to present content
-            # to users via text-to-speech. Speech Dispatcher has a feature
-            # to control how capital letters are presented: Do nothing at
-            # all, say the word 'capital' prior to presenting a capital
-            # letter, or play a tone which Speech Dispatcher refers to as
-            # a sound 'icon'. This string to be translated refers to the
-            # brief/non-verbose output presented in response to the use of
-            # an Orca command which makes it possible for users to quickly
-            # cycle amongst these alternatives without having to get into
-            # a GUI.
-            #
-            brief = C_("capitalization style", "none")
+            full = messages.CAPITALIZATION_NONE_FULL
+            brief = messages.CAPITALIZATION_NONE_BRIEF
 
         _settingsManager.setSetting('capitalizationStyle', newStyle)
         self.presentMessage(full, brief)
@@ -2945,203 +2628,30 @@ class Script(script.Script):
         word = _settingsManager.getSetting('enableEchoByWord')
         sentence = _settingsManager.getSetting('enableEchoBySentence')
 
-        # check if we are in the none case.
         if (key, word, sentence) == (False, False, False):
-            # cycle to key echo
             (newKey, newWord, newSentence) = (True, False, False)
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command.
-            #
-            full = _("Key echo set to key.")
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command. The following string is a
-            # brief message which will be presented to the user who is
-            # cycling amongst the various echo options.
-            #
-            brief = C_("key echo", "key")
-
-        # The key echo only case
+            full = messages.KEY_ECHO_KEY_FULL
+            brief = messages.KEY_ECHO_KEY_BRIEF
         elif (key, word, sentence) == (True, False, False):
-            # cycle to word echo
             (newKey, newWord, newSentence) = (False, True, False)
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command.
-            #
-            full = _("Key echo set to word.")
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command. The following string is a
-            # brief message which will be presented to the user who is
-            # cycling amongst the various echo options.
-            #
-            brief = C_("key echo", "word")
-
-        # the word only case
+            full = messages.KEY_ECHO_WORD_FULL
+            brief = messages.KEY_ECHO_WORD_BRIEF
         elif (key, word, sentence) == (False, True, False):
-            # cycle to sentence echo
             (newKey, newWord, newSentence) = (False, False, True)
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command.
-            #
-            full = _("Key echo set to sentence.")
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command. The following string is a
-            # brief message which will be presented to the user who is
-            # cycling amongst the various echo options.
-            #
-            brief = C_("key echo", "sentence")
-
-        # the sentence only case
+            full = messages.KEY_ECHO_SENTENCE_FULL
+            brief = messages.KEY_ECHO_SENTENCE_BRIEF
         elif (key, word, sentence) == (False, False, True):
-            # cycle to word and key echo
             (newKey, newWord, newSentence) = (True, True, False)
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command.
-            #
-            full = _("Key echo set to key and word.")
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command. The following string is a
-            # brief message which will be presented to the user who is
-            # cycling amongst the various echo options.
-            #
-            brief = C_("key echo", "key and word")
-
-        # the key and word case
+            full = messages.KEY_ECHO_KEY_AND_WORD_FULL
+            brief = messages.KEY_ECHO_KEY_AND_WORD_BRIEF
         elif (key, word, sentence) == (True, True, False):
-            # cycle to word and sentence echo
             (newKey, newWord, newSentence) = (False, True, True)
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command.
-            #
-            full = _("Key echo set to word and sentence.")
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command. The following string is a
-            # brief message which will be presented to the user who is
-            # cycling amongst the various echo options.
-            #
-            brief = C_("key echo", "word and sentence")
-
-        # cycle round
+            full = messages.KEY_ECHO_WORD_AND_SENTENCE_FULL
+            brief = messages.KEY_ECHO_WORD_AND_SENTENCE_BRIEF
         else:
-            # cycle to none
             (newKey, newWord, newSentence) = (False, False, False)
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command.
-            #
-            full = _("Key echo set to None.")
-            # Translators: Orca has an "echo" setting which allows
-            # the user to configure what is spoken in response to a
-            # key press. Given a user who typed "Hello world.":
-            # - key echo: "H e l l o space w o r l d period"
-            # - word echo: "Hello" spoken when the space is pressed;
-            #   "world" spoken when the period is pressed.
-            # - sentence echo: "Hello world" spoken when the period
-            #   is pressed.
-            # A user can choose to have no echo, one type of echo, or
-            # multiple types of echo and can cycle through the various
-            # levels quickly via a command. The following string is a
-            # brief message which will be presented to the user who is
-            # cycling amongst the various echo options.
-            #
-            brief = C_("key echo", "None")
+            full = messages.KEY_ECHO_NONE_FULL
+            brief = messages.KEY_ECHO_NONE_BRIEF
 
         _settingsManager.setSetting('enableKeyEcho', newKey)
         _settingsManager.setSetting('enableEchoByWord', newWord)
@@ -3149,7 +2659,6 @@ class Script(script.Script):
         self.presentMessage(full, brief)
         return True
 
-
     def toggleTableCellReadMode(self, inputEvent=None):
         """Toggles an indicator for whether we should just read the current
         table cell or read the whole row."""
@@ -3157,17 +2666,9 @@ class Script(script.Script):
         speakRow = _settingsManager.getSetting('readTableCellRow')
         _settingsManager.setSetting('readTableCellRow', not speakRow)
         if not speakRow:
-            # Translators: when users are navigating a table, they
-            # sometimes want the entire row of a table read, or
-            # they just want the current cell to be presented to them.
-            #
-            line = _("Speak row")
+            line = messages.TABLE_MODE_ROW
         else:
-            # Translators: when users are navigating a table, they
-            # sometimes want the entire row of a table read, or
-            # they just want the current cell to be presented to them.
-            #
-            line = _("Speak cell")
+            line = messages.TABLE_MODE_CELL
 
         self.presentMessage(line)
 
@@ -3446,11 +2947,7 @@ class Script(script.Script):
 
         utterances = []
         utterances.append(textContents)
-
-        # Translators: when the user selects (highlights) text in
-        # a document, Orca lets them know this.
-        #
-        utterances.append(C_("text", "selected"))
+        utterances.append(messages.TEXT_SELECTED)
         speech.speak(utterances)
 
     def onNameChanged(self, event):
@@ -3581,17 +3078,9 @@ class Script(script.Script):
             if announceState:
                 voice = self.voices.get(settings.SYSTEM_VOICE)
                 if event.detail1:
-                    # Translators: this object is now selected.
-                    # Let the user know this.
-                    #
-                    #
-                    speech.speak(C_("text", "selected"), voice, False)
+                    speech.speak(messages.TEXT_SELECTED, voice, False)
                 else:
-                    # Translators: this object is now unselected.
-                    # Let the user know this.
-                    #
-                    #
-                    speech.speak(C_("text", "unselected"), voice, False)
+                    speech.speak(messages.TEXT_UNSELECTED, voice, False)
                 return
 
         if event.type.startswith("object:state-changed:focused"):
@@ -3685,11 +3174,7 @@ class Script(script.Script):
                     event.source, prevWordAndOffsets[1] ) \
                or self.utilities.isWordMisspelled(
                     event.source, nextWordAndOffsets[1]):
-                # Translators: this is to inform the user of the presence
-                # of the red squiggly line which indicates that a given
-                # word is not spelled correctly.
-                #
-                self.speakMessage(_("misspelled"))
+                self.speakMessage(messages.MISSPELLED)
 
     def onTextDeleted(self, event):
         """Called whenever text is deleted from an object.
@@ -4000,9 +3485,7 @@ class Script(script.Script):
         if event.source != parentTable:
             return
 
-        # Translators: This is a message presented to users when the
-        # columns in a table have been reordered.
-        self.presentMessage(_("Columns reordered"))
+        self.presentMessage(messages.TABLE_REORDERED_COLUMNS)
 
     def onRowReordered(self, event):
         """Called whenever the rows in a table are reordered.
@@ -4016,10 +3499,7 @@ class Script(script.Script):
         if event.source != parentTable:
             return
 
-        # Translators: This is a message presented to users when the
-        # rows in a table have been reordered, as would happen when
-        # re-sorting the table by clicking on its header.
-        self.presentMessage(_("Rows reordered"))
+        self.presentMessage(messages.TABLE_REORDERED_ROWS)
 
     def onValueChanged(self, event):
         """Called whenever an object's value changes.  Currently, the
@@ -4646,11 +4126,7 @@ class Script(script.Script):
                             index = 0
                             for key in list(self.lastProgressBarTime.keys()):
                                 if key == obj and key != mostRecentUpdate[0]:
-                                    # Translators: this is an index value
-                                    # so that we can tell which progress bar
-                                    # we are referring to.
-                                    #
-                                    label = _("Progress bar %d.") % (index + 1)
+                                    label = messages.PROGRESS_BAR_NUMBER % (index + 1)
                                     utterances.append(label)
                                 else:
                                     index += 1
@@ -4684,9 +4160,7 @@ class Script(script.Script):
                     #
                     if key == "weight" \
                        and (attribute == "bold" or int(attribute) > 400):
-                        # Translators: bold as in the font sense.
-                        #
-                        line = _("bold")
+                        line = messages.BOLD
                     elif key in ["left-margin", "right-margin"]:
                         # We need to test if we are getting a margin value
                         # that includes unit information (OOo now provides
@@ -4802,20 +4276,14 @@ class Script(script.Script):
                 # This is a blank line. Announce it if the user requested
                 # that blank lines be spoken.
                 if speakBlankLines:
-                    # Translators: "blank" is a short word to mean the
-                    # user has navigated to an empty line.
-                    #
-                    self.speakMessage(_("blank"), interrupt=False)
+                    self.speakMessage(messages.BLANK, interrupt=False)
                 return
 
         if character in ["\n", "\r\n"]:
             # This is a blank line. Announce it if the user requested
             # that blank lines be spoken.
             if speakBlankLines:
-                # Translators: "blank" is a short word to mean the
-                # user has navigated to an empty line.
-                #
-                self.speakMessage(_("blank"), interrupt=False)
+                self.speakMessage(messages.BLANK, interrupt=False)
             return
         else:
             self.speakMisspelledIndicator(obj, offset)
@@ -5109,14 +4577,8 @@ class Script(script.Script):
             context = self.getFlatReviewContext()
             location = query.findQuery(context, self.justEnteredFlatReviewMode)
             if not location:
-                # Translators: the Orca "Find" dialog allows a user to
-                # search for text in a window and then move focus to
-                # that text.  For example, they may want to find the
-                # "OK" button.  This message lets them know a string
-                # they were searching for was not found.
-                #
                 message = _("string not found")
-                self.presentMessage(message)
+                self.presentMessage(messages.STRING_NOT_FOUND)
             else:
                 context.setCurrent(location.lineIndex, location.zoneIndex, \
                                    location.wordIndex, location.charIndex)
@@ -5182,20 +4644,9 @@ class Script(script.Script):
                 if maxIndex > (len(allTokens) - 1):
                     maxIndex = len(allTokens) - 1
 
-                # Translators: Orca will provide more compelling output of
-                # the spell checking dialog in some applications.  The first
-                # thing it does is let them know what the misspelled word
-                # is.
-                #
-                utterances = [_("Misspelled word: %s") % badWord]
-
-                # Translators: Orca will provide more compelling output of
-                # the spell checking dialog in some applications.  The second
-                # thing it does is give the phrase containing the misspelled
-                # word in the document.  This is known as the context.
-                #
+                utterances = [messages.MISSPELLED_WORD % badWord]
                 contextPhrase = " ".join(allTokens[minIndex:maxIndex+1])
-                utterances.append(_("Context is %s") % contextPhrase)
+                utterances.append(messages.MISSPELLED_WORD_CONTEXT % contextPhrase)
 
                 # Turn the list of utterances into a string.
                 text = " ".join(utterances)
@@ -5442,16 +4893,10 @@ class Script(script.Script):
               text.getSelection(i))
 
     def _getCtrlShiftSelectionsStrings(self):
-        return [
-            # Translators: when the user selects (highlights) text in
-            # a document, Orca will speak information about what they
-            # have selected.
-            #
-            _("paragraph selected down from cursor position"),
-            _("paragraph unselected down from cursor position"),
-            _("paragraph selected up from cursor position"),
-            _("paragraph unselected up from cursor position"),
-        ]
+        return [messages.PARAGRAPH_SELECTED_DOWN,
+                messages.PARAGRAPH_UNSELECTED_DOWN,
+                messages.PARAGRAPH_SELECTED_UP,
+                messages.PARAGRAPH_UNSELECTED_UP]
 
     def speakTextSelectionState(self, obj, startOffset, endOffset):
         """Speak "selected" if the text was just selected, "unselected" if
@@ -5500,47 +4945,24 @@ class Script(script.Script):
         specialCaseFound = False
         if (eventStr == "Page_Down") and isShiftKey and isControlKey:
             specialCaseFound = True
-            # Translators: when the user selects (highlights) text in
-            # a document, Orca will speak information about what they
-            # have selected.
-            #
-            line = _("line selected to end from previous cursor position")
-
+            line = messages.LINE_SELECTED_RIGHT
         elif (eventStr == "Page_Up") and isShiftKey and isControlKey:
             specialCaseFound = True
-            # Translators: when the user selects (highlights) text in
-            # a document, Orca will speak information about what they
-            # have selected.
-            #
-            line = _("line selected from start to previous cursor position")
+            line = messages.LINE_SELECTED_LEFT
 
         elif (eventStr == "Page_Down") and isShiftKey and not isControlKey:
             specialCaseFound = True
             if selectedText:
-                # Translators: when the user selects (highlights) text in
-                # a document, Orca will speak information about what they
-                # have selected.
-                #
-                line = _("page selected from cursor position")
+                line = messages.PAGE_SELECTED_DOWN
             else:
-                # Translators: when the user unselects text in a document,
-                # Orca will speak information about what they have unselected.
-                #
-                line = _("page unselected from cursor position")
+                line = messages.PAGE_UNSELECTED_DOWN
 
         elif (eventStr == "Page_Up") and isShiftKey and not isControlKey:
             specialCaseFound = True
             if selectedText:
-                # Translators: when the user selects (highlights) text in
-                # a document, Orca will speak information about what they
-                # have selected.
-                #
-                line = _("page selected to cursor position")
+                line = messages.PAGE_SELECTED_UP
             else:
-                # Translators: when the user unselects text in a document,
-                # Orca will speak information about what they have unselected.
-                #
-                line = _("page unselected to cursor position")
+                line = messages.PAGE_UNSELECTED_UP
 
         elif (eventStr == "Down") and isShiftKey and isControlKey:
             specialCaseFound = True
@@ -5561,30 +4983,16 @@ class Script(script.Script):
         elif (eventStr == "Home") and isShiftKey and isControlKey:
             specialCaseFound = True
             if selectedText:
-                # Translators: when the user selects (highlights) text in
-                # a document, Orca will speak information about what they
-                # have selected.
-                #
-                line = _("document selected to cursor position")
+                line = messages.DOCUMENT_SELECTED_UP
             else:
-                # Translators: when the user unselects text in a document,
-                # Orca will speak information about what they have unselected.
-                #
-                line = _("document unselected to cursor position")
+                line = messages.DOCUMENT_UNSELECTED_UP
 
         elif (eventStr == "End") and isShiftKey and isControlKey:
             specialCaseFound = True
             if selectedText:
-                # Translators: when the user selects (highlights) text in
-                # a document, Orca will speak information about what they
-                # have selected.
-                #
-                line = _("document selected from cursor position")
+                line = messages.DOCUMENT_SELECTED_DOWN
             else:
-                # Translators: when the user unselects text in a document,
-                # Orca will speak information about what they have unselected.
-                #
-                line = _("document unselected from cursor position")
+                line = messages.DOCUMENT_SELECTED_UP
 
         elif (eventStr == "A") and isControlKey:
             # The user has typed Control-A. Check to see if the entire
@@ -5597,11 +5005,7 @@ class Script(script.Script):
                    startOffset == 0 and endOffset == charCount:
                     specialCaseFound = True
                     self.updateBraille(obj)
-
-                    # Translators: this means the user has selected
-                    # all the text in a document (e.g., Ctrl+a in gedit).
-                    #
-                    line = _("entire document selected")
+                    line = messages.DOCUMENT_SELECTED_ALL
 
         if specialCaseFound:
             speech.speak(line, None, False)
@@ -5644,16 +5048,9 @@ class Script(script.Script):
         if not _settingsManager.getSetting('onlySpeakDisplayedText'):
             voice = self.voices.get(settings.SYSTEM_VOICE)
             if self.utilities.isTextSelected(obj, startOffset, endOffset):
-                # Translators: when the user selects (highlights) text in
-                # a document, Orca lets them know this.
-                #
-                speech.speak(C_("text", "selected"), voice, False)
+                speech.speak(messages.TEXT_SELECTED, voice, False)
             elif len(text.getText(startOffset, endOffset)):
-                # Translators: when the user unselects
-                # (unhighlights) text in a document, Orca lets
-                # them know this.
-                #
-                speech.speak(C_("text", "unselected"), voice, False)
+                speech.speak(messages.TEXT_UNSELECTED, voice, False)
 
         self._saveLastTextSelections(text)
 
@@ -5704,11 +5101,7 @@ class Script(script.Script):
                 text.getTextAtOffset(offset, pyatspi.TEXT_BOUNDARY_WORD_START)
             if self.utilities.isWordMisspelled(obj, offset) \
                and wordAndOffsets[0] != orca_state.lastWordCheckedForSpelling:
-                # Translators: this is to inform the user of the presence
-                # of the red squiggly line which indicates that a given
-                # word is not spelled correctly.
-                #
-                self.speakMessage(_("misspelled"))
+                self.speakMessage(messages.MISSPELLED)
             # Store this word so that we do not continue to present the
             # presence of the red squiggly as the user arrows amongst
             # the characters.
@@ -6167,11 +5560,7 @@ class Script(script.Script):
         Arguments:
         - character: the character to speak information of
         """
-        # Translators: this is information about a unicode character
-        # reported to the user.  The value is the unicode number value
-        # of this character in hex.
-        #
-        speech.speak(_("Unicode %s") % \
+        speech.speak(messages.UNICODE % \
                          self.utilities.unicodeValueString(character))
 
     def presentTime(self, inputEvent):
diff --git a/src/orca/speechdispatcherfactory.py b/src/orca/speechdispatcherfactory.py
index 060eab5..9d992b6 100644
--- a/src/orca/speechdispatcherfactory.py
+++ b/src/orca/speechdispatcherfactory.py
@@ -26,10 +26,7 @@
 #
 # pylint: disable-msg=W0142
 
-"""Provides an Orca speech server for Speech Dispatcher backend.
-
-NOTE: THIS IS EXPERIMENTAL ONLY AND IS NOT A SUPPORTED COMPONENT OF ORCA.
-"""
+"""Provides an Orca speech server for Speech Dispatcher backend."""
 
 __id__ = "$Id$"
 __version__   = "$Revision$"
@@ -43,6 +40,7 @@ import re
 
 from . import chnames
 from . import debug
+from . import messages
 from . import speechserver
 from . import settings
 from . import orca_state
@@ -379,8 +377,9 @@ class SpeechServer(speechserver.SpeechServer):
         acss[ACSS.RATE] = max(0, min(99, rate + delta))
         debug.println(debug.LEVEL_CONFIGURATION,
                       "Speech rate is now %d" % rate)
-        # Translators: This string announces speech rate change.
-        self.speak(decrease and _("slower.") or _("faster."), acss=acss)
+
+        self.speak(decrease and messages.SPEECH_SLOWER \
+                   or messages.SPEECH_FASTER, acss=acss)
 
     def _change_default_speech_pitch(self, decrease=False):
         acss = settings.voices[settings.DEFAULT_VOICE]
@@ -392,8 +391,9 @@ class SpeechServer(speechserver.SpeechServer):
         acss[ACSS.AVERAGE_PITCH] = max(0, min(9, pitch + delta))
         debug.println(debug.LEVEL_CONFIGURATION,
                       "Speech pitch is now %d" % pitch)
-        # Translators: This string announces speech pitch change.
-        self.speak(decrease and _("lower.") or _("higher."), acss=acss)
+
+        self.speak(decrease and messages.SPEECH_LOWER \
+                   or messages.SPEECH_HIGHER, acss=acss)
 
     def getInfo(self):
         return [self._SERVER_NAMES.get(self._id, self._id), self._id]
diff --git a/src/orca/structural_navigation.py b/src/orca/structural_navigation.py
index f665862..078c4bd 100644
--- a/src/orca/structural_navigation.py
+++ b/src/orca/structural_navigation.py
@@ -32,6 +32,7 @@ import pyatspi
 from . import debug
 from . import input_event
 from . import keybindings
+from . import messages
 from . import orca
 from . import orca_gui_navlist
 from . import orca_state
@@ -353,13 +354,7 @@ class StructuralNavigationObject:
         try:
             objects = self.structuralNavigation._getAll(self)
         except:
-            # Translators: Orca has a command that presents a list of
-            # structural navigation objects in a dialog box so that users
-            # can navigate more quickly than they could with native keyboard
-            # navigation. This is a message that will be presented to the
-            # user when an error (such as the operation timing out) kept us
-            # from getting these objects.
-            script.presentMessage(_("Error: Could not create list of objects."))
+            script.presentMessage(messages.NAVIGATION_DIALOG_ERROR)
             return
 
         title, columnHeaders, rowData = self._dialogData()
@@ -427,13 +422,7 @@ class StructuralNavigationObject:
             try:
                 objects = self.structuralNavigation._getAll(self, arg=level)
             except:
-                # Translators: Orca has a command that presents a list of
-                # structural navigation objects in a dialog box so that users
-                # can navigate more quickly than they could with native keyboard
-                # navigation. This is a message that will be presented to the
-                # user when an error (such as the operation timing out) kept us
-                # from getting these objects.
-                script.presentMessage(_("Error: Could not create list of objects."))
+                script.presentMessage(messages.NAVIGATION_DIALOG_ERROR)
                 return
 
             title, columnHeaders, rowData = self._dialogData(arg=level)
@@ -509,10 +498,7 @@ class StructuralNavigationObject:
             if settings.inferLiveRegions:
                 script.liveMngr.goLastLiveRegion()
             else:
-                # Translators: this announces to the user that live region
-                # support has been turned off.
-                #
-                script.presentMessage(_("Live region support is off"))
+                script.presentMessage(messages.LIVE_REGIONS_OFF)
 
         if self.objType == StructuralNavigation.TABLE_CELL:
             return goCell
@@ -740,29 +726,9 @@ class StructuralNavigation:
         self.enabled = not self.enabled
 
         if self.enabled:
-            # Translators: the structural navigation keys are designed
-            # to move the caret around document content by object type.
-            # Thus H moves you to the next heading, Shift H to the
-            # previous heading, T to the next table, and so on. Some
-            # users prefer to turn this off to use Firefox's search
-            # when typing feature.  This message is sent to both the
-            # braille display and the speech synthesizer when the user
-            # toggles the structural navigation feature of Orca.
-            # It should be a brief informative message.
-            #
-            string = _("Structural navigation keys on.")
+            string = messages.STRUCTURAL_NAVIGATION_KEYS_ON
         else:
-            # Translators: the structural navigation keys are designed
-            # to move the caret around document content by object type.
-            # Thus H moves you to the next heading, Shift H to the
-            # previous heading, T to the next table, and so on. Some
-            # users prefer to turn this off to use Firefox's search
-            # when typing feature.  This message is sent to both the
-            # braille display and the speech synthesizer when the user
-            # toggles the structural navigation feature of Orca.
-            # It should be a brief informative message.
-            #
-            string = _("Structural navigation keys off.")
+            string = messages.STRUCTURAL_NAVIGATION_KEYS_OFF
 
         debug.println(debug.LEVEL_CONFIGURATION, string)
         self._script.presentMessage(string)
@@ -796,12 +762,7 @@ class StructuralNavigation:
         try:
             iTable = table.queryTable()
         except:
-            # Translators: this is for navigating document content by
-            # moving from table cell to table cell. If the user gives a
-            # table navigation command but is not in a table, Orca speaks
-            # this message.
-            #
-            self._script.presentMessage(_("Not in a table."))
+            self._script.presentMessage(messages.TABLE_NOT_IN_A)
             return None
 
         currentRow, currentCol = currentCoordinates
@@ -815,40 +776,16 @@ class StructuralNavigation:
             cell = iTable.getAccessibleAt(desiredRow, desiredCol)
             if not cell:
                 if desiredCol < 0:
-                    # Translators: this is for navigating document
-                    # content by moving from table cell to table cell.
-                    # This is the message spoken when the user attempts
-                    # to move to the left of the current cell and is
-                    # already in the first column.
-                    #
-                    self._script.presentMessage(_("Beginning of row."))
+                    self._script.presentMessage(messages.TABLE_ROW_BEGINNING)
                     desiredCol = 0
                 elif desiredCol > iTable.nColumns - 1:
-                    # Translators: this is for navigating document
-                    # content by moving from table cell to table cell.
-                    # This is the message spoken when the user attempts
-                    # to move to the right of the current cell and is
-                    # already in the last column.
-                    #
-                    self._script.presentMessage(_("End of row."))
+                    self._script.presentMessage(messages.TABLE_ROW_END)
                     desiredCol = iTable.nColumns - 1
                 if desiredRow < 0:
-                    # Translators: this is for navigating document
-                    # content by moving from table cell to table cell.
-                    # This is the message spoken when the user attempts
-                    # to move to the cell above the current cell and is
-                    # already in the first row.
-                    #
-                    self._script.presentMessage(_("Top of column."))
+                    self._script.presentMessage(messages.TABLE_COLUMN_TOP)
                     desiredRow = 0
                 elif desiredRow > iTable.nRows - 1:
-                    # Translators: this is for navigating document
-                    # content by moving from table cell to table cell.
-                    # This is the message spoken when the user attempts
-                    # to move to the cell below the current cell and is
-                    # already in the last row.
-                    #
-                    self._script.presentMessage(_("Bottom of column."))
+                    self._script.presentMessage(messages.TABLE_COLUMN_BOTTOM)
                     desiredRow = iTable.nRows - 1
             elif self._script.utilities.isSameObject(thisCell, cell) \
                  or settings.skipBlankCells and self._isBlankCell(cell):
@@ -967,21 +904,9 @@ class StructuralNavigation:
 
         if wrapped:
             if not isNext:
-                # Translators: when the user is attempting to locate a
-                # particular object and the top of a page or list is
-                # reached without that object being found, we "wrap" to
-                # the bottom and continue looking upwards. We need to
-                # inform the user when this is taking place.
-                #
-                self._script.presentMessage(_("Wrapping to bottom."))
+                self._script.presentMessage(messages.WRAPPING_TO_BOTTOM)
             else:
-                # Translators: when the user is attempting to locate a
-                # particular object and the bottom of a page or list is
-                # reached without that object being found, we "wrap" to the
-                # top and continue looking downwards. We need to inform the
-                # user when this is taking place.
-                #
-                self._script.presentMessage(_("Wrapping to top."))
+                self._script.presentMessage(messages.WRAPPING_TO_TOP)
 
         structuralNavigationObject.present(obj, arg)
 
@@ -1999,21 +1924,7 @@ class StructuralNavigation:
             self._setCaretPosition(obj, characterOffset)
             self._presentObject(obj, characterOffset)
         else:
-            # Translators: this is for navigating document content by
-            # moving from anchor to anchor. (An anchor is a named spot
-            # that one can jump to.) This is a detailed message which
-            # will be presented to the user if no more anchors can be found.
-            #
-            full = _("No more anchors.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
+            full = messages.NO_MORE_ANCHORS
             brief = C_("structural navigation", "Not found")
             self._script.presentMessage(full, brief)
 
@@ -2098,22 +2009,8 @@ class StructuralNavigation:
             #
             self._presentLine(obj, characterOffset)
         else:
-            # Translators: this is for navigating document content by
-            # moving from blockquote to blockquote. This is a detailed
-            # message which will be presented to the user if no more
-            # blockquotes can be found.
-            #
-            full = _("No more blockquotes.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_BLOCKQUOTES
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _blockquoteDialogData(self):
@@ -2211,22 +2108,8 @@ class StructuralNavigation:
         if obj:
             obj.queryComponent().grabFocus()
         else:
-            # Translators: this is for navigating document content by
-            # moving from push button to push button in a form. This is
-            # a detailed message which will be presented to the user if
-            # no more push buttons can be found.
-            #
-            full = _("No more buttons.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_BUTTONS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _buttonDialogData(self):
@@ -2324,22 +2207,8 @@ class StructuralNavigation:
         if obj:
             obj.queryComponent().grabFocus()
         else:
-            # Translators: this is for navigating document content by
-            # moving from checkbox to checkbox in a form. This is a
-            # detailed message which will be presented to the user if
-            # no more checkboxes can be found.
-            #
-            full = _("No more check boxes.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_CHECK_BOXES
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _checkBoxDialogData(self):
@@ -2455,24 +2324,8 @@ class StructuralNavigation:
             self._setCaretPosition(newObj, characterOffset)
             self._presentObject(obj, 0)
         else:
-            # Translators: this is for navigating document content by
-            # moving from 'large object' to 'large object'. A 'large
-            # object' is a logical chunk of text, such as a paragraph,
-            # a list, a table, etc. This is a detailed message which
-            # will be presented to the user if no more large objects
-            # can be found.
-            #
-            full = _("No more large objects.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_CHUNKS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _chunkDialogData(self):
@@ -2577,22 +2430,8 @@ class StructuralNavigation:
         if obj:
             obj.queryComponent().grabFocus()
         else:
-            # Translators: this is for navigating document content by
-            # moving from combo box to combo box in a form. This is a
-            # detailed message which will be presented to the user if
-            # no more checkboxes can be found.
-            #
-            full = _("No more combo boxes.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_COMBO_BOXES
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _comboBoxDialogData(self):
@@ -2708,22 +2547,8 @@ class StructuralNavigation:
         if obj:
             obj.queryComponent().grabFocus()
         else:
-            # Translators: this is for navigating document content by
-            # moving from text entry to text entry in a form. This is
-            # a detailed message which will be presented to the user if
-            # no more text entries can be found.
-            #
-            full = _("No more entries.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_ENTRIES
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _entryDialogData(self):
@@ -2832,22 +2657,8 @@ class StructuralNavigation:
                 obj = obj[0]
             obj.queryComponent().grabFocus()
         else:
-            # Translators: this is for navigating document content by
-            # moving from form field to form filed. This is a detailed
-            # message which will be presented to the user if no more form
-            # field can be found.
-            #
-            full = _("No more form fields.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_FORM_FIELDS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _formFieldDialogData(self):
@@ -3004,40 +2815,12 @@ class StructuralNavigation:
             self._setCaretPosition(obj, characterOffset)
             self._presentObject(obj, characterOffset)
         elif not arg:
-            # Translators: this is for navigating HTML content by moving from
-            # heading to heading (e.g. <h1>, <h2>, etc). This string is the
-            # detailed message which Orca will present if there are no more
-            # headings found.
-            #
-            full = _("No more headings.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_HEADINGS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
         else:
-            # Translators: this is for navigating HTML content by moving from
-            # heading to heading at a particular level (i.e. only <h1> or only
-            # <h2>, etc.) This string is the detailed message which Orca will
-            # present if there are no more headings found at the desired level.
-            #
-            full = _("No more headings at level %d.") % arg
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_HEADINGS_AT_LEVEL % arg
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _headingDialogData(self, arg=None):
@@ -3168,23 +2951,8 @@ class StructuralNavigation:
             self._setCaretPosition(obj, characterOffset)
             self._presentObject(obj, characterOffset)
         else:
-            # Translators: this is for navigating to the previous ARIA
-            # role landmark.  ARIA role landmarks are the W3C defined
-            # HTML tag attribute 'role' used to identify important part
-            # of webpage like banners, main context, search etc.  This
-            # is an indication that one was not found.
-            #
-            full = _("No landmark found.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_LANDMARK_FOUND
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     ########################
@@ -3292,22 +3060,8 @@ class StructuralNavigation:
             self._setCaretPosition(obj, characterOffset)
             self._presentLine(obj, characterOffset)
         else:
-            # Translators: this is for navigating document content by moving
-            # from bulleted/numbered list to bulleted/numbered list. This
-            # string is the detailed message which Orca will present if there
-            # are no more lists found.
-            #
-            full = _("No more lists.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_LISTS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _listDialogData(self):
@@ -3412,22 +3166,8 @@ class StructuralNavigation:
             #
             self._presentLine(obj, characterOffset)
         else:
-            # Translators: this is for navigating document content by
-            # moving from bulleted/numbered list item to  bulleted/
-            # numbered list item.  This string is the detailed message
-            # which Orca will present if there are no more list items found.
-            #
-            full = _("No more list items.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_LIST_ITEMS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _listItemDialogData(self):
@@ -3532,21 +3272,8 @@ class StructuralNavigation:
             #
             self._script.outlineAccessible(obj)
         else:
-            # Translators: this is for navigating HTML in a structural
-            # manner, where a 'live region' is a location in a web page
-            # that are updated without having to refresh the entire page.
-            #
-            full = _("No more live regions.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_LIVE_REGIONS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     ########################
@@ -3627,21 +3354,8 @@ class StructuralNavigation:
             self._setCaretPosition(newObj, characterOffset)
             self._presentObject(obj, 0)
         else:
-            # Translators: this is for navigating document content by moving
-            # from paragraph to paragraph. This string is the detailed message
-            # which Orca will present if there are no more paragraphs found.
-            #
-            full = _("No more paragraphs.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_PARAGRAPHS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _paragraphDialogData(self):
@@ -3739,22 +3453,8 @@ class StructuralNavigation:
         if obj:
             obj.queryComponent().grabFocus()
         else:
-            # Translators: this is for navigating in document content by moving
-            # from radio button to radio button in a form. This string is the
-            # detailed message which Orca will present if there are no more
-            # radio buttons found.
-            #
-            full = _("No more radio buttons.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_RADIO_BUTTONS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _radioButtonDialogData(self):
@@ -3845,22 +3545,8 @@ class StructuralNavigation:
             self._setCaretPosition(newObj, characterOffset)
             self._presentObject(obj, 0)
         else:
-            # Translators: this is for navigating document content by moving
-            # amongst separators (e.g. <hr> tags). This string is the detailed
-            # message which Orca will present if there are no more separators
-            # found.
-            #
-            full = _("No more separators.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_SEPARATORS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     ########################
@@ -3940,21 +3626,8 @@ class StructuralNavigation:
             self._setCaretPosition(cell, characterOffset)
             self._presentObject(cell, characterOffset)
         else:
-            # Translators: this is for navigating document content by moving
-            # from table to table.  This string is the detailed message which
-            # Orca will present if there are no more tables found.
-            #
-            full = _("No more tables.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_TABLES
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _tableDialogData(self):
@@ -4174,22 +3847,8 @@ class StructuralNavigation:
             #
             obj.queryComponent().grabFocus()
         else:
-            # Translators: this is for navigating document content by moving
-            # from unvisited link to unvisited link. This string is the 
-            # detailed message which Orca will present if there are no more
-            # unvisited links found.
-            #
-            full = _("No more unvisited links.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_UNVISITED_LINKS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _unvisitedLinkDialogData(self):
@@ -4295,22 +3954,8 @@ class StructuralNavigation:
         if obj:
             obj.queryComponent().grabFocus()
         else:
-            # Translators: this is for navigating document content by moving
-            # from visited link to visited link. This string is the detailed
-            # message which Orca will present if there are no more visited
-            # links found.
-            #
-            full = _("No more visited links.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_VISITED_LINKS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _visitedLinkDialogData(self):
@@ -4406,22 +4051,8 @@ class StructuralNavigation:
             #
             obj.queryComponent().grabFocus()
         else:
-            # Translators: this is for navigating document content by moving
-            # from unvisited link to unvisited link. This string is the 
-            # detailed message which Orca will present if there are no more
-            # links found.
-            #
-            full = _("No more links.")
-            # Translators: Orca has a command that allows the user to move
-            # to the next structural navigation object. In Orca, "structural
-            # navigation" refers to quickly moving through a document by
-            # jumping amongst objects of a given type, such as from link to
-            # link, or from heading to heading, or from form field to form
-            # field. This is a brief message which will be presented to the
-            # user if the desired structural navigation object could not be
-            # found.
-            #
-            brief = C_("structural navigation", "Not found")
+            full = messages.NO_MORE_LINKS
+            brief = messages.STRUCTURAL_NAVIGATION_NOT_FOUND
             self._script.presentMessage(full, brief)
 
     def _linkDialogData(self):


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]