Subject: bug#7230: 24.0.50; Regression: Many dictionaries not found by ispell.el

From: Agustin Martin <[email-masked]>
Date: Mon, 18 Oct 2010 13:22:47 +0200

On Sun, Oct 17, 2010 at 07:41:16PM +0200, Knut Anders Hatlen wrote:
> 
> On a system with Aspell 0.60.6 with English dictionaries installed,
> evaluating the following expression successfully changes the dictionary
> on Emacs 23.2:
> 
> (progn
>   (require 'ispell)
>   (ispell-change-dictionary "british-ize"))
> 
> On Emacs 24 it fails:

Thanks for noticing and sorry for the bug. I thought it was behaving 
correctly since a lot of English variants were listed and unfortunately 
did not notice that some of them were missing, my fault. I really wonder 
how no one found this before.

This change was introduced to deal with portuguese, that has no pt.dat, but
pt_BR or pt_PT. 

I am currently playing with attached patch, that tries different .dat
matches. This should be better than before, and deal with former case plus
portuguese. Will test a bit more and commit if no problems appear.

-- 
Agustin
--- ispell.el.orig	2010-10-18 13:20:35.000000000 +0200
+++ ispell.el	2010-10-18 13:20:45.000000000 +0200
@@ -983,17 +983,30 @@
     (car (split-string (buffer-string)))))
 
 (defun ispell-aspell-find-dictionary (dict-name)
+  "Create a list of properties for a given aspell dictionary."
+  ;; Make sure this is defined
+  (or ispell-aspell-data-dir
+      (setq ispell-aspell-data-dir
+	    (ispell-get-aspell-config-value "data-dir")))
   ;; This returns nil if the data file does not exist.
   ;; Can someone please explain the return value format when the
   ;; file does exist -- rms?
-  (let* ((lang ;; Strip out variant, etc.
-	  (and (string-match "^[[:alpha:]_]+" dict-name)
-	       (match-string 0 dict-name)))
+  (let* ((datafile1
+	  (concat ispell-aspell-data-dir "/"
+		  ;; Strip out variant, country code, etc.
+		  (and (string-match "^[[:alpha:]]+" dict-name)
+		       (match-string 0 dict-name)) ".dat"))
+	 (datafile2
+	  (concat ispell-aspell-data-dir "/"
+		  ;; Strip out anything but xx_YY.
+		  (and (string-match "^[[:alpha:]_]+" dict-name)
+		       (match-string 0 dict-name)) ".dat"))
 	 (data-file
-	  (concat (or ispell-aspell-data-dir
-		      (setq ispell-aspell-data-dir
-			    (ispell-get-aspell-config-value "data-dir")))
-		  "/" lang ".dat"))
+	  (if (file-readable-p datafile1)
+	      datafile1
+	    (if (file-readable-p datafile2)
+		datafile2
+	      "No dat file found")))
 	 otherchars)
     (condition-case ()
 	(with-temp-buffer