2011-04-07 37 views
10

Tôi muốn bản địa hóa các hằng số của mình. Các hằng số được xác định và khai báo theo cách thông thường:Chuỗi liên tục dưới dạng Chuỗi được bản địa hóa

extern NSString * const kStringName; 

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

Làm cách nào để làm cho nó có thể bản địa hóa? Điều này chỉ có thể không hoạt động ...

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

Cảm ơn bạn!

Trả lời

7

Biến const có thể đã được tối ưu hóa tại thời gian biên dịch, do đó bạn không thể thay đổi nó khi chạy. Bạn chỉ đơn giản là không thể có chuỗi địa phương hóa.

1

Đây là điều bạn không thể làm.

Tùy thuộc vào lý do chính xác bạn đang cố gắng làm, có thể giải pháp tốt là sử dụng biến chuỗi tĩnh.

3

Bạn không thể bản địa hóa hằng số của mình khi bạn cần hiển thị nó?

[[NSBundle mainBundle] localizedStringForKey:kStringName 
             value:kStringName 
             table:nil] 
2

tôi đã tạo ra một kịch bản PHP mà phải mất một tập tin Localizable.strings định dạng đúng như đầu vào và tạo ra một tập tin Localizable.h như đầu ra chứa thích hợp # define-lệnh cho mỗi String-Key. Bạn có thể sửa đổi nó khi bạn thấy phù hợp.

Kịch bản yêu cầu tất cả các phím chuỗi được định dạng với tiểu lời chia bằng chữ hoa, do đó, một dòng nên xem xét như thế này trong Localizable.strings tập tin của bạn:

"SectionSomeString" = "This is my string."; 

mà sau đó sẽ được chuyển đổi sang

#define SECTION_SOME_STRING NSLocalizedString(@"SectionSomeString", nil) 

Các kịch bản PHP trông như sau:

<?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"; 
} 

?> 
3

Không exactl y không đổi, nhưng cũng rất hữu ích

//in the beginning of source file 
static NSString* CommentsTitleString; 

@implementation ClassName 

+(void)initialize 
{ 
    CommentsTitleString = NSLocalizedString(@"PLAYER_comments", nil); 
} 

@end 
0

Đi con đường bình thường bằng cách tuyên bố với extern trong một tiêu đề và xác định trong việc thực hiện sử dụng NSLocalizedString() kết quả trong lỗi này:

Initializer element is not a compile-time constant

Dưới đây là một cách để làm được việc này vấn đề.

Trong tập tin tiêu đề khai báo một phương thức lớp mà trả về một chuỗi ...

@interface MyGlobals : NSObject 

+ (NSString *)localizedStringWhatever; 

@end 

Thực hiện phương pháp này ...

@implementation MyGlobals 

+ (NSString *)localizedStringWhatever { 
    return NSLocalizedString(@"Whatever", @"blah blah blah."); 
} 

@end 

Khi bạn cần phải sử dụng nó nhập MyGlobals và yêu cầu nó cho chuỗi ...

NSString *whatever = [MyGlobals localizedStringWhatever]; 
Các vấn đề liên quan