Buenas Practicas
Consejos y recomendaciones para una localizacion efectiva en VRChat
TextMeshPro vs Legacy Text
Siempre usa TextMeshPro (TMP) en vez de Legacy Text:
- TMP tiene mejor soporte para caracteres CJK (japones, coreano, chino)
- TMP maneja mejor los saltos de linea y el overflow de texto
- VRChat optimiza el renderizado de TMP
- TMP soporta rich text nativo (
<color>,<b>,<size>)
⚠
Legacy Text funciona con Idiomas, pero tiene limitaciones con caracteres CJK y rendimiento. Migra a TMP siempre que sea posible.
Diseño de Canvas responsivo
Algunos idiomas necesitan mucho mas espacio que otros. Diseña tu UI con esto en mente:
- Usa componentes de layout de Unity:
HorizontalLayoutGroup,VerticalLayoutGroup,ContentSizeFitter - Configura el overflow de TMP a "Ellipsis" o "Truncate" como seguridad
- Prueba con los idiomas mas largos (aleman, ruso, portugues) para verificar que todo cabe
- Evita textos con ancho fijo — usa anclas y layout flexible
Longitud relativa por idioma
| Idioma | Longitud relativa vs ingles | Nota |
|---|---|---|
| Aleman | +30% | Palabras compuestas muy largas |
| Ruso | +20% | Declinaciones añaden longitud |
| Portugues | +20% | Articulos y preposiciones |
| Frances | +15% | Articulos frecuentes |
| Español | +15% | Similar al frances |
| Japones | -30% | Menos caracteres pero mas anchos |
| Coreano | -20% | Silabas compactas |
| Chino | -50% | Caracteres muy compactos pero anchos |
Fuentes CJK en VRChat
Esta seccion es muy importante para que los caracteres asiaticos se vean correctamente:
- VRChat incluye las fuentes Noto Sans CJK en su cliente
- NO necesitas incluir fuentes CJK en tu proyecto
- En el editor de Unity, los caracteres CJK pueden verse como cuadrados — esto es normal
- En VRChat se renderizan correctamente en PC y Quest
⚠
No pongas fuentes personalizadas en
TMP Settings > Fallback Font Assets. Si lo haces, VRChat no usara sus fuentes internas y los caracteres CJK NO se renderizaran. Deja la lista de fallback VACIA.
Estructura del JSON
Recomendaciones para organizar tu archivo de traducciones:
- Usa prefijos para organizar claves:
"settings_","menu_","hud_" - Manten las claves en ingles para universalidad (ej:
"btn_start", no"btn_iniciar") - Puedes tener multiples archivos JSON para diferentes secciones de tu mundo
- El JSON es editable manualmente con cualquier editor de texto
{
"en": {
"menu_play": "Play",
"menu_settings": "Settings",
"hud_score": "Score: {0}",
"hud_time": "Time: {0}:{1}"
},
"es": {
"menu_play": "Jugar",
"menu_settings": "Configuracion",
"hud_score": "Puntuacion: {0}",
"hud_time": "Tiempo: {0}:{1}"
}
}
Rendimiento
- El sistema usa cache: los diccionarios del idioma activo se cachean en memoria
- Cambiar de idioma es instantaneo (<1ms) porque recachea el diccionario completo
GetValue()tiene costo O(1) gracias al cache- No hay allocations de GC durante las llamadas normales
- 100+ claves y 100+ TextLocalizers: sin problema de rendimiento
Listeners externos
Si tienes scripts UdonSharp que necesitan reaccionar al cambio de idioma:
public class MyScript : UdonSharpBehaviour
{
[SerializeField] LocalizationManager _manager;
void Start()
{
_manager.RegisterListener(this);
}
public void _OnLanguageChanged()
{
// El idioma ha cambiado
string lang = _manager.GetCurrentLanguage();
// Actualiza lo que necesites...
}
}
ⓘ
Ver la API Runtime para la referencia completa de metodos disponibles.
Multiples archivos JSON
- Puedes asignar diferentes archivos JSON a diferentes LocalizationManagers
- Util para mundos con secciones independientes
- Cada JSON puede tener diferentes idiomas y claves
- El LocalizationManager solo trabaja con el JSON que tiene asignado
Control de versiones
- Incluye el JSON en tu sistema de control de versiones (Git)
- El JSON es legible y se puede comparar facilmente con
git diff - Usa la exportacion CSV para colaborar con traductores sin acceso a Unity