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.json.unitypackage mas reciente desde la pagina de ReleasesAssets > Import Package > Custom PackageEl 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.
Packages/com.benderdios.idiomas/Prefabs/ (instalacion VPM) o Assets/Idiomas/Prefabs/ (instalacion manual)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
│ ├── IdiomasEditorStrings.cs # Traducciones del propio inspector (11 idiomas)
│ ├── 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. |
OnLanguageDropdownChanged() | Callback que el TMP_Dropdown dispara via SendCustomEvent al cambiar la seleccion. |
SendCustomEvent)Ideales para conectar botones de UI directamente, sin script intermedio.
| Metodo | Idioma |
|---|---|
SetLanguageAuto() | Deteccion automatica (equivalente a SetLanguage(null)) |
SetLanguageEnglish() | en — English |
SetLanguageSpanish() | es — Espanol |
SetLanguageJapanese() | ja — 日本語 |
SetLanguageKorean() | ko — 한국어 |
SetLanguageChineseSimplified() | zh-CN — 中文 (简体) |
SetLanguageChineseTraditional() | zh-TW — 中文 (繁體) |
SetLanguageRussian() | ru — Русский |
SetLanguagePortuguese() | pt-BR — Portugues |
SetLanguageFrench() | fr — Francais |
SetLanguageGerman() | de — Deutsch |
SetLanguageCatalan() | ca — Catala |
| Metodo | Retorno | Descripcion |
|---|---|---|
UpdateText() | void | Actualiza el texto con la traduccion actual. Se llama automaticamente. |
SetTranslationKey(string key) | void | Cambia la clave de traduccion y actualiza el texto. |
GetTranslationKey() | string | Devuelve la clave de traduccion actual. |
SetParams(string p0) | void | Reemplaza {0} en la traduccion y actualiza. |
SetParams2(string p0, string p1) | void | Reemplaza {0} y {1}. |
SetParams3(string p0, string p1, string p2) | void | Reemplaza {0}, {1} y {2}. |
GetManager() | LocalizationManager | Devuelve el manager asignado. |
SetManager(LocalizationManager m) | void | Establece el manager manualmente. |
| Metodo | Retorno | Descripcion |
|---|---|---|
UpdateAllTexts() | void | Actualiza todos los textos del Canvas. Se llama automaticamente al cambiar idioma. |
GetCanvasId() | string | Devuelve el ID del canvas. |
GetBaseLanguage() | string | Devuelve el idioma base configurado. |
GetManager() | LocalizationManager | Devuelve el manager asignado. |
GetTextCount() | int | Numero total de textos gestionados (TMP + Legacy). |
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.26
2022.3 or later
No dependencies
No legacy packages