Fórmulas de traducción: localización complicada para iOS y más allá

La trama de esta historia se desarrolló cuando tuve la oportunidad de implementar una de las tareas de producto de nuestra empresa Jivo para la plataforma iOS. Pero empezaré con una breve introducción.

La localización es uno de los temas que se discuten con frecuencia en el desarrollo móvil.

Principalmente en este tema con respecto a la plataforma iOS, se ven afectados los siguientes aspectos:

  • servicios para simplificar la organización y sincronización de traducciones;

  • mejores prácticas para traducir archivos xib;

  • complementos auxiliares en tiempo de compilación para la verificación de la traducción.

Sin embargo, nuestra historia no se trata de eso. Para sincronizar las traducciones, hemos integrado con éxito un servicio de terceros en nuestra empresa, en lugar de archivos xib, preferimos el código y todavía no usamos complementos en tiempo de compilación (sin embargo, hay pensamientos sobre la implementación).

Nuestra historia trata de cómo un día tuvimos la oportunidad de afrontar una tarea en la que prácticamente tuvimos que hacer malabares con las traducciones de una misma frase en el significado, que cambió ligeramente según el contexto.

Cómo empezó todo

Nuestro producto ahora tiene funcionalidad para configurar recordatorios. Los recordatorios pueden ser útiles en caso de que el operador desee volver al cliente un poco más tarde. Por ejemplo, para aclarar si han surgido preguntas adicionales algún tiempo después de la consulta, lo que ayuda a aumentar la lealtad. Se puede configurar un recordatorio para un tiempo determinado para usted o para otro operador, y opcionalmente puede especificar un comentario de texto (descripción), si es necesario.

Por supuesto, el hecho de configurar tal recordatorio se duplica en la cinta de diálogo mediante un mensaje del sistema. Y fue precisamente aquí donde se descubrió la dificultad: dependiendo de la configuración del recordatorio, la etiqueta de información puede verse completamente diferente. Por ejemplo (de la versión en inglés de la interfaz):

◼︎ 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

( , , ) , . .

La biblioteca está escrita en C ++ y también hay un contenedor en C y Swift .

For Swift proporciona conectividad a través de CocoaPods y Swift the Package Manager .

Repositorio de GitHub




All Articles