Index: util.py
===================================================================
--- util.py	(revision 1903)
+++ util.py	(working copy)
@@ -53,6 +53,11 @@
 
 from orca_i18n import _ # for gettext support
 
+# Unicode currency symbols (populated by the getUnicodeCurrencySymbols() 
+# routine).
+#
+_unicodeCurrencySymbols = []
+
 # Embedded object character used to indicate that an object is
 # embedded in a string.
 #
@@ -170,6 +175,45 @@
 
     return False
 
+def getUnicodeCurrencySymbols():
+    """Return a list of the unicode currency symbols, populating the list
+    if this is the first time that this routine has been called.
+
+    Returns a list of unicode currency symbols.
+    """
+
+    global _unicodeCurrencySymbols
+
+    if not _unicodeCurrencySymbols:
+        _unicodeCurrencySymbols = [ \
+            u'\u0024',     # dollar sign
+            u'\u00A2',     # cent sign
+            u'\u00A3',     # pound sign
+            u'\u00A4',     # currency sign
+            u'\u00A5',     # yen sign
+            u'\u0192',     # latin small letter f with hook
+            u'\u060B',     # afghani sign
+            u'\u09F2',     # bengali rupee mark
+            u'\u09F3',     # bengali rupee sign
+            u'\u0AF1',     # gujarati rupee sign
+            u'\u0BF9',     # tamil rupee sign
+            u'\u0E3F',     # thai currency symbol baht
+            u'\u17DB',     # khmer currency symbol riel
+            u'\u2133',     # script capital m
+            u'\u5143',     # cjk unified ideograph-5143
+            u'\u5186',     # cjk unified ideograph-5186
+            u'\u5706',     # cjk unified ideograph-5706
+            u'\u5713',     # cjk unified ideograph-5713
+            u'\uFDFC',     # rial sign
+        ]
+
+        # Add 20A0 (EURO-CURRENCY SIGN) to 20B5 (CEDI SIGN)
+        #
+        for ordChar in range(ord(u'\u20A0'), ord(u'\u20B5') + 1):
+            _unicodeCurrencySymbols.append(unichr(ordChar))
+
+    return _unicodeCurrencySymbols
+
 def getDisplayedLabel(object):
     """If there is an object labelling the given object, return the
     text being displayed for the object labelling this object.
Index: gnomespeechfactory.py
===================================================================
--- gnomespeechfactory.py	(revision 1903)
+++ gnomespeechfactory.py	(working copy)
@@ -651,9 +651,28 @@
                 #
                 isSpecial = isPrev and isNext and (oldText[i] == ".")
 
-                if (len(oldText) == 1) or isSpecial or (style <= level):
+                # If this is a dash and the users punctuation level is not 
+                # NONE and the previous character is a white space character,
+                # and the next character is a dollar sign or a digit, then 
+                # always speak it. See bug #392939.
+                #
+                prevCharMatches = nextCharMatches = False
+                currencySymbols = util.getUnicodeCurrencySymbols()
+                if i > 0:
+                    prevCharMatches = (oldText[i - 1] in string.whitespace)
+                if i < (len(oldText) - 1):
+                    nextCharMatches = (oldText[i + 1] in string.digits or \
+                                       oldText[i + 1] in currencySymbols)
+
+                if oldText[i] == "-" and \
+                   style != settings.PUNCTUATION_STYLE_NONE and \
+                   prevCharMatches and nextCharMatches:
                     if isPrev:
                         newText += " "
+                    newText += _("minus")
+                elif (len(oldText) == 1) or isSpecial or (style <= level):
+                    if isPrev:
+                        newText += " "
                     newText += chnames.getCharacterName(oldText[i])
                     if (action == punctuation_settings.PUNCTUATION_INSERT) \
                         and not isNext:
