Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Palvelu kahdella kielellä

Sivun loppuun

Clacier [25.06.2011 18:59:49]

#

Keksin nyt siis palvelun jonka käyttäjäkunta tulee olemaan kaksikielinen. En ole ennen toteuttanut palvelua kahdella kielellä, joten ennenkuin teen mitään hätiköityä tai vaikeimman kautta niin onko kellään ajatusta, miten tuo kannattaisi toteuttaa? Ei varmaan jokaista filua kannata tehdä erikseen, index_fi.php sekä index_en.php jne.

manninen [25.06.2011 20:11:42]

#

Jokseenkin nuin näin äkkiseltään. Ei testattu eikä mitään :)

/* Joku tiedosto */

$kieli = 'fi';

if(!empty($_GET['kieli'])){
  $kieli = $_GET['kieli'];
}

if($kieli != 'fi'){
 require_once('./kielipaketit/kieli.en.php');
}else{
 require_once('./kielipaketit/kieli.fi.php');
}

$mlData = Language();

echo $mlData['value_1'];
echo $mlData['value_2'];
/* Kieli en tiedosto ./kielipaketit/kieli.en.php */
function Language[
  $mlData['value_1'] = 'Save';
  $mlData['value_2'] = 'delete';

  return $mlData;
}
/* Kieli Fi tiedosto ./kielipaketit/kieli.fi.php */
function Language[
  $mlData['value_1'] = 'Tallenna';
  $mlData['value_2'] = 'Poista';

  return $mlData;
}

Triton [25.06.2011 20:44:45]

#

Kannattaa varmaan tutustua, kuinka jotkut frameworkit hoitavat homman. Niistä saa hyvin mallia...

Macro [25.06.2011 21:01:09]

#

