AmberDB

 view release on metacpan or  search on metacpan

lib/AmberDB/Locale/Lang/gb.pm  view on Meta::CPAN

package AmberDB::Locale::Lang::gb;

use 5.016;
use warnings;
use utf8;

our $VERSION = '5.24.0';

my $CREATED  = '2026-09-03';

# -------------------------------------------------------
# Global Base (gb) Locale Data for AmberDB::Locale.
#
# Pure data module — no logic, no methods other than data().
#
# Design Principles for Global Base (gb):
# 1. Universal Multilingual Support: Designed for international,
#    cross-border datasets combining English, Turkish, German,
#    French, Spanish, Italian, Scandinavian, and Slavic-Latin text.
# 2. Comprehensive Alphabet: alphabet_chars includes all European,
#    Nordic, and Turkish extended Latin letters so no valid characters
#    are stripped during text sanitization.
# 3. Permissive Search Regex: regex_map expands characters across their
#    accented and unaccented forms (e.g. searching 'cafe' matches 'café',
#    'munchen' matches 'münchen', 'seker' matches 'şeker').
# 4. Canonical Accent Folding: accent_map flattens accented letters
#    to base Latin forms for high-recall inverted search indexing (.src).
# 5. Lossless ASCII Transliteration: ascii_map cleanly converts
#    non-decomposable Unicode ligatures (ß->ss, æ->ae, œ->oe, ø->o,
#    ı->i, ł->l, ð->d, þ->th, ə->e) for URL slugs and ASCII IDs.
# 6. International Formatting: Default numbers, dates, and currency
#    follow ISO and international English conventions (USD/cent, . decimal).
# -------------------------------------------------------
sub data {
    return {

        # ---------------------------------------------------------
        # Casing special-cases
        # uc_map: applied BEFORE Perl's uc()
        # lc_map: applied BEFORE Perl's lc()
        # Standard Unicode casing handles almost all Latin chars.
        # Turkish dotted capital İ -> i is preserved during lc.
        # ---------------------------------------------------------
        uc_map => {},
        lc_map => {
            "\x{130}" => 'i',    # Turkish dotted capital İ -> i
        },

        # ---------------------------------------------------------
        # Case-insensitive & accent-tolerant search regex character map
        # Maps both base and accented characters to a regex character class
        # covering all regional variations.
        # ---------------------------------------------------------
        regex_map => {
            # A variations: a, á, à, â, ä, ã, å, ā, æ
            'a'       => '[aA\x{E1}\x{C1}\x{E0}\x{C0}\x{E2}\x{C2}\x{E4}\x{C4}\x{E3}\x{C3}\x{E5}\x{C5}\x{101}\x{100}\x{E6}\x{C6}]',
            'A'       => '[aA\x{E1}\x{C1}\x{E0}\x{C0}\x{E2}\x{C2}\x{E4}\x{C4}\x{E3}\x{C3}\x{E5}\x{C5}\x{101}\x{100}\x{E6}\x{C6}]',

            # C variations: c, ç, ć, č
            'c'       => '[cC\x{E7}\x{C7}\x{107}\x{106}\x{10D}\x{10C}]',
            'C'       => '[cC\x{E7}\x{C7}\x{107}\x{106}\x{10D}\x{10C}]',
            "\x{E7}"  => '[cC\x{E7}\x{C7}\x{107}\x{106}\x{10D}\x{10C}]', # ç
            "\x{C7}"  => '[cC\x{E7}\x{C7}\x{107}\x{106}\x{10D}\x{10C}]', # Ç

            # D variations: d, ð, đ
            'd'       => '[dD\x{F0}\x{D0}\x{111}\x{110}]',
            'D'       => '[dD\x{F0}\x{D0}\x{111}\x{110}]',

            # E variations: e, é, è, ê, ë, ē, ė, ę, ə
            'e'       => '[eE\x{E9}\x{C9}\x{E8}\x{C8}\x{EA}\x{CA}\x{EB}\x{CB}\x{113}\x{112}\x{117}\x{116}\x{119}\x{118}\x{259}\x{18F}]',
            'E'       => '[eE\x{E9}\x{C9}\x{E8}\x{C8}\x{EA}\x{CA}\x{EB}\x{CB}\x{113}\x{112}\x{117}\x{116}\x{119}\x{118}\x{259}\x{18F}]',

            # G variations: g, ÄŸ
            'g'       => '[gG\x{11F}\x{11E}]',
            'G'       => '[gG\x{11F}\x{11E}]',
            "\x{11F}" => '[gG\x{11F}\x{11E}]', # ÄŸ
            "\x{11E}" => '[gG\x{11F}\x{11E}]', # Äž

            # I variations: i, I, ı, İ, î, ï, í, ì, ī
            'i'       => '[iI\x{131}I\x{130}i\x{EE}\x{CE}\x{EF}\x{CF}\x{ED}\x{CD}\x{EC}\x{CC}\x{12B}\x{12A}]',
            'I'       => '[iI\x{131}I\x{130}i\x{EE}\x{CE}\x{EF}\x{CF}\x{ED}\x{CD}\x{EC}\x{CC}\x{12B}\x{12A}]',
            "\x{131}" => '[iI\x{131}I\x{130}i\x{EE}\x{CE}\x{EF}\x{CF}\x{ED}\x{CD}\x{EC}\x{CC}\x{12B}\x{12A}]', # ı
            "\x{130}" => '[iI\x{131}I\x{130}i\x{EE}\x{CE}\x{EF}\x{CF}\x{ED}\x{CD}\x{EC}\x{CC}\x{12B}\x{12A}]', # İ

            # L variations: l, Å‚
            'l'       => '[lL\x{142}\x{141}]',
            'L'       => '[lL\x{142}\x{141}]',



( run in 0.450 second using v1.01-cache-2.11-cpan-aadc1410aed )