#iphone #objective-c
#iPhone #objective-c
Вопрос:
Я хотел бы локализовать свои константы. Константы определяются и объявляются обычным способом:
extern NSString * const kStringName;
NSString * const kStringName = @"Whatever...";
Как сделать ее локализуемой? Это просто не может работать…
NString * const kStringName = NSLocalizedString(@"Whatever...", @"Whatever...");
Спасибо!
Ответ №1:
Переменная const может быть уже оптимизирована во время компиляции, поэтому вы не сможете изменить ее во время выполнения. У вас просто не может быть константных локализованных строк.
Ответ №2:
Разве вы не можете просто локализовать свою константу, когда вам нужно ее отобразить?
[[NSBundle mainBundle] localizedStringForKey:kStringName
value:kStringName
table:nil]
Ответ №3:
Не совсем постоянная, но тоже полезная
//in the beginning of source file
static NSString* CommentsTitleString;
@implementation ClassName
(void)initialize
{
CommentsTitleString = NSLocalizedString(@"PLAYER_comments", nil);
}
@end
Ответ №4:
Я создал PHP-скрипт, который принимает правильно отформатированный файл Localizable.strings в качестве входных данных и создает Localizable .файл h в качестве выходных данных, содержащий соответствующие команды #define для каждого строкового ключа. Вы можете изменить ее по своему усмотрению.
Сценарий ожидает, что все строковые ключи будут отформатированы с разделением вложенных слов заглавными буквами, поэтому строка в вашем файле Localizable.strings должна выглядеть следующим образом:
"SectionSomeString" = "This is my string.";
которая затем будет преобразована в
#define SECTION_SOME_STRING NSLocalizedString(@"SectionSomeString", nil)
PHP-скрипт выглядит следующим образом:
<?php
/**
Script for generating constants out of Localizable.strings files
Author: Gihad Chbib
*/
define("INPUT_FILE", "Localizable.strings");
define("OUTPUT_FILE", "Localizable.h");
define("HEADER_COMMENT", "// Auto-generated constants file - don't change manually!");
if (file_exists(INPUT_FILE)) {
$file = fopen(INPUT_FILE, "r");
$defineconstant = str_replace(".", "_", OUTPUT_FILE);
$output = HEADER_COMMENT."nn";
$output .= "#ifndef _".$defineconstant."n";
$output .= "#define _".$defineconstant."n";
while (!feof($file)) {
$lineOfText = fgets($file);
if ((strstr($lineOfText, "=") !== FALSE) amp;amp; (substr($lineOfText, -2) === ";n")) {
$arr = explode("=", $lineOfText);
$defineKey = str_replace(""", "", $arr[0]);
$constructedKey = "";
for ($i=0; $i<strlen($defineKey); $i ) {
$letter = $defineKey[$i];
if (preg_match('/[a-z|A-Z]$/',$letter)==true) {
$ucletter = strtoupper($letter);
if (($ucletter === $letter) amp;amp; ($i !== 0)) {
$constructedKey .= "_".$ucletter;
} else {
$constructedKey .= $ucletter;
}
} else {
$constructedKey .= $letter;
}
}
$defineKey = trim($defineKey);
$constructedKey = trim($constructedKey);
$output .= "#define $constructedKey NSLocalizedString(@"$defineKey", nil);n";
} else if (substr($lineOfText, 0, 2) == "//") {
$output .= "n$lineOfTextn";
}
}
$output .= "n#endifn";
echo nl2br($output);
fclose($file);
// Save file
file_put_contents(OUTPUT_FILE, $output, LOCK_EX);
} else {
echo "Input file ".INPUT_FILE." not found";
}
?>
Ответ №5:
Это то, чего вы не можете сделать.
В зависимости от того, почему именно вы пытаетесь это сделать, возможно, хорошим решением было бы использовать статическую строковую переменную.
Ответ №6:
Переход по обычному маршруту путем объявления with extern
в заголовке и определения в реализации using NSLocalizedString()
приводит к этой ошибке:
Элемент инициализатора не является константой времени компиляции
Вот один из способов обойти эту проблему.
В заголовочном файле объявите метод класса, который возвращает строку…
@interface MyGlobals : NSObject
(NSString *)localizedStringWhatever;
@end
Реализуйте метод…
@implementation MyGlobals
(NSString *)localizedStringWhatever {
return NSLocalizedString(@"Whatever", @"blah blah blah.");
}
@end
Когда вам нужно будет ее использовать, импортируйте MyGlobals
и запросите у нее строку…
NSString *whatever = [MyGlobals localizedStringWhatever];