function Language[ pitäisi olla varmaan function Language() {.

Lebe80 [25.06.2011 21:04:26]

#

Ja vaikka mannisen esimerkki oli hieman kömpelö, niin ehtolausekin voisi olla loogisemmin:

if($kieli == 'fi'){
 require_once('./kielipaketit/kieli.fi.php');
}else{
 require_once('./kielipaketit/kieli.en.php');
}

Tällöin kieliä on paljon helpompi jatkossa lisätä. Muutenkin tuntuu takaperoiselta verrata mannisen tavoin.

BC1 [26.06.2011 00:21:28]

#

Saattaa mennä jo liian hienoksi tai isoksi, mutta mikäli kyseessä on "perinteinen sivusto" - eli jossa on Etusivu - Alasivu - Alasivu -rakenne, eikä mitään erikoisempia omia juttuja (kuten kielikohtaisia PHP-pätkiä), voisi olla aika rautaa käyttää jotain valmista runkojärjestelmää (esim. WordPress, Joomla!, CMS Made Simple ...).

Tai sitten ihan tekee itse jonkin kevyen tietokanta-pohjaisen ratkaisun. Ajattelin vain sitä puolta, että jos sivustolla on paljon pitkiä tekstipätkiä. Saattaa tuollainen funktio-ratkaisu muuttua nopeasti ylläpitohelvetiksi ellei niitä käännöksiä paloittele sivukohtaisiksi.

Mutta minusta ihan hyvä tuo mannisen esimerkki. Toimii hyvin esim. sovelluspuolella ja voi lisätä helposti lisää kieliä.

manninen [26.06.2011 06:32:24]

#

Lebe80 kirjoitti:

Ja vaikka mannisen esimerkki oli hieman kömpelö, niin ehtolausekin voisi olla loogisemmin:

if($kieli == 'fi'){
 require_once('./kielipaketit/kieli.fi.php');
}else{
 require_once('./kielipaketit/kieli.en.php');
}

Tällöin kieliä on paljon helpompi jatkossa lisätä. Muutenkin tuntuu takaperoiselta verrata mannisen tavoin.

Edellämainittuun kommenttiin viitaten, ottaisin itsekkin mielelläni vastaan paremman esimerkin. Varsinkin kun sana "kömpelö" mainitaan. Yleisisesti olisi fiksua laittaa tälläiseen kommenttiin mukaan parempi esimerkki, jotta sen muutkin näkisi ja myös minä voisin jotain paremmin oppia. Siihen asti, paranneltu muutos ehdotustenne pohjalta.

Aina on mahdollista myös tehdä jokaiselle sivulle tällä tavoin uniikki tiedosto, mutta myös yhden tiedoston jakaminen onnistuu pienessä mittakaavassa selkeästi tiedostoa kommentoimalla.

/* Joku tiedosto */

$kieli = 'fi';

if(!empty($_GET['kieli'])){
  $kieli = $_GET['kieli'];
}

if($kieli == 'fi'){
require_once('./kielipaketit/kieli.fi.php');
}else{
require_once('./kielipaketit/kieli.en.php');
}

$mlData = Language();

echo $mlData['value_1'];
echo $mlData['value_2'];
/* Kieli en tiedosto ./kielipaketit/kieli.en.php */
function Language()[
  $mlData['value_1'] = 'Save';
  $mlData['value_2'] = 'delete';

  return $mlData;
}
/* Kieli Fi tiedosto ./kielipaketit/kieli.fi.php */
function Language()[
  $mlData['value_1'] = 'Tallenna';
  $mlData['value_2'] = 'Poista';

  return $mlData;
}

PS. Ei tämä ehkä ole paras, mutta ainakin yksi vaihtoeho!

The Alchemist [26.06.2011 08:50:44]

#

Itse käyttäisin havainnoillisempaa tapaa. Minusta tätä on helpompi käyttää myös käännösten kirjoittajan näkökulmasta. Systeemi mahdollistaa myös vajaavaisten käännösten käyttämisen; niiden testaaminen on helpompaa ja kaikkia yksityiskohtia ei tarvitse kääntää kerralla. Lisäksi tr()-funktiota voi kutsua ilman aktiivista käännöstä, jolloin se vain palauttaa argumenttina annetun tekstin itsensä.

HUOM!
Korvaa init()-funktiossa olevat putkimerkit ('|') kenoviivoilla! Putkan tyhmä foorumi trimmaa ne kaikki pois.

*** translations/defs.php
<?php

namespace tr_extras;

function tr_defs() {
	return array_flip(
		array(
		'#long1',
		'Button',
		'Name',
		'Password',
		'Send',
		'Displaying %d items',
		'Title',
		)
	);
}

?>

*** translations/lang_fi.php
<?php

namespace tr_extras;

function tr_strings() {
	return array(
		'Tässä on erittäin pitkä teksti, jonka kopioiminen voisi olla rasittavaa
		ja ylläpito työlästä.',
		'Painike',
		'Nimi',
		'Salasana',
		'Lähetä',
		'Näkyvillä %d kohdetta',
		'Otsikko',
	);
}

?>

*** index.php
<?php

class Translation {
	private static $defs, $strings;
	private static $loaded = false;

	static function init($lang) {
		if (self::$loaded)
			return;

		$file = sprintf('translations/lang_%s.php', $lang);

		if (!is_file($file))
			throw new Exception(
				sprintf('Language pack "%s" not found!', $lang)
			);

		require_once 'translations/defs.php';
		require_once $file;

		self::$loaded = true;
		self::$defs = |tr_extras|tr_defs();
		self::$strings = |tr_extras|tr_strings();
	}

	static function tr($str, $args=null, $id=-1) {
		if ($id == -1)
			$i = self::$loaded && isset(self::$defs[$str])
			   ? self::$defs[$str] : -1;
		else
			$i = $id;

		if ($i == -1 || !isset(self::$strings[$i]))
			return self::str($str, $args);

		return self::str(self::$strings[$i], $args);
	}

	private static function str($str, $args) {
		if ($args == null)
			return $str;

		return vsprintf($str, $args);
	}
}

function tr($str, $args=null, $id=-1) {
	return Translation::tr($str, $args, $id);
}

Translation::init('fi');

print tr('Button') . '<br/>' . tr('Displaying %d items', array(5));
print '<br/>' . tr('No translation');
print '<br/>' . tr('This is a very long text.', null, 0);

?>

Yucca [26.06.2011 14:28:13]

#

The Alchemist kirjoitti:

Itse käyttäisin havainnoillisempaa tapaa. Minusta tätä on helpompi käyttää myös käännösten kirjoittajan näkökulmasta. Systeemi mahdollistaa myös vajaavaisten käännösten käyttämisen; niiden testaaminen on helpompaa ja kaikkia yksityiskohtia ei tarvitse kääntää kerralla.

Kääntämisen ja kääntäjien ongelmat yleensä unohdetaan tällaisissa yhteyksissä, ja niinpä tulokset ovatkin usein karmeita. Miten toimisitte kääntäjinä esimerkiksi silloin, kun käännettävänä merkkijonona on englannin sana ötoö? Esimerkki ei ole keksitty. Jos kääntäjä voi ja osaa käyttää sivua tai sovellusta, johon käännös tulee, hän ehkä pystyy kehittämään jonkin jotenkin ymmärrettävän käännöksen, kuten ökohteeseenö, vaikka luontevaa käännöksestä ei tietenkään saa. Useimmiten käännökset ostetaan sieltä, mistä halvimmalla saa, eikä kääntäjä tietenkään rupea tekemään mitään ylimääräistä siinäkään tapauksessa, että ehkä osaisi, koska siitä ei makseta ja taksat ovat jo nälkärajoilla. (Ja todella haastava esimerkkitapauksestani tulee tilanteessa, jossa samaa merkkijonoa käytetään kahdessa aivan erilaisessa kontekstissa, kuten öfrom Helsinki to Londonö ja öfrom January 1 to February 7ö.)

Tekstin pilkkominen osiin, jotka käännetään erikseen, saattaa kyllä on hyvin perusteltua teknisistä syistä. Tosin jos sivut tehdään niin, että HTML-merkkaus on mahdollisimman yksinkertaista ja loogista, jolloin kompleksisuus on CSS- ja JavaScript-tiedostoissa, ei olisi välttämättä huono ajatus se, että koko sivu (teksti + HTML) on käännösyksikkönä. Jos halutaan tehdä muutokset tehokkaasti (yhden sanan muuttaminen ei vaadi koko tekstin uudelleenkäännöstä), voidaan kehittää jokin työkalu tähän (vaatii muutosten merkkaamista) tai sitten yrittää sopia käännöstoimiston kanssa, että käännösmuistin käyttö ei maksa tai maksaa vain kohtuullisesti. (Käännösmuisti = kääntäjien käyttämien työkalujen ylläpitämä tietokanta fraasien ja sanojen käännöksistä.)

Jos kuitenkin pilkotaan, kannattaa välttää liian pieneksi pilkkomista. Jos pitää pilkkoa hyvin pieneksi, pitää kääntäjille kommunikoida konteksti, mikä on melko työlästä.

lainaus:

function tr_strings() {
	return array(
		'Tässä on erittäin pitkä teksti, jonka kopioiminen voisi olla rasittavaa
		ja ylläpito työlästä.',
		'Painike',
		'Nimi',
		'Salasana',
		'Lähetä',
		'Näkyvillä %d kohdetta',
		'Otsikko',

Esimerkiksi suomen sanaa önimiö voivat vastata muissa kielissä eri sanat sen mukaan, millaisen asian nimestä on kyse, eikä ölähetäö ole sekään ihan yksiselitteinen. Fraasi öNäkyvillä %d kohdettaö on vaativa ja yleensä lokalisoidaankin väärin, sillä eihän tuo mene oikein edes suomessa, jos %d:tä vastaava luku on 1. Esimerkiksi venäjässä on vielä hankalampaa, koska ökohdettaö on käännettävä sanalla, jonka muoto riippuu luvun suuruudesta suhteellisen mutkikkaalla tavalla. Yleisesti tällaisten fraasien lokalisointi pitäisi tehdä joko kirjastoilla, joissa on melko kehittynyt lokalisointituki, tai sitten huolellisesti koodaamalla niiden kielten käsittely, joita käytetään, ja tekemällä fraasin eri muodoista eri merkkijonot. Jälkimmäisessä tapauksessa uuden kielen lisääminen voi tietenkin vaatia ohjelmamuutoksia.

Nuo esimerkit olivat sentään kontekstiriippuvuudeltaan melko vaatimattomia. Hankalampia ovat esimerkiksi sellaiset tekstit kuin ölightö, öleftö (’vasen’ vai ’jäljellä’ vai jotain muuta?), öresetö ja ötopö.

Grez [26.06.2011 16:21:40]

#

Itse meinasin kirjoittaa kans noista, että kannattaa kääntää kokonaisia lauseita, joissa muuttujat on osana.

Mutta jos on useampia muuttujia, niin tuo Yuccan %d tyyli ei välttämättä ole paras, koska joskus eri kielissä on luontevampaa sanoa asioita eri järjestyksessä. Itse käytän yleensä numeroituja parametreja, tyyliin:

Haluatko siirtää %1 kohdetta kansioon %2?

Juice [26.06.2011 16:43:43]

#

Kannattaako pyörää keksiä uudestaan? Itse olen joitakin sivuja rakentanut käyttäen PHP:n gettext-kirjastoa ja .po-tiedostoja. Ainakin käännöstyö on mukavampaa, kun ei tarvitse php-tiedostoon näpytellä lisää taulukon alkioita. Tuolla näyttäisi jokin tutoriaali olevan aiheeseen liittyen:

http://mel.melaxis.com/devblog/2005/08/06/localizing-php-web-sites-using-gettext/

The Alchemist [26.06.2011 17:12:58]

#

Mitäs se Jukka taas valittaa? Väärinymmärtämisen paikalliskisat menossa vai mistä tässä on kyse? Demosinhan minä, että on hyvä käyttää kokonaisia merkkijonoja eikä yrittää kääntää sana kerrallaan. Tiettävästi täällä ei kukaan edes ole nostanut esiin kyseistä vaihtoehtoa. (Tai siis ei ollut...)

Millä muotoa "Displaying 1 items" on sitten korrektia englantia? Onko se nyt aivan pakko sanoa ääneen, että jos haluaa yksityiskohdatkin silotella, niin sitten pitää esimerkiksi laittaa yksikkömuodot virkkeistä / sanoista erikseen käännöksiin? Voiko täällä olettaa kenenkään muun kuin itsensä tajuavan asioista yhtään mitään?

Ja ihan sinua varten sanon ääneen senkin, että esim. navigaatiossa tai lomakkeiden painikkeissa ei käytetä virkkeitä vaan usein jopa yksittäisiä sanoja. Nämä täytyy luonnollisesti kääntää yksitellen, duh.

Petja [28.06.2011 10:49:06]

#

Oma ratkaisuni:

//index.php
if(!isset($_COOKIE['lang'])) {
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
if($lang=="fi"){
setcookie("lang", "fi", time()+2419200);
}else{
setcookie("lang", "en", time()+2419200);
}}
if($_COOKIE['lang']=="fi") {
//Suomeksi!
}else{
//In English!
}
//vaihdakieli.php
setcookie("lang", $_GET['l'], time()+2419200);

Skripti tarkistaa käyttäjän selaimen kielen. Jos kieli on suomi, kirjoitetaan lang-eväste, jossa lukee "fi". Mikäli kieli on jokin muu kuin em., ko. evästeeseen kirjoitetaan "en". Tämän jälkeen eväste tarkistetaan ja tiedot tulostetaan sen mukaan. Voit tehdä sivustolle nappulat, joista kieli pystytään helposti vaihtamaan.

Koodit tehty hätäisesti! En myöskään ole testannut.
Joku saa korjata koodin.

-tossu- [28.06.2011 11:10:35]

#

En luottaisi kauheasti Accept-Language-headeriin. Esimerkiksi minulla ei ole siinä suomea.

Ei myöskään kannata tarkistaa substr-funktiolla vain alkua headerista, koska siinä saattaa olla useita kieliä pilkulla erotettuna. Jos et jaksa koodata kunnollista parseria, joka ottaa huomioon myös kielien q-arvot, kannattaa käyttä strpos-tarkistusta.

Petja [28.06.2011 11:43:36]

#

Ensimmäisenähän pitäisi olla ensisijainen kieli.

Ajatellaan:

selain       sivu
fi,en,sv     fi
en,fi,sv     en
sv,fi,en     en (sv ei ole sivun kieli, joten kieleksi tulee en)

-tossu- [28.06.2011 12:18:28]

#

Kielien järjestys headerissa ei kerro, mikä on ensisijainen kieli, vaan kielen jälkeen tuleva q-arvo. Käytännössä en usko monenkaan säätävän selaimen asetuksia tältä osin oikeiksi, joten jos kielilistassa on "fi", on se suurella todennäköisyydellä ensisijainen kieli. Tietysti jollain voi olla asetuksena "en, fi;q=0.5".

Olli [29.06.2011 08:37:56]

#

Tuolla on valmis parseri ACCEPT_LANGUAGE -headerille.
http://www.thefutureoftheweb.com/blog/use-accept-language-header

Yucca [06.07.2011 08:58:04]

#

The Alchemist kirjoitti:

Mitäs se Jukka taas valittaa?

Kerropas se! Siis mitä minä sinun mielestäsi valitin?

lainaus:

Väärinymmärtämisen paikalliskisat menossa vai mistä tässä on kyse?

Saattaa olla, sillä %d-juttukin pantiin minun nimiini, vaikka se esiintyi lainaamassani koodissa ja siihen esittämissäni huomioissa, joiden yksi sisältö oli, että niin ei kannata tehdä. Siis ei niin, että heitetään jollekin yleiselle funktiolle argumentti "%d kohdetta", vaan niin, että heitetään jollekin erityiselle funktiolle (joka osaa hoitaa tätä tyyppiä olevat ilmaukset _oikein_) argumentteina luku ja olio, joka vastaa sanaa "kohde".

lainaus:

Demosinhan minä, että on hyvä käyttää kokonaisia merkkijonoja eikä yrittää kääntää sana kerrallaan. Tiettävästi täällä ei kukaan edes ole nostanut esiin kyseistä vaihtoehtoa. (Tai siis ei ollut...)

Tässä keskustelussa oli kyllä esitetty vain sellaista, missä on kyse yksittäisten sanojen ja lyhyiden fraasien kääntämisestä. Sellaisesta on aivan liikaa esimerkkejä, joten kyseessä on todellinen riski eikä vain se, että keskustelussa on esitetty lyhyyden vuoksi lyhyitä esimerkkejä.

lainaus:

Millä muotoa "Displaying 1 items" on sitten korrektia englantia?

Sanopas se! Esittämäsi lokalisointimenetelmä ("%d kohdetta") ei siis toimi englannillekaan, eikä useimmille muille kielille.

lainaus:

Onko se nyt aivan pakko sanoa ääneen, että jos haluaa yksityiskohdatkin silotella, niin sitten pitää esimerkiksi laittaa yksikkömuodot virkkeistä / sanoista erikseen käännöksiin?

Onko sinusta yksityiskohtien siloittelua se, että teksti on edes jotenkin tolkullista ja tietyn kielen mukaista? Eikä tässä todellakaan riitä se, että laitetaan yksikkömuodot "virkkeistä / sanoista". (Virkkeen yksikkömuoto onkin ihan uusi käsitetuttavuus.)

lainaus:

Voiko täällä olettaa kenenkään muun kuin itsensä tajuavan asioista yhtään mitään?

Voi olettaa, että jos jostakin aiheesta keskusteltaessa käsitellään vain sen triviaaleimpia puolia tavalla, jolla tyypillisesti mennään metsään, niin olisi aihetta valottaa jonkin verran todellistakin problematiikkaa.

lainaus:

Ja ihan sinua varten sanon ääneen senkin, että esim. navigaatiossa tai lomakkeiden painikkeissa ei käytetä virkkeitä vaan usein jopa yksittäisiä sanoja. Nämä täytyy luonnollisesti kääntää yksitellen, duh.

Olet väärässä. Juuri yksitellen kääntämällä saavutetaan absurdeja tuloksia jopa silloin, kun kääntäjä on osaava ja huolellinen. On olennaista, että käännetään esimerkiksi valikko kokonaisuutena ja painikkeen teksti niin, että kääntäjä tietää kontekstin.

Metabolix [06.07.2011 11:53:06]

#

Monet käännösongelmat voi välttää, jos ei edes yritä muodostaa kokonaisia lauseita. Pilkattu %d-tekniikka (tai vielä varmemmin Grezin {1}-tekniikka) toimii monissa kielissä aivan hyvin tällaisissa tilanteissa: "Tilaus: %s. Päiväys: %s. Tuotteita: %d. Maksettava: %.2f €. Tili: X." (Toki eri riveille.) Ei ole myöskään harvinaista, että käyttäjänkin elämä helpottuu tästä, jos selostuksesta tulisi muuten mutkikas. "1.1.2011 tehty tilaus 1234-ABCD sisältää 3 tuotetta, joiden hinta, 12,34 euroa, täytyy maksaa tilille X."

Pitkienkin tekstien kanssa voi hyödyntää vastaavaa: käännetään erikseen yleispätevä selostus ja luetellaan tarkemmat tiedot perässä. "Yksi tai useampi valitsemistasi tuotteista on loppunut varastosta. Tämän vuoksi pälä pälä pälä. ... Tuotteet: %s."

Yucca kirjoitti:

Virkkeen yksikkömuoto onkin ihan uusi käsitetuttavuus.

Termi on ehkä omalaatuinen, mutta ajatus sinänsä ei suinkaan ole yllättävä. Itsekin olen tehnyt istumapaikanvalintasivua, jossa monesta ilmoituksesta täytyisi periaatteessa olla kolme muotoa: "valitsemasi paikka", "valitsemasi paikat", "osa valitsemistasi paikoista". En muista, oliko.

Yucca [06.07.2011 20:02:51]

#

Metabolix kirjoitti:

Monet käännösongelmat voi välttää, jos ei edes yritä muodostaa kokonaisia lauseita.

Kömpelyydellä voi saada paljon aikaan, enkä tarkoita tätä mitenkään erityisen ironiseksi. Mutta esitetty esimerkki oli öNäkyvillä %d kohdettaö. Lisäksi kömpelyydellä on rajansa; verkkokaupan tilaus on aika lailla erikoisapaus.

lainaus:

Maksettava: %.2f €.

Ja siinä sitten käytetään desimaalierottimena pistettä. Useimmissa kielissä käytetään jotain muuta. Luvun tulostaminen pitää tietenkin lokalisoida. Lisäksi rahasummia ei yleensä pitäisi käsitellä reaalilukuina pyöristysvirheiden mahdollisuuden takia.

lainaus:

"1.1.2011 tehty tilaus 1234-ABCD sisältää 3 tuotetta, joiden hinta, 12,34 euroa, täytyy maksaa tilille X."

Kiinnostava olkiukko.

lainaus:

Yucca kirjoitti:

Virkkeen yksikkömuoto onkin ihan uusi käsitetuttavuus.

Termi on ehkä omalaatuinen, mutta ajatus sinänsä ei suinkaan ole yllättävä. Itsekin olen tehnyt istumapaikanvalintasivua, jossa monesta ilmoituksesta täytyisi periaatteessa olla kolme muotoa: "valitsemasi paikka", "valitsemasi paikat", "osa valitsemistasi paikoista". En muista, oliko.

Mikään noista ei ole virke. En tiedä, miksi nostat esiin esimerkin, josta et edes muista miten se menee, mutta tietenkin tuollaisia tilanteita syntyy. Eri asia on, että erilaisia mahdollisia viestejä, joissa nuo esiintyvät, saattaa olla niin vähän, että on käytännöllisempää käännättää ne kokonaisina virkkeinä (!) kuin yrittää rakentaa niitä osista.

Metabolix [06.07.2011 23:10:13]

#

Yucca, alan olla väärinymmärryksestäsi hyvinkin samaa mieltä The Alchemistin kanssa.

Yucca kirjoitti:

Lisäksi kömpelyydellä on rajansa; verkkokaupan tilaus on aika lailla erikoisapaus.

Nyt tulikin minulle aivan uusi termi. Vai tarkoititko kirjoittaa "erikoisapeus"? Surullista totisesti...

Yucca kirjoitti:

Mutta esitetty esimerkki oli öNäkyvillä %d kohdettaö.

Hienoa, että osaat soveltaa asioita etkä lannistu, vaikka alkuperäisessä esimerkissä oli eri sanoja kuin esittämässäni ratkaisussa. Miten olisi "Kohteita näkyvillä: %d"?

Yucca kirjoitti:

lainaus:

Maksettava: %.2f €.

Ja siinä sitten käytetään desimaalierottimena pistettä.

Siinä se Yucca taitavasti pätee ohjelmoinninkin saralla – ehkä kannattaa jatkossa olla pätemättä. Jopa PHP osaa (ajoympäristönsä puitteissa) tulostaa desimaalierottimena pilkun, kun käsketään:

setlocale(LC_NUMERIC, "fi_FI.UTF-8");
printf("%.2f", 1.23);
// Tai jopa echolla:
echo 1.23;

Sitä paitsi mikään ei estä käyttämästä tuttuja formaattimerkintöjä myös omassa muotoilufunktiossa.

Yucca kirjoitti:

Lisäksi rahasummia ei yleensä pitäisi käsitellä reaalilukuina pyöristysvirheiden mahdollisuuden takia.

Tulostamisella on melko vähän tekemistä käsittelyn kanssa. Tavallinen double-tietotyyppinen luku selviää suunnilleen 15 merkitsevästä numerosta, joten jos summa ei mene paljon yli biljoonan euron, tulostus onnistuu tällä tavalla aivan hyvin. Sitä paitsi mikään ei estä käyttämästä tuttuja formaattimerkintöjä omassa, mielivaltaisia desimaalilukuja muotoilevassa funktiossa.

Yucca kirjoitti:

Mikään noista ei ole virke. En tiedä, miksi nostat esiin esimerkin, josta et edes muista miten se menee,

Oletin, että tällaisesta asiasta keskusteleva henkilö kykenisi muodostamaan olennaisimman osan ympärille omia virkkeitä ja huomaisi itse, että annetut sanaparit eivät sovi täsmälleen samanlaiseen tilanteeseen. Ilmeisesti odotin liikaa.

Onko jotain väliä, mitä tarkalleen olen vuosia sitten kirjoittanut? Virkkeettömäksi jäänyt ja siten siis äärimmäisen vajavainen ja surkeasti epäonnistunut esimerkkini kaikesta huolimatta on esimerkki tilanteesta, jossa lukumäärän vaikutus näkyy laajemminkin kuin lukuna ja yksittäisenä monikkomuotona.

Virkkeenne, olkaa hyvä: "Valitsemasi paikka ei ole enää vapaa, ole hyvä ja valitse toinen paikka!" Ehkä tästä jo onnistuu oikean osan vaihtaminen muihin antamiini vaihtoehtoihin ja muiden osien korjaaminen.

Yucca kirjoitti:

saattaa olla niin vähän, että on käytännöllisempää käännättää ne kokonaisina virkkeinä

Hienoa, että olemme vihdoin samaa mieltä. Herää epäilys, ettet ole edes yrittänyt ymmärtää tekstiäni.

Grez [06.07.2011 23:50:52]

#

Clacier kirjoitti:

Keksin nyt siis palvelun jonka käyttäjäkunta tulee olemaan kaksikielinen.

Miksi muuten turhaan toteutat palvelua kahdella eri kielellä jos kerran käyttäjäkunta on kaksikielistä? Eikö riitä että toteutat toisella niistä kielistä, jota käyttäjät osaa?

Yucca [09.07.2011 00:17:44]

#

Metabolix kirjoitti:

Hienoa, että osaat soveltaa asioita etkä lannistu, vaikka alkuperäisessä esimerkissä oli eri sanoja kuin esittämässäni ratkaisussa. Miten olisi "Kohteita näkyvillä: %d"?

Alkuperäisessä esimerkissä oli kyllä öNäkyvillä %d kohdettaö, kuten on kai aika helppo nähdä. Siis nimimerkin öThe Alchemistö ensimmäisessä viestissä.

lainaus:

Jopa PHP osaa (ajoympäristönsä puitteissa) tulostaa desimaalierottimena pilkun, kun käsketään:

Sellaisesta käskemisestä ei ollut mitään puhetta. Mitenköhän käynee, jos ei käsketä?

lainaus:

Tulostamisella on melko vähän tekemistä käsittelyn kanssa.

Jos kylmän tyynesti tulostetaan jotain %f-formaatilla, niin olisikohan kohtuullista olettaa, että on myös käsitelty rahasummia reaalilukuina?

lainaus:

Yucca kirjoitti:

Mikään noista ei ole virke. En tiedä, miksi nostat esiin esimerkin, josta et edes muista miten se menee,

Oletin, että tällaisesta asiasta keskusteleva henkilö kykenisi muodostamaan olennaisimman osan ympärille omia virkkeitä

Oletit siis, että voi surutta puhua virkkeistä, jotka eivät ole virkkeitä, ja jättää lukijan tehtäväksi kehittää väitteisiisi tolkkua.

The Alchemist [09.07.2011 08:56:26]

#

Metabolix kirjoitti:

oveltaa asioita etkä lannistu, vaikka alkuperäisessä esimerkissä oli eri sanoja kuin esittämässäni ratkaisussa. Miten olisi "Kohteita näkyvillä: %d"?

Ehdottamasi ilmaisumuoto on ns. insinöörin näkemys. Itse käytän mieluummin kokonaisia virkkeitä kuin listatyyppistä ilmaisumuotoa. Se saa softan tuntumaan vähemmän neuvostoliittolaiselta.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta