[.NET] Multilanguage

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Ik loop nu tegen het probleem aan hoe maak ik een programma goed meertalig?
In het bedrijf waar ik werk is de huidige situatie dat ze binnen VBA een functie hebben gemaakt waarbij ze een nummer en een standaard waarde opgeven.

Bijvoorbeeld: Translate(324, "Datum")

Wanneer de tag 324 niet bestaat wordt de standaard tekst "Datum" weergegeven.
Daarnaast hebben ze een functie gemaakt waarbij ze eenvoudig door alle form`s lopen en de objecten in de vertaal database plaatsen.

Echter lijkt mij het werken met een nr minder binnen .NET i.v.m. het unieke nummer binnen de database waarbij je telkens bij taal onafhankelijkheid in de code, binnen de database de tag nummer moet zoeken. En dat moet vervolgens in de code weer worden geplaatst.

Ik heb gekeken op internet en daar wordt gebruik gemaakt van een resx bestand (XML met daarin label en waarde). Daarnaast had een ander voor elke vertaling een functie geschreven. Ook dat lijkt me niet optimaal.

Maar wanneer je gebruik wil maken van de standaard waarde "Datum" als naam en je past hierin iets aan ben je gelijktijdig de waarde in de database kwijt of waardes met twee verschillende betekenissen kun je niet onderscheiden.

Hoe gaan jullie hier mee om, heeft hier iemand iets voor gebruikt?

Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Nu online

lier

MikroTik nerd

Ik heb je verhaal twee keer gelezen en begrijp er eerlijk gezegd niet zo heel veel van.

Zou je (functioneel) willen vertellen wat de bedoeling is ?
Je hebt in ieder geval resource files gevonden, waarom geeft dat jou niet de oplossing ?
Om elke keer een call naar de database te voorkomen kan je natuurlijk gebruik maken van een hashtable die je volgens het singleton principe vult. Is dat misschien wat je zoekt ?

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:35
Resx files, met een default (fall through) culture, zo doe ik het.

Verder snap ik niet veel van je betoog ...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 13:58
Josvds schreef op vrijdag 16 juli 2010 @ 15:21:
Maar wanneer je gebruik wil maken van de standaard waarde "Datum" als naam en je past hierin iets aan ben je gelijktijdig de waarde in de database kwijt of waardes met twee verschillende betekenissen kun je niet onderscheiden.
Dat laatste kun je voorkomen door de identifier context-gevoelig te maken. Ergo, een label 'datum' in form A hoeft niet dezelfde waarde te hebben als hetzelfde label in form B.

Het label als standaardwaarde gebruiken raad ik af: niet alleen krijg je dan zoals gezegd problemen wanneer die standaardwaarde moet veranderen, het limiteert je ook tot "spreektaal" in je label naamgeving. Voor een multilanguage webapp hebben wij daarom ooit gebruik gemaakt van relatief omschrijvende labels ('welcomeHeader', 'loginButton', etc) die optioneel contextgevoelig zijn (ergo, als in die context het label gedefinieerd is krijgt het deze waarde, zoniet wordt gezocht naar het label in de standaard context, wat weer voorkomt dat je bepaalde standaard dingen dubbel zit te vertalen).

Overigens zijn er ook voor veel talen al erg goede multilanguage libraries die je kan gebruiken, ik zou je aanraden daar eerst naar te kijken voor je het wiel opnieuw probeert uit te vinden :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je moet even twee zaken scheiden. Je hebt aan de ene kant de vertaling van de labels en aan de andere kant de presentatie van data (vanuit database, memory, xml, webservice, etc).

Wij gebruiken gewoon de standaard resource tools van .NET. Op basis van de culture van de gebruiker worden datums, getallen en valuta al op de door de gebruiker bekend manier weergegeven. De resource bestanden bevatten inderdaad een label en een waarde. Een voorbeeld aanroep is bijvoorbeeld Loc.GetText("ReportTitle", DateTime.Now);

De string welke door GetText wordt terug gegeven wordt op het einde nog eens door String.Format gehaald om eventuele argumenten in de tekst te plaatsen.

Als je werkt aan een WPF project, neem dan eens hier een kijkje. Wij hebben een soortgelijk systeem, alleen dan net ietsje anders. Onze localizer kan de resource data ook bijvoorbeeld via een webservice of database inlezen.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • defcon84
  • Registratie: September 2009
  • Laatst online: 22-09 14:46

defcon84

Multipass?

whoami schreef op vrijdag 16 juli 2010 @ 15:32:
Resx files, met een default (fall through) culture, zo doe ik het.

Verder snap ik niet veel van je betoog ...
zoals het hoort dus :)
ik zet ook altijd alles in een global resource file..

Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Even kort op mijn 1e bericht:

Wat wil ik graag?
Ik wil binnen .NET graag mijn applicaties dermate ontwikkelen dat ze taal onafhankelijk zijn.
Daarbij graag eenvoudig ontwikkelen zonder te wisselen tussen verschillende applicaties/tools.
Ook wil ik het direct vanaf de code kunnen bepalen, maar wel op een centraal punt beheren.

Hoe we het nu in VBA doen?
We hebben een functie geschreven waarbij we 2 parameters mee geven.
1) Het id waarmee de vertaling in de database staat
2) De standaard waarde die er komt te staat als de tag niet in de database voorkomt
Deze wordt gebruikt binnen de code.

Daarnaast wordt bij de start van de applicatie d.m.v. een andere functie bij alle controls de label/tekst aangepast aan de hand van een tag nummer binnen Access forms.

Waarom wil ik het anders?
Binnen de code wil ik niet werken met een ID met de reden dat je niet weet wat hier staat. Ook al staat er een standaard waarde achter wil dat niet zeggen dat in de database hetzelfde staat. Je moet dus de database langs je programmeer werk houden.

Wat waren opties die ik zelf bedacht had?
Ik denk maar even hardop hier.. Misschien dat jullie me kunnen volgen en daarop een juist inbreng hebben.

1) Alle vertalingen kenmerken door een ENUM waarde, vervolgens achter elke enum waarde een vertalings object plaatsen. Zo kun je eenvoudig binnen de code de juiste taal selecteren. Echter moet je dan weer zorgen dat al deze enums ook gevuld worden.

2) Selectie bij naam die je opgeeft echter wat voor naam moet je hier plaatsen? Een label waarin een status wordt geplaatst kan wel 10x veranderen. Dus dan moet je zeggen statusLabelStart, statusLabel.. etc. Is dat overzichtelijk?

3) Een macro schrijven binnen .NET waarbij eenvoudig een formulier wordt getoont waarin je een waarde opgeeft. Vervolgens de vertaling uit de database ziet, kunt aangeven of dit correct is of dat je een nieuwe entry wilt invoeren. Maar volgens mij kan je in een macro geen form weergeven.

Externe tools
Ik graag alles zelf ontwikkelen omdat je hierbij zeker weet wat je hebt gemaakt, het eigen beheer in handen en je snapt wat je gemaakt hebt. Fout afhandeling op dezelfde manier, etc. Daarnaast is mijn bedoeling van de zelf ontwikkeling ook dat ik er van leer.

Acties:
  • 0 Henk 'm!

  • Gadgets
  • Registratie: Juni 2006
  • Laatst online: 19-09 23:03
Waarom reageer je niet even op het antwoord wat al 3x gegeven is? Resource files zijn voor jou de oplossing, centrale plek bewaren, beschrijvende keys.

Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Gadgets schreef op vrijdag 16 juli 2010 @ 16:22:
Waarom reageer je niet even op het antwoord wat al 3x gegeven is? Resource files zijn voor jou de oplossing, centrale plek bewaren, beschrijvende keys.
Verzinnen jullie voor 2000 vertallingen zelf 2000 labels, PrintToolMeldingPrintenLadenMilsukt, etc.? Hierbij ben je toch nog constant op 2 plaatsen alles aan het invoeren?

Acties:
  • 0 Henk 'm!

  • RedPixel
  • Registratie: Januari 2004
  • Laatst online: 22-09 15:47
Dat is veel handiger dan telkens bij elk gebruik van een tekst een nummertje op moeten zoeken...

I see red pixels.


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 14:45

Sebazzz

3dp

Josvds schreef op vrijdag 16 juli 2010 @ 16:31:
[...]


Verzinnen jullie voor 2000 vertallingen zelf 2000 labels, PrintToolMeldingPrintenLadenMilsukt, etc.? Hierbij ben je toch nog constant op 2 plaatsen alles aan het invoeren?
Nee hoor. Je hebt gewoon bijvoorbeeld een tekst die je in een messagebox wilt wilt weergeven bijvoorbeeld "Downloading of update failed", "Downloaden van update is mislukt", "Fehler Download das Update" en die gooi je in drie resx bestanden (bijvoorbeeld Strings.resx, Strings.nl.resx, Strings.de.resx) met de keyname Message_Dialog_DownloadUpdate_Failed. Daarna kan ze benaderen met Strings.Message_Dialog_DownloadUpdate_Failed, onafhankelijk van de taal, strong-typed en met Intellisense support.

C#:
1
MessageBox.Show(Strings.Message_Dialog_DownloadUpdate_Failed);

Dus je resource tabellen zien er dan zo uit:
code:
1
2
key                                  |  value
Message_Dialog_DownloadUpdate_Failed | Downloading update failed

code:
1
2
key                                  |  value
Message_Dialog_DownloadUpdate_Failed | Update kon niet worden gedownload

Enzovoort.
En als je met formattering wilt werken is het ook geen probleem.

code:
1
2
key                                  |  value
Message_Dialog_DownloadUpdate_Failed | Downloading update failed (errorcode {0})

C#:
1
MessageBox.Show(String.Format(Strings.Message_Dialog_DownloadUpdate_Failed, exception.ErrorCode);


Als je een aantal resource bestanden naast elkaar wilt editen kan je o.a Zeta Resource Editor gebruiken. Dan loop je geen keys te copy/pasten en het werkt heel snel.

Overigens als je een Windows Forms applicatie maakt, zit lokalisatie support in de editor zelf ingebouwd, dat is nog makkelijker maar dat kan je op internet wel vinden ;)

[ Voor 37% gewijzigd door Sebazzz op 16-07-2010 16:53 ]

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Dankje.. Zo had ik het inderdaad nog niet bekeken. Ik wist niet dat een variable uit de resx ook zo benaderbaar was. Want waar ik het vaak vond stond het als resourcemanager... RS.GetString("btnSluiten", culture).

Bedankt.. Sorry zo had ik het nog niet gezien.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:35
Josvds schreef op vrijdag 16 juli 2010 @ 16:31:
[...]


Verzinnen jullie voor 2000 vertallingen zelf 2000 labels, PrintToolMeldingPrintenLadenMilsukt, etc.? Hierbij ben je toch nog constant op 2 plaatsen alles aan het invoeren?
Ik heb een tooltje geschreven, die al mijn vertaalbare strings in een DB opslaat.
Met dat tooltje zet ik gewoon de talen die ik ondersteun naast elkaar.
De resources worden dus gevisualiseerd in een grid, waarbij de linkse (eerste) kolom de key bevat; de 2de kolom bevat dan bv de values in het Nederlands, de 3de in het Frans, etc...
Met een druk op de knop worden de resx files dan gegenereerd.

Dit gebruik ik dan meestal enkel maar voor strings die ik moet gebruiken in messageboxen, en dergelijke.
Controls vertaal ik gewoon in de designer. (Localizable = true; taal kiezen).

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 14:45

Sebazzz

3dp

Zeta Resource Editor gebruik ik altijd, daarbij kan je het ook naast elkaar zetten :)

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
whoami schreef op vrijdag 16 juli 2010 @ 20:10:
[...]
Ik heb een tooltje geschreven, die al mijn vertaalbare strings in een DB opslaat.
Met dat tooltje zet ik gewoon de talen die ik ondersteun naast elkaar.
De resources worden dus gevisualiseerd in een grid, waarbij de linkse (eerste) kolom de key bevat; de 2de kolom bevat dan bv de values in het Nederlands, de 3de in het Frans, etc...
Beetje als poedit dus ;)
Ik doe 't zelf volledig in VS (althans; voor localizable stuff binnen VS projecten en voor zover mogelijk). Idd via de resource editor en de forms middels de localizable/language properties.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Grappig dat hier in de hele topic het kernwoord "internationalization" nog niet is genoemd. Want zo heet het beestje, en dat zal je een stuk meer hits geven op google :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
.oisyn schreef op zaterdag 17 juli 2010 @ 12:43:
Grappig dat hier in de hele topic het kernwoord "internationalization" nog niet is genoemd. Want zo heet het beestje, en dat zal je een stuk meer hits geven op google :)
Of i18n (zie topic tags) :Y)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
in de .NET wereld wordt het globalization genoemd.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
"Men" moet sowieso leren dat je er met het vertalen van strings alleen lang niet bent. Je hebt te maken met verschillende datum/tijd notaties (en erger: verschillende kalenders), getalnotaties (1.000 en 1,000) , valuta etc. en dan heb ik het nog niet eens over de soms subtiele cultuurverschillen (rood is in onze cultuur "fout"/"niet goed" maar in andere culturen kan 't een hele andere betekenis hebben). Voor dat laatste detail vind ik het nog acceptabel om links te laten liggen maar de andere zaken vind ik toch een belangrijk onderdeel van i18n/globalization dat vaak vergeten wordt.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
RobIII schreef op zaterdag 17 juli 2010 @ 22:41:
"Men" moet sowieso leren dat je er met het vertalen van strings alleen lang niet bent. Je hebt te maken met verschillende datum/tijd notaties (en erger: verschillende kalenders), getalnotaties (1.000 en 1,000) , valuta etc. en dan heb ik het nog niet eens over de soms subtiele cultuurverschillen (rood is in onze cultuur "fout"/"niet goed" maar in andere culturen kan 't een hele andere betekenis hebben). Voor dat laatste detail vind ik het nog acceptabel om links te laten liggen maar de andere zaken vind ik toch een belangrijk onderdeel van i18n/globalization dat vaak vergeten wordt.
Mwa, het ondersteunen van verschillende kalenders en getalnotaties zijn niet zo heel moeilijk. Daarvoor het je het cultureinfo object. Cultuur verschillen doen we niet aan :+.

Persoonlijk vindt ik RTL talen fatsoenlijk ondersteunen vele malen moeilijk dan alle onderdelen die tot nu toe in dit topic zijn genoemd.

Acties:
  • 0 Henk 'm!

Verwijderd

RobIII schreef op zaterdag 17 juli 2010 @ 22:41:
"Men" moet sowieso leren dat je er met het vertalen van strings alleen lang niet bent. Je hebt te maken met verschillende datum/tijd notaties (en erger: verschillende kalenders), getalnotaties (1.000 en 1,000) , valuta etc. en dan heb ik het nog niet eens over de soms subtiele cultuurverschillen (rood is in onze cultuur "fout"/"niet goed" maar in andere culturen kan 't een hele andere betekenis hebben). Voor dat laatste detail vind ik het nog acceptabel om links te laten liggen maar de andere zaken vind ik toch een belangrijk onderdeel van i18n/globalization dat vaak vergeten wordt.
hm, wat te denken van links<->rechtsom lezend, dit betekent dat naast vertalen ook controls soms om geswitched moeten worden (althans wil je het goed doen).

@deathraven: het simpel stellen van specifieke problemen is wel erg makkelijk, blij dat je niet bij ons in het team zit.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
D-Raven schreef op zondag 18 juli 2010 @ 00:14:
[...]


Mwa, het ondersteunen van verschillende kalenders en getalnotaties zijn niet zo heel moeilijk. Daarvoor het je het cultureinfo object. Cultuur verschillen doen we niet aan :+.
Het is niet moeilijk; maar wordt wel maar zelden (goed) gedaan ;) Dat was mijn hele punt :P
D-Raven schreef op zondag 18 juli 2010 @ 00:14:
Persoonlijk vindt ik RTL talen fatsoenlijk ondersteunen vele malen moeilijk dan alle onderdelen die tot nu toe in dit topic zijn genoemd.
Ook dat valt wel mee als je gewoon de designer gebruikt. En RTL talen was 1 van de dingen die ik onder "etc." schaarde :+

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1