refactor!: rename project from DeepLX to DLX

Rebrand in response to a trademark report regarding the DEEPL mark.
Renames the Go module path, exported symbols, binary, systemd/launchd
services, Docker images, and CI artifacts; adds a trademark disclaimer
to the README and removes screenshots containing DeepL branding.

BREAKING CHANGE: Go module path is now github.com/OwO-Network/DLX.
translate.TranslateByDeepLX is now translate.TranslateByDLX and
DeepLXTranslationResult is now DLXTranslationResult. The release
binaries, systemd service, and Docker images are renamed from
deeplx to dlx.
This commit is contained in:
Vincent Yang 2026-07-08 08:53:32 -07:00
parent 88a00874c8
commit 515752fe25
No known key found for this signature in database
GPG Key ID: F9D66A5FEA75787E
19 changed files with 137 additions and 105 deletions

View File

@ -4,14 +4,14 @@
# @Date: 2022-10-20 02:19:06 # @Date: 2022-10-20 02:19:06
# @LastEditors: Vincent Yang # @LastEditors: Vincent Yang
# @LastEditTime: 2024-03-20 16:52:40 # @LastEditTime: 2024-03-20 16:52:40
# @FilePath: /DeepLX/.cross_compile.sh # @FilePath: /DLX/.cross_compile.sh
# @Telegram: https://t.me/missuo # @Telegram: https://t.me/missuo
# #
# Copyright © 2022 by Vincent, All Rights Reserved. # Copyright © 2022 by Vincent, All Rights Reserved.
### ###
set -e set -e
DIST_PREFIX="deeplx" DIST_PREFIX="dlx"
DEBUG_MODE=${2} DEBUG_MODE=${2}
TARGET_DIR="dist" TARGET_DIR="dist"
PLATFORMS="darwin/amd64 darwin/arm64 linux/386 linux/amd64 linux/arm64 linux/mips openbsd/amd64 openbsd/arm64 freebsd/amd64 freebsd/arm64 windows/386 windows/amd64" PLATFORMS="darwin/amd64 darwin/arm64 linux/386 linux/amd64 linux/arm64 linux/mips openbsd/amd64 openbsd/arm64 freebsd/amd64 freebsd/arm64 windows/386 windows/amd64"

View File

@ -8,7 +8,7 @@ on:
- 'v*' - 'v*'
env: env:
DOCKER_IMAGE_NAME: missuo/deeplx DOCKER_IMAGE_NAME: missuo/dlx
GHCR_IMAGE_NAME: ${{ github.repository }} GHCR_IMAGE_NAME: ${{ github.repository }}
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}

View File

