Строковая константа в виде локализованной строки

#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];