diff --git a/bin/weewx/cheetahgenerator.py b/bin/weewx/cheetahgenerator.py index 75478a4b..f5d7cd26 100644 --- a/bin/weewx/cheetahgenerator.py +++ b/bin/weewx/cheetahgenerator.py @@ -90,7 +90,8 @@ default_search_list = [ "weewx.cheetahgenerator.Stats", "weewx.cheetahgenerator.UnitInfo", "weewx.cheetahgenerator.Extras", - "weewx.cheetahgenerator.JSONHelpers"] + "weewx.cheetahgenerator.JSONHelpers", + "weewx.gettext.Gettext"] # ============================================================================= @@ -149,7 +150,7 @@ class CheetahGenerator(weewx.reportengine.ReportGenerator): self.initExtensions(gen_dict[section_name]) # Generate any templates in the given dictionary: - ngen = self.generate(gen_dict[section_name], self.gen_ts) + ngen = self.generate(gen_dict[section_name], section_name, self.gen_ts) self.teardown() @@ -198,7 +199,7 @@ class CheetahGenerator(weewx.reportengine.ReportGenerator): while len(self.search_list_objs): del self.search_list_objs[-1] - def generate(self, section, gen_ts): + def generate(self, section, section_name, gen_ts): """Generate one or more reports for the indicated section. Each section in a period is a report. A report has one or more templates. @@ -219,7 +220,7 @@ class CheetahGenerator(weewx.reportengine.ReportGenerator): if subsection in CheetahGenerator.generator_dict: section[subsection]['summarize_by'] = subsection # Call recursively, to generate any templates in this subsection - ngen += self.generate(section[subsection], gen_ts) + ngen += self.generate(section[subsection], subsection, gen_ts) # We have finished recursively processing any subsections in this # section. Time to do the section itself. If there is no option @@ -308,7 +309,7 @@ class CheetahGenerator(weewx.reportengine.ReportGenerator): pass searchList = self._getSearchList(encoding, timespan, - default_binding) + default_binding, section_name) tmpname = _fullname + '.tmp' try: @@ -369,14 +370,15 @@ class CheetahGenerator(weewx.reportengine.ReportGenerator): return ngen - def _getSearchList(self, encoding, timespan, default_binding): + def _getSearchList(self, encoding, timespan, default_binding, section_name): """Get the complete search list to be used by Cheetah.""" # Get the basic search list timespan_start_tt = time.localtime(timespan.start) searchList = [{'month_name' : time.strftime("%b", timespan_start_tt), 'year_name' : timespan_start_tt[0], - 'encoding' : encoding}, + 'encoding' : encoding, + 'page' : section_name}, self.outputted_dict] # Bind to the default_binding: diff --git a/bin/weewx/gettext.py b/bin/weewx/gettext.py new file mode 100644 index 00000000..0d993671 --- /dev/null +++ b/bin/weewx/gettext.py @@ -0,0 +1,142 @@ +# Simple localization for WeeWX +# Copyright (C) 2021 Johanna Karen Roedenbeck + +# See the file LICENSE.txt for your full rights. + +""" + provides tag $gettext(key, page) + + Language dependent texts are stored in special localization files. + The are merged into skin_dict in reportengine.py according to the + language the user chooses in weewx.conf for the given report. + Different reports can be in different languages. + + The file defines language dependent label texts as well as other + texts used in skins. + + The values provided by $gettext(key, page) are found in the file + in the [Texts] section. Subsections in the [Texts] section can + provide special texts for certain templates. To get values from + subsections $gettext() is called with special tag $page for the + parameter page. That is especially useful in include files that + are included in multiple templates. + + Examples: + + Assume the localization file to be: + + [Texts] + Key1 = Text1 + [[index]] + Title = Text2 + [[othertemplate]] + Title = Text3 + + With that file is: + + $gettext("Key1") ==> Text1 + + $gettext("Title",$page) ==> is Text2 if included in template "index" + and Text3 if included in template + "othertemplate" + + $gettext(page=$page).Title ==> same as before + + You can use "speaking" key names. If they contain whitespace they need + to be enclosed in quotes in the localization file + + If the value contains commas you must enclose it in single or double + quotes. Otherwise an array instead of a string is returned. + +""" + +from six.moves import collections_abc +from weewx.cheetahgenerator import SearchList +from weeutil.weeutil import KeyDict +import weeutil.config + +# Test for new-style weewx v4 logging by trying to import weeutil.logger +import weeutil.logger +import logging + +log = logging.getLogger(__name__) + + +class Gettext(SearchList): + + def get_extension_list(self,timespan,db_lookup): + + def locale_label(key='',page=''): + """ $gettext() + + key: key to look up for + page: section name + + """ + _text_dict = self.generator.skin_dict.get('Texts',{}) + + # get the appropriate section for page if defined + # Note: no hierarchy here + if page: + if page not in _text_dict: + log.error("could not find section [Texts][[%s]] for report %s" % (page,self.generator.skin_dict.get('REPORT_NAME','unknown'))) + # Note: no 'else:' here, because we need the empty dict + # page is specified --> get subsection "page" + _text_dict = _text_dict.get(page,{}) + + # if key is not empty, get the value for key + if key: + # return the value for key + # if key not in _text_dict return key instead + return KeyDict(_text_dict)[key] + + + # if key is empty but page is not return further class instance + if page: + _page_dict = weeutil.config.config_from_str('') + #merge_dict = self.generator.skin_dict.get('Labels',{}).get('Generic',{}) + #if merge_dict: + # weeutil.config.merge_config(_page_dict,merge_dict) + merge_dict = Gettext._get_cheetah_dict(self.generator.skin_dict.get('CheetahGenerator',{}),page) + if merge_dict: + weeutil.config.merge_config(_page_dict,merge_dict) + weeutil.config.merge_config(_page_dict,_text_dict) + return _page_dict + + # if key as well as page are empty + return ParallelDict(_text_dict) + + return [{'gettext':locale_label}] + + @staticmethod + def _get_cheetah_dict(cheetah_dict,page): + """ find section page in cheetah_dict recursively """ + + for section in cheetah_dict.sections: + subsection = Gettext._get_cheetah_dict(cheetah_dict[section],page) + if subsection is not None: + return subsection + if page in cheetah_dict: + return cheetah_dict[page] + return None + + + +class ParallelDict(collections_abc.Mapping): + + def __init__(self, source): + self.source = source + + def __getitem__(self, key): + try: + return self.source[key] + except KeyError: + return key + + + def __len__(self): + return self.source.__len__() + + def __iter__(self): + for key in self.source: + yield key diff --git a/bin/weewx/reportengine.py b/bin/weewx/reportengine.py index c3b45977..a9d761cd 100644 --- a/bin/weewx/reportengine.py +++ b/bin/weewx/reportengine.py @@ -254,6 +254,72 @@ class StdReportEngine(threading.Thread): for scalar in self.config_dict['StdReport'].scalars: skin_dict[scalar] = self.config_dict['StdReport'][scalar] + ####################################################################### + # internationalization support + + # The key 'lang' defines a language code like 'en' or 'de'. It is + # used as a file name for a language file that is located in the + # 'lang' subdirectory of the skin directory. + + # get the language option if defined + # (As config_dict is not merged into skin_dict so far, + # skin_dict['lang'] has not the final value here. We + # have to take config_dict into account, too.) + lang_config = self.config_dict['StdReport'][report].get('lang',skin_dict.get('lang',None)) + + if lang_config: + + # Now add the options in the report's localization file. Start by figuring where it is located. + lang_config_path = os.path.join( + self.config_dict['WEEWX_ROOT'], + self.config_dict['StdReport']['SKIN_ROOT'], + self.config_dict['StdReport'][report].get('skin', ''), + 'lang', + lang_config+'.conf') + + # Now retrieve the language dictionary for the skin. Wrap it in a try block in case we fail. It is ok if + # there is no file - everything for a skin might be defined in the weewx configuration. + try: + merge_dict = configobj.ConfigObj(lang_config_path, file_error=True, encoding='utf-8') + log.debug("Found localization file %s for report '%s'", lang_config_path, report) + # make sure 'Texts' is present and a dict (section) + if not isinstance(merge_dict.get('Texts',None),dict): + if 'Texts' in merge_dict: + log.error("'Texts' is not a section in '%s'" % lang_config_path) + merge_dict['Texts']={} + # set language code for $gettext.lang + merge_dict['Texts']['lang'] = os.path.basename(lang_config_path).split('.')[0] + # Merge the skin config file in: + weeutil.config.merge_config(skin_dict, merge_dict) + if self.first_run: + log.info("Using localization file %s for report '%s'" % + (lang_config_path, report)) + except IOError as e: + log.debug("Cannot read localization file %s for report '%s': %s", + lang_config_path, report, e) + except SyntaxError as e: + log.error("Failed to read localization file %s for report '%s': %s", + lang_config_path, report, e) + raise + + # See if the user wants this report based on another unit system than US. + # The value can be US, METRIC, or METRICWX. + # (As config_dict is not merged into skin_dict so far, + # skin_dict['units_base'] has not the final value here. We + # have to take config_dict into account, too.) + report_units_base = self.config_dict['StdReport'][report].get('units_base',skin_dict.get('units_base',None)) + + if report_units_base: + # Get the chosen unit system out of units.py. Copy it to prevent + # the original from being changed. Merge it into skin_dict. + try: + merge_dict = weewx.units.std_groups[weewx.units.unit_constants[report_units_base]].copy() + weeutil.config.merge_config(skin_dict, {'Units':{'Groups':merge_dict}}) + except (SyntaxError,TypeError,IndexError,ValueError,IOError) as e: + log.error("error merging unit system '%s' for report '%s'" % (report_units_base,report)) + + ####################################################################### + # Finally, inject any overrides for this specific report. Because this is the last merge, it will have the # final say. weeutil.config.merge_config(skin_dict, self.config_dict['StdReport'][report]) diff --git a/docs/customizing.htm b/docs/customizing.htm index 5a890f01..eea22bef 100644 --- a/docs/customizing.htm +++ b/docs/customizing.htm @@ -443,7 +443,8 @@ Version: 4.6
Each report has a skin associated with it. For most reports, the relationship with the skin is an - obvious one: it contains the templates, any auxiliary files such as background GIFs or CSS style sheets, and + obvious one: it contains the templates, any auxiliary files such as background + GIFs or CSS style sheets, files with localization data, and a skin configuration file, skin.conf. If you will, the skin controls the look and feel of the report. Note that more than one report can use the same skin. For example, you might want to run a report that uses US Customary units, then run another report against the same skin, but @@ -807,6 +808,16 @@ db_manager.getSql("SELECT SUM(rain) FROM %s "\
+ Now suppose the skin author took care of internationalization + and provided language files. In this case s/he would not have + set the label in skin.conf but in + a language file, for English in + lang/en.conf, for german in + lang/de.conf etc. +
++ lang/en.conf would contain + what was defined in skin.conf + before: +
++... +[Labels] + ... + [[Generic]] + ... + outTemp = Exterior Temperature ++
+ lang/de.conf would contain: +
++... +[Labels] + ... + [[Generic]] + ... + outTemp = Außentemperatur + inTemp = Innentemperatur ++
+ The user sets the language by the optional + lang option in + weewx.conf. +
+Finally, for purposes of illustrating precedence, suppose the [StdReport] section of weewx.conf contains this: @@ -904,6 +955,10 @@ db_manager.getSql("SELECT SUM(rain) FROM %s "\ [[[Labels]]] [[[[Generic]]]] outTemp = Barn Temperature + + [[LifeC]] + skin = Life + lang = de
@@ -931,20 +986,31 @@ db_manager.getSql("SELECT SUM(rain) FROM %s "\
- Note how the values specified for inTemp are not overridden anywhere, so the value + Note how the values specified for inTemp + are not overridden anywhere, except + lang/de.conf, so the value specified in weewx/defaults.py, that is, Inside Temperature, is used for all reports.
+ class="code">Inside Temperature, is used for all reports, + except LifeC.The value for outTemp is not overridden for report SeasonsA, so it uses the label specified in weewx/defaults.py, that is, Outside Temperature. By contrast, for the "Life" reports, a value for outTemp was specified in the skin so, in the absence of any user override, its value, Exterior - Temperature will be used as the new default. Finally, for the report LifeB, + Temperature will be used as the new default. For the report LifeB, the user has specified an override for outTemp, so that value, Barn Temperature, is used. + Finally, for the report LifeC + a language has been set, so the labels are taken from the + specified language file.
@@ -1119,7 +1185,40 @@ db_manager.getSql("SELECT SUM(rain) FROM %s "\
To accomplish this, we will generate two reports, one using the defaults, the other using overrides to - change the target unit system and the target directory. The section [StdReport] + change the target unit system and the target directory. +
++ If you only want to use one of the predefined unit systems + like US or + METRIC you can simply specify + a unit system in the report configuration like this: +
++[StdReport] + + # Where the skins reside, relative to WEEWX_ROOT + SKIN_ROOT = skins + + # Where the generated reports should go, relative to WEEWX_ROOT + HTML_ROOT = public_html + + # The database binding indicates which data should be used in reports. + data_binding = wx_binding + + [[SeasonsUSReport]] + skin = Seasons + units_base = US + enable = true + + [[SeasonsMetricReport]] + skin = Seasons + units_base = METRIC + enable = true + HTML_ROOT = public_html/metric+
+ If you need individual settings for a lot of units you + can specify the units directly in the report configuration. + In this case the section [StdReport] will look like this:
@@ -2962,6 +3061,207 @@ $month.outTemp.series(aggregate_type='max', aggregate_interval='day', time_serie
Tags for series.
+ General tags
+
+
+ There are some general tags, that do not reflect observation
+ data but technical data of processing the template files.
+ You can especially use them in #if
+ expressions to control how Cheetah processes the template.
+
+ | Tag | +Description | +
| $month_name | +Name of the month, the file is created for | +
| $year_name | +Year, the file is created for | +
| $encoding | +Character encoding, to which the file is converted + after creation. Possible values are + html_entities, + strict_ascii, + normalized_ascii, and + utf-8. + | +
| $page | +Name of the page that is actually processed. + This is the section name from + skin.conf + where the template is described. You can especially + use it in include files that are included in multiple + templates. So parts of the content defined in the include + file can depend on the template file, for example + header lines. You can also use it together with + $gettext to structure + the language file. | +
| $gettext.lang | +Language code set by the + lang option + for the report. You can use this tag in + #if expressions and + to include language codes where the HTML + specification requires them. + |
| $gettext(page=$page).template | ++ File name of the template actually processed + | +
+ Web pages and other files to be created do not only contain + observation values and their labels but also static text. + The $gettext tag provides + internationalization support for those static texts. + To support internationalization do not write static + text into to template or include files but use + $gettext there to define it. +
++ Suppose you write a skin called + "YourSkin" + and + you want to have a head line in there, that + is "Current Conditions" in English, but "aktuelle Werte" + in german, "Conditions actuelles" in french etc. Then + the template file could contain: +
+...
+<h1>$gettext("Current Conditions")</h1>
+...
+ + The section of weewx.conf + configuring your skin could now look like this: +
+... +[StdReport] + ... + [[YourSkinReport]] + skin = YourSkin + lang = fr + ...+
+ With lang = fr the report + is in french. To get it in English, replace the language + code fr by the code for English + en. And to get it in german + use de. +
++ To make that work a language file has to be created for + each language supported. The language files reside in + the lang subdirectory of the + skin directory that is defined by the + skin option. The file name + of the language file is the language code appended + by .conf, for example + en.conf, + de.conf, or + fr.conf. +
++ The language file has the same layout as + skin.conf, i.e. + you can put language specific versions of the labels there. + Additionally a section [Texts] + can be defined to hold the static texts used in the skin. + For the example above the language files would contain + the following: +
+en.conf
+... +[Texts] + "Current Conditions" = Current Conditions + ...+
de.conf
+... +[Texts] + "Current Conditions" = Aktuelle Werte + ...+
fr.conf
+... +[Texts] + "Current Conditions" = Conditions actuelles ++
+ While it is not technically necessary we recommend to use + the whole English text for key. The template is easier to + read then. And it is easier for the person who translates + the texts if the original English version of the text is + found on the left side. But there are cases when that is + not possible, and then you can use any string you find + reasonable enough to describe the entry. +
++ See the SKIN_ROOT/Seasons/lang + subdirectory for examples of language files. +
+ ++ If your skin is big and there are lots of texts to define + you can structure the [Texts] + section by subsections. Each template can have its own + subsection. The subsections need to be called identically + to the respective sections in skin.conf. +
+
+ Assuming you have a template section called + [[[index]]] and another + section called [[[othertemplate]]], + then the language files could look like this: +
+... +[Texts] + ...some general texts here... + [[index]] + ...some texts for template index here, for example + Key = Some text + [[othertemplate]] + ...some texts for template othertemplate here, for example + Key = Some other text+
+ To refer to these template specific texts add + $page as parameter to + $gettext(). For example: +
+...
+$gettext("Key",$page)
+...
+ + If template "index" is processed, the entry "Key" in + subsection [[index]] is + used, and the value is "Some text". + If template "othertemplate" is processed, the + entry "Key" in subsection + [[othertemplate]] + is used, and the value is "Some other text". + You can place this tag in an include file + that is called by both "index" and "othertemplate", + and the value is chosen from the appropriate subsection. +
+ +@@ -4179,10 +4479,49 @@ class MyStats(SearchList): # 1
- This section is provides suggestions for localization, including translation to different languages and + This section provides suggestions for localization, + including translation to different languages and display of data in formats specific to a locale.
+ ++ First look whether the skin already came with a localization + for your language. If there is a + lang subdirectory in the skin + directory, look into it. There you find a file for each + language this skin is already localized to. If your + language is there, all you need to do is to select it + in weewx.conf: +
+...
+[StdReport]
+ ...
+ [[TheSkin]]
+ skin = skin_directory
+ lang = language_code
+ ...
+ + If the lang subdirectory + is present in the skin directory the skin is + probably prepared already for localization. + The only thing to do then is translating. + To do so, copy the file + en.conf and name it + according to the language code of your language. + Then translate all the strings on the right + side of the equal signs to your language. + The skin author may be interested in your + language file to ship it together with the + skin for the use of other users. + Last set the language code in + weewx.conf + as described in the previous section. +
+@@ -4191,15 +4530,37 @@ class MyStats(SearchList): # 1 formats and language.
++ Create a subdirectory called lang + in the skin directory. + + Then create a file named by the language code with the + suffix .conf. For example, if + you want to translate to spanish, name the file + es.conf. + The next step is + to make the templates language-aware as described in the + following section. +
+- In every HTML template (these typically have a file suffix of .html.tmpl) change - the HTML "lang" attribute to the target language. For example, for Spanish use es: + Open the template file and the language file in different + editor windows. It is much easier if you can change both + files simultaneously. +
+ ++ In every HTML template (these typically have a file suffix of + .html.tmpl) change + the HTML "lang" attribute to a configurable value.
<!DOCTYPE html> -<html lang="es"> +<html lang="$gettext.lang"> <head> <meta charset="UTF-8"> ... @@ -4232,12 +4593,26 @@ class MyStats(SearchList): # 1<div id='current_widget' class="widget"> <div class="widget_title"> - Conditions Actuelle + $gettext("Current Conditions") <a class="widget_control" onclick="toggle_widget('current')">♦</a> </div>- ++ In the language file start a + [Texts] section and place the + translation there like: +
+... +[Texts] + ... + "Current Conditions" = Conditions Actuelles + ...++ Repeat that for all strings you find. Make sure not + to replace HTML tags and HTML options. +
+Translate labels and modify local options
@@ -4354,13 +4729,21 @@ class MyStats(SearchList): # 1 locales? This example shows how to translate the Seasons skin for multiple languages.
- Create a directory for each language. Each directory contains template files and a skin configuration file. - Any text in each template file should be in the target language. Ensure that each HTML template file has the - lang set properly. + Create a subdirectory called + lang in the skin directory. + The language files containing the language dependent + information go there. Start creating a language file + for the primary language and save it to the + lang directory. The name + of the file consists of the language code of the + target language and the suffix + .conf. Later on you can + create language files for each language you want + to support based on that file.
- Translate observation names and other labels, and put them into the skin configuration files. There should - be one configuration file for each language. + Translate observation names and other labels, and put them + into the created language file.
Ensure that any locale-specific formatting is specified properly. For example, consider the
- The result will be a directory of templates and configurations, with one directory for each + Static texts are localized using the + $gettext("original text") tag. + Create a section [Texts] + in the language file and place a line +
+"original text" = translated text++ there in each language file. In the template file you refer + to those texts by +
+$gettext("original text")++ According to the language setting of the report the tag + stands for the text in the appropriate language. +
+ ++ The result will be a directory of language files + with one file for each language/localization.
--skins/Seasons/ -skins/Seasons/en/skin.conf -skins/Seasons/en/index.html.tmpl -skins/Seasons/es/skin.conf -skins/Seasons/es/index.html.tmpl -skins/Seasons/de/skin.conf -skins/Seasons/de/index.html.tmpl -skins/Seasons/fr/skin.conf -skins/Seasons/fr/index.html.tmplUsers will then create each report in the WeeWX configuration file. @@ -4392,16 +4783,20 @@ skins/Seasons/fr/index.html.tmpl
[StdReport]
[[Seasons_en]]
- skin = Seasons/en
+ skin = Seasons
+ lang = en
HTML_ROOT = public_html/en
[[Seasons_es]]
- skin = Seasons/es
+ skin = Seasons
+ lang = es
HTML_ROOT = public_html/es
[[Seasons_de]]
- skin = Seasons/de
+ skin = Seasons
+ lang = de
HTML_ROOT = public_html/de
[[Seasons_fr]]
- skin = Seasons/fr
+ skin = Seasons
+ lang = fr
HTML_ROOT = public_html/fr
The result is multiple reports, each in a different language and localization, independent of the locale of @@ -5696,7 +6091,23 @@ xstats/bin/user/xstats.py
This section contains the options available in the skin configuration file, skin.conf. + class="code">skin.conf. The same options apply to the + language files found in the subdirectory + lang, like + lang/en.conf for English. +
++ We recommend to put +
@@ -6104,10 +6515,48 @@ growing_base = 50.0, degree_F class="code">time_delta will be accepted. Default is 300 seconds.
- ++ This section applies to language files only. +
++ The section [Texts] holds + static texts that are used in the templates. + Generally there are multiple language files, each file + for one language and named by the language code + defined in ISO 639-1. + The entries + give the translation of the texts to the target language, like +
+"English text" = same text in the target language+
+ or define texts by keys that can be refereced within the template. +
+"Key" = some text to display+
+ To use the English text for the key is recommended, because + the template is easier to read then and while translating + you see the original English text on the left side. +
+
+ Note!
+ Strings that include commas must be included in single or
+ double quotes.
+
+ There may be subsections, named like the template + subsections in the + [CheetahGenerator] section of + skin.conf. The entries defined + in such subsections apply to the respective template only. +
This section contains the options for the Cheetah generator.
+This section contains the options for the Cheetah generator. + It applies to skin.conf only.
search_list
diff --git a/docs/usersguide.htm b/docs/usersguide.htm index c2dfce2d..d9e3b3fe 100644 --- a/docs/usersguide.htm +++ b/docs/usersguide.htm @@ -2273,8 +2273,11 @@ longitude = -77.0366These are the four reports that actually generate HTML files and plots. They all ship in the standard WeeWX - distribution. They all use US Customary units by default, but this can be changed by editing section [Defaults]. + distribution. They all use US Customary units by default, but this can be changed + by setting the option units_base or + by editing section [StdReport][[Defaults]].
They all have the following options in common.
@@ -2284,6 +2287,55 @@ longitude = -77.0366 the directory should be any templates used by the skin and a skin configuration file, skin.conf. +lang
++ Which language to display the skin. + The value to this option is a two-character language code as defined in ISO 639-1. + It defines the language the skin shall be displayed in. + For each language, that a certain skin can display, an appropriate + language file resides in the + lang subdirectory of the + skin directory. It is named by the language code, appended + by .conf, for example + en.conf for English. + If there is no file for your language, + copy en.conf and translate + the texts on the right side of the equal signs to the + language you want to use. It is important that you name + the file according to the list in ISO 639-1. +
+ +units_base
++ Which unit system to use with the skin. That can be + US, + METRIC, or + METRICWX. + If the option is not set, the units set in the + [StdReport][[Defaults]] + section are used. If no defaults are + set, US is the default. + See the section "Changing + the unit system" in the "Customization Guide" + for more details. + The difference between METRICDE + and the other metric unit systems is that it uses + mm for rain and + km/h for wind. + Settings in the section + [[[Units]]][[[[Groups]]]] + overwrite the unit settings resulting from this option + for individual observation types. See "How to + change units" in the "Customization Guide" + for more details. +
+enable
Set to true to enable the processing of this skin. Set to deleted on the remote server. Valid values are 1 to enable and 0 to disable. Required. Default is 0.
++ This section defines default values for all skins. You can set: +
+ If the skin you use comes with internationalization + support and you set a language by the + lang option, the settings + resulting from this option overwrite the settings in + the [[Defaults]] section. +
+ +This section is for configuring the StdConvert service. This service acts as a @@ -3081,12 +3155,6 @@ longitude = -77.0366 Default is INNODB.
-- This section covers a suite of default values, which control things such as which unit system should be - used in reports, what label to be used for an observation type, and how it should be formatted. -
-diff --git a/skins/Seasons/about.inc b/skins/Seasons/about.inc index 424ab377..85a2d4fd 100644 --- a/skins/Seasons/about.inc +++ b/skins/Seasons/about.inc @@ -6,7 +6,7 @@