Kirjoittaja Aihe: kuinka omasta ohjelmasta tehdään monikielinen? (python ratkaisu, c puuttuu)  (Luettu 1907 kertaa)

aapo

  • Käyttäjä
  • Viestejä: 195
    • Profiili
Ensin yksinkertainen, mutta toimiva, Howto kuinka Pythonilla tehdään ohjelma, joka käyttää ihan oikeita po/mo-kielitiedostoja.

Tehdään työhakemisto ja siirrytään sinne.

Tehdään selkokielinen po tiedosto, vaikkapa fi.po
Koodia: [Valitse]
domain "myapp"

#: NAME
msgid "Application"
msgstr "Ohjelma"

#: VERSION
msgid "Version"
msgstr "Versio"

Tehdään kansiorakenne:
Koodia: [Valitse]
mkdir -p locale/fi/LC_MESSAGES/

pakataan po -> mo (po on selkokielinen ja mo on binaarinen)
Koodia: [Valitse]
msgfmt fi.po

Siirretään tuotettu myapp.mo oikeaan paikkaan
Koodia: [Valitse]
mv myapp.mo locale/fi/LC_MESSAGES/

Tehdään python-tiedosto
Koodia: [Valitse]
import gettext

class MyApp:

  transLoc = "./locale"
  t = gettext.translation("myapp", transLoc)
  _ = t.ugettext

  t.install()

  print _("Application")
  print _("Version")
Jossa on siis tärkeä tuo transLoc (sijainti) ja "myapp" pitää vastata domain nimeä (se mikä on tuonne po-tiedostoon laitettu).
Nyt tuo alaviiva _ viittaa lokalisoituihin teksteihin.

Ohjelma tulostaa: (siis kun koneen locale on fi)
Ohjelma
Versio


Ja itse kysymys:
Kuinka teen tämän saman c:llä?

Tommi S.

  • Käyttäjä
  • Viestejä: 240
    • Profiili
En tiedä asiasta tarkemmin mutta löysin guuglaamalla tällaisen jutun:http://oriya.sarovar.org/docs/gettext_single.html

Tässä koodipätkä tuosta jutusta:
Koodia: [Valitse]
#include <libintl.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
setlocale( LC_ALL, "" );
bindtextdomain( "hello", "/usr/share/locale" );
textdomain( "hello" );
printf( gettext( "Hello, world!\n" ) );
exit(0);
}

Tuon alaviivajutun saa toimimaan kun lisää tällaisen makron: #define _(STRING)    gettext(STRING)
Eli kokonaisuudessaan näin:
Koodia: [Valitse]
#include <libintl.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

#define _(STRING) gettext(STRING)

int main(void)
{
setlocale( LC_ALL, "" );
bindtextdomain( "hello", "/usr/share/locale" );
textdomain( "hello" );
printf( _( "Hello, world!\n" ) );
exit(0);
}