Repository: kubernetes/minikube
Pull request #11746 (2021-06-22 23:49:18)

Add GitHub Action to check if translations are valid
Added GitHub Action workflow that will run when anything in the translation folder is updated to ensure all the translation files are valid.

First checks if the JSON itself is valid, then checks if there are matching variables in the translated string.

Fixed translations that failed the test.


Patch:
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 1edb0da43..6ba172a75 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -3,7 +3,9 @@ on:
   push:
     branches:
       - master  
-
+env:
+  GOPROXY: https://proxy.golang.org
+  GO_VERSION: 1.16.4
 jobs:
   generate-docs:
     runs-on: ubuntu-18.04
@@ -11,7 +13,7 @@ jobs:
       - uses: actions/checkout@v2
       - uses: actions/setup-go@v2
         with:
-          go-version: 1.16.4
+          go-version: ${{env.GO_VERSION}}
           stable: true
       - name: gendocs
         run: |
diff --git a/.github/workflows/time-to-k8s.yml b/.github/workflows/time-to-k8s.yml
index eeb3a6509..4917d8fd6 100644
--- a/.github/workflows/time-to-k8s.yml
+++ b/.github/workflows/time-to-k8s.yml
@@ -2,6 +2,9 @@ name: "time-to-k8s benchmark"
 on:
   release:
     types: [released]
+env:
+  GOPROXY: https://proxy.golang.org
+  GO_VERSION: 1.16.4
 jobs:
   benchmark:
     runs-on: ubuntu-18.04
@@ -11,7 +14,7 @@ jobs:
       run: git submodule update --init
     - uses: actions/setup-go@v2
       with:
-          go-version: 1.16.4
+          go-version: ${{env.GO_VERSION}}
           stable: true
     - name: Benchmark
       run: |
diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml
new file mode 100644
index 000000000..1287f0dc3
--- /dev/null
+++ b/.github/workflows/translations.yml
@@ -0,0 +1,28 @@
+name: Translations Validation
+on:
+  pull_request:
+    paths:
+      - "translations/**"
+env:
+  GOPROXY: https://proxy.golang.org
+  GO_VERSION: 1.16.4
+jobs:
+  unit_test:
+    runs-on: ubuntu-20.04
+    steps:
+      - uses: actions/checkout@v2
+      - uses: actions/setup-go@v2
+        with:
+          go-version: ${{env.GO_VERSION}}
+          stable: true
+      - name: Install libvirt
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y libvirt-dev
+      - name: Download Dependencies
+        run: go mod download
+      - name: Unit Test
+        env:
+          TESTSUITE: unittest
+        run: make test
+        continue-on-error: false
diff --git a/hack/update/golang_version/update_golang_version.go b/hack/update/golang_version/update_golang_version.go
index d4fc63799..92e504bae 100644
--- a/hack/update/golang_version/update_golang_version.go
+++ b/hack/update/golang_version/update_golang_version.go
@@ -45,39 +45,39 @@ const (
 
 var (
 	schema = map[string]update.Item{
-		".github/workflows/iso.yml": {
+		".github/workflows/build.yml": {
 			Replace: map[string]string{
-				`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
+				`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
 			},
 		},
-		".github/workflows/kic_image.yml": {
+		".github/workflows/master.yml": {
 			Replace: map[string]string{
-				`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
+				`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
 			},
 		},
-		".github/workflows/build.yml": {
+		".github/workflows/pr.yml": {
 			Replace: map[string]string{
-				`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
+				`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
 			},
 		},
-		".github/workflows/master.yml": {
+		".github/workflows/docs.yml": {
 			Replace: map[string]string{
-				`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
+				`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
 			},
 		},
-		".github/workflows/pr.yml": {
+		".github/workflows/time-to-k8s.yml": {
 			Replace: map[string]string{
-				`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
+				`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
 			},
 		},
-		".github/workflows/docs.yml": {
+		".github/workflows/translations.yml": {
 			Replace: map[string]string{
-				`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
+				`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
 			},
 		},
-		".github/workflows/time-to-k8s.yml": {
+		".github/workflows/pr_verified.yaml": {
 			Replace: map[string]string{
-				`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
+				`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
 			},
 		},
 		".travis.yml": {
diff --git a/translations/de.json b/translations/de.json
index be50ba730..9e7e19878 100644
--- a/translations/de.json
+++ b/translations/de.json
@@ -252,7 +252,7 @@
 	"Failed to save config {{.profile}}": "",
 	"Failed to save dir": "",
 	"Failed to save stdin": "",
-	"Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}": "NO_PROXY Env konnte nicht festgelegt werden. Benutzen Sie `export NO_PROXY = $ NO_PROXY, {{. Ip}}",
+	"Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}": "NO_PROXY Env konnte nicht festgelegt werden. Benutzen Sie `export NO_PROXY = $ NO_PROXY, {{.ip}}",
 	"Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "",
 	"Failed to setup certs": "",
 	"Failed to start container runtime": "",
@@ -576,7 +576,7 @@
 	"Target directory {{.path}} must be an absolute path": "",
 	"Target {{.path}} can not be empty": "",
 	"Test docs have been saved at - {{.path}}": "",
-	"The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}": "Der Treiber \"{{.driver_name}}\" benötigt Root-Rechte. Führen Sie minikube aus mit 'sudo minikube --vm-driver = {{. Driver_name}}.",
+	"The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}": "Der Treiber \"{{.driver_name}}\" benötigt Root-Rechte. Führen Sie minikube aus mit 'sudo minikube --vm-driver = {{.driver_name}}.",
 	"The \"{{.driver_name}}\" driver should not be used with root privileges.": "",
 	"The \"{{.name}}\" cluster has been deleted.": "Der Cluster \"{{.name}}\" wurde gelöscht.",
 	"The \"{{.name}}\" cluster has been deleted.__1": "Der Cluster \"{{.name}}\" wurde gelöscht.",
@@ -714,7 +714,7 @@
 	"Unable to load config: {{.error}}": "Konfig kann nicht geladen werden: {{.error}}",
 	"Unable to load host": "",
 	"Unable to load profile: {{.error}}": "",
-	"Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "\"{{.Kubernetes_version}}\" kann nicht geparst werden: {{.error}}",
+	"Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "\"{{.kubernetes_version}}\" kann nicht geparst werden: {{.error}}",
 	"Unable to parse default Kubernetes version from constants: {{.error}}": "",
 	"Unable to parse memory '{{.memory}}': {{.error}}": "",
 	"Unable to parse oldest Kubernetes version from constants: {{.error}}": "",
@@ -943,4 +943,4 @@
 	"{{.profile}} profile is not valid: {{.err}}": "",
 	"{{.type}} is not yet a supported filesystem. We will try anyways!": "",
 	"{{.url}} is not accessible: {{.error}}": ""
-}
\ No newline at end of file
+}
diff --git a/translations/es.json b/translations/es.json
index 2595b1fe5..3ba112e71 100644
--- a/translations/es.json
+++ b/translations/es.json
@@ -3,7 +3,7 @@
 	"\"{{.context}}\" context has been updated to point to {{.hostname}}:{{.port}}": "El contexto \"{{.context}}\" ha sido actualizado para apuntar a {{.hostname}}:{{.port}}",
 	"\"{{.machineName}}\" does not exist, nothing to stop": "\"{{.machineName}}\" no existe, nada para detener.",
 	"\"{{.name}}\" profile does not exist": "El perfil \"{{.name}}\" no existe.",
-	"\"{{.name}}\" profile does not exist, trying anyways.": "El perfil \"{.name}\" no existe, intentando de todas formas.",
+	"\"{{.name}}\" profile does not exist, trying anyways.": "El perfil \"{{.name}}\" no existe, intentando de todas formas.",
 	"'none' driver does not support 'minikube docker-env' command": "El controlador 'none' no soporta el comando 'minikube docker-env'.",
 	"'none' driver does not support 'minikube mount' command": "El driver 'none' no soporta el comando 'minikube mount'.",
 	"'none' driver does not support 'minikube podman-env' command": "El controlador 'none' no soporta el comando 'minikube podman-env'.",
@@ -40,7 +40,7 @@
 	"Add machine IP to NO_PROXY environment variable": "Agregar una IP de máquina a la variable de entorno NO_PROXY",
 	"Add, delete, or push a local image into minikube": "Agrega, elimina, o empuja una imagen local dentro de minikube, haciendo (add, delete, push) respectivamente.",
 	"Add, remove, or list additional nodes": "Usa (add, remove, list) para agregar, eliminar o listar nodos adicionales.",
-	"Adding node {{.name}} to cluster {{.cluster}}": "Agregando el nodo {{.name}} al cluster.",
+	"Adding node {{.name}} to cluster {{.cluster}}": "Agregando el nodo {{.name}} al cluster {{.cluster}}.",
 	"Additional help topics": "Temas de ayuda adicionales",
 	"Additional mount options, such as cache=fscache": "Opciones de montaje adicionales, por ejemplo cache=fscache",
 	"Adds a node to the given cluster config, and starts it.": "Agrega un nodo a la configuración de cluster dada e iniciarlo.",
@@ -947,4 +947,4 @@
 	"{{.profile}} profile is not valid: {{.err}}": "",
 	"{{.type}} is not yet a supported filesystem. We will try anyways!": "",
 	"{{.url}} is not accessible: {{.error}}": ""
-}
\ No newline at end of file
+}
diff --git a/translations/fr.json b/translations/fr.json
index 5414dbbf8..b909a1766 100644
--- a/translations/fr.json
+++ b/translations/fr.json
@@ -13,7 +13,7 @@
 	"- Docs https://docs.docker.com/docker-for-windows/#resources": "- Docs https://docs.docker.com/docker-for-windows/#resources",
 	"- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "- Assurez-vous que votre démon {{.driver_name}} a accès à suffisamment de ressources CPU/mémoire.",
 	"- Prune unused {{.driver_name}} images, volumes and abandoned containers.": "- Nettoyer les images {{.driver_name}} non utilisées, les volumes et les conteneurs abandonnés.",
-	"- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "- Nettoyer les images {{.driver_name}} non utilisées, les volumes, les réseaux et les conteneurs abandonnées.",
+	"- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "- Nettoyer les images {{.driver_name}} non utilisées, les volumes, les réseaux et les conteneurs abandonnées.\n\n\t\t\t\t{{.driver_name}} system prune --volumes",
 	"- Restart your {{.driver_name}} service": "- Redémarrer votre service {{.driver_name}}",
 	"- {{.logPath}}": "",
 	"--kvm-numa-count range is 1-8": "la tranche de --kvm-numa-count est 1 à 8",
@@ -421,7 +421,7 @@
 	"Paused {{.count}} containers": "{{.count}} conteneurs suspendus",
 	"Paused {{.count}} containers in: {{.namespaces}}": "{{.count}} conteneurs suspendus dans : {{.namespaces}}",
 	"Pausing node {{.name}} ... ": "Suspendre le nœud {{.name}} ...",
-	"Permissions:  {{.octalMode}} ({{.writtenMode}})": "Autorisations : {{.octalMode}} ({{.writeMode}})",
+	"Permissions:  {{.octalMode}} ({{.writtenMode}})": "Autorisations : {{.octalMode}} ({{.writtenMode}})",
 	"Please attach the following file to the GitHub issue:": "Veuillez joindre le fichier suivant au problème GitHub :",
 	"Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "Veuillez créer un cluster avec une plus grande taille de disque : `minikube start --disk SIZE_MB`",
 	"Please either authenticate to the registry or use --base-image flag to use a different registry.": "Veuillez vous authentifier auprès du registre ou utiliser l'indicateur --base-image pour utiliser un registre différent.",
@@ -470,8 +470,8 @@
 	"Registry mirrors to pass to the Docker daemon": "Miroirs de dépôt à transmettre au daemon Docker.",
 	"Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/": "Réinstallez VirtualBox et redémarrez. Sinon, essayez le pilote kvm2 : https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/",
 	"Reinstall VirtualBox and verify that it is not blocked: System Preferences -\u003e Security \u0026 Privacy -\u003e General -\u003e Some system software was blocked from loading": "Réinstallez VirtualBox et vérifiez qu'il n'est pas bloqué : Préférences Système -\u003e Sécurité \u0026 Confidentialité -\u003e Général -\u003e Le chargement de certains logiciels système a été bloqué",
-	"Related issue: {{.url}}": "Problème connexe : {{.url}}",
-	"Related issues:": "Problème connexe : {{.url}}",
+	"Related issue: {{.url}}": "Problème connexe: {{.url}}",
+	"Related issues:": "Problème connexe:",
 	"Relaunching Kubernetes using {{.bootstrapper}} ...": "Redémarrage de Kubernetes à l'aide de {{.bootstrapper}}…",
 	"Remove one or more images": "Supprimer une ou plusieurs images",
 	"Remove the invalid --docker-opt or --insecure-registry flag if one was provided": "Supprimez l'indicateur --docker-opt ou --insecure-registry non valide s'il a été fourni",
@@ -620,8 +620,8 @@
 	"The control plane node must be running for this command": "Le nœud du plan de contrôle doit être en cours d'exécution pour cette commande",
 	"The cri socket path to be used": "Chemin d'accès au socket CRI à utiliser.",
 	"The cri socket path to be used.": "Le chemin de socket cri à utiliser.",
-	"The docker-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "",
-	"The docker-env command is only compatible with the \"docker\" runtime, but this cluster was configured to use the \"{{.runtime}}\" runtime.": "La commande docker-env est incompatible avec les clusters multi-nœuds. Utilisez le module 'registry' : https://minikube.sigs.k8s.io/docs/handbook/registry/",
+	"The docker-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "La commande docker-env est incompatible avec les clusters multi-nœuds. Utilisez le module 'registry' : https://minikube.sigs.k8s.io/docs/handbook/registry/",
+	"The docker-env command is only compatible with the \"docker\" runtime, but this cluster was configured to use the \"{{.runtime}}\" runtime.": "",
 	"The driver '{{.driver}}' is not supported on {{.os}}/{{.arch}}": "Le pilote \"{{.driver}}\" n'est pas compatible avec {{.os}}/{{.arch}}.",
 	"The existing \"{{.name}}\" cluster was created using the \"{{.old}}\" driver, which is incompatible with requested \"{{.new}}\" driver.": "Le cluster \"{{.name}}\" existant a été créé à l'aide du pilote \"{{.old}}\", qui est incompatible avec le pilote \"{{.new}}\" demandé.",
 	"The existing node configuration appears to be corrupt. Run 'minikube delete'": "La configuration de nœud existante semble être corrompue. Exécutez 'minikube delete'",
@@ -871,7 +871,7 @@
 	"minikube is missing files relating to your guest environment. This can be fixed by running 'minikube delete'": "minikube manque des fichiers relatifs à votre environnement invité. Cela peut être corrigé en exécutant 'minikube delete'",
 	"minikube is not meant for production use. You are opening non-local traffic": "minikube n'est pas destiné à une utilisation en production. Vous ouvrez du trafic non local",
 	"minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "minikube ne peut pas accéder à Google Container Registry. Vous devrez peut-être le configurer pour utiliser un proxy HTTP.",
-	"minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "minikube ne parvient pas à se connecter à la VM : {{.error}}\n\n\tCela est probablement dû à l'une des deux raisons suivantes :\n\n\t- Interférence VPN ou pare-feu\n\t- {{.hypervisor }} problème de configuration réseau\n\n\tSolutions suggérées :\n\n\t- Désactivez votre logiciel VPN ou pare-feu local\n\t- Configurez votre VPN ou pare-feu local pour autoriser l'accès à {{.ip}}\n \t- Redémarrez ou réinstallez {{.hypervisor}}\n\t- Utilisez un autre --vm-driver\n\t- Utilisez --force pour annuler cette vérification de connectivité\n\t",
+	"minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "minikube ne parvient pas à se connecter à la VM : {{.error}}\n\n\tCela est probablement dû à l'une des deux raisons suivantes :\n\n\t- Interférence VPN ou pare-feu\n\t- {{.hypervisor}} problème de configuration réseau\n\n\tSolutions suggérées :\n\n\t- Désactivez votre logiciel VPN ou pare-feu local\n\t- Configurez votre VPN ou pare-feu local pour autoriser l'accès à {{.ip}}\n \t- Redémarrez ou réinstallez {{.hypervisor}}\n\t- Utilisez un autre --vm-driver\n\t- Utilisez --force pour annuler cette vérification de connectivité\n\t",
 	"minikube profile was successfully set to {{.profile_name}}": "Le profil de minikube a été défini avec succès sur {{.profile_name}}",
 	"minikube provisions and manages local Kubernetes clusters optimized for development workflows.": "minikube provisionne et gère des clusters Kubernetes locaux optimisés pour les workflows de développement.",
 	"minikube quickly sets up a local Kubernetes cluster": "minikube configure rapidement un cluster Kubernetes local",
@@ -943,10 +943,10 @@
 	"{{.name}} was successfully configured": "{{.name}} a été configuré avec succès",
 	"{{.n}} is nearly out of disk space, which may cause deployments to fail! ({{.p}}% of capacity)": "{{.n}} manque presque d'espace disque, ce qui peut entraîner l'échec des déploiements ! ({{.p}} % de la capacité)",
 	"{{.n}} is out of disk space! (/var is at {{.p}}% of capacity)": "{{.n}} n'a plus d'espace disque ! (/var est à {{.p}} % de capacité)",
-	"{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "{{.oxibin}} prend un temps anormalement long pour répondre, pensez à redémarrer {{.osibin}}",
+	"{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "{{.ocibin}} prend un temps anormalement long pour répondre, pensez à redémarrer {{.ocibin}}",
 	"{{.path}} is version {{.client_version}}, which may have incompatibilites with Kubernetes {{.cluster_version}}.": "{{.path}} est la version {{.client_version}}, qui peut comporter des incompatibilités avec Kubernetes {{.cluster_version}}.",
 	"{{.prefix}}minikube {{.version}} on {{.platform}}": "{{.prefix}}minikube {{.version}} sur {{.platform}}",
-	"{{.profile}} profile is not valid: {{.err}}": "Le profil {{.profile}} n'est pas valide : {{.error}}",
+	"{{.profile}} profile is not valid: {{.err}}": "Le profil {{.profile}} n'est pas valide : {{.err}}",
 	"{{.type}} is not yet a supported filesystem. We will try anyways!": "{{.type}} n'est pas encore un système de fichiers pris en charge. Nous essaierons quand même !",
 	"{{.url}} is not accessible: {{.error}}": "{{.url}} n'est pas accessible : {{.error}}"
-}
\ No newline at end of file
+}
diff --git a/translations/ja.json b/translations/ja.json
index d86712a73..a11577db6 100644
--- a/translations/ja.json
+++ b/translations/ja.json
@@ -185,7 +185,7 @@
 	"Error getting cluster bootstrapper": "クラスタのブートストラッパを取得中にエラーが発生しました",
 	"Error getting cluster config": "クラスタの設定を取得中にエラーが発生しました",
 	"Error getting host": "ホストを取得中にエラーが発生しました",
-	"Error getting port binding for '{{.driver_name}} driver: {{.error}}": "「{{.driver_name}}」ドライバー用のポートをバインディング中にエラーが発生しました",
+	"Error getting port binding for '{{.driver_name}} driver: {{.error}}": "「{{.driver_name}}」ドライバー用のポートをバインディング中にエラーが発生しました: {{.error}}",
 	"Error getting primary control plane": "コントロールプレーンを取得中にエラーが発生しました",
 	"Error getting service with namespace: {{.namespace}} and labels {{.labelName}}:{{.addonName}}: {{.error}}": "",
 	"Error getting ssh client": "SSH クライアントを取得中にエラーが発生しました",
@@ -222,7 +222,7 @@
 	"Failed to configure metallb IP {{.profile}}": "",
 	"Failed to create file": "",
 	"Failed to create runtime": "",
-	"Failed to delete cluster {{.name}}, proceeding with retry anyway.": "クラスタを削除できませんでしたが、処理を続行します。",
+	"Failed to delete cluster {{.name}}, proceeding with retry anyway.": "クラスタ {{.name}} を削除できませんでしたが、処理を続行します。",
 	"Failed to delete cluster {{.name}}.": "",
 	"Failed to delete cluster: {{.error}}": "",
 	"Failed to delete cluster: {{.error}}__1": "クラスタを削除できませんでした。{{.error}}",
@@ -384,7 +384,7 @@
 	"Node operations": "ノードの運用",
 	"Node {{.name}} failed to start, deleting and trying again.": "",
 	"Node {{.name}} was successfully deleted.": "{{.name}} ノードは削除されました。",
-	"Node {{.nodeName}} does not exist.": "{{.name}} ノードは存在しません。",
+	"Node {{.nodeName}} does not exist.": "{{.nodeName}} ノードは存在しません。",
 	"None of the known repositories are accessible. Consider specifying an alternative image repository with --image-repository flag": "",
 	"None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "使用しているロケーション内で既知のいずれのリポジトリにもアクセスできません。フォールバックとして {{.image_repository_name}} を使用します",
 	"None of the known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag": "既知のいずれのリポジトリにもアクセスできません。--image-repository フラグとともに代替のイメージ リポジトリを指定することを検討してください",
@@ -964,4 +964,4 @@
 	"{{.profile}} profile is not valid: {{.err}}": "",
 	"{{.type}} is not yet a supported filesystem. We will try anyways!": "{{.type}} はまだサポートされていなファイルシステムです。とにかくやってみます！",
 	"{{.url}} is not accessible: {{.error}}": "{{.url}} はアクセス可能ではありません。 {{.error}}"
-}
\ No newline at end of file
+}
diff --git a/translations/ko.json b/translations/ko.json
index 6d9761ed2..9a986a050 100644
--- a/translations/ko.json
+++ b/translations/ko.json
@@ -17,7 +17,7 @@
 	"- Delete and recreate minikube cluster\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}": "minikube 클러스터를 삭제하고 재생성합니다.\n\t\tminikube를 삭제합니다.\n\t\tminikube start --driver={{.driver_name}}",
 	"- Docs https://docs.docker.com/docker-for-mac/#resources": "- 문서: https://docs.docker.com/docker-for-mac/#resources",
 	"- Docs https://docs.docker.com/docker-for-windows/#resources": "- 문서: https://docs.docker.com/docker-for-windows/#resources",
-	"- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "- {{.driver_name} 데몬이 충분한 CPU/메모리 리소스에 액세스할 수 있는지 확인합니다.",
+	"- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "- {{.driver_name}} 데몬이 충분한 CPU/메모리 리소스에 액세스할 수 있는지 확인합니다.",
 	"- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "",
 	"- Restart your {{.driver_name}} service": "{{.driver_name}} 서비스를 다시 시작하세요",
 	"- {{.logPath}}": "",
@@ -77,7 +77,7 @@
 	"CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "",
 	"Cache image from docker daemon": "도커 데몬의 캐시 이미지",
 	"Cache image from remote registry": "원격 레지스트리의 캐시 이미지",
-	"Cannot find directory {{.path}} for copy": "복사하기 위한 디렉토리 {{.path} 를 찾을 수 없습니다.",
+	"Cannot find directory {{.path}} for copy": "복사하기 위한 디렉토리 {{.path}} 를 찾을 수 없습니다.",
 	"Cannot find directory {{.path}} for mount": "마운트하기 위한 디렉토리 {{.path}} 를 찾을 수 없습니다",
 	"Cannot use both --output and --format options": "--output 과 --format 옵션을 함께 사용할 수 없습니다",
 	"Check if you have unnecessary pods running by running 'kubectl get po -A": "",
@@ -114,7 +114,7 @@
 	"Could not process errors from failed deletion": "",
 	"Could not resolve IP address": "",
 	"Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn.": "",
-	"Creating Kubernetes in {{.driver_name}} {{.machine_type}} with (CPUs={{.number_of_cpus}}) ({{.number_of_host_cpus}} available), Memory={{.memory_size}}MB ({{.host_memory_size}}MB available) ...": "{{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) 에 쿠버네티스를 설치하는 중 ...",
+	"Creating Kubernetes in {{.driver_name}} {{.machine_type}} with (CPUs={{.number_of_cpus}}) ({{.number_of_host_cpus}} available), Memory={{.memory_size}}MB ({{.host_memory_size}}MB available) ...": "{{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}} ({{.number_of_host_cpus}}MB 유효한), Memory={{.memory_size}}MB ({{.host_memory_size}}MB 유효한) ...",
 	"Creating mount {{.name}} ...": "",
 	"Creating {{.driver_name}} VM (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "{{.driver_name}} VM (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) 를 생성하는 중 ...",
 	"Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) ...": "",
@@ -156,7 +156,7 @@
 	"Done! kubectl is now configured to use \"{{.name}}\"": "끝났습니다! 이제 kubectl 이 \"{{.name}}\" 를 사용할 수 있도록 설정되었습니다",
 	"Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "끝났습니다! kubectl이 \"{{.name}}\" 클러스터와 \"{{.ns}}\" 네임스페이스를 기본적으로 사용하도록 구성되었습니다.",
 	"Download complete!": "다운로드가 성공하였습니다!",
-	"Downloading Kubernetes {{.version}} preload ...": "쿠버네티스 {{.version} 을 다운로드 중 ...",
+	"Downloading Kubernetes {{.version}} preload ...": "쿠버네티스 {{.version}} 을 다운로드 중 ...",
 	"Downloading VM boot image ...": "가상 머신 부트 이미지 다운로드 중 ...",
 	"Downloading driver {{.driver}}:": "드라이버 {{.driver}} 다운로드 중 :",
 	"Downloading {{.name}} {{.version}}": "{{.name}} {{.version}} 다운로드 중",
@@ -949,9 +949,9 @@
 	"{{.name}} cluster does not exist": "{{.name}} 클러스터가 존재하지 않습니다",
 	"{{.name}} doesn't have images.": "{{.name}} 이미지가 없습니다.",
 	"{{.name}} has following images:": "{{.name}}에는 다음과 같은 이미지가 있습니다.",
-	"{{.name}} has no available configuration options": "{{.driver}} 이 사용 가능한 환경 정보 옵션이 없습니다",
-	"{{.name}} is already running": "{{.driver}} 이 이미 실행 중입니다",
-	"{{.name}} was successfully configured": "{{.driver}} 이 성공적으로 설정되었습니다",
+	"{{.name}} has no available configuration options": "{{.name}} 이 사용 가능한 환경 정보 옵션이 없습니다",
+	"{{.name}} is already running": "{{.name}} 이 이미 실행 중입니다",
+	"{{.name}} was successfully configured": "{{.name}} 이 성공적으로 설정되었습니다",
 	"{{.n}} is nearly out of disk space, which may cause deployments to fail! ({{.p}}% of capacity)": "",
 	"{{.n}} is out of disk space! (/var is at {{.p}}% of capacity)": "",
 	"{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "",
@@ -961,4 +961,4 @@
 	"{{.profile}} profile is not valid: {{.err}}": "{{.profile}} 프로파일이 올바르지 않습니다: {{.err}}",
 	"{{.type}} is not yet a supported filesystem. We will try anyways!": "",
 	"{{.url}} is not accessible: {{.error}}": "{{.url}} 이 접근 불가능합니다: {{.error}}"
-}
\ No newline at end of file
+}
diff --git a/translations/pl.json b/translations/pl.json
index 1d0462ae2..b801df76b 100644
--- a/translations/pl.json
+++ b/translations/pl.json
@@ -459,7 +459,7 @@
 	"Print just the version number.": "Wyświetl tylko numer wersji",
 	"Print the version of minikube": "Wyświetl wersję minikube",
 	"Print the version of minikube.": "Wyświetl wersję minikube.",
-	"Problems detected in {{.entry}}:": "Wykryto problem w {{.name}}",
+	"Problems detected in {{.entry}}:": "Wykryto problem w {{.entry}}",
 	"Problems detected in {{.name}}:": "Wykryto problem w {{.name}}:",
 	"Profile \"{{.cluster}}\" not found. Run \"minikube profile list\" to view all profiles.": "",
 	"Profile gets or sets the current minikube profile": "Pobiera lub ustawia aktywny profil minikube",
@@ -549,7 +549,7 @@
 	"Show only log entries which point to known problems": "Pokaż logi które wskazują na znane problemy",
 	"Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.": "",
 	"Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only)": "",
-	"Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "Zignorowano zmianę kontekstu kubectl ponieważ --keep-context zostało przekazane",
+	"Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "Zignorowano zmianę kontekstu kubectl dla {{.profile_name}} ponieważ --keep-context zostało przekazane",
 	"Some dashboard features require the metrics-server addon. To enable all features please run:\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n": "",
 	"Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path": "",
 	"Sorry, completion support is not yet implemented for {{.name}}": "",
@@ -869,7 +869,7 @@
 	"invalid kubernetes version": "Nieprawidłowa wersja Kubernetesa",
 	"keep the kube-context active after cluster is stopped. Defaults to false.": "",
 	"kubeadm detected a TCP port conflict with another process: probably another local Kubernetes installation. Run lsof -p\u003cport\u003e to find the process and kill it": "",
-	"kubectl and minikube configuration will be stored in {{.home_folder}}": "konfiguracja minikube i kubectl będzie przechowywana w katalogu {{.home_dir}}",
+	"kubectl and minikube configuration will be stored in {{.home_folder}}": "konfiguracja minikube i kubectl będzie przechowywana w katalogu {{.home_folder}}",
 	"kubectl not found in PATH, but is required for the dashboard. Installation guide: https://kubernetes.io/docs/tasks/tools/install-kubectl/": "kubectl nie zostało odnalezione w zmiennej środowiskowej ${PATH}. Instrukcja instalacji:  https://kubernetes.io/docs/tasks/tools/install-kubectl/",
 	"kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'": "",
 	"kubectl proxy": "",
@@ -961,4 +961,4 @@
 	"{{.profile}} profile is not valid: {{.err}}": "{{.profile}} profil nie jest poprawny: {{.err}}",
 	"{{.type}} is not yet a supported filesystem. We will try anyways!": "{{.type}} nie jest wspierany przez system plików. I tak spróbujemy!",
 	"{{.url}} is not accessible: {{.error}}": "{{.url}} nie jest osiągalny: {{.error}}"
-}
\ No newline at end of file
+}


