pascalx.lang.locale.rtlang.pas

Переключить прокрутку окна
Загрузить этот исходный код

{
    pascalx.lang.locale.rtlang — модуль поддержки текущей локали приложения.

    Copyright © 2021, 2026 Малик Разработчик

    Это свободная программа: вы можете перераспространять её и/или
    изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
    в каком она была опубликована Фондом свободного программного обеспечения;
    либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.

    Эта программа распространяется в надежде, что она может быть полезна,
    но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
    или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
    общественной лицензии GNU.

    Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
    вместе с этой программой. Если это не так, см.
    <http://www.gnu.org/licenses/>.
}

unit pascalx.lang.locale.rtlang;

    {$MODE DELPHI}

interface

    {%region} uses
        pascalx.lang,
        pascalx.lang.locale;
    {%endregion}

    {$TYPEINFO ON}
    {$CALLING REGISTER}

    {%region} type
        CyrillicLocale = class;

        CyrillicLocale = class(Locale)
        public
            constructor create();
            function isLowerCase(character: uchar): boolean; override;
            function isUpperCase(character: uchar): boolean; override;
            function toLowerCase(character: uchar): uchar; override;
            function toUpperCase(character: uchar): uchar; override;
            function orderOf(character: uchar): int; override;
        end;
    {%endregion}

implementation

    {$CALLING REGISTER}

    {%region  CyrillicLocale }
        constructor CyrillicLocale.create();
        begin
            inherited create('ru-RU', nil);
        end;

        function CyrillicLocale.isLowerCase(character: uchar): boolean;
        begin
            result := (character >= #$0430) and (character <= #$045f);
        end;

        function CyrillicLocale.isUpperCase(character: uchar): boolean;
        begin
            result := (character >= #$0400) and (character <= #$042f);
        end;

        function CyrillicLocale.toLowerCase(character: uchar): uchar;
        begin
            if (character >= #$0400) and (character <= #$040f) then begin
                result := uchar(int(character) + $0050);
                exit;
            end;
            if (character >= #$0410) and (character <= #$042f) then begin
                result := uchar(int(character) + $0020);
                exit;
            end;
            result := character;
        end;

        function CyrillicLocale.toUpperCase(character: uchar): uchar;
        begin
            if (character >= #$0430) and (character <= #$044f) then begin
                result := uchar(int(character) - $0020);
                exit;
            end;
            if (character >= #$0450) and (character <= #$045f) then begin
                result := uchar(int(character) - $0050);
                exit;
            end;
            result := character;
        end;

        function CyrillicLocale.orderOf(character: uchar): int;
        begin
            if (character >= #$0430) and (character <= #$044f) then dec(character, $0020);
            if (character >= #$0450) and (character <= #$045f) then dec(character, $0050);
            if character = #$0401 then begin
                result := 6;
                exit;
            end;
            if (character >= #$0410) and (character <= #$0415) then begin
                result := int(character) - $0410;
                exit;
            end;
            if (character >= #$0416) and (character <= #$042f) then begin
                result := int(character) - ($0410 - 1);
                exit;
            end;
            result := inherited orderOf(character) + 33;
        end;
    {%endregion}

    {%region} initialization
        Locale.register(CyrillicLocale.create());
    {%endregion}

end.