Übersetzungsformeln: Schwierige Lokalisierung für iOS und darüber hinaus

Die Handlung dieser Geschichte entwickelte sich, als ich die Gelegenheit hatte, eine der Produktaufgaben unserer Firma Jivo für die iOS-Plattform zu implementieren. Aber ich beginne mit einer kurzen Einführung.

Lokalisierung ist eines der häufig diskutierten Themen in der mobilen Entwicklung.

Hauptsächlich in Bezug auf die iOS-Plattform sind folgende Aspekte betroffen:

  • Dienstleistungen zur Vereinfachung der Organisation und Synchronisation von Übersetzungen;

  • Best Practice für die Übersetzung von xib-Dateien;

  • Zusätzliche Add-Ons zur Kompilierungszeit zur Überprüfung von Übersetzungen.

In unserer Geschichte geht es jedoch nicht darum. Um Übersetzungen zu synchronisieren, haben wir erfolgreich einen Drittanbieter-Service in unser Unternehmen integriert. Anstelle von xib-Dateien bevorzugen wir Code und verwenden noch keine Add-Ons zur Kompilierungszeit (es gibt jedoch Überlegungen zur Implementierung).

Unsere Geschichte handelt davon, wie wir eines Tages die Chance hatten, uns einer Aufgabe zu stellen, bei der wir praktisch Übersetzungen derselben Phrase jonglieren mussten, die je nach Kontext leicht modifiziert wurden.

Wie alles begann

Unser Produkt verfügt jetzt über Funktionen zum Festlegen von Erinnerungen. Erinnerungen können nützlich sein, wenn der Bediener etwas später zum Kunden zurückkehren möchte. Zum Beispiel, um zu klären, ob einige Zeit nach der Konsultation zusätzliche Fragen aufgetaucht sind, was zur Steigerung der Loyalität beiträgt. Eine Erinnerung für eine bestimmte Zeit kann für Sie selbst oder für einen anderen Bediener festgelegt werden, und Sie können bei Bedarf optional einen Textkommentar (Beschreibung) angeben.

Natürlich wird die Tatsache, dass eine solche Erinnerung eingestellt wird, durch eine Systemnachricht auf dem Dialogband dupliziert. Und genau hier wurde die Schwierigkeit entdeckt: Je nach Konfiguration der Erinnerung kann das Informationsetikett völlig anders aussehen. Zum Beispiel (aus der englischen Version der Benutzeroberfläche):

◼︎ You created the reminder for agent Alex on 08/29/20 at 4:30 PM



◼︎ Agent Nick created the reminder "Ask about any issue happened since our call" on 10/03/20 at 11:30 AM



◼︎ Agent Alex completed the reminder on 12/05/20 at 5:00 PM

, :

◼︎ –

◼︎

◼︎

◼︎ – , ,

, 32 . , , , . , .

, « » , :

// either...
let caption = format(
  "REMINDER_CREATE_SELF_FOR_SELF", // !!!
  reminder.time)

// or...
let caption = format(
  "REMINDER_CREATE_ANOTHER_WITH_COMMENT_FOR_SELF", // !!!
  reminder.author.name,
  reminder.comment,
  reminder.time)

// etc...

. , , , . , , . , :

if reminder.author.isMe {
  slices += [format("REMINDER_AUTHOR_SELF")]
}
else {
  slices += [format("REMINDER_AUTHOR_ANOTHER", reminder.author.name)]
}

if let comment = reminder.comment {
  slices += [format("REMINDER_COMMENT", comment)]
}

if reminder.target.isMe {
  slices += [format("REMINDER_FOR_SELF")]
}
else {
  slices += [format("REMINDER_FOR_ANOTHER", reminder.target.name)]
}

slices += [format("REMINDER_TIME", reminder.time)]

let caption = slices.joined()

, - . .

. bb- , . , , , . « ».

( ). , , .

– , , $creatorName, , .

– , , $[Agent $creatorName ## You]; - Agent $creatorName You, ##; , ; . , , ( ) ; .

– , , , $[Agent $creatorName ## :another: Another agent ## You]; - Agent $creatorName, Another agent You; Another agent another, , , ( ).

. , :

◼︎ Agent Nick created the reminder on 10/03/20 at 11:30 AM



◼︎ You created the reminder "Ask about any issue happened since our call" on 10/03/20 at 11:30 AM



◼︎ Agent Nick created the reminder "Ask about any issue happened since our call" on 10/03/20 at 11:30 AM



◼︎ You created the reminder for Alex on 10/03/20 at 11:30 AM

:

$[Agent $creatorName ## You] created the reminder $["$comment"] $[for $targetName] on $date at $time

, . , , . , ( Swift, C++, ).

  • :

let parser = PureParser()
let formula = "$[Agent $creatorName ## You] created the reminder $[\"$comment\"] $[for $targetName] on $date at $time"

parser.assign(variable: "creatorName", value: "Nick")
parser.assign(variable: "date", value: "10/03/20")
parser.assign(variable: "time", value: "11:30 AM")

let result = parser.execute(formula, collapseSpaces: true, resetOnFinish: true)
print(result)

// Agent Nick created the reminder on 10/03/20 at 11:30 AM
  • :

let parser = PureParser()
let formula = "$[Agent $creatorName ## You] created the reminder $[\"$comment\"] $[for $targetName] on $date at $time"

parser.assign(variable: "comment", value: "Ask about any issue happened since our call")
parser.assign(variable: "date", value: "10/03/20")
parser.assign(variable: "time", value: "11:30 AM")

let result = parser.execute(formula, collapseSpaces: true, resetOnFinish: true)
print(result)

// You created the reminder "Ask about any issue happened since our call" on 10/03/20 at 11:30 AM
  • :

let parser = PureParser()
let formula = "$[Agent $creatorName ## You] created the reminder $[\"$comment\"] $[for $targetName] on $date at $time"

parser.assign(variable: "creatorName", value: "Nick")
parser.assign(variable: "comment", value: "Ask about any issue happened since our call")
parser.assign(variable: "date", value: "10/03/20")parser.assign(variable: "time", value: "11:30 AM")

let result = parser.execute(formula, collapseSpaces: true, resetOnFinish: true)
print(result)

// Agent Nick created the reminder "Ask about any issue happened since our call" on 10/03/20 at 11:30 AM
  • :

let parser = PureParser()
let formula = "$[Agent $creatorName ## You] created the reminder $[\"$comment\"] $[for $targetName] on $date at $time"

parser.assign(variable: "targetName", value: "Alex")
parser.assign(variable: "date", value: "10/03/20")
parser.assign(variable: "time", value: "11:30 AM")

let result = parser.execute(formula, collapseSpaces: true, resetOnFinish: true)
print(result)

// You created the reminder for Alex on 10/03/20 at 11:30 AM
  • : ?

let parser = PureParser()
let formula = "$[Agent $creatorName ## :another: Another agent ## You] created the reminder $[\"$comment\"] $[for $targetName] on $date at $time"

parser.activate(alias: "another", true)
parser.assign(variable: "date", value: "10/03/20")
parser.assign(variable: "time", value: "11:30 AM")

let result = parser.execute(formula, collapseSpaces: true, resetOnFinish: true)
print(result)

// Another agent created the reminder on 10/03/20 at 11:30 AM

( , , ) , . .

Die Bibliothek ist in C ++ geschrieben , und es gibt auch einen Wrapper in C und Swift .

For Swift bietet Konnektivität über CocoaPods und Swift the Package Manager .

GitHub-Repository




All Articles