Test patch:
diff --git a/pkg/minikube/translate/translate_test.go b/pkg/minikube/translate/translate_test.go
index d04579109..dd5893ad8 100644
--- a/pkg/minikube/translate/translate_test.go
+++ b/pkg/minikube/translate/translate_test.go
@@ -17,6 +17,11 @@ limitations under the License.
 package translate
 
 import (
+	"encoding/json"
+	"os"
+	"path/filepath"
+	"regexp"
+	"sort"
 	"testing"
 
 	"golang.org/x/text/language"
@@ -97,3 +102,81 @@ func TestT(t *testing.T) {
 		})
 	}
 }
+
+func TestTranslationFilesValid(t *testing.T) {
+	languageFiles, err := filepath.Glob("../../../translations/*.json")
+	if err != nil {
+		t.Fatalf("failed to get translation files: %v", err)
+	}
+	for _, filename := range languageFiles {
+		lang := filepath.Base(filename)
+		t.Run(lang, func(t *testing.T) {
+			contents, err := os.ReadFile(filename)
+			if err != nil {
+				t.Fatalf("unable to read file %s: %v", filename, err)
+			}
+
+			// check if JSON is valid
+			if valid := json.Valid(contents); !valid {
+				t.Fatalf("%s does not contain valid json", filename)
+			}
+
+			// convert file into map
+			var entries map[string]string
+			if err := json.Unmarshal(contents, &entries); err != nil {
+				t.Fatalf("could not unmarshal file %s: %v", filename, err)
+			}
+
+			// for each line
+			for k, v := range entries {
+				// if no translation, skip
+				if v == "" {
+					continue
+				}
+
+				// get all variables (ex. {{.name}})
+				keyVariables := distinctVariables(k)
+				valueVariables := distinctVariables(v)
+
+				// check if number of original string and translated variables match
+				if len(keyVariables) != len(valueVariables) {
+					t.Errorf("line %q: %q has mismatching number of variables\noriginal string variables: %s; translated variables: %s", k, v, keyVariables, valueVariables)
+					continue
+				}
+
+				// for each variable in the original string
+				for i, keyVar := range keyVariables {
+					// check if translated string has same variable
+					if keyVar != valueVariables[i] {
+						t.Errorf("line %q: %q has mismatching variables\noriginal string variables: %s do not match translated variables: %s", k, v, keyVariables, valueVariables)
+						break
+					}
+				}
+			}
+		})
+	}
+}
+
+func distinctVariables(line string) []string {
+	re := regexp.MustCompile(`{{\..+?}}`)
+
+	// get all the variables from the string (possiible duplicates)
+	variables := re.FindAllString(line, -1)
+	distinctMap := make(map[string]bool)
+
+	// add them to a map to get distinct list of variables
+	for _, variable := range variables {
+		distinctMap[variable] = true
+	}
+	distinct := []string{}
+
+	// convert map into slice
+	for k := range distinctMap {
+		distinct = append(distinct, k)
+	}
+
+	// sort the slice to make the comparison easier
+	sort.Strings(distinct)
+
+	return distinct
+}