iphone - la lecture du fichier Localizable.strings comme une valeur clé dans un dictionnaire

StackOverflow https://stackoverflow.com/questions/3153600

Question

Je veux lire le texte à partir du fichier Localizable.strings. Je collectionne les chaînes de traduction de plusieurs répertoires et fichiers dans un dossier. Mais j'ai plusieurs copies des mêmes chaînes de traduction. Je veux supprimer ce programme. Donc, je dois lire les chaînes uniquement (pas les commentaires) du fichier .strings et  - puis les trier,  - enlever les chaînes répétées puis créer un nouveau fichier .strings.

Est-il possible de lire le fichier de chaînes et de garder la chaîne clé et la valeur traduit dans un dictionnaire. Je veux dire une méthode intégrée pour lire un fichier .text, seule la partie « clé » = « valeur », en évitant / * ... * / ou partie # commentaires. Comme la lecture d'un fichier de configuration.

Était-ce utile?

La solution 2

Je suis heureux de trouver une excellente API dans la classe NSString. Le code est ci-dessous.

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application 
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings"];
NSString *fileText = [NSString stringWithContentsOfFile:filePath encoding: NSUnicodeStringEncoding error:nil];
NSDictionary *stringDictionary = [fileText propertyListFromStringsFileFormat];

NSArray *allKeys = [stringDictionary allKeys];

NSArray *sortedKeys = [allKeys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

NSString *documentsDirectory;   
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);  
if ([paths count] > 0)  {       
    documentsDirectory = [paths objectAtIndex:0];       
}

NSString *outputPath = [documentsDirectory stringByAppendingString:@"/Localizable.strings"];
NSLog(@"Strings contents are writing to: %@",outputPath);
[[NSFileManager defaultManager] createFileAtPath:outputPath contents:nil attributes:nil];
NSFileHandle *outputHandle = [NSFileHandle fileHandleForWritingAtPath:outputPath];
[outputHandle seekToEndOfFile];

for(id key in sortedKeys){
    NSString *line = [NSString stringWithFormat:@"\"%@\" = \"%@\";\n", key, [stringDictionary objectForKey:key]];
    NSLog(@"%@",line);
    [outputHandle writeData:[line dataUsingEncoding:NSUnicodeStringEncoding]];
}
}

Autres conseils

  NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable"
                                                   ofType:@"strings"                                                       
                                              inDirectory:nil
                                          forLocalization:@"ja"];

  // compiled .strings file becomes a "binary property list"
  NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

  NSString *jaTranslation = [dict objectForKey:@"hello"];

Solution à Swift

Je créé un code rapide suivant le code Objective-C répond par @ jason-moore ci-dessus Cette solution est équivalente rapide.

guard let path = Bundle.main.url(forResource: "Localizable", withExtension: "strings", subdirectory: nil, localization: "ja") else {
            return nil
        }
guard let dict = NSDictionary(contentsOf: path) else {
        return nil
    }
guard let jaTranslation = dict.value(forKey: "hello") as? String else {
        return nil
    }

Ce que je cherchais un moyen de lire un JSON à partir d'un fichier dans un paquet NSDictionary puis l'imprimer dans un UITextView. Le résultat n'a pas été bien formaté!

I a utilisé une partie de la réponse de Karim à partir de ci-dessus pour créer une méthode qui a généré un json Beautified dans une chaîne:

-(void)setText:(NSDictionary *)json
{
    NSArray *allKeys = [json allKeys];

    _beautyStr = @"";
    for(id key in allKeys){
       NSString *line = [NSString stringWithFormat:@"\"%@\" = \"%@\";\n", key, [text objectForKey:key]];
    _beautyStr = [NSString stringWithFormat:@"%@%@",_beautyStr, line];
    }

    NSLog(@"%@",_beautyStr);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top