mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-02 08:22:22 +00:00
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".
This commit is contained in:
parent
36535caf96
commit
5fdf4fc07d
5
etc/NEWS
5
etc/NEWS
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user