Подтвердить что ты не робот

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

Я хотел бы локализовать мои константы. Константы определяются и объявляются обычным способом:

extern NSString * const kStringName;

NSString * const kStringName = @"Whatever...";

Как сделать его локализуемым? Это просто не может работать...

NString * const kStringName = NSLocalizedString(@"Whatever...", @"Whatever...");

Спасибо!

4b9b3361

Ответ 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 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"; 
}

?>

Ответ 5

Это то, что вы не можете сделать.

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

Ответ 6

Переход обычного маршрута путем объявления с помощью 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];