Sistema de localizacion standalone para mundos de VRChat usando UdonSharp. Traduce automaticamente todos los textos de un Canvas a multiples idiomas.
100% independiente. No requiere YamaPlayer ni ningun otro sistema externo.
https://emerytheec.github.io/vpm-listing/index.jsonCopia la carpeta Idiomas/ completa a Assets/ en tu proyecto de Unity.
El sistema soporta 11 idiomas incluyendo japones, chino, coreano y ruso. Estos caracteres se renderizan automaticamente con las fuentes internas del cliente de VRChat (Noto Sans CJK) en runtime.
No necesitas configurar fuentes adicionales.
Para que las fuentes de VRChat funcionen, la lista de Fallback Font Assets
en TMP Settings (Edit > Project Settings > TextMeshPro Settings) debe estar
vacia. Si hay fuentes custom ahi, VRChat las usa en vez de las suyas.
Nota: En el editor de Unity (Play mode local), los caracteres CJK pueden aparecer como cuadrados. Esto es normal — al subir el mundo a VRChat se renderizan correctamente.
Assets/Idiomas/Prefabs/LocalizationManager a tu escena (Hierarchy)settings, lobby, hud)en)Si tienes muchos canvas sin localizar:
Para textos sueltos que no estan en un canvas:
btn_start)API MyMemory: gratis, sin registro, 5000 caracteres por dia. Lingva Translate se usa como fallback si MyMemory falla. Las traducciones marcadas [TODO:xx] fallaron y necesitan traduccion manual.
Edita directamente el archivo JSON de traducciones. Formato:
{
"en": {
"mi_clave": "English text"
},
"es": {
"mi_clave": "Texto en espanol"
},
"ja": {
"mi_clave": "日本語テキスト"
}
}
Menu: Tools > Idiomas > Exportar-Importar CSV
Permite exportar las traducciones a CSV para editarlas en Google Sheets o Excel, y luego importarlas de vuelta al JSON. Util para colaborar con traductores.
| Codigo | Idioma | Caracteres especiales |
|---|---|---|
en | English | No |
es | Espanol | No |
ja | Japanese | Si (fuentes VRChat automaticas) |
ko | Korean | Si (fuentes VRChat automaticas) |
zh-CN | Chinese Simplified | Si (fuentes VRChat automaticas) |
zh-TW | Chinese Traditional | Si (fuentes VRChat automaticas) |
ru | Russian | Si (fuentes VRChat automaticas) |
pt-BR | Portuguese | No |
fr | French | No |
de | German | No |
ca | Catalan | No |
Puedes agregar cualquier idioma editando el JSON. El sistema detecta automaticamente los idiomas disponibles.
El cerebro del sistema. Solo necesitas uno por escena.
Se coloca en el raiz de un Canvas y traduce todos los textos hijos.
[Idiomas:canvasId] N textosSe coloca en un solo texto para traduccion individual.
{0}, {1}, {2}{t} como placeholder)Al iniciar, el sistema detecta el idioma del jugador:
VRCPlayerApi.GetCurrentLanguage()es-CL → busca es si no existe es-CLja, Madrid → es, etc. (soporta Windows y IANA/Quest)en)Idiomas/
├── Runtime/
│ ├── LocalizationManager.cs # Cerebro del sistema
│ ├── CanvasLocalizer.cs # Localizador de canvas completo
│ ├── TextLocalizer.cs # Localizador de texto individual
│ └── Idiomas.Runtime.asmdef # Assembly definition
├── Editor/
│ ├── LocalizationManagerEditor.cs # Inspector del Manager
│ ├── CanvasLocalizerEditor.cs # Inspector del CanvasLocalizer
│ ├── CanvasLocalizerGizmo.cs # Gizmo en Scene View
│ ├── AutoTranslateWindow.cs # Ventana de auto-traduccion
│ ├── CsvExportImportWindow.cs # Exportar/importar CSV
│ ├── IdiomasLanguages.cs # Definiciones centralizadas de idiomas
│ ├── IdiomasEditorUtils.cs # Utilidades compartidas
│ ├── IdiomasPrefabCreator.cs # Creador de demos
│ └── Idiomas.Editor.asmdef # Assembly definition
├── Prefabs/
│ └── LocalizationManager.prefab # Prefab listo para usar
├── package.json # Metadatos VPM
└── README.md
Namespace: BenderDios.Idiomas
| Metodo | Descripcion |
|---|---|
SetLanguage(string lang) | Cambia el idioma activo. null = auto-detectar. |
GetValue(string key) | Obtiene la traduccion de una clave. Fallback en cascada. |
GetPluralValue(string key, int count) | Traduccion con pluralizacion (_zero, _one, _other). {n} se reemplaza por el numero. |
GetCurrentLanguage() | Devuelve el codigo del idioma activo (ej: "es"). |
GetLanguageCount() | Numero de idiomas disponibles. |
GetAvailableLanguages() | Array de codigos de idioma. |
HasLanguage(string lang) | true si el idioma existe en el JSON. |
IsReady() | true cuando el sistema esta inicializado. |
RegisterListener(UdonSharpBehaviour) | Registra un listener que recibe _OnLanguageChanged al cambiar idioma. |
RegisterLocalizer(TextLocalizer) | Registra un TextLocalizer en runtime. |
RegisterCanvasLocalizer(CanvasLocalizer) | Registra un CanvasLocalizer en runtime. |
SetLanguageJapanese(), SetLanguageEnglish(), etc. | Metodos sin parametros para SendCustomEvent. |
| Metodo | Descripcion |
|---|---|
UpdateText() | Actualiza el texto con la traduccion actual. |
SetTranslationKey(string key) | Cambia la clave en runtime. |
SetParams(string p0) | Reemplaza {0} en la traduccion y actualiza. |
SetParams2(string p0, string p1) | Reemplaza {0} y {1}. |
SetParams3(string p0, string p1, string p2) | Reemplaza {0}, {1} y {2}. |
Convencion de claves en el JSON:
{
"en": {
"players_zero": "No players",
"players_one": "1 player",
"players_other": "{n} players"
},
"es": {
"players_zero": "Sin jugadores",
"players_one": "1 jugador",
"players_other": "{n} jugadores"
}
}
En tu script: manager.GetPluralValue("players", count)
En el JSON: "welcome": "Hola {0}, tienes {1} mensajes"
En tu script con TextLocalizer:
textLocalizer.SetParams2("Bender", "5");
// Resultado: "Hola Bender, tienes 5 mensajes"
Para que tu script reaccione cuando el jugador cambia de idioma:
_OnLanguageChanged() en tu script.Actualmente, si un jugador elige un idioma manualmente y vuelve a entrar al mundo, el sistema auto-detecta de nuevo. Para persistir la eleccion:
manager.RegisterListener(this)._OnLanguageChanged(), guarda manager.GetCurrentLanguage() con tu sistema de persistencia.Start(), lee el idioma guardado y llama manager.SetLanguage(idiomaGuardado).VRChat ofrece PlayerData para persistencia entre sesiones.
MIT. Libre para uso personal y comercial. Creditos apreciados pero no requeridos.
com.benderdios.idiomas
Undefined
1.0.25
2022.3 or later
No dependencies
No legacy packages