Batch Script │ Çoklu dil nasıl eklenir? Nasıl yönetilir?
Batch script ile yaptığınız çalışmalarınızı paylaşıyorsanız kitlenize hitap edebilmek için projenize farklı dil seçenekleri eklemek isteyebilirsiniz. Ben bu konuda belli bir bilgi birikimine ulaşmadan önce Toolbox çalışmamı İngilizce ve Türkçe olarak iki ayrı şekilde düzenliyordum. Bir Türkçe bölümünü bir İngilizce bölümünü düzeltmekle uğraşırken çok yoruluyordum. Yapmak istediğim bir çok şeyi yapamıyordum. Bu sorunu çözmek için öğrendiğim methotu detaylarıyla anlatmaya çalıştım.
1- Sistem dil verisi nasıl öğrenilir? Nasıl işlenir?
Öncelikle bu konuyu öğrenip dil verisini alıp yönlendirme veya tanımları nasıl yapacağımızı öğrenelim. Bu bölüme dil ekleme olayının temeli diyebiliriz.
Dil verisini alttaki Dism komutuyla bulabiliriz. Bu komut sistem diline göre otomatik atama yapmak istersek kullanacağımız yöntemdir.
Dism /online /Get-intl
Bu komut içinde bakacağımız bölüm "Default system UI Language"
Bu veriyi alıp işlemek istiyorsak aşağıdaki FOR döngüsünü kullanmamız gerekiyor. Aşağıdaki örnekte for döngüsü içinde tokens=6 kullanmamın nedeni sistem dilinin bulunduğu konum olmasıdır. Yukarıdaki görsele göre anlatırsam bu veri ile Dism komutunu çalıştırıp Default system UI Language bölümünü aratıyorum. Tek dize olarak gelen bu bölümde 6.sırada olan dil verisini yani 'tr-TR' alıp Lang değişkenine tanımlıyorum. Bununla yönlendirme yapmak isterseniz if ile veriyi tanımladığınız değişkene mantıksal sorgulama yapmanız gerekiyor. Aşağıda örnek çalışmayla tüm detaylar anlatılmıştır.
echo off
chcp 65001
setlocal enabledelayedexpansion
cls
:: Yönetici çalışma yetkileri sonrası dizin System32 olur. Bunu aşağıdaki komut ile çalışma dizinine ayarlıyorum.
cd /d %~dp0
:: Çalışma dizini Konum değişkeni içine tanımlıyorum.
FOR /F "tokens=*" %%a in ('cd') do (set Konum=%%a)
:: Sistem dil verisini öğrenip if ile sorgulama yapıp tanımlama yapıyorum.
:: Ben dil dosyalarımı "%Konum%\Bin\Language" içerisinde tutuyorum. Ona göre anlatıyorum. Siz farklı bir dizine yerleştirebilirsiniz.
:: tr-TR, en-US gibi dil etiketleri "BCP 47" olarak bilinir. Google'dan bu ifadeyi aratıp diğer dillerin tanımlarını bulabilirsiniz.
FOR /F "tokens=6" %%a in ('Dism /online /Get-intl ^| Find /I "Default system UI language"') do (
if %%a EQU tr-TR (set Dil="%Konum%\Bin\Language\Turkish.cmd")
if %%a EQU en-US (set Dil="%Konum%\Bin\Language\English.cmd")
)
echo !Dil!
pause
exit
2- Dil dosyaları nasıl oluşturulur?
Dil dosyalarını çalışma dizininde veya bir klasör içinde bulundurabilirsiniz. Derli toplu durması için klasör içerisinde tutmak daha iyi olacaktır. Batch script içinde kod olarak çalıştıracağınız komutlar var ve bunları dil dosyasına tanımlamak istiyorsanız, dil dosyasını .cmd uzantılı olarak hazırlamanız gerekir. Ancak bu tarz komutlar çalıştırmanız gerekmiyorsa uzantısını .ini .txt olarakta ayarlayabilirsiniz.
2.1- Birinci Yöntem;
Dil dosyaları içinde sağlıklı bir yönetim yapabilmek için güzel bir şablon oluşturmalıyız. Ben her dil verisini işlerken özel tanımlar ekliyorum. Başlıklar için ayrı, genel metinler için ayrı, kod içeren dil verilerini ayrı bölümde çalıştırıyorum. > bu işareti daha sağlıklı görüntüleme ve veri çekerken işaret olarak kullanıyoruz.
2.1- Birinci Yöntem;
Dil dosyaları içinde sağlıklı bir yönetim yapabilmek için güzel bir şablon oluşturmalıyız. Ben her dil verisini işlerken özel tanımlar ekliyorum. Başlıklar için ayrı, genel metinler için ayrı, kod içeren dil verilerini ayrı bölümde çalıştırıyorum. > bu işareti daha sağlıklı görüntüleme ve veri çekerken işaret olarak kullanıyoruz.
T0001>Başlık>
T0002>Örnek çalışma>
T0003>Test başlığı>
B0001>Ana menü>
B0002>Yan menü>
M0001>Geri>
M0002>İleri>
2.2- İkinci Yöntem;
Batch script kodlamamız içinde bazı menüleri veya bölümleri sıralı şekilde almamız gerekebilir. Yukarıdaki gibi bol sıfırlı ifadeler işimizi zorlaştıracağı için daha farklı ve sade bir tanım yaparak dil dosyamızı oluşturuyoruz.
OG_1_>Test1>
OG_2_>Test2>
OG_3_>Test3>
OG_4_>Test4>
2.3- Üçüncü Yöntem;
Karmaşık olan bölümleri kod ile çalıştırıp dil dosyası içine eklemek için dosyamızı .cmd veya .bat olarak oluşturuyoruz. Ben toolbox içinde uygulama indir bölümünde 3 sütun da 60 üstü programı nizami şekilde paylaştığım için bunu döngüler ile tanımlayıp liste oluşturmak zor ve zahmetli olacaktır. Bunun yerine dil dosyamızın içinde ilgili bölüm için başlık oluşturup gerekli bölümlerde çalıştırmak için çağıracağız.
:: Dil dosyası içindeki yönlendirme bölümü
Call %*
goto :eof
:Menu1
echo test1 test2 test3
echo test4 test5 test6
echo test7 test8 test9
goto :eof
3- Dil dosyalarından verileri nasıl çekeriz?
Dil dosyasından verileri çekmek için '
Call
' parametresini kullanacağız. Call parametresinde iki yöntem kullanacağız. Bunlardan birinde dil dosyasına eklediğimiz veriyi bir değişkene tanımlayacağız. Diğerinde ise dil dosyası içinde komutlu bir bölüm var ise onu çağırıp çalıştırmak için kullanacağımız yöntemi anlatacağım. Dil verisini çekerken önce Call parametresini kullanıp ilgili başlıktan değişkene veriyi tanımlayacağız sonra echo parametresi ile ekrana yazdıracağız.
Aşağıdaki yöntemler içinde dil verisini çekerken değerleri doğru kullanmaya dikkat edin. '>' sembolü alacağımız aralığı belirtir. Tokens kaçıncı sırada olduğunu belirtir. Aşağıdaki örnek ile anlatmak gerekirse;
T0001>test1>test2>test3>test4>
tokens=1 ► T0001
tokens=2 ► test1
tokens=3 ► test2
tokens=4 ► test3
tokens=5 ► test4
şeklinde verileri alır. '>' sembollerini dahil etmez. Ayrıca değişken tanımı yaparken 'L' sabit değerine ek harf ataması yaparak çoklu tanım yapmayı sağlıyoruz. Burada siz isterseniz farklı bir tanım yapabilirsiniz. Aşağıdaki örnekle detaylandırırsak aynı satırda iki farklı dil verisini çekip kullanmam gerektiğinde bunlar için farklı harf tanımlaması yapıyorum.
Call :Dil A 2 T0001
Call :Dil B 2 T0002
echo !LA2! - !LB2!
Dil verisini her satırda farklı atamanız gerekmez. Aşağıdaki gibi farklı satıra geçince aynı değişkeni yeniden tanımlayıp içeriğini istediğiniz veri ile doldurabilirsiniz.
Call :Dil A 2 T0002
echo !LA2!
Call :Dil A 2 T0005
echo !LA2!
3.1- Birinci Yöntem;
Bu bölümü çok sık kullanacağımız için öncelikle Call ile çağırabileceğimiz bir başlık hazırlıyoruz. Ben bu başlığı ':Dil' olarak tanımladım. For döngüsü ile dil dosyamızın yolunu tanımladığımız dosya içinden istediğimiz veriyi çekeceğiz.
◘ Batch çalışması;
echo off
chcp 65001
setlocal enabledelayedexpansion
cls
:: Yönetici çalışma yetkileri sonrası dizin System32 olur. Bunu aşağıdaki komut ile çalışma dizinine ayarlıyorum.
cd /d %~dp0
:: Çalışma dizini Konum değişkeni içine tanımlıyorum.
FOR /F "tokens=*" %%a in ('cd') do (set Konum=%%a)
:: Varsayılan sistem dilini öğrenip Dil değişkenine tanımlıyorum.
FOR /F "tokens=6" %%a in ('Dism /online /Get-intl ^| Find /I "Default system UI language"') do (
if %%a EQU tr-TR (set Dil="%Konum%\Bin\Language\Turkish.cmd")
if %%a EQU en-US (set Dil="%Konum%\Bin\Language\English.cmd")
)
:: Veriyi çağırmak için Call komutunu ve çağırmak istediğim başlığı yazıyorum
:: Daha sonra Dil verimi nasıl tanımlayacağımı ve hangi veriyi, hangi sıradan alacağımı belirtiyorum.
:: A ifadesiyle dil değişkenini LA olarak tanımladım. B kullansaydım LB olacaktı. Aynı dizin içinde farklı tanımlamalar yapmamız gerekebilir. Bundan dolayı dil verisini çeşitlendirmek için harf atamalarını esnek tutmamız gerekiyor.
:: Daha sonra 2 ifadesiyle istediğim verinin dil dosyasındaki konumunu veriyorum.
:: T0001 ifadesiyle istediğim dil verisini belirtiyorum.
Call :Dil A 2 T0001
echo !LA2!
pause
exit
:: --------------:Dil
:: Değişkenler konusunda bu bölümü işlemiştik.
:: %~1= Değişken harfi │ %~2= Konum verisi│ %~3= Dil verisi
:: Öncelikle değişkenimizi temizliyoruz.
set L%~1%~2=
:: For döngüsünde delims ile > aralık işaretimizi tanımladık. Tokens ile alacağımız verinin sırasını tanımladık.
:: Findstr ile dil dosyası içinde arama yaptık
:: Bulduğumuz değeri değişkenimize tanımladık.
FOR /F "delims=> tokens=%~2" %%z in ('Findstr /i "%~3" %Dil%') do (set L%~1%~2=%%z)
goto :eof
3.2- İkinci Yöntem;
Bu bölümde sıralı verileri nasıl listeleyip çekeceğimizi gösteriyoruz.
◘ Batch çalışması;
echo off
chcp 65001
setlocal enabledelayedexpansion
cls
:: Yönetici çalışma yetkileri sonrası dizin System32 olur. Bunu aşağıdaki komut ile çalışma dizinine ayarlıyorum.
cd /d %~dp0
:: Çalışma dizini Konum değişkeni içine tanımlıyorum.
FOR /F "tokens=*" %%a in ('cd') do (set Konum=%%a)
:: Varsayılan sistem dilini öğrenip Dil değişkenine tanımlıyorum.
FOR /F "tokens=6" %%a in ('Dism /online /Get-intl ^| Find /I "Default system UI language"') do (
if %%a EQU tr-TR (set Dil="%Konum%\Bin\Language\Turkish.cmd")
if %%a EQU en-US (set Dil="%Konum%\Bin\Language\English.cmd")
)
:: Aşağıdaki FOR /L döngüsü ile 1'den başlayıp 1 artarak 4'e kadar saymasını istedik. Dil dosyanıza göre buradaki 4 değerini kendinize göre ayarlayacaksınız. Bu döngü ile aynı şeyleri tekrar tekrar yazmaktan kaçınıyoruz.
:: Veriyi çağırmak için Call komutunu ve çağırmak istediğim başlığı yazıyorum
:: Daha sonra Dil verimi nasıl tanımlayacağımı ve hangi veriyi, hangi sıradan alacağımı belirtiyorum.
:: A ifadesiyle dil değişkenini LA olarak tanımladım. B kullansaydım LB olacaktı. Aynı dizin içinde farklı tanımlamalar yapmamız gerekebilir. Bundan dolayı dil verisini çeşitlendirmek için harf atamalarını esnek tutmamız gerekiyor.
:: Daha sonra 2 ifadesiyle istediğim verinin dil dosyasındaki konumunu veriyorum.
:: OG_%%a_ ifadesiyle istediğim dil verisini belirtiyorum. %%a FOR döngü içinde rakamları sırasıyla içerisinde barındıran değişkendir.
FOR /L %%a in (1,1,4) do (
Call :Dil A 2 OG_%%a_
echo !LA2!
)
pause
exit
:: --------------:Dil
:: Değişkenler konusunda bu bölümü işlemiştik.
:: %~1= Değişken harfi │ %~2= Konum verisi│ %~3= Dil verisi
:: Öncelikle değişkenimizi temizliyoruz.
set L%~1%~2=
:: For döngüsünde delims ile > aralık işaretimizi tanımladık. Tokens ile alacağımız verinin sırasını tanımladık.
:: Findstr ile dil dosyası içinde arama yaptık
:: Bulduğumuz değeri değişkenimize tanımladık.
FOR /F "delims=> tokens=%~2" %%z in ('Findstr /i "%~3" %Dil%') do (set L%~1%~2=%%z)
goto :eof
3.3- Üçüncü Yöntem;
Bu bölümde .cmd .bat uzantılı dil dosyalarından komutlu bölümleri çağıracağız.
◘ Batch çalışması;
echo off
chcp 65001
setlocal enabledelayedexpansion
cls
:: Yönetici çalışma yetkileri sonrası dizin System32 olur. Bunu aşağıdaki komut ile çalışma dizinine ayarlıyorum.
cd /d %~dp0
:: Çalışma dizini Konum değişkeni içine tanımlıyorum.
FOR /F "tokens=*" %%a in ('cd') do (set Konum=%%a)
:: Varsayılan sistem dilini öğrenip Dil değişkenine tanımlıyorum.
FOR /F "tokens=6" %%a in ('Dism /online /Get-intl ^| Find /I "Default system UI language"') do (
if %%a EQU tr-TR (set Dil="%Konum%\Bin\Language\Turkish.cmd")
if %%a EQU en-US (set Dil="%Konum%\Bin\Language\English.cmd")
)
:: Call parametresi ile Dil değişkenine tanımladığım dil komut dosyasından Menu1 başlığını çağırıyorum.
Call !Dil! :Menu1
pause
exit
◘ Dil Dosyası;
:: Batch çalışmasından gönderdiğim parametriyi dil komut dosyasından çalıştırıp Menu1 başlığına gidiyorum.
Call %*
:: Görüntülemeyi yapıp geri dönmesi için goto :eof uyguladık.
goto :eof
:Menu1
echo test1 test2 test3
echo test4 test5 test6
echo test7 test8 test9
:: Görüntülemeyi yapıp geri dönmesi için goto :eof uyguladık.
goto :eof