From 1b1b50b9969e7c63b72f50cef05e6c97dd0c2694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Gaspar=20de=20Valenzuela=20Cueto?= <276561719+alvarogaspardevalenzuela@users.noreply.github.com> Date: Thu, 16 Apr 2026 18:57:34 +0200 Subject: [PATCH] Added static zones for Spanish style names (both for all of Spain and for the Catalonia region) with the existing two surnames option enabled. Made US names have an optional middle name. Made a static zone for US names with middle name. Added support for femenine forms of surnames. Modified the Russia and Ukraine zones to have the correct surname gender. Changed the generation of names so that either a full male name or a full female name is generated (e.g. middle name gender will match first name gender, and same for surnames). --- lib/src/random_name_generator_base.dart | 33 +++++--- lib/src/zone.dart | 6 ++ lib/src/zones/russia.dart | 42 ++++------ lib/src/zones/ukraine.dart | 103 +++++++++++++++++++++++- lib/src/zones/us.dart | 8 +- 5 files changed, 153 insertions(+), 39 deletions(-) diff --git a/lib/src/random_name_generator_base.dart b/lib/src/random_name_generator_base.dart index f61fb80..bfd3a7f 100644 --- a/lib/src/random_name_generator_base.dart +++ b/lib/src/random_name_generator_base.dart @@ -5,7 +5,7 @@ import 'zone.dart'; /// Base class for random name generators class RandomNames { final Zone _zone; - final Random? _random; + final Random _random; /// Creates a new instance of RandomNames that accepts a [Random] instance /// to be used for generating random names allowing to generate names in a @@ -13,8 +13,11 @@ class RandomNames { RandomNames.seeded({ Zone? zone, Random? random, - }) : _random = random, - _zone = zone ?? ([...Zone.all]..shuffle(random)).first; + }) : _random = random ?? Random(), + _zone = zone ?? ([...Zone.all]..shuffle(random)).first { + if (_zone.surnamesW.isEmpty) + _zone.surnamesW = _zone.surnames; + } factory RandomNames([Zone? zone]) => RandomNames.seeded(zone: zone); @@ -35,23 +38,29 @@ class RandomNames { /// Returns a random surname String surname() { + return ([..._zone.surnames, ..._zone.surnamesW]..shuffle(_random)).first; + } + + /// Returns a random surname for a woman + String womanSurname() { + return ([..._zone.surnamesW]..shuffle(_random)).first; + } + + /// Returns a random surname for a man + String manSurname() { return ([..._zone.surnames]..shuffle(_random)).first; } /// Returns a random full name String fullName() { - return _zone.fullNameStructure - .replaceFirst("_S_", surname()) - .replaceFirst("_S_", surname()) - .replaceFirst("_N_", name()) - .replaceFirst("_N_", name()); + return _random.nextBool() ? womanFullName() : manFullName(); } /// Returns a random full name for a woman String womanFullName() { return _zone.fullNameStructure - .replaceFirst("_S_", surname()) - .replaceFirst("_S_", surname()) + .replaceFirst("_S_", womanSurname()) + .replaceFirst("_S_", womanSurname()) .replaceFirst("_N_", womanName()) .replaceFirst("_N_", womanName()); } @@ -59,8 +68,8 @@ class RandomNames { /// Returns a random full name for a man String manFullName() { return _zone.fullNameStructure - .replaceFirst("_S_", surname()) - .replaceFirst("_S_", surname()) + .replaceFirst("_S_", manSurname()) + .replaceFirst("_S_", manSurname()) .replaceFirst("_N_", manName()) .replaceFirst("_N_", manName()); } diff --git a/lib/src/zone.dart b/lib/src/zone.dart index fb6e0f1..5ce844b 100644 --- a/lib/src/zone.dart +++ b/lib/src/zone.dart @@ -36,6 +36,9 @@ abstract class Zone { /// List of surnames List surnames = []; + /// List of surnames in their female variation (which is often the same as the male surname) + List surnamesW = []; + /// List of male first names List namesM = []; @@ -48,9 +51,12 @@ abstract class Zone { String get fullNameStructure => "_N_ _S_"; static Zone catalonia = Catalonia(); + static Zone catalonia_long = Catalonia(twoSurnames: true); static Zone france = France(); static Zone spain = Spain(); + static Zone spain_long = Spain(twoSurnames: true); static Zone us = US(); + static Zone us_long = US(useMiddleNames: true); static Zone uk = UK(); static Zone turkey = Turkey(); static Zone germany = Germany(); diff --git a/lib/src/zones/russia.dart b/lib/src/zones/russia.dart index 5bc0f59..ff18f79 100644 --- a/lib/src/zones/russia.dart +++ b/lib/src/zones/russia.dart @@ -52,11 +52,26 @@ class Russia extends Zone { "Belyaev", "Titov", "Lazarev", - "Morozova", - "Nikitina", + ]; + + surnamesW = [ + "Ivanova", + "Smirnova", + "Kuznetsova", + "Popova", + "Vasilieva", "Petrova", + "Sokolova", + "Mikhailova", + "Novikova", + "Fedorova", + "Morozova", + "Volkova", + "Alekseeva", + "Lebedeva", "Semenova", "Egorova", + "Pavlova", "Kozlova", "Stepanova", "Nikitina", @@ -85,29 +100,6 @@ class Russia extends Zone { "Belyaeva", "Titova", "Lazareva", - "Pavlova", - "Kotova", - "Golubeva", - "Volkova", - "Kuzmina", - "Mironova", - "Konovalova", - "Zaytseva", - "Solovieva", - "Bogdanova", - "Vorobeva", - "Simonova", - "Konstantinova", - "Kharitonova", - "Belyakova", - "Shirokova", - "Sokolnikova", - "Andreeva", - "Yakovleva", - "Gavrilova", - "Belyaeva", - "Titova", - "Lazareva" ]; namesM = [ diff --git a/lib/src/zones/ukraine.dart b/lib/src/zones/ukraine.dart index 79a9b36..d8e6438 100644 --- a/lib/src/zones/ukraine.dart +++ b/lib/src/zones/ukraine.dart @@ -84,7 +84,6 @@ class Ukraine extends Zone { "Rudenko", "Vasylev", "Polishchuk", - "Sokolova", "Mykytenko", "Frolov", "Melnichenko", @@ -108,6 +107,108 @@ class Ukraine extends Zone { "Humeniuk" ]; + surnamesW = [ + "Ivanenko", + "Petrovych", + "Kovalenko", + "Tkachenko", + "Morozova", + "Savchenko", + "Kozlova", + "Shevchenko", + "Stepanova", + "Kovalchuk", + "Oliynyk", + "Kravchenko", + "Melnik", + "Bondarenko", + "Tymoshenko", + "Kozak", + "Yakovych", + "Zaytseva", + "Romanenko", + "Lysenko", + "Fedorova", + "Andriyenko", + "Zakharova", + "Goncharova", + "Dmytruk", + "Chernyshova", + "Prokhorova", + "Semenova", + "Bilyk", + "Makarenko", + "Kononenko", + "Bogdanova", + "Fomin", + "Gavrylova", + "Nikolenko", + "Rusnak", + "Mykhailenko", + "Shapovalova", + "Holovko", + "Shved", + "Doroshenko", + "Kushnir", + "Popovych", + "Kucherenko", + "Karpenko", + "Kucher", + "Zaitseva", + "Klymenko", + "Yurchenko", + "Osipova", + "Boyko", + "Pavlenko", + "Mykolenko", + "Vasylchenko", + "Korol", + "Mosiychuk", + "Lytvynenko", + "Korzh", + "Solovyova", + "Kryvtsova", + "Antonova", + "Danylo", + "Ostapenko", + "Sokolova", + "Oleksyuk", + "Martynenko", + "Kovalenko", + "Ishchenko", + "Zadorozhna", + "Shcherbakova", + "Khomenko", + "Korol", + "Mazur", + "Sereda", + "Kovalchuk", + "Rudenko", + "Vasyleva", + "Polishchuk", + "Mykytenko", + "Frolova", + "Melnichenko", + "Shulga", + "Mazurenko", + "Sydorovych", + "Skrypnyk", + "Ovcharenko", + "Drozd", + "Yemets", + "Panfilova", + "Shcherbak", + "Bykova", + "Kryvda", + "Kurylo", + "Sydorenko", + "Ostapovych", + "Kuznetsova", + "Shevchuk", + "Kupchak", + "Humeniuk" + ]; + namesM = [ "Oleksandr", "Andriy", diff --git a/lib/src/zones/us.dart b/lib/src/zones/us.dart index 256659c..8563d84 100644 --- a/lib/src/zones/us.dart +++ b/lib/src/zones/us.dart @@ -4,7 +4,10 @@ import '../zone.dart'; class US extends Zone { @override String id = "us"; - US() { + bool _useMiddleNames = false; + + US({bool useMiddleNames = false}) { + _useMiddleNames = useMiddleNames; surnames = [ "Smith", "Johnson", @@ -314,4 +317,7 @@ class US extends Zone { "Lori", ]; } + + @override + String get fullNameStructure => _useMiddleNames ? "_N_ _N_ _S_" : "_N_ _S_"; }