diff options
author | Juri Linkov <juri@linkov.net> | 2019-03-24 23:55:07 +0200 |
---|---|---|
committer | Juri Linkov <juri@linkov.net> | 2019-03-24 23:55:07 +0200 |
commit | 5fdf4fc07df7dd897931efb5dbf5f26dfaff9274 (patch) | |
tree | 807fd09f411bd670cb0f7bc7834469366e514036 | |
parent | 36535caf9621f984f7f95d4def09bdb0ae2f1d2a (diff) | |
download | emacs-5fdf4fc07df7dd897931efb5dbf5f26dfaff9274.tar.gz |
i18n: Add function ngettext for pluralization.
* lisp/international/mule-cmds.el (ngettext): New function.
https://lists.gnu.org/archive/html/emacs-devel/2019-03/msg00586.html
* lisp/replace.el (flush-lines, how-many, occur-1, occur-engine)
(perform-replace): Use ngettext.
* lisp/progmodes/grep.el (grep-exit-message): Use ngettext.
(grep-mode-font-lock-keywords): Match both singular and plural form
of "matches".
-rw-r--r-- | etc/NEWS | 5 | ||||
-rw-r--r-- | lisp/international/mule-cmds.el | 14 | ||||
-rw-r--r-- | lisp/progmodes/grep.el | 7 | ||||
-rw-r--r-- | lisp/replace.el | 51 |
4 files changed, 54 insertions, 23 deletions
@@ -1364,6 +1364,11 @@ Now, such rx expressions generate an error. * Lisp Changes in Emacs 27.1 +** i18n (internationalization) + +*** ngettext can be used now to return the right plural form +according to the given numeric value. + +++ ** inhibit-null-byte-detection is renamed to inhibit-nul-byte-detection diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el index 5f87d899415..035932e395d 100644 --- a/lisp/international/mule-cmds.el +++ b/lisp/international/mule-cmds.el @@ -2798,6 +2798,20 @@ See also `locale-charset-language-names', `locale-language-names', 'a4))))))) nil) +;;; i18n (internationalization) + +(defun ngettext (msgid msgid_plural n) + "Return the plural form of the translation of the string. +This function is similar to the `gettext' function as it finds the message +catalogs in the same way. But it takes two extra arguments. The MSGID +parameter must contain the singular form of the string to be converted. +It is also used as the key for the search in the catalog. +The MSGID_PLURAL parameter is the plural form. The parameter N is used +to determine the plural form. If no message catalog is found MSGID is +returned if N is equal to 1, otherwise MSGID_PLURAL." + (if (= n 1) msgid msgid_plural)) + + ;;; Character property (put 'char-code-property-table 'char-table-extra-slots 5) diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el index a5427dd8b7e..c0f47159c95 100644 --- a/lisp/progmodes/grep.el +++ b/lisp/progmodes/grep.el @@ -459,7 +459,7 @@ abbreviated part can also be toggled with ;; remove match from grep-regexp-alist before fontifying ("^Grep[/a-zA-Z]* started.*" (0 '(face nil compilation-message nil help-echo nil mouse-face nil) t)) - ("^Grep[/a-zA-Z]* finished with \\(?:\\(\\(?:[0-9]+ \\)?matches found\\)\\|\\(no matches found\\)\\).*" + ("^Grep[/a-zA-Z]* finished with \\(?:\\(\\(?:[0-9]+ \\)?match\\(?:es\\)? found\\)\\|\\(no matches found\\)\\).*" (0 '(face nil compilation-message nil help-echo nil mouse-face nil) t) (1 compilation-info-face nil t) (2 compilation-warning-face nil t)) @@ -552,7 +552,10 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'." ;; so the buffer is still unmodified if there is no output. (cond ((and (zerop code) (buffer-modified-p)) (if (> grep-num-matches-found 0) - (cons (format "finished with %d matches found\n" grep-num-matches-found) + (cons (format (ngettext "finished with %d match found\n" + "finished with %d matches found\n" + grep-num-matches-found) + grep-num-matches-found) "matched") '("finished with matches found\n" . "matched"))) ((not (buffer-modified-p)) diff --git a/lisp/replace.el b/lisp/replace.el index 59ad1a375b8..318a9fb0253 100644 --- a/lisp/replace.el +++ b/lisp/replace.el @@ -983,7 +983,10 @@ also print the number." (progn (forward-line 1) (point))) (setq count (1+ count)))) (set-marker rend nil) - (when interactive (message "Deleted %d matching lines" count)) + (when interactive (message (ngettext "Deleted %d matching line" + "Deleted %d matching lines" + count) + count)) count)) (defun how-many (regexp &optional rstart rend interactive) @@ -1032,9 +1035,10 @@ a previously found match." (if (= opoint (point)) (forward-char 1) (setq count (1+ count)))) - (when interactive (message "%d occurrence%s" - count - (if (= count 1) "" "s"))) + (when interactive (message (ngettext "%d occurrence" + "%d occurrences" + count) + count)) count))) @@ -1617,11 +1621,12 @@ See also `multi-occur'." (not (eq occur-excluded-properties t)))))) (let* ((bufcount (length active-bufs)) (diff (- (length bufs) bufcount))) - (message "Searched %d buffer%s%s; %s match%s%s" - bufcount (if (= bufcount 1) "" "s") + (message "Searched %d %s%s; %s %s%s" + bufcount + (ngettext "buffer" "buffers" bufcount) (if (zerop diff) "" (format " (%d killed)" diff)) (if (zerop count) "no" (format "%d" count)) - (if (= count 1) "" "es") + (ngettext "match" "matches" count) ;; Don't display regexp if with remaining text ;; it is longer than window-width. (if (> (+ (length (or (get-text-property 0 'isearch-string regexp) @@ -1856,14 +1861,15 @@ See also `multi-occur'." (let ((beg (point)) end) (insert (propertize - (format "%d match%s%s%s in buffer: %s%s\n" - matches (if (= matches 1) "" "es") + (format "%d %s%s%s in buffer: %s%s\n" + matches + (ngettext "match" "matches" matches) ;; Don't display the same number of lines ;; and matches in case of 1 match per line. (if (= lines matches) - "" (format " in %d line%s" + "" (format " in %d %s" lines - (if (= lines 1) "" "s"))) + (ngettext "line" "lines" lines))) ;; Don't display regexp for multi-buffer. (if (> (length buffers) 1) "" (occur-regexp-descr regexp)) @@ -1889,13 +1895,15 @@ See also `multi-occur'." (goto-char (point-min)) (let ((beg (point)) end) - (insert (format "%d match%s%s total%s:\n" - global-matches (if (= global-matches 1) "" "es") + (insert (format "%d %s%s total%s:\n" + global-matches + (ngettext "match" "matches" global-matches) ;; Don't display the same number of lines ;; and matches in case of 1 match per line. (if (= global-lines global-matches) - "" (format " in %d line%s" - global-lines (if (= global-lines 1) "" "s"))) + "" (format " in %d %s" + global-lines + (ngettext "line" "lines" global-lines))) (occur-regexp-descr regexp))) (setq end (point)) (when title-face @@ -2730,10 +2738,10 @@ characters." (1+ num-replacements)))))) (when (and (eq def 'undo-all) (null (zerop num-replacements))) - (message "Undid %d %s" num-replacements - (if (= num-replacements 1) - "replacement" - "replacements")) + (message (ngettext "Undid %d replacement" + "Undid %d replacements" + num-replacements) + num-replacements) (ding 'no-terminate) (sit-for 1))) (setq replaced nil last-was-undo t last-was-act-and-show nil))) @@ -2859,9 +2867,10 @@ characters." last-was-act-and-show nil)))))) (replace-dehighlight)) (or unread-command-events - (message "Replaced %d occurrence%s%s" + (message (ngettext "Replaced %d occurrence%s" + "Replaced %d occurrences%s" + replace-count) replace-count - (if (= replace-count 1) "" "s") (if (> (+ skip-read-only-count skip-filtered-count skip-invisible-count) |