Ответ 1
Переменная const может уже оптимизироваться во время компиляции, поэтому вы не можете ее изменить во время выполнения. Вы просто не можете иметь константные локализованные строки.
Я хотел бы локализовать мои константы. Константы определяются и объявляются обычным способом:
extern NSString * const kStringName;
NSString * const kStringName = @"Whatever...";
Как сделать его локализуемым? Это просто не может работать...
NString * const kStringName = NSLocalizedString(@"Whatever...", @"Whatever...");
Спасибо!
Переменная const может уже оптимизироваться во время компиляции, поэтому вы не можете ее изменить во время выполнения. Вы просто не можете иметь константные локализованные строки.
Не можете ли вы просто локализовать свою константу, когда вам нужно ее отобразить?
[[NSBundle mainBundle] localizedStringForKey:kStringName
value:kStringName
table:nil]
Не совсем постоянный, но полезный
//in the beginning of source file
static NSString* CommentsTitleString;
@implementation ClassName
+(void)initialize
{
CommentsTitleString = NSLocalizedString(@"PLAYER_comments", nil);
}
@end
Я создал PHP script, который берет правильно отформатированный файл Localizable.strings в качестве входных данных и создает файл Localizable.h как вывод, содержащий соответствующие # define-команды для каждого String-Key. Вы можете изменить его по своему усмотрению.
script ожидает, что все строковые ключи будут отформатированы с подсловами, разделенными заглавными буквами, поэтому строка должна выглядеть так в вашем файле 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."\n\n";
$output .= "#ifndef _".$defineconstant."\n";
$output .= "#define _".$defineconstant."\n";
while (!feof($file)) {
$lineOfText = fgets($file);
if ((strstr($lineOfText, "=") !== FALSE) && (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) && ($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$lineOfText\n";
}
}
$output .= "\n#endif\n";
echo nl2br($output);
fclose($file);
// Save file
file_put_contents(OUTPUT_FILE, $output, LOCK_EX);
} else {
echo "Input file ".INPUT_FILE." not found";
}
?>
Это то, что вы не можете сделать.
В зависимости от того, почему именно вы пытаетесь это сделать, может быть, хорошим решением будет использование статической строковой переменной.
Переход обычного маршрута путем объявления с помощью extern
в заголовке и определение в реализации с использованием NSLocalizedString()
приводит к этой ошибке:
Элемент инициализатора не является константой времени компиляции
Вот один из способов обойти эту проблему.
В файле заголовка объявляется метод класса, который возвращает строку...
@interface MyGlobals : NSObject
+ (NSString *)localizedStringWhatever;
@end
Внедрить метод...
@implementation MyGlobals
+ (NSString *)localizedStringWhatever {
return NSLocalizedString(@"Whatever", @"blah blah blah.");
}
@end
Когда вам нужно использовать его import MyGlobals
и запросить его для строки...
NSString *whatever = [MyGlobals localizedStringWhatever];