From 3c1acc397ed579507ecf45be652595736a1d58dc Mon Sep 17 00:00:00 2001 From: dbs Date: Sat, 15 Dec 2007 05:29:49 +0000 Subject: [PATCH] Update to correspond with polib 0.30.1: * occurences->occurrences * different handling of header newline characters Remove some inherited methods that add no new behaviour. git-svn-id: svn://svn.open-ils.org/ILS/trunk@8219 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- build/i18n/scripts/basel10n.py | 18 +++---- build/i18n/scripts/db-seed-i18n.py | 24 ++------- build/i18n/scripts/fieldmapper.py | 22 +------- build/i18n/tests/data/complex.po | 9 ++-- build/i18n/tests/data/complex.pot | 9 ++-- build/i18n/tests/data/testidl.pot | 82 +++++++++++++++--------------- build/i18n/tests/testIDL.py | 8 ++- build/i18n/tests/testSQL.py | 5 +- build/i18n/tests/testbase.py | 34 ++++++------- build/i18n/tests/testhelper.py | 24 ++++----- build/i18n/tests/testpo.py | 12 ++--- 11 files changed, 105 insertions(+), 142 deletions(-) diff --git a/build/i18n/scripts/basel10n.py b/build/i18n/scripts/basel10n.py index 63efb7c106..bb816e6a8f 100755 --- a/build/i18n/scripts/basel10n.py +++ b/build/i18n/scripts/basel10n.py @@ -38,17 +38,17 @@ class BaseL10N: version = 'Evergreen 1.4' if date is None: date = time.strftime("%Y-%m-%d %H:%M:%S") + '-0400' - self.pot.metadata['Project-Id-Version'] = version + r'\n' + self.pot.metadata['Project-Id-Version'] = version self.pot.metadata['Report-Msgid-Bugs-To'] = \ - 'open-ils-dev@list.georgialibraries.org' + r'\n' + 'open-ils-dev@list.georgialibraries.org' # Cheat and hard-code the time zone offset - self.pot.metadata['POT-Creation-Date'] = date + r'\n' - self.pot.metadata['PO-Revision-Date'] = 'YEAR-MO-DA HO:MI+ZONE' + r'\n' - self.pot.metadata['Last-Translator'] = 'FULL NAME ' + r'\n' - self.pot.metadata['Language-Team'] = 'LANGUAGE ' + r'\n' - self.pot.metadata['MIME-Version'] = '1.0' + r'\n' - self.pot.metadata['Content-Type'] = 'text/plain; charset=utf-8' + r'\n' - self.pot.metadata['Content-Transfer-Encoding'] = '8-bit' + r'\n' + self.pot.metadata['POT-Creation-Date'] = date + self.pot.metadata['PO-Revision-Date'] = 'YEAR-MO-DA HO:MI+ZONE' + self.pot.metadata['Last-Translator'] = 'FULL NAME ' + self.pot.metadata['Language-Team'] = 'LANGUAGE ' + self.pot.metadata['MIME-Version'] = '1.0' + self.pot.metadata['Content-Type'] = 'text/plain; charset=utf-8' + self.pot.metadata['Content-Transfer-Encoding'] = '8-bit' def savepot(self, destination): """ diff --git a/build/i18n/scripts/db-seed-i18n.py b/build/i18n/scripts/db-seed-i18n.py index 48f0114cb9..248a1fa52f 100755 --- a/build/i18n/scripts/db-seed-i18n.py +++ b/build/i18n/scripts/db-seed-i18n.py @@ -36,29 +36,11 @@ class SQL(basel10n.BaseL10N): basel10n.BaseL10N.__init__(self) self.sql = [] - def loadpo(self, potfile): - """ - Load a POT file - """ - basel10n.BaseL10N.loadpo(self, potfile) - - def pothead(self): - """ - Initialize POT metadata - """ - basel10n.BaseL10N.pothead(self) - - def savepot(self, outfile): - """ - Write a POT file - """ - basel10n.BaseL10N.savepot(self, outfile) - def getstrings(self, source): """ Each INSERT statement contains a schema and tablename which we need to insert into the config.i18n table. We'll push this into our - POEntry.occurences attribute. + POEntry.occurrences attribute. Each INSERT statement also contains 0 or more oils_i18n_gettext() markers for the en-US string that we'll use for our msgid attribute. @@ -92,7 +74,7 @@ class SQL(basel10n.BaseL10N): i18n = re.compile(r'\'\'').sub("'", i18n) if i18n is not None: poe = polib.POEntry() - poe.occurences = [(table, num)] + poe.occurrences = [(table, num)] poe.msgid = i18n self.pot.append(poe) num = num + 1 @@ -106,7 +88,7 @@ class SQL(basel10n.BaseL10N): insert = "INSERT INTO config.i18n_core (fq_field, identity_value," \ " translation, string) VALUES ('%s', '%s', '%s', '%s');" for entry in self.pot: - for table in entry.occurences: + for table in entry.occurrences: # Escape SQL single-quotes to avoid b0rkage msgid = re.compile(r'\'').sub("''", entry.msgid) msgstr = re.compile(r'\'').sub("''", entry.msgstr) diff --git a/build/i18n/scripts/fieldmapper.py b/build/i18n/scripts/fieldmapper.py index 38888a97be..b32bde2fd5 100755 --- a/build/i18n/scripts/fieldmapper.py +++ b/build/i18n/scripts/fieldmapper.py @@ -38,24 +38,6 @@ class IDL(basel10n.BaseL10N): self.idl = '' self.definitions = [] - def loadpo(self, potfile): - """ - Load a POT file - """ - basel10n.BaseL10N.loadpo(self, potfile) - - def pothead(self): - """ - Initialize POT metadata - """ - basel10n.BaseL10N.pothead(self) - - def savepot(self, outfile): - """ - Write a POT file - """ - basel10n.BaseL10N.savepot(self, outfile) - def get_strings(self, source): """ Extracts translatable strings from the reporter:label attributes @@ -72,7 +54,7 @@ class IDL(basel10n.BaseL10N): for entity in handler.entities: poe = polib.POEntry() - poe.occurences = handler.entities[entity] + poe.occurrences = handler.entities[entity] poe.msgid = entity self.pot.append(poe) self.idl = handler.entityized @@ -83,7 +65,7 @@ class IDL(basel10n.BaseL10N): """ entity = '' for entry in self.pot: - for name in entry.occurences: + for name in entry.occurrences: if entry.msgstr == '': # No translation available; use the en-US definition self.definitions.append(entity % (name[0], entry.msgid)) diff --git a/build/i18n/tests/data/complex.po b/build/i18n/tests/data/complex.po index 2cc5c727ba..3e0c427680 100644 --- a/build/i18n/tests/data/complex.po +++ b/build/i18n/tests/data/complex.po @@ -17,10 +17,11 @@ msgstr "Utiliser la bibliothèque" #: 2475:field.rxbt.voided.label msgid "" -"Super crazy long and repetitive message ID from hell" -"Super crazy long and repetitive message ID from hell" -"Super crazy long and repetitive message ID from hell" -"Super crazy long and repetitive message ID from hell" +"\n" +"Super crazy long and repetitive message ID from hell\n" +"Super crazy long and repetitive message ID from hell\n" +"Super crazy long and repetitive message ID from hell\n" +"Super crazy long and repetitive message ID from hell\n" "Super crazy long and repetitive message ID from hell" msgstr "ôèàéç" diff --git a/build/i18n/tests/data/complex.pot b/build/i18n/tests/data/complex.pot index 6e1843f9d9..324e2053ce 100644 --- a/build/i18n/tests/data/complex.pot +++ b/build/i18n/tests/data/complex.pot @@ -17,10 +17,11 @@ msgstr "" #: 2475:field.rxbt.voided.label msgid "" -"Super crazy long and repetitive message ID from hell" -"Super crazy long and repetitive message ID from hell" -"Super crazy long and repetitive message ID from hell" -"Super crazy long and repetitive message ID from hell" +"\n" +"Super crazy long and repetitive message ID from hell\n" +"Super crazy long and repetitive message ID from hell\n" +"Super crazy long and repetitive message ID from hell\n" +"Super crazy long and repetitive message ID from hell\n" "Super crazy long and repetitive message ID from hell" msgstr "" diff --git a/build/i18n/tests/data/testidl.pot b/build/i18n/tests/data/testidl.pot index c32f011925..b637549a39 100644 --- a/build/i18n/tests/data/testidl.pot +++ b/build/i18n/tests/data/testidl.pot @@ -11,166 +11,166 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8-bit\n" -#: 29:field.auoi.org_unit.label +#: field.auoi.org_unit.label:29 msgid "Allowed Org Unit" msgstr "" -#: 58:field.rodcirc.checkin_staff.label +#: field.rodcirc.checkin_staff.label:58 msgid "Check In Staff" msgstr "" -#: 52:class.rodcirc.label +#: class.rodcirc.label:52 msgid "Overdue Circulation" msgstr "" -#: 76:field.rodcirc.stop_fines_time.label +#: field.rodcirc.stop_fines_time.label:76 msgid "Fine Stop Date/Time" msgstr "" -#: 57:field.rodcirc.checkin_lib.label +#: field.rodcirc.checkin_lib.label:57 msgid "Check In Library" msgstr "" -#: 84:field.rodcirc.circ_type.label +#: field.rodcirc.circ_type.label:84 msgid "Circulation Type" msgstr "" -#: 66:field.rodcirc.fine_interval.label +#: field.rodcirc.fine_interval.label:66 msgid "Fine Interval" msgstr "" -#: 85:field.rodcirc.billing_total.label +#: field.rodcirc.billing_total.label:85 msgid "Billing Totals" msgstr "" -#: 64:field.rodcirc.duration.label +#: field.rodcirc.duration.label:64 msgid "Circulation Duration" msgstr "" -#: 45:field.aws.name.label +#: field.aws.name.label:45 msgid "Workstation Name" msgstr "" -#: 20:class.auoi.label +#: class.auoi.label:20 msgid "User Sharing Opt-in" msgstr "" -#: 73:field.rodcirc.recuring_fine_rule.label +#: field.rodcirc.recuring_fine_rule.label:73 msgid "Recurring Fine Rule" msgstr "" -#: 65:field.rodcirc.duration_rule.label +#: field.rodcirc.duration_rule.label:65 msgid "Circ Duration Rule" msgstr "" -#: 25:field.auoi.id.label +#: field.auoi.id.label:25 msgid "Opt-in ID" msgstr "" -#: 86:field.rodcirc.payment_total.label +#: field.rodcirc.payment_total.label:86 msgid "Payment Totals" msgstr "" -#: 71:field.rodcirc.phone_renewal.label +#: field.rodcirc.phone_renewal.label:71 msgid "Phone Renewal" msgstr "" -#: 60:field.rodcirc.circ_lib.label +#: field.rodcirc.circ_lib.label:60 msgid "Circulating Library" msgstr "" -#: 68:field.rodcirc.max_fine.label +#: field.rodcirc.max_fine.label:68 msgid "Max Fine Amount" msgstr "" -#: 79:field.rodcirc.xact_finish.label +#: field.rodcirc.xact_finish.label:79 msgid "Transaction Finish Date/Time" msgstr "" -#: 28:field.auoi.usr.label +#: field.auoi.usr.label:28 msgid "User" msgstr "" -#: 26:field.auoi.opt_in_ws.label 39:class.aws.label +#: field.auoi.opt_in_ws.label:26 class.aws.label:39 msgid "Workstation" msgstr "" -#: 75:field.rodcirc.stop_fines.label +#: field.rodcirc.stop_fines.label:75 msgid "Fine Stop Reason" msgstr "" -#: 70:field.rodcirc.opac_renewal.label +#: field.rodcirc.opac_renewal.label:70 msgid "OPAC Renewal" msgstr "" -#: 61:field.rodcirc.circ_staff.label +#: field.rodcirc.circ_staff.label:61 msgid "Circulating Staff" msgstr "" -#: 82:field.rodcirc.payments.label +#: field.rodcirc.payments.label:82 msgid "Transaction Payments" msgstr "" -#: 59:field.rodcirc.checkin_time.label +#: field.rodcirc.checkin_time.label:59 msgid "Check In Date/Time" msgstr "" -#: 69:field.rodcirc.max_fine_rule.label +#: field.rodcirc.max_fine_rule.label:69 msgid "Max Fine Rule" msgstr "" -#: 80:field.rodcirc.xact_start.label +#: field.rodcirc.xact_start.label:80 msgid "Check Out Date/Time" msgstr "" -#: 83:field.rodcirc.billable_transaction.label +#: field.rodcirc.billable_transaction.label:83 msgid "Base Transaction" msgstr "" -#: 72:field.rodcirc.recuring_fine.label +#: field.rodcirc.recuring_fine.label:72 msgid "Recurring Fine Amount" msgstr "" -#: 27:field.auoi.staff.label +#: field.auoi.staff.label:27 msgid "Staff Member" msgstr "" -#: 44:field.aws.id.label +#: field.aws.id.label:44 msgid "Workstation ID" msgstr "" -#: 78:field.rodcirc.usr.label +#: field.rodcirc.usr.label:78 msgid "Patron" msgstr "" -#: 63:field.rodcirc.due_date.label +#: field.rodcirc.due_date.label:63 msgid "Due Date/Time" msgstr "" -#: 81:field.rodcirc.billings.label +#: field.rodcirc.billings.label:81 msgid "Transaction Billings" msgstr "" -#: 30:field.auoi.opt_in_ts.label +#: field.auoi.opt_in_ts.label:30 msgid "Opt-in Date/Time" msgstr "" -#: 62:field.rodcirc.desk_renewal.label +#: field.rodcirc.desk_renewal.label:62 msgid "Desk Renewal" msgstr "" -#: 77:field.rodcirc.target_copy.label +#: field.rodcirc.target_copy.label:77 msgid "Circulating Item" msgstr "" -#: 74:field.rodcirc.renewal_remaining.label +#: field.rodcirc.renewal_remaining.label:74 msgid "Remaining Renewals" msgstr "" -#: 46:field.aws.owning_lib.label +#: field.aws.owning_lib.label:46 msgid "Owning Library" msgstr "" -#: 67:field.rodcirc.id.label +#: field.rodcirc.id.label:67 msgid "Circ ID" msgstr "" diff --git a/build/i18n/tests/testIDL.py b/build/i18n/tests/testIDL.py index 08f74b0970..568af9ecdc 100644 --- a/build/i18n/tests/testIDL.py +++ b/build/i18n/tests/testIDL.py @@ -9,8 +9,6 @@ import filecmp import os -import polib -import re import subprocess import testhelper import unittest @@ -40,7 +38,7 @@ class TestIDLL10N(unittest.TestCase): Convert an en-US IDL file to an entityized version """ devnull = open('/dev/null', 'w') - proc = subprocess.Popen( + subprocess.Popen( ('python', self.script, '--convert', self.idlfile, '--output', self.saveidlent), 0, None, None, devnull, devnull).wait() @@ -52,7 +50,7 @@ class TestIDLL10N(unittest.TestCase): Create a POT file from a fieldmapper IDL file """ devnull = open('/dev/null', 'w') - proc = subprocess.Popen( + subprocess.Popen( ('python', self.script, '--pot', self.idlfile, '--output', self.savepot), 0, None, None, devnull, devnull).wait() @@ -68,7 +66,7 @@ class TestIDLL10N(unittest.TestCase): Generate an entity definition file from a PO file """ devnull = open('/dev/null', 'w') - proc = subprocess.Popen( + subprocess.Popen( ('python', self.script, '--entity', self.testpo, '--output', self.saveentities), 0, None, None, devnull, devnull).wait() diff --git a/build/i18n/tests/testSQL.py b/build/i18n/tests/testSQL.py index 9723e2dd2d..5cd9b33434 100644 --- a/build/i18n/tests/testSQL.py +++ b/build/i18n/tests/testSQL.py @@ -32,8 +32,7 @@ class TestSQLFramework(unittest.TestCase): """ Create a POT file from our test SQL statements. """ - devnull = open('/dev/null', 'w') - proc = subprocess.Popen( + subprocess.Popen( ('python', self.script, '--pot', self.sqlsource, '--output', self.testpot), 0, None, None).wait() @@ -49,7 +48,7 @@ class TestSQLFramework(unittest.TestCase): Create a SQL file from a translated PO file. """ devnull = open('/dev/null', 'w') - proc = subprocess.Popen( + subprocess.Popen( ('python', self.script, '--sql', self.canonpo, '--locale', 'zz-ZZ', '--output', self.testsql), 0, None, None, devnull, devnull).wait() diff --git a/build/i18n/tests/testbase.py b/build/i18n/tests/testbase.py index 47d7178f46..2320b294d1 100644 --- a/build/i18n/tests/testbase.py +++ b/build/i18n/tests/testbase.py @@ -20,19 +20,19 @@ class TestBaseL10N(unittest.TestCase): poentries = [{ 'msgid': 'Using Library', 'msgstr': 'Utiliser la bibliothèque', - 'occurences': [ + 'occurrences': [ {'line': 240, 'name': 'field.aihu.org_unit.label'}, {'line': 257, 'name': 'field.ancihu.org_unit.label'}, ]}, { 'msgid': '\nSuper crazy long and repetitive message ID from hell\nSuper crazy long and repetitive message ID from hell\nSuper crazy long and repetitive message ID from hell\nSuper crazy long and repetitive message ID from hell\nSuper crazy long and repetitive message ID from hell', 'msgstr': 'ôèàéç', - 'occurences': [ + 'occurrences': [ {'line': 2475, 'name': 'field.rxbt.voided.label'}, ]}, { 'msgid': 'Record Source', - 'occurences': [ + 'occurrences': [ {'line': 524, 'name': 'field.bre.source.label'}, ]}, ] @@ -40,15 +40,15 @@ class TestBaseL10N(unittest.TestCase): def setUp(self): sys.path.append(os.path.join(self.basedir, '../scripts/')) self.tearDown() - for dir in self.tmpdirs: - os.mkdir(dir) + for tmpdir in self.tmpdirs: + os.mkdir(tmpdir) def tearDown(self): - for dir in self.tmpdirs: - if os.access(dir, os.F_OK): - for file in os.listdir(dir): - os.remove(os.path.join(dir, file)) - os.rmdir(dir) + for tmpdir in self.tmpdirs: + if os.access(tmpdir, os.F_OK): + for tmpfile in os.listdir(tmpdir): + os.remove(os.path.join(tmpdir, tmpfile)) + os.rmdir(tmpdir) def testload(self): """ @@ -59,13 +59,13 @@ class TestBaseL10N(unittest.TestCase): poload.loadpo(self.canonpo) pogen = basel10n.BaseL10N() pogen.pothead('Evergreen 1.4', '1999-12-31 23:59:59 -0400') - pogen.pot.metadata['PO-Revision-Date'] = '2007-12-08 23:14:20 -0400\\n' - pogen.pot.metadata['Last-Translator'] = ' Dan Scott \\n' - pogen.pot.metadata['Language-Team'] = 'fr-CA \\n' + pogen.pot.metadata['PO-Revision-Date'] = '2007-12-08 23:14:20 -0400' + pogen.pot.metadata['Last-Translator'] = ' Dan Scott ' + pogen.pot.metadata['Language-Team'] = 'fr-CA ' for msg in self.poentries: poe = polib.POEntry() - for x in msg['occurences']: - poe.occurences.append((x['line'], x['name'])) + for x in msg['occurrences']: + poe.occurrences.append((x['line'], x['name'])) poe.msgid = msg['msgid'] if msg.has_key('msgstr'): poe.msgstr = msg['msgstr'] @@ -82,8 +82,8 @@ class TestBaseL10N(unittest.TestCase): pogen.pothead('Evergreen 1.4', '1999-12-31 23:59:59 -0400') for msg in self.poentries: poe = polib.POEntry() - for x in msg['occurences']: - poe.occurences.append((x['line'], x['name'])) + for x in msg['occurrences']: + poe.occurrences.append((x['line'], x['name'])) poe.msgid = msg['msgid'] pogen.pot.append(poe) pogen.savepot(self.savefile) diff --git a/build/i18n/tests/testhelper.py b/build/i18n/tests/testhelper.py index 44f5007b63..dc44dd22a9 100644 --- a/build/i18n/tests/testhelper.py +++ b/build/i18n/tests/testhelper.py @@ -19,18 +19,18 @@ def mungepothead(file): mungefile.write(line) mungefile.close() -def setUp(self): - sys.path.append(os.path.join(self.basedir, '../scripts/')) - sys.path.append(self.basedir) - self.tearDown() - for dir in self.tmpdirs: - os.mkdir(dir) +def setUp(obj): + sys.path.append(os.path.join(obj.basedir, '../scripts/')) + sys.path.append(obj.basedir) + obj.tearDown() + for tmpdir in obj.tmpdirs: + os.mkdir(tmpdir) -def tearDown(self): - for dir in self.tmpdirs: - if os.access(dir, os.F_OK): - for file in os.listdir(dir): - os.remove(os.path.join(dir, file)) - os.rmdir(dir) +def tearDown(obj): + for tmpdir in obj.tmpdirs: + if os.access(tmpdir, os.F_OK): + for tmpfile in os.listdir(tmpdir): + os.remove(os.path.join(tmpdir, tmpfile)) + os.rmdir(tmpdir) diff --git a/build/i18n/tests/testpo.py b/build/i18n/tests/testpo.py index 50922a473b..737c4bf7a1 100644 --- a/build/i18n/tests/testpo.py +++ b/build/i18n/tests/testpo.py @@ -31,10 +31,10 @@ class TestPOFramework(unittest.TestCase): devnull = open('/dev/null', 'w') os.mkdir('tests/tmp') os.mkdir(self.project_dir) - proc = subprocess.Popen(('cp', '-r', 'po', 'tests/tmp'), 0, None, None, devnull, devnull).wait() - proc = subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'newpot'), 0, None, None, devnull, devnull).wait() - proc = subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'newpo'), 0, None, None, devnull, devnull).wait() - proc = subprocess.Popen(('make', 'LOCALE=ll-LL', 'PROJECT=tests/tmp/locale', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'newproject'), 0, None, None, devnull, devnull).wait() + subprocess.Popen(('cp', '-r', 'po', 'tests/tmp'), 0, None, None, devnull, devnull).wait() + subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'newpot'), 0, None, None, devnull, devnull).wait() + subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'newpo'), 0, None, None, devnull, devnull).wait() + subprocess.Popen(('make', 'LOCALE=ll-LL', 'PROJECT=tests/tmp/locale', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'newproject'), 0, None, None, devnull, devnull).wait() devnull.close() def tearDown(self): @@ -101,7 +101,7 @@ class TestPOFramework(unittest.TestCase): # Regenerate the project files to get the translated strings in place devnull = open('/dev/null', 'w') - proc = subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'updateproject'), 0, None, None, devnull, devnull).wait() + subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'updateproject'), 0, None, None, devnull, devnull).wait() self.assertEqual(filecmp.cmp(commonprops, testprops), 1) @@ -136,7 +136,7 @@ class TestPOFramework(unittest.TestCase): # Update the PO files to get the translated strings in place devnull = open('/dev/null', 'w') - proc = subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'updatepo'), 0, None, None, devnull, devnull).wait() + subprocess.Popen(('make', 'LOCALE=ll-LL', 'POINDIR=tests/tmp/po', 'POOUTDIR=tests/tmp/po', 'updatepo'), 0, None, None, devnull, devnull).wait() commonprops = os.path.join(self.locale_dir, 'common.properties.po') tempprops = os.path.join(self.locale_dir, 'temp.properties.po') -- 2.43.2