@ -41,7 +41,7 @@ jobs:
CGO_ENABLED: "0" CGO_ENABLED: "0"
run: | run: |
mkdir -p dist mkdir -p dist
BINARY="dist/deeplx_${GOOS}_${GOARCH}" BINARY="dist/dlx_${GOOS}_${GOARCH}"
if [ "${GOOS}" = "windows" ]; then if [ "${GOOS}" = "windows" ]; then
BINARY="${BINARY}.exe" BINARY="${BINARY}.exe"
fi fi
@ -50,7 +50,7 @@ jobs:
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: deeplx_${{ matrix.goos }}_${{ matrix.goarch }} name: dlx_${{ matrix.goos }}_${{ matrix.goarch }}
path: dist/* path: dist/*
if-no-files-found: error if-no-files-found: error

3
.gitignore vendored
View File

@ -1,4 +1,5 @@
DeepLX DLX
dlx
# macOS Finder metadata # macOS Finder metadata
.DS_Store .DS_Store

View File

@ -1,13 +1,13 @@
FROM golang:1.25 AS builder FROM golang:1.25 AS builder
WORKDIR /go/src/github.com/OwO-Network/DeepLX WORKDIR /go/src/github.com/OwO-Network/DLX
COPY . . COPY . .
RUN go get -d -v ./ RUN go get -d -v ./
RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o deeplx . RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o dlx .
FROM alpine:latest FROM alpine:latest
WORKDIR /app WORKDIR /app
RUN addgroup -S deeplx && adduser -h /app -G deeplx -SH deeplx RUN addgroup -S dlx && adduser -h /app -G dlx -SH dlx
USER deeplx:deeplx USER dlx:dlx
COPY --from=builder --chown=deeplx:deeplx /go/src/github.com/OwO-Network/DeepLX/deeplx /app/deeplx COPY --from=builder --chown=dlx:dlx /go/src/github.com/OwO-Network/DLX/dlx /app/dlx
EXPOSE 1188 EXPOSE 1188
ENTRYPOINT ["/app/deeplx"] ENTRYPOINT ["/app/dlx"]

View File

@ -2,32 +2,63 @@
* @Author: Vincent Young * @Author: Vincent Young
* @Date: 2022-10-18 07:32:29 * @Date: 2022-10-18 07:32:29
* @LastEditors: Vincent Yang * @LastEditors: Vincent Yang
* @LastEditTime: 2024-11-30 19:48:00 * @LastEditTime: 2026-07-08 00:00:00
* @FilePath: /DeepLX/README.md * @FilePath: /DLX/README.md
* @Telegram: https://t.me/missuo * @Telegram: https://t.me/missuo
* *
* Copyright © 2022 by Vincent, All Rights Reserved. * Copyright © 2022 by Vincent, All Rights Reserved.
--> -->
[![GitHub Workflow][1]](https://github.com/OwO-Network/DeepLX/actions) # DLX
[![Go Version][2]](https://github.com/OwO-Network/DeepLX/blob/main/go.mod)
[![Go Report][3]](https://goreportcard.com/badge/github.com/OwO-Network/DeepLX)
[![GitHub License][4]](https://github.com/OwO-Network/DeepLX/blob/main/LICENSE)
[![Docker Pulls][5]](https://hub.docker.com/r/missuo/deeplx)
[![Releases][6]](https://github.com/OwO-Network/DeepLX/releases)
[1]: https://img.shields.io/github/actions/workflow/status/OwO-Network/DeepLX/release.yaml?logo=github [![GitHub Workflow][1]](https://github.com/OwO-Network/DLX/actions)
[2]: https://img.shields.io/github/go-mod/go-version/OwO-Network/DeepLX?logo=go [![Go Version][2]](https://github.com/OwO-Network/DLX/blob/main/go.mod)
[3]: https://goreportcard.com/badge/github.com/OwO-Network/DeepLX [![Go Report][3]](https://goreportcard.com/badge/github.com/OwO-Network/DLX)
[4]: https://img.shields.io/github/license/OwO-Network/DeepLX [![GitHub License][4]](https://github.com/OwO-Network/DLX/blob/main/LICENSE)
[5]: https://img.shields.io/docker/pulls/missuo/deeplx?logo=docker [![Docker Pulls][5]](https://hub.docker.com/r/missuo/dlx)
[6]: https://img.shields.io/github/v/release/OwO-Network/DeepLX?logo=smartthings [![Releases][6]](https://github.com/OwO-Network/DLX/releases)
## How to use [1]: https://img.shields.io/github/actions/workflow/status/OwO-Network/DLX/release.yaml?logo=github
[2]: https://img.shields.io/github/go-mod/go-version/OwO-Network/DLX?logo=go
[3]: https://goreportcard.com/badge/github.com/OwO-Network/DLX
[4]: https://img.shields.io/github/license/OwO-Network/DLX
[5]: https://img.shields.io/docker/pulls/missuo/dlx?logo=docker
[6]: https://img.shields.io/github/v/release/OwO-Network/DLX?logo=smartthings
> \[!TIP] > [!IMPORTANT]
> > **Disclaimer:** DLX is an independent, open-source project. It is **not** affiliated with, endorsed by, or sponsored by DeepL SE in any way. "DeepL" is a registered trademark of DeepL SE. Any reference to DeepL in this repository is made solely to describe interoperability with the DeepL translation service.
> Learn more about [📘 Using DeepLX](https://deeplx.owo.network) by checking it out.
DLX is a self-hosted translation API server written in Go. It exposes a simple HTTP API on port `1188`.
## Usage
### Docker
```bash
docker run -d -p 1188:1188 ghcr.io/owo-network/dlx:latest
```
Or use the provided [`compose.yaml`](compose.yaml):
```bash
docker compose up -d
```
### Binary
Download the binary for your platform from [Releases](https://github.com/OwO-Network/DLX/releases) and run it:
```bash
./dlx
```
### Translate
```bash
curl -X POST http://localhost:1188/translate \
-H "Content-Type: application/json" \
-d '{"text": "Hello, world!", "source_lang": "EN", "target_lang": "ZH"}'
```
## Discussion Group ## Discussion Group
[Telegram Group](https://t.me/+8KDGHKJCxEVkNzll) [Telegram Group](https://t.me/+8KDGHKJCxEVkNzll)
@ -36,12 +67,12 @@
### Contributors ### Contributors
<a href="https://github.com/OwO-Network/DeepLX/graphs/contributors"> <a href="https://github.com/OwO-Network/DLX/graphs/contributors">
<img src="https://contrib.rocks/image?repo=OwO-Network/DeepLX&anon=0" /> <img src="https://contrib.rocks/image?repo=OwO-Network/DLX&anon=0" />
</a> </a>
## Activity ## Activity
![Alt](https://repobeats.axiom.co/api/embed/5f473f85db27cb30028a2f3db7a560f3577a4860.svg "Repobeats analytics image") ![Alt](https://repobeats.axiom.co/api/embed/5f473f85db27cb30028a2f3db7a560f3577a4860.svg "Repobeats analytics image")
## License ## License
[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FOwO-Network%2FDeepLX.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2FOwO-Network%2FDeepLX?ref=badge_large) [MIT](LICENSE)

View File

@ -1,6 +1,6 @@
services: services:
deeplx: dlx:
image: ghcr.io/owo-network/deeplx:latest image: ghcr.io/owo-network/dlx:latest
restart: always restart: always
ports: ports:
- "1188:1188" - "1188:1188"

View File

@ -1,12 +1,12 @@
[Unit] [Unit]
Description=DeepLX Service Description=DLX Service
After=network.target After=network.target
[Service] [Service]
Type=simple Type=simple
Restart=always Restart=always
WorkingDirectory=/usr/bin/ WorkingDirectory=/usr/bin/
ExecStart=/usr/bin/deeplx ExecStart=/usr/bin/dlx
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target

2
go.mod
View File

@ -1,4 +1,4 @@
module github.com/OwO-Network/DeepLX module github.com/OwO-Network/DLX
go 1.25.0 go 1.25.0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 KiB

View File

@ -1,21 +1,21 @@
### ###
# @Author: Vincent Young # @Author: Vincent Young
# @Date: 2023-02-12 09:53:21 # @Date: 2023-02-12 09:53:21
# @LastEditors: Vincent Young # @LastEditors: Vincent Yang
# @LastEditTime: 2023-02-12 10:01:57 # @LastEditTime: 2026-07-08 00:00:00
# @FilePath: /DeepLX/install.sh # @FilePath: /DLX/install.sh
# @Telegram: https://t.me/missuo # @Telegram: https://t.me/missuo
# #
# Copyright © 2023 by Vincent, All Rights Reserved. # Copyright © 2023 by Vincent, All Rights Reserved.
### ###
install_deeplx(){ install_dlx(){
last_version=$(curl -Ls "https://api.github.com/repos/OwO-Network/DeepLX/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') last_version=$(curl -Ls "https://api.github.com/repos/OwO-Network/DLX/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
if [[ ! -n "$last_version" ]]; then if [[ ! -n "$last_version" ]]; then
echo -e "${red}Failed to detect DeepLX version, probably due to exceeding Github API limitations.${plain}" echo -e "${red}Failed to detect DLX version, probably due to exceeding Github API limitations.${plain}"
exit 1 exit 1
fi fi
echo -e "DeepLX latest version: ${last_version}, Start install..." echo -e "DLX latest version: ${last_version}, Start install..."
arch=$(uname -m) arch=$(uname -m)
case "${arch}" in case "${arch}" in
@ -29,13 +29,13 @@ install_deeplx(){
;; ;;
esac esac
wget -q -N --no-check-certificate -O /usr/bin/deeplx https://github.com/OwO-Network/DeepLX/releases/download/${last_version}/deeplx_linux_${file_arch} wget -q -N --no-check-certificate -O /usr/bin/dlx https://github.com/OwO-Network/DLX/releases/download/${last_version}/dlx_linux_${file_arch}
chmod +x /usr/bin/deeplx chmod +x /usr/bin/dlx
wget -q -N --no-check-certificate -O /etc/systemd/system/deeplx.service https://raw.githubusercontent.com/OwO-Network/DeepLX/main/deeplx.service wget -q -N --no-check-certificate -O /etc/systemd/system/dlx.service https://raw.githubusercontent.com/OwO-Network/DLX/main/dlx.service
systemctl daemon-reload systemctl daemon-reload
systemctl enable deeplx systemctl enable dlx
systemctl start deeplx systemctl start dlx
echo -e "Installed successfully, listening at 0.0.0.0:1188" echo -e "Installed successfully, listening at 0.0.0.0:1188"
} }
install_deeplx install_dlx

View File

@ -3,7 +3,7 @@
* @Date: 2023-07-01 21:45:34 * @Date: 2023-07-01 21:45:34
* @LastEditors: Jason Lyu * @LastEditors: Jason Lyu
* @LastEditTime: 2025-04-08 13:45:00 * @LastEditTime: 2025-04-08 13:45:00
* @FilePath: /DeepLX/main.go * @FilePath: /DLX/main.go
* @Telegram: https://t.me/missuo * @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo * @GitHub: https://github.com/missuo
* *
@ -17,13 +17,13 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/OwO-Network/DeepLX/service" "github.com/OwO-Network/DLX/service"
) )
func main() { func main() {
cfg := service.InitConfig() cfg := service.InitConfig()
fmt.Printf("DeepL X has been successfully launched! Listening on %v:%v\n", cfg.IP, cfg.Port) fmt.Printf("DLX has been successfully launched! Listening on %v:%v\n", cfg.IP, cfg.Port)
fmt.Println("Developed by sjlleo <i@leo.moe> and missuo <me@missuo.me>.") fmt.Println("Developed by sjlleo <i@leo.moe> and missuo <me@missuo.me>.")
// Setting the application to release mode // Setting the application to release mode

View File

@ -3,12 +3,12 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>Label</key> <key>Label</key>
<string>me.missuo.deeplx</string> <string>me.missuo.dlx</string>
<key>KeepAlive</key> <key>KeepAlive</key>
<true/> <true/>
<key>ProgramArguments</key> <key>ProgramArguments</key>
<array> <array>
<string>/usr/local/bin/deeplx</string> <string>/usr/local/bin/dlx</string>
</array> </array>
<key>RunAtLoad</key> <key>RunAtLoad</key>
<true/> <true/>

View File

@ -3,7 +3,7 @@
* @Date: 2024-04-23 00:39:03 * @Date: 2024-04-23 00:39:03
* @LastEditors: Jason Lyu * @LastEditors: Jason Lyu
* @LastEditTime: 2025-04-08 13:45:00 * @LastEditTime: 2025-04-08 13:45:00
* @FilePath: /DeepLX/config.go * @FilePath: /DLX/service/config.go
* @Telegram: https://t.me/missuo * @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo * @GitHub: https://github.com/missuo
* *

View File

@ -3,7 +3,7 @@
* @Date: 2023-07-01 21:45:34 * @Date: 2023-07-01 21:45:34
* @LastEditors: Jason Lyu * @LastEditors: Jason Lyu
* @LastEditTime: 2025-04-08 13:45:00 * @LastEditTime: 2025-04-08 13:45:00
* @FilePath: /DeepLX/main.go * @FilePath: /DLX/service/service.go
* @Telegram: https://t.me/missuo * @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo * @GitHub: https://github.com/missuo
* *
@ -23,7 +23,7 @@ import (
"github.com/gin-contrib/cors" "github.com/gin-contrib/cors"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/OwO-Network/DeepLX/translate" "github.com/OwO-Network/DLX/translate"
) )
func authMiddleware(cfg *Config) gin.HandlerFunc { func authMiddleware(cfg *Config) gin.HandlerFunc {
@ -101,7 +101,7 @@ func Router(cfg *Config) *gin.Engine {
r.GET("/", func(c *gin.Context) { r.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"code": http.StatusOK, "code": http.StatusOK,
"message": "DeepL Free API, Developed by sjlleo and missuo. Go to /translate with POST. http://github.com/OwO-Network/DeepLX", "message": "DLX Translation API, Developed by sjlleo and missuo. Go to /translate with POST. https://github.com/OwO-Network/DLX",
}) })
}) })
@ -131,7 +131,7 @@ func Router(cfg *Config) *gin.Engine {
return return
} }
result, err := translate.TranslateByDeepLX(sourceLang, targetLang, translateText, tagHandling, proxyURL, "") result, err := translate.TranslateByDLX(sourceLang, targetLang, translateText, tagHandling, proxyURL, "")
if err != nil { if err != nil {
log.Printf("Translation failed: %s", err) log.Printf("Translation failed: %s", err)
c.JSON(http.StatusInternalServerError, gin.H{ c.JSON(http.StatusInternalServerError, gin.H{
@ -206,7 +206,7 @@ func Router(cfg *Config) *gin.Engine {
return return
} }
result, err := translate.TranslateByDeepLX(sourceLang, targetLang, translateText, tagHandling, proxyURL, dlSession) result, err := translate.TranslateByDLX(sourceLang, targetLang, translateText, tagHandling, proxyURL, dlSession)
if err != nil { if err != nil {
log.Printf("Translation failed: %s", err) log.Printf("Translation failed: %s", err)
c.JSON(http.StatusInternalServerError, gin.H{ c.JSON(http.StatusInternalServerError, gin.H{
@ -263,7 +263,7 @@ func Router(cfg *Config) *gin.Engine {
targetLang = jsonData.TargetLang targetLang = jsonData.TargetLang
} }
result, err := translate.TranslateByDeepLX("", targetLang, translateText, "", proxyURL, "") result, err := translate.TranslateByDLX("", targetLang, translateText, "", proxyURL, "")
if err != nil { if err != nil {
log.Printf("Translation failed: %s", err) log.Printf("Translation failed: %s", err)
c.JSON(http.StatusInternalServerError, gin.H{ c.JSON(http.StatusInternalServerError, gin.H{

View File

@ -3,7 +3,7 @@
* @Date: 2024-09-16 11:59:24 * @Date: 2024-09-16 11:59:24
* @LastEditors: Vincent Yang * @LastEditors: Vincent Yang
* @LastEditTime: 2026-05-22 00:00:00 * @LastEditTime: 2026-05-22 00:00:00
* @FilePath: /DeepLX/translate/translate.go * @FilePath: /DLX/translate/translate.go
* @Telegram: https://t.me/missuo * @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo * @GitHub: https://github.com/missuo
* *
@ -382,13 +382,13 @@ func callOneshot(endpoint string, body []byte, bearerToken, proxyURL string) (gj
return gjson.ParseBytes(raw), resp.StatusCode, nil return gjson.ParseBytes(raw), resp.StatusCode, nil
} }
// TranslateByDeepLX performs translation via the DeepL oneshot endpoint. // TranslateByDLX performs translation via the DeepL oneshot endpoint.
// Passing dlSession switches to the Pro endpoint; the value is sent // Passing dlSession switches to the Pro endpoint; the value is sent
// verbatim as the Bearer token (i.e. it must be an OAuth access token, // verbatim as the Bearer token (i.e. it must be an OAuth access token,
// not the legacy dl_session cookie). // not the legacy dl_session cookie).
func TranslateByDeepLX(sourceLang, targetLang, text string, tagHandling string, proxyURL string, dlSession string) (DeepLXTranslationResult, error) { func TranslateByDLX(sourceLang, targetLang, text string, tagHandling string, proxyURL string, dlSession string) (DLXTranslationResult, error) {
if text == "" { if text == "" {
return DeepLXTranslationResult{ return DLXTranslationResult{
Code: http.StatusNotFound, Code: http.StatusNotFound,
Message: "No text to translate", Message: "No text to translate",
}, nil }, nil
@ -396,21 +396,21 @@ func TranslateByDeepLX(sourceLang, targetLang, text string, tagHandling string,
resolvedTarget, err := resolveTargetLang(targetLang) resolvedTarget, err := resolveTargetLang(targetLang)
if err != nil { if err != nil {
return DeepLXTranslationResult{ return DLXTranslationResult{
Code: http.StatusBadRequest, Code: http.StatusBadRequest,
Message: err.Error(), Message: err.Error(),
}, nil }, nil
} }
resolvedSource, err := resolveSourceLang(sourceLang) resolvedSource, err := resolveSourceLang(sourceLang)
if err != nil { if err != nil {
return DeepLXTranslationResult{ return DLXTranslationResult{
Code: http.StatusBadRequest, Code: http.StatusBadRequest,
Message: err.Error(), Message: err.Error(),
}, nil }, nil
} }
if n := utf8.RuneCountInString(text); n > maxFreeTextLength { if n := utf8.RuneCountInString(text); n > maxFreeTextLength {
return DeepLXTranslationResult{ return DLXTranslationResult{
Code: http.StatusRequestEntityTooLarge, Code: http.StatusRequestEntityTooLarge,
Message: fmt.Sprintf("text exceeds maximum length: %d characters (anonymous oneshot limit is %d)", n, maxFreeTextLength), Message: fmt.Sprintf("text exceeds maximum length: %d characters (anonymous oneshot limit is %d)", n, maxFreeTextLength),
}, nil }, nil
@ -443,13 +443,13 @@ func TranslateByDeepLX(sourceLang, targetLang, text string, tagHandling string,
// took too long" from other 503 failure modes (DNS, TLS, etc.). // took too long" from other 503 failure modes (DNS, TLS, etc.).
var ue *url.Error var ue *url.Error
if errors.Is(err, context.DeadlineExceeded) || (errors.As(err, &ue) && ue.Timeout()) { if errors.Is(err, context.DeadlineExceeded) || (errors.As(err, &ue) && ue.Timeout()) {
return DeepLXTranslationResult{ return DLXTranslationResult{
ID: id, ID: id,
Code: http.StatusGatewayTimeout, Code: http.StatusGatewayTimeout,
Message: fmt.Sprintf("upstream DeepL request timed out after %s", oneshotTimeout), Message: fmt.Sprintf("upstream DeepL request timed out after %s", oneshotTimeout),
}, nil }, nil
} }
return DeepLXTranslationResult{ return DLXTranslationResult{
ID: id, ID: id,
Code: http.StatusServiceUnavailable, Code: http.StatusServiceUnavailable,
Message: err.Error(), Message: err.Error(),
@ -460,13 +460,13 @@ func TranslateByDeepLX(sourceLang, targetLang, text string, tagHandling string,
case http.StatusOK: case http.StatusOK:
// fall through to body parsing // fall through to body parsing
case http.StatusTooManyRequests: case http.StatusTooManyRequests:
return DeepLXTranslationResult{ return DLXTranslationResult{
ID: id, ID: id,
Code: http.StatusTooManyRequests, Code: http.StatusTooManyRequests,
Message: "too many requests, your IP has been blocked by DeepL temporarily, please don't request it frequently in a short time", Message: "too many requests, your IP has been blocked by DeepL temporarily, please don't request it frequently in a short time",
}, nil }, nil
default: default:
return DeepLXTranslationResult{ return DLXTranslationResult{
ID: id, ID: id,
Code: http.StatusServiceUnavailable, Code: http.StatusServiceUnavailable,
Message: fmt.Sprintf("request failed with status code: %d", status), Message: fmt.Sprintf("request failed with status code: %d", status),
@ -475,7 +475,7 @@ func TranslateByDeepLX(sourceLang, targetLang, text string, tagHandling string,
translations := result.Get("translations").Array() translations := result.Get("translations").Array()
if len(translations) == 0 { if len(translations) == 0 {
return DeepLXTranslationResult{ return DLXTranslationResult{
ID: id, ID: id,
Code: http.StatusServiceUnavailable, Code: http.StatusServiceUnavailable,
Message: "Translation failed", Message: "Translation failed",
@ -484,7 +484,7 @@ func TranslateByDeepLX(sourceLang, targetLang, text string, tagHandling string,
mainText := translations[0].Get("text").String() mainText := translations[0].Get("text").String()
if mainText == "" { if mainText == "" {
return DeepLXTranslationResult{ return DLXTranslationResult{
ID: id, ID: id,
Code: http.StatusServiceUnavailable, Code: http.StatusServiceUnavailable,
Message: "Translation failed", Message: "Translation failed",
@ -495,7 +495,7 @@ func TranslateByDeepLX(sourceLang, targetLang, text string, tagHandling string,
sourceLang = strings.ToUpper(detected) sourceLang = strings.ToUpper(detected)
} }
return DeepLXTranslationResult{ return DLXTranslationResult{
Code: http.StatusOK, Code: http.StatusOK,
ID: id, ID: id,
Data: mainText, Data: mainText,

View File

@ -3,7 +3,7 @@
* @Date: 2024-09-16 11:59:24 * @Date: 2024-09-16 11:59:24
* @LastEditors: Vincent Yang * @LastEditors: Vincent Yang
* @LastEditTime: 2026-05-22 00:00:00 * @LastEditTime: 2026-05-22 00:00:00
* @FilePath: /DeepLX/translate/types.go * @FilePath: /DLX/translate/types.go
* @Telegram: https://t.me/missuo * @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo * @GitHub: https://github.com/missuo
* *
@ -12,11 +12,11 @@
package translate package translate
// DeepLXTranslationResult is the public response shape consumed by the HTTP // DLXTranslationResult is the public response shape consumed by the HTTP
// handlers in the service package. The structure predates the migration to // handlers in the service package. The structure predates the migration to
// the oneshot endpoint; Alternatives is now always empty because oneshot does // the oneshot endpoint; Alternatives is now always empty because oneshot does
// not return alternative translations, and ID is synthesized from time. // not return alternative translations, and ID is synthesized from time.
type DeepLXTranslationResult struct { type DLXTranslationResult struct {
Code int `json:"code"` Code int `json:"code"`
ID int64 `json:"id"` ID int64 `json:"id"`
Message string `json:"message,omitempty"` Message string `json:"message,omitempty"`

View File

@ -12,44 +12,44 @@ if [[ $EUID -ne 0 ]]; then
exit 1 exit 1
fi fi
uninstall_deeplx() { uninstall_dlx() {
echo -e "${green}Starting DeepLX uninstallation...${plain}" echo -e "${green}Starting DLX uninstallation...${plain}"
# 1. Stop and disable the DeepLX service # 1. Stop and disable the DLX service
if systemctl is-active --quiet deeplx; then if systemctl is-active --quiet dlx; then
echo -e "${yellow}Stopping DeepLX service...${plain}" echo -e "${yellow}Stopping DLX service...${plain}"
systemctl stop deeplx systemctl stop dlx
else else
echo -e "${yellow}DeepLX service is not running or not found.${plain}" echo -e "${yellow}DLX service is not running or not found.${plain}"
fi fi
if systemctl is-enabled --quiet deeplx; then if systemctl is-enabled --quiet dlx; then
echo -e "${yellow}Disabling DeepLX service from starting on boot...${plain}" echo -e "${yellow}Disabling DLX service from starting on boot...${plain}"
systemctl disable deeplx systemctl disable dlx
else else
echo -e "${yellow}DeepLX service is not enabled.${plain}" echo -e "${yellow}DLX service is not enabled.${plain}"
fi fi
# 2. Remove the systemd service file # 2. Remove the systemd service file
if [ -f /etc/systemd/system/deeplx.service ]; then if [ -f /etc/systemd/system/dlx.service ]; then
echo -e "${yellow}Removing DeepLX systemd service file (/etc/systemd/system/deeplx.service)...${plain}" echo -e "${yellow}Removing DLX systemd service file (/etc/systemd/system/dlx.service)...${plain}"
rm -f /etc/systemd/system/deeplx.service rm -f /etc/systemd/system/dlx.service
systemctl daemon-reload systemctl daemon-reload
echo -e "${green}Systemd daemon reloaded.${plain}" echo -e "${green}Systemd daemon reloaded.${plain}"
else else
echo -e "${yellow}DeepLX systemd service file not found, skipping removal.${plain}" echo -e "${yellow}DLX systemd service file not found, skipping removal.${plain}"
fi fi
# 3. Remove the DeepLX executable # 3. Remove the DLX executable
if [ -f /usr/bin/deeplx ]; then if [ -f /usr/bin/dlx ]; then
echo -e "${yellow}Removing DeepLX executable (/usr/bin/deeplx)...${plain}" echo -e "${yellow}Removing DLX executable (/usr/bin/dlx)...${plain}"
rm -f /usr/bin/deeplx rm -f /usr/bin/dlx
else else
echo -e "${yellow}DeepLX executable not found, skipping removal.${plain}" echo -e "${yellow}DLX executable not found, skipping removal.${plain}"
fi fi
echo -e "${green}DeepLX uninstallation complete.${plain}" echo -e "${green}DLX uninstallation complete.${plain}"
echo -e "${green}If you wish to reinstall, please run the install script again.${plain}" echo -e "${green}If you wish to reinstall, please run the install script again.${plain}"
} }
uninstall_deeplx uninstall_dlx