Skip to content

Josep Carod i Rovira reads family Rovira — Catalan and Polish link surnames with i, which is not a conjunction #397

Description

@derek73

Catalan (and Polish) link two surnames with i, but i is not in CONJUNCTIONS, so the link is not joined:

"Josep Lluis Carod i Rovira"  ->  given='Josep'  middle='Lluis Carod i'  family='Rovira'
"Josep Carod i Rovira"        ->  given='Josep'  middle='Carod i'        family='Rovira'

The family should be the whole link (Carod i Rovira), which is how Spanish y already parses today:

"Juan Garcia y Lopez"         ->  family='Garcia y Lopez'

Why it was left out, and what measurement says

i is the Roman numeral I (suffixes.py:18), and the concern was the collision. Measured by adding i to a custom Lexicon's conjunctions, generation markers do not collide the way expected — every one of these is unchanged:

input result what protects it
John Smith I, john smith i suffix='I' a generation marker is trailing, and classified before grouping
John I Smith middle='I' P3's bare-Latin-capital veto: a capital single letter is an initial and never joins
john i smith middle='i' P3's three-word carve-out
Maier, Amy I, Jr. unchanged the only name in all three corpora (783 lines) with a bare i token

The collision is real, but it lands somewhere else

A word can hold both tags. With i added it carries conjunction and vocab:suffix, and _is_rootname() returns False for a suffix piece — so i shrinks the total that P3's carve-out tests (total < 4 in _group.py:200). It therefore needs one more name word than y does before it joins:

with i added to conjunctions:
"Josep Lluis Carod i Rovira"  ->  family='Carod i Rovira'   fixed
"Josep Carod i Rovira"        ->  family='Rovira'           NOT fixed
"Juan Garcia y Lopez"         ->  family='Garcia y Lopez'   (y counts itself toward total)

given + two surnames is the commonest Catalan shape, so adding the word alone fixes the longer names and leaves the common one behind.

What needs deciding

  1. Add i at all — it serves Catalan and Polish.
  2. If yes: should a word carrying both conjunction and vocab:suffix count toward the carve-out's rootname total? That is a C-ii question (set-vs-set collision, docs/design/decisions.md), and it is what decides whether Josep Carod i Rovira is fixed.
  3. Out of reach either way: JOSEP LLUIS CAROD I ROVIRA keeps I an initial under the Latin-capital veto — that is Should Jose E Maria Santos join like Jose e Maria Santos does? (the single-letter connective's Latin-capital veto was never adjudicated) #383.

Docs affected

rules.md#P3's prose says the vocabulary holds six single-letter conjunctions (y e и і й و); this makes seven. decisions.md#3-0-reevaluations already records that which single letters a tradition wants joined is per-locale policy — i is another instance of it.

Activity

  1. self-assigned this
    on Aug 18, 2026
  2. added this to the v2.2 milestone on Aug 22, 2026
  3. modified the milestones: v2.2, v2.3 on Aug 30, 2026
  4. 10 remaining items

  5. added a commit that references this issue on Sep 22, 2026
  6. derek73 commented on Sep 22, 2026

    @derek73
    OwnerAuthor

    Closed by #536.

    i is in the default conjunctions, and the common shape is fixed, not only the long one: Josep Carod i Rovira gives family Carod i Rovira, Josep Lluis Carod i Rovira gives middle Lluis, and Carod i Rovira, Josep gives family Carod i Rovira where it used to drop the link and report a suffix i. Polish reads the same way (Jan Kowalski i Nowak).

    The three questions this issue asked:

    1. Add i at all? Yes, marked in conjunctions_ambiguous beside e, as the comment above anticipated. In a mixed-case name a lower-case i between two name words is a link; I and I. stay initials. In a name written wholly in one case it reads as an initial and reports conjunction-or-initial. A Catalan or Polish caller who wants one-case records joined removes the marking: Lexicon.default().remove(conjunctions_ambiguous={"i"}). Removing i from conjunctions restores every earlier reading exactly, and a property test holds the parser to that.
    2. Should a word that is both a conjunction and suffix vocabulary count toward the carve-out total? Yes, where it is placed to join: a single-letter connective counts as a name word whatever else the vocabulary says it is. And one that is also generational vocabulary joins only where a name word stands on each side, so John Quincy Smith i, Josep Lluis Carod i III and John Smith I keep their suffix. Review caught the first version testing position instead of class (… Carod i III read family Carod i III); the fix and the invariant that now guards it are in the PR.
    3. JOSEP LLUIS CAROD I ROVIRA stays an initial, as predicted, and now says so in its report. The report is kept honest: where a one-case I ends the name and is read as the generation (JOHN QUINCY SMITH I, HENRY I), no conjunction-or-initial is raised, so those names report exactly as they did before.

    Accepted and recorded under P3 in docs/design/decisions.md: the two-word Carod i keeps the generation reading; Henry i of England reads as a connective run, like Duke of Edinburgh; and because a marked letter reads as an initial in one-case names, a few all-lower spellings move to match their all-caps twins (maier, amy i, jr. gives middle i, as Maier, Amy I, Jr. always has).

    One interaction surfaced on the way and is fixed in the same PR: a maiden clause ends at any suffix word, and a lower-case i is the roman numeral, so Jane Doe nee Puig i Soler had always been cut to maiden Puig. A link with a name word of the clause on each side now stays in the birth name, maiden Puig i Soler, as the y spelling always read; Jane Doe nee Puig i keeps suffix i.

    rules.md#P3 now counts seven single-letter connectives, and the recipe is in docs/customize.rst.

  7. added 10 commits that reference this issue on Sep 22, 2026
  8. added 3 commits that reference this issue on Oct 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions