Unverified Commit 052d9a38 authored by Sergey Pinus's avatar Sergey Pinus Committed by GitHub
Browse files

Merge branch 'dmMaze:dev' into dev

parents 4455a406 6bb45fd3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
> **如打算公开分享本工具的机翻结果,且没有有经验的译者进行过完整的翻译或校对,请在显眼位置注明机翻。**

# BallonTranslator
简体中文 | [English](/README_EN.md) | [pt-BR](doc/README_PT-BR.md) | [Русский](doc/README_RU.md) | [日本語](doc/README_JA.md) | [Indonesia](doc/README_ID.md) | [Tiếng Việt](doc/README_VI.md) | [한국어](doc/README_KO.md)
简体中文 | [English](/README_EN.md) | [pt-BR](doc/README_PT-BR.md) | [Русский](doc/README_RU.md) | [日本語](doc/README_JA.md) | [Indonesia](doc/README_ID.md) | [Tiếng Việt](doc/README_VI.md) | [한국어](doc/README_KO.md) | [Español](doc/README_ES.md)

深度学习辅助漫画翻译工具,支持一键机翻和简单的图像/文本编辑  

+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
> **If you're sharing the translated result publicly and no experienced human translator participated in a throughout translating or proofreading, please mark it as machine translation somewhere clear to see.**

# BallonTranslator
[简体中文](/README.md) | English | [pt-BR](doc/README_PT-BR.md) | [Русский](doc/README_RU.md) | [日本語](doc/README_JA.md) | [Indonesia](doc/README_ID.md) | [Tiếng Việt](doc/README_VI.md) | [한국어](doc/README_KO.md)
[简体中文](/README.md) | English | [pt-BR](doc/README_PT-BR.md) | [Русский](doc/README_RU.md) | [日本語](doc/README_JA.md) | [Indonesia](doc/README_ID.md) | [Tiếng Việt](doc/README_VI.md) | [한국어](doc/README_KO.md) | [Español](doc/README_ES.md)

Yet another computer-aided comic/manga translation tool powered by deep learning.

+176 −0
Original line number Diff line number Diff line
[简体中文](../doc/加别的翻译器.md) | [English](../doc/how_to_add_new_translator.md) | [pt-BR](../doc/Como_add_um_novo_tradutor.md)) | [Русский](../doc/add_translator_ru.md) | ESPAÑOL

---

## Cómo añadir un nuevo traductor a BallonsTranslator

Si sabe utilizar la API del traductor o el modelo de traducción deseado en Python, siga los pasos que se indican a continuación para integrarlo con BallonsTranslator.

### Implementación de la clase traductor

Si sabes cómo llamar a la API del traductor de destino o del modelo de traducción en Python, implementa una clase en `ballontranslator/dl/translators.__init__.py` como se indica a continuación para utilizarla en la aplicación. El siguiente ejemplo, DummyTranslator, está comentado en `ballontranslator/dl/translator/__init__.py` y puede descomentarse para probarlo en el programa.

1. **Crear una nueva clase en `ballontranslator/dl/translators/__init__.py`:**

```python
# "dummy translator" es el nombre que aparece en la aplicación
@register_translator('dummy translator')
class DummyTranslator(BaseTranslator):

    concate_text = True

    # parámetros mostrados en el panel de configuración.
    # las claves son los nombres de los parámetros, si el tipo del valor es str, será un editor de texto (clave requerida)
    # si el tipo del valor es dict, es necesario especificar el 'tipo' del parámetro,
    # el siguiente 'device' es un selector, las opciones son cpu y cuda, por defecto es cpu
    params: Dict = {
        'api_key': '', 
        'device': {
            'type': 'selector',
            'options': ['cpu', 'cuda'],
            'value': 'cpu'
        }
    }

    def _setup_translator(self):
        '''
        configúrelo aquí.
        las claves lang_map son las opciones de idioma que se muestran en la aplicación,
        asigne las correspondientes claves de idioma aceptadas por la API a los idiomas soportados.
        Aquí sólo se asignan los idiomas soportados por el traductor, este traductor sólo soporta japonés e inglés.
        Para obtener una lista completa de idiomas, consulte LANGMAP_GLOBAL en translator.__init__.
        '''
        self.lang_map['日本語'] = 'ja'
        self.lang_map['English'] = 'en'
        
    def _translate(self, src_list: List[str]) -> List[str]:
        '''
        hacer la traducción aquí.
        Este traductor no hace más que devolver el texto original.
        '''
        source = self.lang_map[self.lang_source]
        target = self.lang_map[self.lang_target]
        
        translation = text
        return translation

    def updateParam(self, param_key: str, param_content):
        '''
        sólo es necesario si algún estado necesita ser actualizado inmediatamente después de que el usuario cambie los parámetros del traductor,
        por ejemplo, si este traductor es un modelo pytorch, puedes convertirlo a cpu/gpu aquí.
        '''
        super().updateParam(param_key, param_content)
        if (param_key == 'device'):
            # obtener el estado actual de los parámetros
            # self.model.to(self.params['device']['value'])
            pass

    @property
    def supported_tgt_list(self) -> List[str]:
        '''
        sólo es necesario si el soporte lingüístico del traductor es asimétrico,
        por ejemplo, este traductor sólo admite inglés -> japonés, no japonés -> inglés.
        '''
        return ['English']

    @property
    def supported_src_list(self) -> List[str]:
        '''
        sólo es necesario si el soporte lingüístico del traductor es asimétrico.
        '''
        return ['日本語']
```

