Как использовать разные шрифты для разных языков в приложении 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
.