File indexing completed on 2024-10-27 08:25:03

0001 # -*- coding: UTF-8 -*
0002 
0003 """
0004 Various specific translation checks.
0005 
0006 @author: Chusslove Illich (Часлав Илић) <caslav.ilic@gmx.net>
0007 @license: GPLv3
0008 """
0009 
0010 from pology import _
0011 
0012 
0013 def check_keyword_list (strict=False):
0014     """
0015     Verify that the translated keyword list has proper syntax according
0016     to the type of keyword message [hook factory].
0017 
0018     The following types of keyword messages are currently detected:
0019       - With context "Keywords" (or starts with "Keywords|"),
0020         indicates .desktop keyword list.
0021       - With context "X-KDE-Keywords" (or starts with "X-KDE-Keywords|"),
0022         indicates KDE-specific .desktop keyword list.
0023 
0024     The C{strict} parameter determines whether the C{msgstr} is checked
0025     only if the C{msgid} itself is valid (C{False}), or regardless
0026     of the validity of C{msgid} (C{True}).
0027 
0028     The checks may limit the actual valid syntax for the list type,
0029     such that some valid corner cases are not allowed.
0030     This is done when respecting a corner case would result in
0031     not catching frequently observed semantic errors.
0032 
0033     @param strict: whether to require valid C{msgstr} even if C{msgid} is not
0034     @type strict: bool
0035 
0036     @return: type V3C hook
0037     @rtype: C{(msgstr, msg, cat) -> spans}
0038     """
0039 
0040     def checkf (msgstr, msg, cat):
0041 
0042         if not strict:
0043             orig_spans = _check_keyword_list_text(msg.msgid, msg, cat)
0044             do_check = (len(orig_spans) == 0)
0045         else:
0046             do_check = True
0047 
0048         if do_check:
0049             spans = _check_keyword_list_text(msgstr, msg, cat)
0050         else:
0051             spans = []
0052 
0053         return spans
0054 
0055     return checkf
0056 
0057 
0058 def _check_keyword_list_text (text, msg, cat):
0059 
0060     spans = []
0061 
0062     ctxt = msg.msgctxt or ""
0063 
0064     if ctxt == "Keywords" or ctxt.startswith("Keywords|"):
0065         pos = text.find(",")
0066         if pos >= 0:
0067             spans.append((pos, pos + 1,
0068                           _("@info",
0069                             "Keyword list with context '%(ident)s' "
0070                             "must not contain commas.",
0071                             ident="Keywords")))
0072         if not text.endswith(";"):
0073             spans.append((len(text), len(text),
0074                           _("@info",
0075                             "Keyword list with context '%(ident)s' "
0076                             "must end with semicolon.",
0077                             ident="Keywords")))
0078 
0079     elif ctxt == "X-KDE-Keywords" or ctxt.startswith("X-KDE-Keywords|"):
0080         pos = text.find(";")
0081         if pos >= 0:
0082             spans.append((pos, pos + 1,
0083                           _("@info",
0084                             "Keyword list with context '%(ident)s' "
0085                             "must not contain semicolons.",
0086                             ident="X-KDE-Keywords")))
0087 
0088     return spans
0089 
0090