La mayoría de los juegos usan localización basada en teclas, es decir, se necesita una clave para describir un texto específico, pero ofrezco una mejor opción, aunque esta opción no es adecuada para aquellos que tienen voz actuando en los juegos, es más fácil a través de una clave.
¿Qué es una clave y por qué es necesaria?
La clave, o más bien la palabra clave, es la palabra por la cual se determinará qué texto se necesita, y luego la búsqueda del idioma seleccionado ya está en marcha. Un ejemplo de una palabra clave:
scene_Escape_from_jail_Ethan_dialog_with_Mary_3 , sí, la clave se verá así si su juego tiene muchas escenas, una gran trama. Sugiero escribir inmediatamente de inmediato una frase en uno de los idiomas, con mayor frecuencia en inglés o uno que el programador tenga fluidez. Por cierto, dado que todas las frases del idioma actual y el idioma principal se encuentran en la RAM, será más productivo que obtenerlo del archivo cada vez, para juegos grandes, puede modificar ligeramente el archivo para cada escena.
Cómo se arreglará todo
En las acciones que se describen a continuación, se utilizará la clase estática Lang, en la que se realizarán todas las búsquedas de palabras / frases. Declaremos una clase conectando las bibliotecas que necesitamos:
using UnityEngine; using System.Collections.Generic;
Por lo tanto, no podemos prescindir de una biblioteca estándar, ya que obtendremos el archivo de los recursos, podemos descargarlo de cualquier manera conveniente, pero es más conveniente y práctico. Se necesitan bibliotecas del sistema para conectar la lista, el diccionario y trabajar con archivos del editor. La biblioteca UnityEditor solo es necesaria para actualizar el archivo durante el primer registro de la frase, porque Después de un reinicio rápido, no siempre se cargarán todas las frases, pero con la ayuda de esta biblioteca podemos resolver este problema. La clase almacena dos campos estáticos, que sean los nombres del archivo, en nuestro caso la ruta es una carpeta con recursos, y puede haber cualquier nombre del archivo.
Ahora necesita agregar listas para almacenar todo lo utilizado por el idioma y el diccionario.
private static int LangIndex;
El campo LangIndex contendrá el índice del idioma actual relativo al registro en el archivo. En la lista de idiomas: se grabarán todos los idiomas utilizados en el archivo. El diccionario almacenará todas las frases en el idioma principal y en el idioma actual.
Debe agregar la inicialización de los campos de clase descritos anteriormente.
Código public static bool isStarting
Inmediatamente usará la directiva incorporada para que no realice acciones innecesarias después de compilar la aplicación. La llamada a Lang.Starting (...) debería ser algo como esto:
#if !UNITY_EDITOR Lang.Starting(LANGUAGE); #else Lang.Starting(LANGUAGE, SystemLanguage.English, SystemLanguage.Russian, SystemLanguage.Ukrainian); #endif private static int FindIndexLanguage(SystemLanguage _language)
La llamada cuando se reproduce en el editor debe contener dos parámetros principales, esto es qué frases de idioma se deben traducir ahora y qué idioma se usará como idioma principal, todos los demás parámetros son los parámetros de idioma que deben estar contenidos en el archivo, estos parámetros son necesarios solo durante el primer lanzamiento, cuando el archivo aún no se ha creado (y no es necesario eliminarlo más tarde), de lo contrario, si necesita agregar algún idioma, debe copiar todo del archivo, eliminar el archivo y volver a ejecutar el código en el editor o agregarlo al archivo usted mismo.
El código anterior utiliza el
método SystemLanguageParse (...) , que simplemente traduce los nombres de idioma del tipo de cadena a SystemLanguage (este método será más bajo).
Detengámonos en el método add:
#if UNITY_EDITOR private static void Add(string AddString)
Dado que este método se usará solo cuando se inicie desde el editor, podemos usar de forma segura la utilidad del sistema para sobrescribir el archivo, así como actualizar los archivos modificados al editor usando el método Refresh (). Entre estas acciones, simplemente se agrega una frase al diccionario, para evitar que se vuelva a grabar en la misma sesión.
Por cierto, olvidé decir que las frases se almacenarán en un archivo .csv, lo que nos permitirá traducir cómodamente frases a Excele. Ahora necesitamos agregar un método que sea bueno para nosotros, que cambiará el idioma:
public static void ChangeLanguage(SystemLanguage _language)
Y así, llegamos al método más importante, que tomará la frase en el idioma principal y la emitirá al usuario correcto:
public static string Phrase(string DefaultPhrase)
Este método simplemente toma una frase en el idioma principal, luego itera sobre todo lo que está en el diccionario, encontrando dicha frase por clave, nos da los valores de esta clave, que es una frase en el idioma que necesitamos. Puede usar este método con una línea de código simple:
string str = Lang.Phrase("Hello world");
Ahora la frase en el idioma que necesitamos entrará en la cadena str, si de repente falta, entonces la frase especificada en los parámetros, es decir, Hola mundo, caerá.
Este método se puede mejorar un poco, para que pueda tomar argumentos para completar:
public static string Phrase(string DefaultPhrase, params string[] args)
Ahora este método se puede llamar como antes:
string str = Lang.Phrase("Hello world");
Pero ahora nuestro método tiene salida formateada, que indica parámetros separados por comas:
string str = Lang.Phrase("Hello {0} from {1}", "world", "habr");
Traducciones de frases
Como escribí anteriormente, el archivo usa extensiones .csv que le permitirán hacer todo en Excel, pero no es tan simple, el problema de C-sharpe y Excel es que entienden el alfabeto cirílico en diferentes codificaciones, Excel solo entiende la codificación UTF-8-BOM o el que nuestro YaP no entiende, deberíamos usar solo UTF-8, aunque el editor unitario entienda UTF-8-BOM, en el código hay dos palabras idénticas en diferentes codificaciones (UTF-8 y UTF-8- BOM) no será igual, lo que conducirá a la adición constante de palabras idénticas a nuestro archivo.
Podemos
codificar archivos usando
NotePad ++ gratis descargándolo desde fuera. sitio. Editar un archivo no le traerá ningún problema, para agregar una sola palabra, incluso puede usar un editor de texto, el mismo bloc de notas o incluso nuestro entorno de programación.
Código final using UnityEngine; using System.Collections.Generic;
Lo más importante para recordar: UTF-8-BOM: para trabajar en Excel, UTF-8 para trabajar con código, no lo olvide.