- Decora la clase con `@register_translator` y proporciona el nombre del traductor que se mostrará en la interfaz. En el ejemplo, el nombre pasado al decorador es `'dummy translator'`, tenga cuidado de no renombrarlo con un traductor existente.
- La clase debe heredar de `BaseTranslator`.

2. **Establece el atributo `concate_text`:**

```python
@register_translator('dummy translator')
class DummyTranslator(BaseTranslator):  
    concate_text = True  # Si el traductor sólo acepta cadenas concatenadas
    concate_text = False # Si el traductor acepta listas de cadenas o plantillas offline
```

- Indica si el traductor sólo acepta texto concatenado (varias frases en una sola cadena) o una lista de cadenas.
- Si se trata de un modelo offline o de una API que acepta listas de cadenas, establézcalo en `False`.

3. **Establezca los parámetros (opcional):**

```python
params: Dict = {
    'api_key': '',  # Editor de texto para la clave API
    'device': {    # Selector para CPU o CUDA
        'type': 'selector',
        'options': ['cpu', 'cuda'],
        'value': 'cpu'
    }
}
```

- Crea un diccionario `params` si el traductor necesita parámetros configurables por el usuario. Si no, déjelo en blanco o asígnele `None`.
- Las claves del diccionario son los nombres de los parámetros que se muestran en la interfaz. Si el tipo de valor correspondiente es str, se mostrará en la aplicación como un editor de texto; en el ejemplo anterior, api_key será un editor de texto con un valor por defecto vacío.
- Los valores pueden ser cadenas (para editores de texto) o diccionarios (en cuyo caso deben describirse mediante 'type', como en el ejemplo anterior. El parámetro 'device' se mostrará como un selector en la aplicación, las opciones válidas son 'cpu' y 'cuda).

<p align="center">
<img src="./src/new_translator.png">
</p>
<p align="center">
parámetros mostrados en el panel de configuración de la aplicación.
</p>  

4. **Implementa el método `_setup_translator`:**

```python
def _setup_translator(self):
    '''
    configúrelo aquí.
    las claves lang_map son las opciones de idioma que se muestran en la aplicación,
    asigne las correspondientes claves de idioma aceptadas por la API a los idiomas soportados.
    Aquí sólo se asignan los idiomas soportados por el traductor, este traductor sólo soporta japonés e inglés.
    Para obtener una lista completa de idiomas, consulte LANGMAP_GLOBAL en translator.__init__.
    '''
    self.lang_map['日本語'] = 'ja'
    self.lang_map['English'] = 'en'
```

- Configurar el traductor (inicialización del modelo, autenticación de la API, etc.).
- Asignar los idiomas mostrados en la aplicación a los códigos de idioma aceptados por la API.
- Consulta `LANGMAP_GLOBAL` en `translator.__init__` para ver la lista completa de idiomas.

5. **Implementa el método `_translate`:**

```python
def _translate(self, src_list: List[str]) -> List[str]:
    '''
    hacer la traducción aquí.
    Este traductor no hace más que devolver el texto original.
    '''
    source = self.lang_map[self.lang_source]
    target = self.lang_map[self.lang_target]
    
    translation = text
    return translation
```

- Recibe una lista de cadenas (`src_list`) para traducir.
- Si `concate_text` es `True`, las cadenas se concatenarán antes de pasarlas al traductor.
- Realiza la traducción utilizando la API o el modelo.
- Devuelve una lista de cadenas traducidas.

### Métodos opcionales

- **`updateParam(self, param_key: str, param_content)`:**
    - Impleméntelo si necesita actualizar el estado del traductor inmediatamente después de que el usuario cambie los parámetros.

- **`supported_tgt_list(self) -> List[str]`:**
    - Implementar si el soporte lingüístico del traductor es asimétrico (por ejemplo, sólo traduce del inglés al japonés).

- **`supported_src_list(self) -> List[str]`:**
    - Aplicar si el soporte lingüístico del traductor es asimétrico.

### Pruebas

Después de implementar el traductor, pruébalo siguiendo el ejemplo de `tests/test_translators.py`.
 No newline at end of file
+15 −0
Original line number Diff line number Diff line
[简体中文](../doc/团子OCR说明.md) | [pt-BR](/Manual_TuanziCR_pt_BR.md) | ESPAÑOL

## Parámetros de solicitud Referencia (Oficial)

<p align="center">
<img src="https://github.com/PiDanShouRouZhouXD/BallonsTranslator/assets/38401147/3c3985e9-f36e-41fb-af94-d6a8088e5ccd" width="85%" height="85%">
</p>

## Descripción de Tuanzi OCR

### Inicio de sesión
Cuando te conectes por primera vez, es posible que recibas mensajes de error sobre la contraseña. Si estás seguro de que la contraseña es correcta, marca y desmarca la opción "force_refresh_token" para forzar un nuevo inicio de sesión. Guarda la configuración y el problema debería resolverse.

### Detección de texto
La función de detección de texto también extrae texto, pero de forma holística (identificación completa). Por lo tanto, al utilizar TuanziOCR, recomendamos no utilizar únicamente la función de OCR, sino combinar la detección de texto de TuanziOCR con la opción "none_ocr". TuanziOCR tiene filtros integrados para onomatopeyas (Reproducción de sonidos por medio de fonemas/palabras. Algunos ejemplos: Ruidos, gritos, sonidos de animales, etc.) y otras funciones. Para conocer los ajustes detallados, consulte la "Referencia de parámetros de solicitud (oficial)" anterior.
 No newline at end of file

doc/README_ES.md

0 → 100644
+241 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading