]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Add rules to generate the en@quot.po and en@boldquot.po files automatically.
authorBruno Haible <bruno@clisp.org>
Tue, 27 Nov 2001 13:13:46 +0000 (13:13 +0000)
committerBruno Haible <bruno@clisp.org>
Sun, 21 Jun 2009 21:26:35 +0000 (23:26 +0200)
12 files changed:
doc/ChangeLog
m4/ChangeLog
m4/gettext.m4
po/ChangeLog
po/Makefile.in.in
po/Makevars [new file with mode: 0644]
po/Rules-quot [new file with mode: 0644]
po/boldquot.sed [new file with mode: 0644]
po/en@boldquot.header [new file with mode: 0644]
po/en@quot.header [new file with mode: 0644]
po/insert-header.sin [new file with mode: 0644]
po/quot.sed [new file with mode: 0644]

index b1e6403579680cb90598df95456abb1732acf87f..16b18f6acc4e84cc5b1a12a63ddbfaa5b05ce50e 100644 (file)
@@ -1,3 +1,7 @@
+2001-11-25  Bruno Haible  <bruno@clisp.org>
+
+       * gettext.texi (po/Makevars): New node.
+
 2001-11-25  Bruno Haible  <bruno@clisp.org>
 
        * msginit.texi: Document option --no-translator.
index f5a7069b95f0e7dd0ebea6e0270df90dd5390c68..37e851a634fa553265e83826d0528a0336977244 100644 (file)
@@ -1,3 +1,9 @@
+2001-11-25  Bruno Haible  <bruno@clisp.org>
+
+       * gettext.m4 (AM_PO_SUBDIRS): Also substitute UPDATEPOFILES and
+       DUMMYPOFILES into Makefile. Also insert Makevars and Rules-* into
+       Makefile.
+
 2001-11-18  Bruno Haible  <haible@clisp.cons.org>
 
        * gettext.m4: Split into submacros.
index 5cc98707d67fbf1d9fa0aed4141f8638fbf52924..fd3a42eecef2276f0bd016c4e167a20d82da1490 100644 (file)
@@ -313,8 +313,9 @@ AC_DEFUN([AM_PO_SUBDIRS],
           rm -f "$ac_dir/POTFILES"
           test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
           sed -e "/^#/d" -e "/^[       ]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," -e "\$s/\(.*\) \\\\/\1/" < "$ac_given_srcdir/$ac_dir/POTFILES.in" > "$ac_dir/POTFILES"
-          # ALL_LINGUAS, GMOFILES, POFILES depend on $ac_dir but don't
-          # depend on user-specified configuration parameters.
+          # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
           if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
             # The LINGUAS file contains the set of available languages.
             if test -n "$ALL_LINGUAS"; then
@@ -328,11 +329,15 @@ AC_DEFUN([AM_PO_SUBDIRS],
             .) srcdirpre= ;;
             *) srcdirpre='$(srcdir)/' ;;
           esac
-          GMOFILES=
           POFILES=
+          GMOFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
           for lang in $ALL_LINGUAS; do
-            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
             POFILES="$POFILES $srcdirpre$lang.po"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
           done
           # CATALOGS depends on both $ac_dir and the user's LINGUAS
           # environment variable.
@@ -367,13 +372,17 @@ AC_DEFUN([AM_PO_SUBDIRS],
             done
           fi
           test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
-          sed -e "/POTFILES =/r $ac_dir/POTFILES" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@POFILES@|$POFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_dir"/Rules-*; do
+            cat "$f" >> "$ac_dir/Makefile"
+          done
         fi
         ;;
       esac
     done],
-   [# Capture the value of obsolete $ALL_LINGUAS because we need it to
-    # compute GMOFILES, POFILES, CATALOGS. But hide it from automake.
+   [# Capture the value of obsolete $ALL_LINGUAS because we need it to compute
+    # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it
+    # from automake.
     eval 'ALL_LINGUAS''="$ALL_LINGUAS"'
     # Capture the value of LINGUAS because we need it to compute CATALOGS.
     LINGUAS="${LINGUAS-%UNSET%}"
index 71dc4c81fb7cc7f216ac6ff04d9b6910df162e16..b1b518f91703da3cb361b07866b70c2e9788417d 100644 (file)
@@ -1,3 +1,29 @@
+2001-11-25  Bruno Haible  <bruno@clisp.org>
+
+       * Makevars: New file.
+       * quot.sed: New file.
+       * boldquot.sed: New file.
+       * en@quot.header: New file.
+       * en@boldquot.header: New file.
+       * insert-header.sin: Mew file.
+       * Rules-quot: New file.
+       * Makefile.in.in: Use $(DOMAIN) instead of $(PACKAGE) almost
+       everywhere.
+       (subdir, top_builddir): Move to Makevars.
+       (MSGINIT): New variable.
+       (MSGCONV): New variable.
+       (MSGEXEC): New variable.
+       (UPDATEPOFILES): New variable.
+       (DUMMYPOFILES): New variable.
+       (DISTFILES.common): New variable.
+       (DISTFILES): Use it.
+       (.SUFFIXES): Add .nop, .po-update.
+       (install-data): Install all of $(DISTFILES.common).
+       (uninstall-data): Uninstall all of $(DISTFILES.common).
+       (update-po): Split into a Makefile rule for each PO file update.
+       (.nop.po-update): New rule, extracted from update-po.
+       ($(DUMMYPOFILES)): New trivial rules.
+
 2001-11-15  Bruno Haible  <haible@clisp.cons.org>
 
        * sv.po: Update from Jan Djärv <Jan.Djarv@mbox200.swipnet.se>.
index 60c55b338435a9ff3fe8e57d1b6ee44eb6d366ee..a2f547b4593da4890682384386bac4adc863205c 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile for program source directory in GNU NLS utilities package.
+# Makefile for PO directory in any package using GNU gettext.
 # Copyright (C) 1995-1997, 2000, 2001 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
 #
 # This file can be copied and used freely without restrictions.  It can
 PACKAGE = @PACKAGE@
 VERSION = @VERSION@
 
-# These two variables depend on the location of this directory.
-subdir = po
-top_builddir = ..
-
 SHELL = /bin/sh
 @SET_MAKE@
 
@@ -38,18 +34,28 @@ MSGFMT = @MSGFMT@
 XGETTEXT = @XGETTEXT@
 MSGMERGE = msgmerge
 MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGEXEC = msgexec
 
 POFILES = @POFILES@
 GMOFILES = @GMOFILES@
-DISTFILES = Makefile.in.in POTFILES.in $(PACKAGE).pot \
-$(POFILES) $(GMOFILES)
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in Makevars \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) POTFILES.in $(DOMAIN).pot \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
 
 POTFILES = \
 
 CATALOGS = @CATALOGS@
 
+# Makevars gets inserted here. (Don't remove this line!)
+
 .SUFFIXES:
-.SUFFIXES: .po .gmo .mo
+.SUFFIXES: .po .gmo .mo .nop .po-update
 
 .po.mo:
        $(MSGFMT) -c -o $@ $<
@@ -66,23 +72,23 @@ all: all-@USE_NLS@
 all-yes: $(CATALOGS)
 all-no:
 
-# Note: Target 'all' must not depend on target '$(srcdir)/$(PACKAGE).pot',
+# Note: Target 'all' must not depend on target '$(srcdir)/$(DOMAIN).pot',
 # otherwise packages like GCC can not be built if only parts of the source
 # have been downloaded.
 
-$(srcdir)/$(PACKAGE).pot: $(POTFILES) $(srcdir)/POTFILES.in
-       $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \
+$(srcdir)/$(DOMAIN).pot: $(POTFILES) $(srcdir)/POTFILES.in
+       $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
          --add-comments=TRANSLATORS: --keyword=_ --keyword=N_ \
          --files-from=$(srcdir)/POTFILES.in \
-       && test ! -f $(PACKAGE).po \
-          || ( rm -f $(srcdir)/$(PACKAGE).pot \
-               && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot )
+       && test ! -f $(DOMAIN).po \
+          || ( rm -f $(srcdir)/$(DOMAIN).pot \
+               && mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot )
 
 $(POFILES): force
        @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
        test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
-       echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(PACKAGE).pot"; \
-       cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(PACKAGE).pot
+       echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \
+       cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot
 
 
 install: install-exec install-data
@@ -90,8 +96,10 @@ install-exec:
 install-data: install-data-@USE_NLS@
        if test "$(PACKAGE)" = "gettext"; then \
          $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
-         $(INSTALL_DATA) $(srcdir)/Makefile.in.in \
-                         $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+         for file in $(DISTFILES.common); do \
+           $(INSTALL_DATA) $(srcdir)/$$file \
+                           $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
        else \
          : ; \
        fi
@@ -105,12 +113,12 @@ install-data-yes: all
          dir=$(localedir)/$$lang/LC_MESSAGES; \
          $(mkinstalldirs) $(DESTDIR)$$dir; \
          if test -r $$cat; then \
-           $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/$(PACKAGE).mo; \
-           echo "installing $$cat as $(DESTDIR)$$dir/$(PACKAGE).mo"; \
+           $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+           echo "installing $$cat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
          else \
-           $(INSTALL_DATA) $(srcdir)/$$cat $(DESTDIR)$$dir/$(PACKAGE).mo; \
+           $(INSTALL_DATA) $(srcdir)/$$cat $(DESTDIR)$$dir/$(DOMAIN).mo; \
            echo "installing $(srcdir)/$$cat as" \
-                "$(DESTDIR)$$dir/$(PACKAGE).mo"; \
+                "$(DESTDIR)$$dir/$(DOMAIN).mo"; \
          fi; \
        done
 
@@ -142,7 +150,9 @@ uninstall: uninstall-exec uninstall-data
 uninstall-exec:
 uninstall-data: uninstall-data-@USE_NLS@
        if test "$(PACKAGE)" = "gettext"; then \
-         rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+         for file in $(DISTFILES.common); do \
+           rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
        else \
          : ; \
        fi
@@ -152,7 +162,7 @@ uninstall-data-yes:
        for cat in $$catalogs; do \
          cat=`basename $$cat`; \
          lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
-         rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(PACKAGE).mo; \
+         rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo; \
        done
 
 check: all
@@ -160,7 +170,7 @@ check: all
 dvi info tags TAGS ID:
 
 mostlyclean:
-       rm -f core core.* $(PACKAGE).po *.new.po
+       rm -f core core.* $(DOMAIN).po *.new.po
        rm -fr *.o
 
 clean: mostlyclean
@@ -191,32 +201,37 @@ dist2: $(DISTFILES)
        done
 
 update-po: Makefile
-       $(MAKE) $(PACKAGE).pot
+       $(MAKE) $(DOMAIN).pot
+       $(MAKE) $(UPDATEPOFILES)
+       $(MAKE) update-gmo
+
+# General rule for updating PO files.
+
+.nop.po-update:
+       @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
        if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; fi; \
        tmpdir=`pwd`; \
+       echo "$$lang:"; \
+       test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+       echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
        cd $(srcdir); \
-       catalogs='$(GMOFILES)'; \
-       for cat in $$catalogs; do \
-         cat=`basename $$cat`; \
-         lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
-         echo "$$lang:"; \
-         if $(MSGMERGE) $$lang.po $(PACKAGE).pot -o $$tmpdir/$$lang.new.po; then \
-           if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
-             rm -f $$tmpdir/$$lang.new.po; \
-           else
-             if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
-               :; \
-             else \
-               echo "msgmerge for $$cat failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
-               exit 1; \
-             fi; \
-           fi; \
-         else \
-           echo "msgmerge for $$cat failed!" 1>&2; \
+       if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \
+         if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
            rm -f $$tmpdir/$$lang.new.po; \
+         else \
+           if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+             :; \
+           else \
+             echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+             exit 1; \
+           fi; \
          fi; \
-       done
-       $(MAKE) update-gmo
+       else \
+         echo "msgmerge for $$lang.po failed!" 1>&2; \
+         rm -f $$tmpdir/$$lang.new.po; \
+       fi
+
+$(DUMMYPOFILES):
 
 update-gmo: Makefile $(GMOFILES)
        @:
diff --git a/po/Makevars b/po/Makevars
new file mode 100644 (file)
index 0000000..f831426
--- /dev/null
@@ -0,0 +1,8 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
diff --git a/po/Rules-quot b/po/Rules-quot
new file mode 100644 (file)
index 0000000..b0cbb7e
--- /dev/null
@@ -0,0 +1,42 @@
+# Special Makefile rules for English message catalogs with quotation marks.
+
+DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
+
+.SUFFIXES: .insert-header .po-update-en
+
+en@quot.po-update: en@quot.po-update-en
+en@boldquot.po-update: en@boldquot.po-update-en
+
+.insert-header.po-update-en:
+       @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
+       if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; fi; \
+       tmpdir=`pwd`; \
+       echo "$$lang:"; \
+       ll=`echo $$lang | sed -e 's/@.*//'`; \
+       LC_ALL=C; export LC_ALL; \
+       cd $(srcdir); \
+       if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGEXEC) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \
+         if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+           rm -f $$tmpdir/$$lang.new.po; \
+         else \
+           if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+             :; \
+           else \
+             echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+             exit 1; \
+           fi; \
+         fi; \
+       else \
+         echo "creation of $$lang.po failed!" 1>&2; \
+         rm -f $$tmpdir/$$lang.new.po; \
+       fi
+
+en@quot.insert-header: insert-header.sin
+       sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
+
+en@boldquot.insert-header: insert-header.sin
+       sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
+
+mostlyclean: mostlyclean-quot
+mostlyclean-quot:
+       rm -f *.insert-header
diff --git a/po/boldquot.sed b/po/boldquot.sed
new file mode 100644 (file)
index 0000000..4b937aa
--- /dev/null
@@ -0,0 +1,10 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
+s/“/“\e[1m/g
+s/”/\e[0m”/g
+s/‘/‘\e[1m/g
+s/’/\e[0m’/g
diff --git a/po/en@boldquot.header b/po/en@boldquot.header
new file mode 100644 (file)
index 0000000..fedb6a0
--- /dev/null
@@ -0,0 +1,25 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
diff --git a/po/en@quot.header b/po/en@quot.header
new file mode 100644 (file)
index 0000000..a9647fc
--- /dev/null
@@ -0,0 +1,22 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
diff --git a/po/insert-header.sin b/po/insert-header.sin
new file mode 100644 (file)
index 0000000..b26de01
--- /dev/null
@@ -0,0 +1,23 @@
+# Sed script that inserts the file called HEADER before the header entry.
+#
+# At each occurrence of a line starting with "msgid ", we execute the following
+# commands. At the first occurrence, insert the file. At the following
+# occurrences, do nothing. The distinction between the first and the following
+# occurrences is achieved by looking at the hold space.
+/^msgid /{
+x
+# Test if the hold space is empty.
+s/m/m/
+ta
+# Yes it was empty. First occurrence. Read the file.
+r HEADER
+# Output the file's contents by reading the next line. But don't lose the
+# current line while doing this.
+g
+N
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/po/quot.sed b/po/quot.sed
new file mode 100644 (file)
index 0000000..0122c46
--- /dev/null
@@ -0,0 +1,6 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g