Mercurial > projects > mde
view mde/content/Items.d @ 107:20f7d813bb0f
Translation: now has a file for each locale, instead of a file for each section. Items updated; all strings translated.
New unittest for Translation; I realised the old one wasn't run anymore.
Changed unittest data and conf dirs.
author | Diggory Hardy <diggory.hardy@gmail.com> |
---|---|
date | Sun, 30 Nov 2008 17:17:56 +0000 |
parents | 08651e8a8c51 |
children | c9fc2d303178 |
line wrap: on
line source
/* LICENSE BLOCK Part of mde: a Modular D game-oriented Engine Copyright © 2007-2008 Diggory Hardy This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ /************************************************************************************************** * A generic way to access content items. *************************************************************************************************/ module mde.content.Items; import mde.content.Content; import mde.gui.exception; import mde.imde; import mde.lookup.Options; import mde.lookup.Translation; debug { import tango.util.log.Log : Log, Logger; private Logger logger; static this () { logger = Log.getLogger ("mde.gui.content.Items"); } } /** Get a specific content item. * * E.g. get ("Options.MiscOptions.L10n") returns miscOpts.L10n, * Items.get ("Options.MiscOptions") returns a ContentList of all misc options. */ AContent get (char[] item) { char[] h = head (item); if (h == "Options") { if (item is null) { if (Options.allContentList is null) { AContent[] list; list.length = Options.optionsClasses.length; size_t i; foreach (n,opts; Options.optionsClasses) { if (opts.contentList is null) loadTransl (opts, n); list[i++] = opts.contentList; } Options.allContentList = new ContentList (h, list); Translation trl = Translation.get (h); Translation.Entry trle = trl.getStruct (h); Options.allContentList.name (trle.name, trle.desc); } return Options.allContentList; } h = head (item); auto p = h in Options.optionsClasses; if (p) { if (p.contentList is null) loadTransl (*p, h); if (item == null) return p.contentList; auto q = (h = head (item)) in p.content; if (q && item is null) // enforce item is an exact match return *q; } } else if (h == "imde") { if (!imdeTransl) { Translation trl = Translation.get (h); Translation.Entry trle = trl.getStruct ("quit"); quit.name (trle.name, trle.desc); imdeTransl = true; } h = head (item); if (h == "quit" && item is null) { quit.name ("Quit"); //FIXME return quit; } } throw new ContentItemException (h); } private: /** Takes the string "head.tail" where tail may contain '.' but head does not, returns "head", * with str set to "tail". */ char[] head (ref char[] str) { size_t i = 0; while (i < str.length && str[i] != '.') ++i; char[] ret = str[0..i]; if (i == str.length) str = null; else str = str[i+1..$]; return ret; } void loadTransl (Options p, char[] n) { debug logger.trace ("Loading translation strings for Options."~n); Translation trans = Translation.get (n); Translation.Entry transled = trans.getStruct (n); p.contentList = new ContentList (n, p.content); p.contentList.name (transled.name, transled.desc); foreach (s, v; p.content) { transled = trans.getStruct (s); v.name (transled.name, transled.desc); } } bool imdeTransl = false; // Has section imde been translated?