Как использовать разные шрифты для разных языков в приложении iOS?

Я в сценарии, где я хочу использовать разные шрифты для разных языков в приложении iOS.

Сначала я думал об использовании локализованных версий файлов .ttf. Я попытался добавить локализованные файлы .ttf в локализованных папках проекта для разных языков с тем же именем и именем шрифта, установленным в них. Это не сработало.

Затем я просмотрел файлы InfoPlist.strings для разных языков. Мне показалось, что это ключевая комбинация значений для "ключевых" строк, найденных в основном Info.plist. Я нашел запись шрифта против ключа "UIAppFonts", который был массивом. Я не могу понять, как помещать локализованные имена файлов шрифтов в InfoPlist.strings в виде массива.

В крайнем случае я собираюсь добавить локализованные имена шрифтов в файлах Localizable.stings, чтобы выбрать имя шрифта в соответствии с текущей локалью и заменить все вхождения в моем проекте везде, где я использовал шрифты. (Очевидно, это очень громоздко). Как:

UIFont *font = [UIFont fontWithName:NSLocalizedString(@"font-name", nil) size:16];

Помогите, если кто-то сделал это раньше. Было бы здорово, если бы какая-то одна из первых двух идей могла быть реализована.

Ответ 1

Вы находитесь на правильном пути с помощью UIAppFonts. Сначала добавьте файлы .ttf в ваш проект в папке "Ресурсы". Затем вам нужно добавить новую строку в Info.plist(а не InfoPlist.strings?). Вы делаете это, нажимая знак "плюс" (+) в крайнем правом углу последней строки в plist, или я думаю, что вы можете щелкнуть правой кнопкой мыши любое другое свойство и выбрать "Создать". Выберите UIAppFonts из раскрывающегося списка в первом столбце, и это должно поместить стрелку ( > ) слева от нее. Нажмите эту стрелку, чтобы развернуть свойство, и вы должны увидеть item0, введите там имя вашего файла .ttf. Control-click для добавления дополнительных элементов по мере необходимости.

Это добавит ваши пользовательские шрифты в приложение. Важно отметить, что когда вы загружаете их с помощью fontWithName, имя, которое вы указываете в @ "font-name", может не совпадать с именем файла .ttf(и обычно IS NOT). Скорее всего, это полное имя, как оно отображается в Шрифтовой книге в разделе "Предварительный просмотр" > "Показать информацию о шрифте".

Все это прекрасно, но он ничего не локализует. Вы можете использовать что-то вроде строки ниже, чтобы запросить код языка, а затем решить, какой шрифт загружать на основе этого:

NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];

Ответ 2

Я действительно сделал это, добавив разные файлы шрифтов для разных языков в проекте и в plist против UIAppFonts. Затем я ввел:

"fontName" = "English Font";
"fontName" = "Russian Font";

в Localizable.strings для каждого поддерживаемого языка

Затем я обратился к нему с помощью:

UIFont *font = [UIFont fontWithName:NSLocalizedString(@"fontName", nil) size:16];

Как я уже упоминал в своем вопросе, что два других подхода кажутся более элегантными. Любое решение по этим вопросам будет очень полезно.

Ответ 3

Чтобы использовать конкретный UIFonts внутри приложения, я создал расширение UIButton и UILabel. Поскольку у меня была такая же проблема, выбирая разные UIFonts для разных языков, я также вставил чек в мое расширение. Что было похоже:

@implementation MyButton{
    NSString *_language;
}

- (void)awakeFromNib{

    _language = [[NSLocale preferredLanguages] objectAtIndex:0];        
    [self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [self.titleLabel setFont:[self whichFontShouldBeUsed]];
}

- (UIFont *)whichFontShouldBeUsed{

    UIFont *fontToUse = [UIFont fontWithName:@"Basic Font"
                                        size:self.titleLabel.font.pointSize];

    if( [_language isEqualToString:@"tr"] &&
        [_language isEqualToString:@"pl"] ){
        fontToUse = [UIFont fontWithName:@"Another Font" 
                                    size:self.titleLabel.font.pointSize];
    } else if( [_language isEqualToString:@"ja"] &&
               [_language isEqualToString:@"tr"] ){

        fontToUse = [UIFont boldSystemFontOfSize:self.titleLabel.font.pointSize];
    } else if( [_language isEqualToString:@"ru"] ){
        fontToUse = [UIFont fontWithName:@"Another Font"
                                    size:self.titleLabel.font.pointSize + 2.0f];
    }

    return fontToUse;
}

Таким образом, вы всегда можете автоматически переключаться UIFonts. Затем вам нужно добавить этот класс внутри Interface Builder. Выберите UIButton, который вы хотите, и добавьте свой собственный класс UIButton:

enter image description here

Для UILabel вы должны использовать setText вместо setTitleLabel" and setTextColor instead of setTitleColor`.

Для получения дополнительной информации о предпочтительныхLanguages ​​просмотрите этот сайт и, конечно же, не забудьте добавить свой fonts к проектам Target и также к plist.